mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Merge 8cc4da21a2 ("block: fix 'kmem_cache of name 'bio-108' already exists'") into android14-6.1-lts
Steps on the way to 6.1.132 Resolves merge conflicts in: kernel/sched/core.c Change-Id: Idf7429c88e7e76a0fcb0479a6679b61ec35d7c82 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -129,11 +129,8 @@ adaptive-tick CPUs: At least one non-adaptive-tick CPU must remain
|
||||
online to handle timekeeping tasks in order to ensure that system
|
||||
calls like gettimeofday() returns accurate values on adaptive-tick CPUs.
|
||||
(This is not an issue for CONFIG_NO_HZ_IDLE=y because there are no running
|
||||
user processes to observe slight drifts in clock rate.) Therefore, the
|
||||
boot CPU is prohibited from entering adaptive-ticks mode. Specifying a
|
||||
"nohz_full=" mask that includes the boot CPU will result in a boot-time
|
||||
error message, and the boot CPU will be removed from the mask. Note that
|
||||
this means that your system must have at least two CPUs in order for
|
||||
user processes to observe slight drifts in clock rate.) Note that this
|
||||
means that your system must have at least two CPUs in order for
|
||||
CONFIG_NO_HZ_FULL=y to do anything for you.
|
||||
|
||||
Finally, adaptive-ticks CPUs must have their RCU callbacks offloaded.
|
||||
|
||||
@@ -74,7 +74,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
||||
/*
|
||||
* This is used to ensure we don't load something for the wrong architecture.
|
||||
*/
|
||||
#define elf_check_arch(x) ((x)->e_machine == EM_ALPHA)
|
||||
#define elf_check_arch(x) (((x)->e_machine == EM_ALPHA) && !((x)->e_flags & EF_ALPHA_32BIT))
|
||||
|
||||
/*
|
||||
* These are used to set parameters in the core dumps.
|
||||
@@ -145,10 +145,6 @@ extern int dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task);
|
||||
: amask (AMASK_CIX) ? "ev6" : "ev67"); \
|
||||
})
|
||||
|
||||
#define SET_PERSONALITY(EX) \
|
||||
set_personality(((EX).e_flags & EF_ALPHA_32BIT) \
|
||||
? PER_LINUX_32BIT : PER_LINUX)
|
||||
|
||||
extern int alpha_l1i_cacheshape;
|
||||
extern int alpha_l1d_cacheshape;
|
||||
extern int alpha_l2_cacheshape;
|
||||
|
||||
@@ -322,7 +322,7 @@ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
|
||||
|
||||
extern void paging_init(void);
|
||||
|
||||
/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT. */
|
||||
/* We have our own get_unmapped_area */
|
||||
#define HAVE_ARCH_UNMAPPED_AREA
|
||||
|
||||
#endif /* _ALPHA_PGTABLE_H */
|
||||
|
||||
@@ -8,23 +8,19 @@
|
||||
#ifndef __ASM_ALPHA_PROCESSOR_H
|
||||
#define __ASM_ALPHA_PROCESSOR_H
|
||||
|
||||
#include <linux/personality.h> /* for ADDR_LIMIT_32BIT */
|
||||
|
||||
/*
|
||||
* We have a 42-bit user address space: 4TB user VM...
|
||||
*/
|
||||
#define TASK_SIZE (0x40000000000UL)
|
||||
|
||||
#define STACK_TOP \
|
||||
(current->personality & ADDR_LIMIT_32BIT ? 0x80000000 : 0x00120000000UL)
|
||||
#define STACK_TOP (0x00120000000UL)
|
||||
|
||||
#define STACK_TOP_MAX 0x00120000000UL
|
||||
|
||||
/* This decides where the kernel will search for a free chunk of vm
|
||||
* space during mmap's.
|
||||
*/
|
||||
#define TASK_UNMAPPED_BASE \
|
||||
((current->personality & ADDR_LIMIT_32BIT) ? 0x40000000 : TASK_SIZE / 2)
|
||||
#define TASK_UNMAPPED_BASE (TASK_SIZE / 2)
|
||||
|
||||
/* This is dead. Everything has been moved to thread_info. */
|
||||
struct thread_struct { };
|
||||
|
||||
@@ -1213,8 +1213,7 @@ SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Get an address range which is currently unmapped. Similar to the
|
||||
generic version except that we know how to honor ADDR_LIMIT_32BIT. */
|
||||
/* Get an address range which is currently unmapped. */
|
||||
|
||||
static unsigned long
|
||||
arch_get_unmapped_area_1(unsigned long addr, unsigned long len,
|
||||
@@ -1236,13 +1235,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
||||
unsigned long len, unsigned long pgoff,
|
||||
unsigned long flags)
|
||||
{
|
||||
unsigned long limit;
|
||||
|
||||
/* "32 bit" actually means 31 bit, since pointers sign extend. */
|
||||
if (current->personality & ADDR_LIMIT_32BIT)
|
||||
limit = 0x80000000;
|
||||
else
|
||||
limit = TASK_SIZE;
|
||||
unsigned long limit = TASK_SIZE;
|
||||
|
||||
if (len > limit)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -3852,6 +3852,85 @@ static inline bool intel_pmu_has_cap(struct perf_event *event, int idx)
|
||||
return test_bit(idx, (unsigned long *)&intel_cap->capabilities);
|
||||
}
|
||||
|
||||
static u64 intel_pmu_freq_start_period(struct perf_event *event)
|
||||
{
|
||||
int type = event->attr.type;
|
||||
u64 config, factor;
|
||||
s64 start;
|
||||
|
||||
/*
|
||||
* The 127 is the lowest possible recommended SAV (sample after value)
|
||||
* for a 4000 freq (default freq), according to the event list JSON file.
|
||||
* Also, assume the workload is idle 50% time.
|
||||
*/
|
||||
factor = 64 * 4000;
|
||||
if (type != PERF_TYPE_HARDWARE && type != PERF_TYPE_HW_CACHE)
|
||||
goto end;
|
||||
|
||||
/*
|
||||
* The estimation of the start period in the freq mode is
|
||||
* based on the below assumption.
|
||||
*
|
||||
* For a cycles or an instructions event, 1GHZ of the
|
||||
* underlying platform, 1 IPC. The workload is idle 50% time.
|
||||
* The start period = 1,000,000,000 * 1 / freq / 2.
|
||||
* = 500,000,000 / freq
|
||||
*
|
||||
* Usually, the branch-related events occur less than the
|
||||
* instructions event. According to the Intel event list JSON
|
||||
* file, the SAV (sample after value) of a branch-related event
|
||||
* is usually 1/4 of an instruction event.
|
||||
* The start period of branch-related events = 125,000,000 / freq.
|
||||
*
|
||||
* The cache-related events occurs even less. The SAV is usually
|
||||
* 1/20 of an instruction event.
|
||||
* The start period of cache-related events = 25,000,000 / freq.
|
||||
*/
|
||||
config = event->attr.config & PERF_HW_EVENT_MASK;
|
||||
if (type == PERF_TYPE_HARDWARE) {
|
||||
switch (config) {
|
||||
case PERF_COUNT_HW_CPU_CYCLES:
|
||||
case PERF_COUNT_HW_INSTRUCTIONS:
|
||||
case PERF_COUNT_HW_BUS_CYCLES:
|
||||
case PERF_COUNT_HW_STALLED_CYCLES_FRONTEND:
|
||||
case PERF_COUNT_HW_STALLED_CYCLES_BACKEND:
|
||||
case PERF_COUNT_HW_REF_CPU_CYCLES:
|
||||
factor = 500000000;
|
||||
break;
|
||||
case PERF_COUNT_HW_BRANCH_INSTRUCTIONS:
|
||||
case PERF_COUNT_HW_BRANCH_MISSES:
|
||||
factor = 125000000;
|
||||
break;
|
||||
case PERF_COUNT_HW_CACHE_REFERENCES:
|
||||
case PERF_COUNT_HW_CACHE_MISSES:
|
||||
factor = 25000000;
|
||||
break;
|
||||
default:
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
if (type == PERF_TYPE_HW_CACHE)
|
||||
factor = 25000000;
|
||||
end:
|
||||
/*
|
||||
* Usually, a prime or a number with less factors (close to prime)
|
||||
* is chosen as an SAV, which makes it less likely that the sampling
|
||||
* period synchronizes with some periodic event in the workload.
|
||||
* Minus 1 to make it at least avoiding values near power of twos
|
||||
* for the default freq.
|
||||
*/
|
||||
start = DIV_ROUND_UP_ULL(factor, event->attr.sample_freq) - 1;
|
||||
|
||||
if (start > x86_pmu.max_period)
|
||||
start = x86_pmu.max_period;
|
||||
|
||||
if (x86_pmu.limit_period)
|
||||
x86_pmu.limit_period(event, &start);
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
static int intel_pmu_hw_config(struct perf_event *event)
|
||||
{
|
||||
int ret = x86_pmu_hw_config(event);
|
||||
@@ -3863,6 +3942,12 @@ static int intel_pmu_hw_config(struct perf_event *event)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (event->attr.freq && event->attr.sample_freq) {
|
||||
event->hw.sample_period = intel_pmu_freq_start_period(event);
|
||||
event->hw.last_period = event->hw.sample_period;
|
||||
local64_set(&event->hw.period_left, event->hw.sample_period);
|
||||
}
|
||||
|
||||
if (event->attr.precise_ip) {
|
||||
if ((event->attr.config & INTEL_ARCH_EVENT_MASK) == INTEL_FIXED_VLBR_EVENT)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/i8253.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/swiotlb.h>
|
||||
#include <asm/processor.h>
|
||||
@@ -461,16 +460,6 @@ static void __init ms_hyperv_init_platform(void)
|
||||
if (efi_enabled(EFI_BOOT))
|
||||
x86_platform.get_nmi_reason = hv_get_nmi_reason;
|
||||
|
||||
/*
|
||||
* Hyper-V VMs have a PIT emulation quirk such that zeroing the
|
||||
* counter register during PIT shutdown restarts the PIT. So it
|
||||
* continues to interrupt @18.2 HZ. Setting i8253_clear_counter
|
||||
* to false tells pit_shutdown() not to zero the counter so that
|
||||
* the PIT really is shutdown. Generation 2 VMs don't have a PIT,
|
||||
* and setting this value has no effect.
|
||||
*/
|
||||
i8253_clear_counter_on_shutdown = false;
|
||||
|
||||
#if IS_ENABLED(CONFIG_HYPERV)
|
||||
/*
|
||||
* Setup the hook to get control post apic initialization.
|
||||
|
||||
@@ -23,8 +23,10 @@
|
||||
#include <asm/traps.h>
|
||||
#include <asm/thermal.h>
|
||||
|
||||
#if defined(CONFIG_X86_LOCAL_APIC) || defined(CONFIG_X86_THERMAL_VECTOR)
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <asm/trace/irq_vectors.h>
|
||||
#endif
|
||||
|
||||
DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat);
|
||||
EXPORT_PER_CPU_SYMBOL(irq_stat);
|
||||
|
||||
@@ -73,7 +73,7 @@ struct bio_slab {
|
||||
struct kmem_cache *slab;
|
||||
unsigned int slab_ref;
|
||||
unsigned int slab_size;
|
||||
char name[8];
|
||||
char name[12];
|
||||
};
|
||||
static DEFINE_MUTEX(bio_slab_lock);
|
||||
static DEFINE_XARRAY(bio_slabs);
|
||||
|
||||
@@ -553,6 +553,12 @@ static const struct dmi_system_id maingear_laptop[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "RP-15"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Eluktronics Inc."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "MECH-17"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GM6XGxX/TUXEDO Stellaris 16 Gen5 AMD */
|
||||
.matches = {
|
||||
|
||||
@@ -20,13 +20,6 @@
|
||||
DEFINE_RAW_SPINLOCK(i8253_lock);
|
||||
EXPORT_SYMBOL(i8253_lock);
|
||||
|
||||
/*
|
||||
* Handle PIT quirk in pit_shutdown() where zeroing the counter register
|
||||
* restarts the PIT, negating the shutdown. On platforms with the quirk,
|
||||
* platform specific code can set this to false.
|
||||
*/
|
||||
bool i8253_clear_counter_on_shutdown __ro_after_init = true;
|
||||
|
||||
#ifdef CONFIG_CLKSRC_I8253
|
||||
/*
|
||||
* Since the PIT overflows every tick, its not very useful
|
||||
@@ -112,12 +105,33 @@ void clockevent_i8253_disable(void)
|
||||
{
|
||||
raw_spin_lock(&i8253_lock);
|
||||
|
||||
/*
|
||||
* Writing the MODE register should stop the counter, according to
|
||||
* the datasheet. This appears to work on real hardware (well, on
|
||||
* modern Intel and AMD boxes; I didn't dig the Pegasos out of the
|
||||
* shed).
|
||||
*
|
||||
* However, some virtual implementations differ, and the MODE change
|
||||
* doesn't have any effect until either the counter is written (KVM
|
||||
* in-kernel PIT) or the next interrupt (QEMU). And in those cases,
|
||||
* it may not stop the *count*, only the interrupts. Although in
|
||||
* the virt case, that probably doesn't matter, as the value of the
|
||||
* counter will only be calculated on demand if the guest reads it;
|
||||
* it's the interrupts which cause steal time.
|
||||
*
|
||||
* Hyper-V apparently has a bug where even in mode 0, the IRQ keeps
|
||||
* firing repeatedly if the counter is running. But it *does* do the
|
||||
* right thing when the MODE register is written.
|
||||
*
|
||||
* So: write the MODE and then load the counter, which ensures that
|
||||
* the IRQ is stopped on those buggy virt implementations. And then
|
||||
* write the MODE again, which is the right way to stop it.
|
||||
*/
|
||||
outb_p(0x30, PIT_MODE);
|
||||
outb_p(0, PIT_CH0);
|
||||
outb_p(0, PIT_CH0);
|
||||
|
||||
if (i8253_clear_counter_on_shutdown) {
|
||||
outb_p(0, PIT_CH0);
|
||||
outb_p(0, PIT_CH0);
|
||||
}
|
||||
outb_p(0x30, PIT_MODE);
|
||||
|
||||
raw_spin_unlock(&i8253_lock);
|
||||
}
|
||||
|
||||
@@ -310,7 +310,10 @@ static ssize_t ibft_attr_show_nic(void *data, int type, char *buf)
|
||||
str += sprintf_ipaddr(str, nic->ip_addr);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_SUBNET_MASK:
|
||||
val = cpu_to_be32(~((1 << (32-nic->subnet_mask_prefix))-1));
|
||||
if (nic->subnet_mask_prefix > 32)
|
||||
val = cpu_to_be32(~0);
|
||||
else
|
||||
val = cpu_to_be32(~((1 << (32-nic->subnet_mask_prefix))-1));
|
||||
str += sprintf(str, "%pI4", &val);
|
||||
break;
|
||||
case ISCSI_BOOT_ETH_PREFIX_LEN:
|
||||
|
||||
@@ -158,6 +158,7 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
|
||||
return 0;
|
||||
|
||||
err_free_mmio:
|
||||
iounmap(hv->vram);
|
||||
vmbus_free_mmio(hv->mem->start, hv->fb_size);
|
||||
err_vmbus_close:
|
||||
vmbus_close(hdev->channel);
|
||||
@@ -176,6 +177,7 @@ static int hyperv_vmbus_remove(struct hv_device *hdev)
|
||||
vmbus_close(hdev->channel);
|
||||
hv_set_drvdata(hdev, NULL);
|
||||
|
||||
iounmap(hv->vram);
|
||||
vmbus_free_mmio(hv->mem->start, hv->fb_size);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -755,7 +755,6 @@ nouveau_connector_force(struct drm_connector *connector)
|
||||
if (!nv_encoder) {
|
||||
NV_ERROR(drm, "can't find encoder to force %s on!\n",
|
||||
connector->name);
|
||||
connector->status = connector_status_disconnected;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -425,6 +425,7 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
|
||||
hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015)
|
||||
table = magic_keyboard_2015_fn_keys;
|
||||
else if (hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021 ||
|
||||
hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024 ||
|
||||
hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021 ||
|
||||
hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021)
|
||||
table = apple2021_fn_keys;
|
||||
@@ -496,6 +497,9 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
|
||||
}
|
||||
}
|
||||
|
||||
if (usage->hid == 0xc0301) /* Omoton KB066 quirk */
|
||||
code = KEY_F6;
|
||||
|
||||
if (usage->code != code) {
|
||||
input_event_with_scancode(input, usage->type, code, usage->hid, value);
|
||||
|
||||
@@ -1030,6 +1034,10 @@ static const struct hid_device_id apple_devices[] = {
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
|
||||
{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
|
||||
{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
|
||||
{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021),
|
||||
|
||||
@@ -184,6 +184,7 @@
|
||||
#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
|
||||
#define USB_DEVICE_ID_APPLE_IRCONTROL5 0x8243
|
||||
#define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021 0x029c
|
||||
#define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024 0x0320
|
||||
#define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021 0x029a
|
||||
#define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021 0x029f
|
||||
#define USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT 0x8102
|
||||
@@ -1072,6 +1073,7 @@
|
||||
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001 0x3001
|
||||
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3003 0x3003
|
||||
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008
|
||||
#define USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473 0x5473
|
||||
|
||||
#define I2C_VENDOR_ID_RAYDIUM 0x2386
|
||||
#define I2C_PRODUCT_ID_RAYDIUM_4B33 0x4b33
|
||||
|
||||
@@ -882,6 +882,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
|
||||
#endif
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) },
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -517,6 +517,10 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
|
||||
/* ISH FW is dead */
|
||||
if (!ish_is_input_ready(dev))
|
||||
return -EPIPE;
|
||||
|
||||
/* Send clock sync at once after reset */
|
||||
ishtp_dev->prev_sync = 0;
|
||||
|
||||
/*
|
||||
* Set HOST2ISH.ILUP. Apparently we need this BEFORE sending
|
||||
* RESET_NOTIFY_ACK - FW will be checking for it
|
||||
@@ -576,15 +580,14 @@ static void fw_reset_work_fn(struct work_struct *unused)
|
||||
*/
|
||||
static void _ish_sync_fw_clock(struct ishtp_device *dev)
|
||||
{
|
||||
static unsigned long prev_sync;
|
||||
uint64_t usec;
|
||||
struct ipc_time_update_msg time = {};
|
||||
|
||||
if (prev_sync && time_before(jiffies, prev_sync + 20 * HZ))
|
||||
if (dev->prev_sync && time_before(jiffies, dev->prev_sync + 20 * HZ))
|
||||
return;
|
||||
|
||||
prev_sync = jiffies;
|
||||
usec = ktime_to_us(ktime_get_boottime());
|
||||
ipc_send_mng_msg(dev, MNG_SYNC_FW_CLOCK, &usec, sizeof(uint64_t));
|
||||
dev->prev_sync = jiffies;
|
||||
/* The fields of time would be updated while sending message */
|
||||
ipc_send_mng_msg(dev, MNG_SYNC_FW_CLOCK, &time, sizeof(time));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -212,6 +212,8 @@ struct ishtp_device {
|
||||
unsigned int ipc_tx_cnt;
|
||||
unsigned long long ipc_tx_bytes_cnt;
|
||||
|
||||
/* Time of the last clock sync */
|
||||
unsigned long prev_sync;
|
||||
const struct ishtp_hw_ops *ops;
|
||||
size_t mtu;
|
||||
uint32_t ishtp_msg_hdr;
|
||||
|
||||
@@ -2409,12 +2409,25 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size)
|
||||
struct resource *iter;
|
||||
|
||||
mutex_lock(&hyperv_mmio_lock);
|
||||
|
||||
/*
|
||||
* If all bytes of the MMIO range to be released are within the
|
||||
* special case fb_mmio shadow region, skip releasing the shadow
|
||||
* region since no corresponding __request_region() was done
|
||||
* in vmbus_allocate_mmio().
|
||||
*/
|
||||
if (fb_mmio && start >= fb_mmio->start &&
|
||||
(start + size - 1 <= fb_mmio->end))
|
||||
goto skip_shadow_release;
|
||||
|
||||
for (iter = hyperv_mmio; iter; iter = iter->sibling) {
|
||||
if ((iter->start >= start + size) || (iter->end <= start))
|
||||
continue;
|
||||
|
||||
__release_region(iter, start, size);
|
||||
}
|
||||
|
||||
skip_shadow_release:
|
||||
release_mem_region(start, size);
|
||||
mutex_unlock(&hyperv_mmio_lock);
|
||||
|
||||
|
||||
@@ -1238,10 +1238,28 @@ static bool slave_can_set_ns_maddr(const struct bonding *bond, struct slave *sla
|
||||
slave->dev->flags & IFF_MULTICAST;
|
||||
}
|
||||
|
||||
/**
|
||||
* slave_set_ns_maddrs - add/del all NS mac addresses for slave
|
||||
* @bond: bond device
|
||||
* @slave: slave device
|
||||
* @add: add or remove all the NS mac addresses
|
||||
*
|
||||
* This function tries to add or delete all the NS mac addresses on the slave
|
||||
*
|
||||
* Note, the IPv6 NS target address is the unicast address in Neighbor
|
||||
* Solicitation (NS) message. The dest address of NS message should be
|
||||
* solicited-node multicast address of the target. The dest mac of NS message
|
||||
* is converted from the solicited-node multicast address.
|
||||
*
|
||||
* This function is called when
|
||||
* * arp_validate changes
|
||||
* * enslaving, releasing new slaves
|
||||
*/
|
||||
static void slave_set_ns_maddrs(struct bonding *bond, struct slave *slave, bool add)
|
||||
{
|
||||
struct in6_addr *targets = bond->params.ns_targets;
|
||||
char slot_maddr[MAX_ADDR_LEN];
|
||||
struct in6_addr mcaddr;
|
||||
int i;
|
||||
|
||||
if (!slave_can_set_ns_maddr(bond, slave))
|
||||
@@ -1251,7 +1269,8 @@ static void slave_set_ns_maddrs(struct bonding *bond, struct slave *slave, bool
|
||||
if (ipv6_addr_any(&targets[i]))
|
||||
break;
|
||||
|
||||
if (!ndisc_mc_map(&targets[i], slot_maddr, slave->dev, 0)) {
|
||||
addrconf_addr_solict_mult(&targets[i], &mcaddr);
|
||||
if (!ndisc_mc_map(&mcaddr, slot_maddr, slave->dev, 0)) {
|
||||
if (add)
|
||||
dev_mc_add(slave->dev, slot_maddr);
|
||||
else
|
||||
@@ -1274,23 +1293,43 @@ void bond_slave_ns_maddrs_del(struct bonding *bond, struct slave *slave)
|
||||
slave_set_ns_maddrs(bond, slave, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* slave_set_ns_maddr - set new NS mac address for slave
|
||||
* @bond: bond device
|
||||
* @slave: slave device
|
||||
* @target: the new IPv6 target
|
||||
* @slot: the old IPv6 target in the slot
|
||||
*
|
||||
* This function tries to replace the old mac address to new one on the slave.
|
||||
*
|
||||
* Note, the target/slot IPv6 address is the unicast address in Neighbor
|
||||
* Solicitation (NS) message. The dest address of NS message should be
|
||||
* solicited-node multicast address of the target. The dest mac of NS message
|
||||
* is converted from the solicited-node multicast address.
|
||||
*
|
||||
* This function is called when
|
||||
* * An IPv6 NS target is added or removed.
|
||||
*/
|
||||
static void slave_set_ns_maddr(struct bonding *bond, struct slave *slave,
|
||||
struct in6_addr *target, struct in6_addr *slot)
|
||||
{
|
||||
char target_maddr[MAX_ADDR_LEN], slot_maddr[MAX_ADDR_LEN];
|
||||
char mac_addr[MAX_ADDR_LEN];
|
||||
struct in6_addr mcast_addr;
|
||||
|
||||
if (!bond->params.arp_validate || !slave_can_set_ns_maddr(bond, slave))
|
||||
return;
|
||||
|
||||
/* remove the previous maddr from slave */
|
||||
/* remove the previous mac addr from slave */
|
||||
addrconf_addr_solict_mult(slot, &mcast_addr);
|
||||
if (!ipv6_addr_any(slot) &&
|
||||
!ndisc_mc_map(slot, slot_maddr, slave->dev, 0))
|
||||
dev_mc_del(slave->dev, slot_maddr);
|
||||
!ndisc_mc_map(&mcast_addr, mac_addr, slave->dev, 0))
|
||||
dev_mc_del(slave->dev, mac_addr);
|
||||
|
||||
/* add new maddr on slave if target is set */
|
||||
/* add new mac addr on slave if target is set */
|
||||
addrconf_addr_solict_mult(target, &mcast_addr);
|
||||
if (!ipv6_addr_any(target) &&
|
||||
!ndisc_mc_map(target, target_maddr, slave->dev, 0))
|
||||
dev_mc_add(slave->dev, target_maddr);
|
||||
!ndisc_mc_map(&mcast_addr, mac_addr, slave->dev, 0))
|
||||
dev_mc_add(slave->dev, mac_addr);
|
||||
}
|
||||
|
||||
static void _bond_options_ns_ip6_target_set(struct bonding *bond, int slot,
|
||||
|
||||
@@ -2107,13 +2107,11 @@ mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
|
||||
const unsigned char *addr, u16 vid,
|
||||
u8 state)
|
||||
static int mv88e6xxx_port_db_get(struct mv88e6xxx_chip *chip,
|
||||
const unsigned char *addr, u16 vid,
|
||||
u16 *fid, struct mv88e6xxx_atu_entry *entry)
|
||||
{
|
||||
struct mv88e6xxx_atu_entry entry;
|
||||
struct mv88e6xxx_vtu_entry vlan;
|
||||
u16 fid;
|
||||
int err;
|
||||
|
||||
/* Ports have two private address databases: one for when the port is
|
||||
@@ -2124,7 +2122,7 @@ static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
|
||||
* VLAN ID into the port's database used for VLAN-unaware bridging.
|
||||
*/
|
||||
if (vid == 0) {
|
||||
fid = MV88E6XXX_FID_BRIDGED;
|
||||
*fid = MV88E6XXX_FID_BRIDGED;
|
||||
} else {
|
||||
err = mv88e6xxx_vtu_get(chip, vid, &vlan);
|
||||
if (err)
|
||||
@@ -2134,14 +2132,39 @@ static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
|
||||
if (!vlan.valid)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
fid = vlan.fid;
|
||||
*fid = vlan.fid;
|
||||
}
|
||||
|
||||
entry.state = 0;
|
||||
ether_addr_copy(entry.mac, addr);
|
||||
eth_addr_dec(entry.mac);
|
||||
entry->state = 0;
|
||||
ether_addr_copy(entry->mac, addr);
|
||||
eth_addr_dec(entry->mac);
|
||||
|
||||
err = mv88e6xxx_g1_atu_getnext(chip, fid, &entry);
|
||||
return mv88e6xxx_g1_atu_getnext(chip, *fid, entry);
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_port_db_find(struct mv88e6xxx_chip *chip,
|
||||
const unsigned char *addr, u16 vid)
|
||||
{
|
||||
struct mv88e6xxx_atu_entry entry;
|
||||
u16 fid;
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_port_db_get(chip, addr, vid, &fid, &entry);
|
||||
if (err)
|
||||
return false;
|
||||
|
||||
return entry.state && ether_addr_equal(entry.mac, addr);
|
||||
}
|
||||
|
||||
static int mv88e6xxx_port_db_load_purge(struct mv88e6xxx_chip *chip, int port,
|
||||
const unsigned char *addr, u16 vid,
|
||||
u8 state)
|
||||
{
|
||||
struct mv88e6xxx_atu_entry entry;
|
||||
u16 fid;
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_port_db_get(chip, addr, vid, &fid, &entry);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -2739,6 +2762,13 @@ static int mv88e6xxx_port_fdb_add(struct dsa_switch *ds, int port,
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid,
|
||||
MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (!mv88e6xxx_port_db_find(chip, addr, vid))
|
||||
err = -ENOSPC;
|
||||
|
||||
out:
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
|
||||
return err;
|
||||
@@ -6502,6 +6532,13 @@ static int mv88e6xxx_port_mdb_add(struct dsa_switch *ds, int port,
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid,
|
||||
MV88E6XXX_G1_ATU_DATA_STATE_MC_STATIC);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (!mv88e6xxx_port_db_find(chip, mdb->addr, mdb->vid))
|
||||
err = -ENOSPC;
|
||||
|
||||
out:
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -1994,7 +1994,8 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
if (!skb)
|
||||
goto oom_next_rx;
|
||||
} else {
|
||||
skb = bnxt_xdp_build_skb(bp, skb, agg_bufs, rxr->page_pool, &xdp, rxcmp1);
|
||||
skb = bnxt_xdp_build_skb(bp, skb, agg_bufs,
|
||||
rxr->page_pool, &xdp);
|
||||
if (!skb) {
|
||||
/* we should be able to free the old skb here */
|
||||
bnxt_xdp_buff_frags_free(rxr, &xdp);
|
||||
|
||||
@@ -462,20 +462,13 @@ int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp)
|
||||
|
||||
struct sk_buff *
|
||||
bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb, u8 num_frags,
|
||||
struct page_pool *pool, struct xdp_buff *xdp,
|
||||
struct rx_cmp_ext *rxcmp1)
|
||||
struct page_pool *pool, struct xdp_buff *xdp)
|
||||
{
|
||||
struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(xdp);
|
||||
|
||||
if (!skb)
|
||||
return NULL;
|
||||
skb_checksum_none_assert(skb);
|
||||
if (RX_CMP_L4_CS_OK(rxcmp1)) {
|
||||
if (bp->dev->features & NETIF_F_RXCSUM) {
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
skb->csum_level = RX_CMP_ENCAP(rxcmp1);
|
||||
}
|
||||
}
|
||||
|
||||
xdp_update_skb_shared_info(skb, num_frags,
|
||||
sinfo->xdp_frags_size,
|
||||
BNXT_RX_PAGE_SIZE * sinfo->nr_frags,
|
||||
|
||||
@@ -33,6 +33,5 @@ void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
|
||||
struct xdp_buff *xdp);
|
||||
struct sk_buff *bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb,
|
||||
u8 num_frags, struct page_pool *pool,
|
||||
struct xdp_buff *xdp,
|
||||
struct rx_cmp_ext *rxcmp1);
|
||||
struct xdp_buff *xdp);
|
||||
#endif
|
||||
|
||||
@@ -510,7 +510,7 @@ void ice_init_arfs(struct ice_vsi *vsi)
|
||||
struct hlist_head *arfs_fltr_list;
|
||||
unsigned int i;
|
||||
|
||||
if (!vsi || vsi->type != ICE_VSI_PF)
|
||||
if (!vsi || vsi->type != ICE_VSI_PF || ice_is_arfs_active(vsi))
|
||||
return;
|
||||
|
||||
arfs_fltr_list = kcalloc(ICE_MAX_ARFS_LIST, sizeof(*arfs_fltr_list),
|
||||
|
||||
@@ -48,15 +48,10 @@ mlx5_esw_bridge_lag_rep_get(struct net_device *dev, struct mlx5_eswitch *esw)
|
||||
struct list_head *iter;
|
||||
|
||||
netdev_for_each_lower_dev(dev, lower, iter) {
|
||||
struct mlx5_core_dev *mdev;
|
||||
struct mlx5e_priv *priv;
|
||||
|
||||
if (!mlx5e_eswitch_rep(lower))
|
||||
continue;
|
||||
|
||||
priv = netdev_priv(lower);
|
||||
mdev = priv->mdev;
|
||||
if (mlx5_lag_is_shared_fdb(mdev) && mlx5_esw_bridge_dev_same_esw(lower, esw))
|
||||
if (mlx5_esw_bridge_dev_same_esw(lower, esw))
|
||||
return lower;
|
||||
}
|
||||
|
||||
@@ -121,7 +116,7 @@ static bool mlx5_esw_bridge_is_local(struct net_device *dev, struct net_device *
|
||||
priv = netdev_priv(rep);
|
||||
mdev = priv->mdev;
|
||||
if (netif_is_lag_master(dev))
|
||||
return mlx5_lag_is_shared_fdb(mdev) && mlx5_lag_is_master(mdev);
|
||||
return mlx5_lag_is_master(mdev);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -436,6 +431,9 @@ static int mlx5_esw_bridge_switchdev_event(struct notifier_block *nb,
|
||||
if (!rep)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (netif_is_lag_master(dev) && !mlx5_lag_is_shared_fdb(esw->dev))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
switch (event) {
|
||||
case SWITCHDEV_FDB_ADD_TO_BRIDGE:
|
||||
fdb_info = container_of(info,
|
||||
|
||||
@@ -4791,11 +4791,9 @@ static int mlx5e_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
u8 mode, setting;
|
||||
int err;
|
||||
|
||||
err = mlx5_eswitch_get_vepa(mdev->priv.eswitch, &setting);
|
||||
if (err)
|
||||
return err;
|
||||
if (mlx5_eswitch_get_vepa(mdev->priv.eswitch, &setting))
|
||||
return -EOPNOTSUPP;
|
||||
mode = setting ? BRIDGE_MODE_VEPA : BRIDGE_MODE_VEB;
|
||||
return ndo_dflt_bridge_getlink(skb, pid, seq, dev,
|
||||
mode,
|
||||
|
||||
@@ -196,6 +196,11 @@ mlx5_chains_create_table(struct mlx5_fs_chains *chains,
|
||||
ns = mlx5_get_flow_namespace(chains->dev, chains->ns);
|
||||
}
|
||||
|
||||
if (!ns) {
|
||||
mlx5_core_warn(chains->dev, "Failed to get flow namespace\n");
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
ft_attr.autogroup.num_reserved_entries = 2;
|
||||
ft_attr.autogroup.max_num_groups = chains->group_num;
|
||||
ft = mlx5_create_auto_grouped_flow_table(ns, &ft_attr);
|
||||
|
||||
@@ -543,6 +543,7 @@ static int mctp_i2c_header_create(struct sk_buff *skb, struct net_device *dev,
|
||||
struct mctp_i2c_hdr *hdr;
|
||||
struct mctp_hdr *mhdr;
|
||||
u8 lldst, llsrc;
|
||||
int rc;
|
||||
|
||||
if (len > MCTP_I2C_MAXMTU)
|
||||
return -EMSGSIZE;
|
||||
@@ -553,6 +554,10 @@ static int mctp_i2c_header_create(struct sk_buff *skb, struct net_device *dev,
|
||||
lldst = *((u8 *)daddr);
|
||||
llsrc = *((u8 *)saddr);
|
||||
|
||||
rc = skb_cow_head(skb, sizeof(struct mctp_i2c_hdr));
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
skb_push(skb, sizeof(struct mctp_i2c_hdr));
|
||||
skb_reset_mac_header(skb);
|
||||
hdr = (void *)skb_mac_header(skb);
|
||||
|
||||
@@ -209,7 +209,7 @@ static int mbim_rx_verify_nth16(struct mhi_mbim_context *mbim, struct sk_buff *s
|
||||
if (mbim->rx_seq + 1 != le16_to_cpu(nth16->wSequence) &&
|
||||
(mbim->rx_seq || le16_to_cpu(nth16->wSequence)) &&
|
||||
!(mbim->rx_seq == 0xffff && !le16_to_cpu(nth16->wSequence))) {
|
||||
net_err_ratelimited("sequence number glitch prev=%d curr=%d\n",
|
||||
net_dbg_ratelimited("sequence number glitch prev=%d curr=%d\n",
|
||||
mbim->rx_seq, le16_to_cpu(nth16->wSequence));
|
||||
}
|
||||
mbim->rx_seq = le16_to_cpu(nth16->wSequence);
|
||||
|
||||
@@ -501,8 +501,6 @@ bool nvme_change_ctrl_state(struct nvme_ctrl *ctrl,
|
||||
switch (new_state) {
|
||||
case NVME_CTRL_LIVE:
|
||||
switch (old_state) {
|
||||
case NVME_CTRL_NEW:
|
||||
case NVME_CTRL_RESETTING:
|
||||
case NVME_CTRL_CONNECTING:
|
||||
changed = true;
|
||||
fallthrough;
|
||||
|
||||
@@ -3525,8 +3525,7 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
|
||||
list_add_tail(&ctrl->ctrl_list, &rport->ctrl_list);
|
||||
spin_unlock_irqrestore(&rport->lock, flags);
|
||||
|
||||
if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_RESETTING) ||
|
||||
!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING)) {
|
||||
if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING)) {
|
||||
dev_err(ctrl->ctrl.device,
|
||||
"NVME-FC{%d}: failed to init ctrl state\n", ctrl->cnum);
|
||||
goto fail_ctrl;
|
||||
|
||||
@@ -3578,6 +3578,8 @@ static const struct pci_device_id nvme_id_table[] = {
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1cc1, 0x5350), /* ADATA XPG GAMMIX S50 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1dbe, 0x5216), /* Acer/INNOGRIT FA100/5216 NVMe SSD */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1dbe, 0x5236), /* ADATA XPG GAMMIX S70 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1e49, 0x0021), /* ZHITAI TiPro5000 NVMe SSD */
|
||||
|
||||
@@ -694,6 +694,40 @@ static int nvme_tcp_handle_r2t(struct nvme_tcp_queue *queue,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nvme_tcp_handle_c2h_term(struct nvme_tcp_queue *queue,
|
||||
struct nvme_tcp_term_pdu *pdu)
|
||||
{
|
||||
u16 fes;
|
||||
const char *msg;
|
||||
u32 plen = le32_to_cpu(pdu->hdr.plen);
|
||||
|
||||
static const char * const msg_table[] = {
|
||||
[NVME_TCP_FES_INVALID_PDU_HDR] = "Invalid PDU Header Field",
|
||||
[NVME_TCP_FES_PDU_SEQ_ERR] = "PDU Sequence Error",
|
||||
[NVME_TCP_FES_HDR_DIGEST_ERR] = "Header Digest Error",
|
||||
[NVME_TCP_FES_DATA_OUT_OF_RANGE] = "Data Transfer Out Of Range",
|
||||
[NVME_TCP_FES_R2T_LIMIT_EXCEEDED] = "R2T Limit Exceeded",
|
||||
[NVME_TCP_FES_UNSUPPORTED_PARAM] = "Unsupported Parameter",
|
||||
};
|
||||
|
||||
if (plen < NVME_TCP_MIN_C2HTERM_PLEN ||
|
||||
plen > NVME_TCP_MAX_C2HTERM_PLEN) {
|
||||
dev_err(queue->ctrl->ctrl.device,
|
||||
"Received a malformed C2HTermReq PDU (plen = %u)\n",
|
||||
plen);
|
||||
return;
|
||||
}
|
||||
|
||||
fes = le16_to_cpu(pdu->fes);
|
||||
if (fes && fes < ARRAY_SIZE(msg_table))
|
||||
msg = msg_table[fes];
|
||||
else
|
||||
msg = "Unknown";
|
||||
|
||||
dev_err(queue->ctrl->ctrl.device,
|
||||
"Received C2HTermReq (FES = %s)\n", msg);
|
||||
}
|
||||
|
||||
static int nvme_tcp_recv_pdu(struct nvme_tcp_queue *queue, struct sk_buff *skb,
|
||||
unsigned int *offset, size_t *len)
|
||||
{
|
||||
@@ -715,6 +749,15 @@ static int nvme_tcp_recv_pdu(struct nvme_tcp_queue *queue, struct sk_buff *skb,
|
||||
return 0;
|
||||
|
||||
hdr = queue->pdu;
|
||||
if (unlikely(hdr->type == nvme_tcp_c2h_term)) {
|
||||
/*
|
||||
* C2HTermReq never includes Header or Data digests.
|
||||
* Skip the checks.
|
||||
*/
|
||||
nvme_tcp_handle_c2h_term(queue, (void *)queue->pdu);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (queue->hdr_digest) {
|
||||
ret = nvme_tcp_verify_hdgst(queue, queue->pdu, hdr->hlen);
|
||||
if (unlikely(ret))
|
||||
|
||||
@@ -997,6 +997,27 @@ out_err:
|
||||
nvmet_req_complete(&cmd->req, status);
|
||||
}
|
||||
|
||||
static bool nvmet_rdma_recv_not_live(struct nvmet_rdma_queue *queue,
|
||||
struct nvmet_rdma_rsp *rsp)
|
||||
{
|
||||
unsigned long flags;
|
||||
bool ret = true;
|
||||
|
||||
spin_lock_irqsave(&queue->state_lock, flags);
|
||||
/*
|
||||
* recheck queue state is not live to prevent a race condition
|
||||
* with RDMA_CM_EVENT_ESTABLISHED handler.
|
||||
*/
|
||||
if (queue->state == NVMET_RDMA_Q_LIVE)
|
||||
ret = false;
|
||||
else if (queue->state == NVMET_RDMA_Q_CONNECTING)
|
||||
list_add_tail(&rsp->wait_list, &queue->rsp_wait_list);
|
||||
else
|
||||
nvmet_rdma_put_rsp(rsp);
|
||||
spin_unlock_irqrestore(&queue->state_lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void nvmet_rdma_recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
{
|
||||
struct nvmet_rdma_cmd *cmd =
|
||||
@@ -1038,17 +1059,9 @@ static void nvmet_rdma_recv_done(struct ib_cq *cq, struct ib_wc *wc)
|
||||
rsp->req.port = queue->port;
|
||||
rsp->n_rdma = 0;
|
||||
|
||||
if (unlikely(queue->state != NVMET_RDMA_Q_LIVE)) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&queue->state_lock, flags);
|
||||
if (queue->state == NVMET_RDMA_Q_CONNECTING)
|
||||
list_add_tail(&rsp->wait_list, &queue->rsp_wait_list);
|
||||
else
|
||||
nvmet_rdma_put_rsp(rsp);
|
||||
spin_unlock_irqrestore(&queue->state_lock, flags);
|
||||
if (unlikely(queue->state != NVMET_RDMA_Q_LIVE) &&
|
||||
nvmet_rdma_recv_not_live(queue, rsp))
|
||||
return;
|
||||
}
|
||||
|
||||
nvmet_rdma_handle_command(queue, rsp);
|
||||
}
|
||||
|
||||
@@ -971,7 +971,7 @@ static const struct regmap_config bcm281xx_pinctrl_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = BCM281XX_PIN_VC_CAM3_SDA,
|
||||
.max_register = BCM281XX_PIN_VC_CAM3_SDA * 4,
|
||||
};
|
||||
|
||||
static int bcm281xx_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
|
||||
|
||||
@@ -8161,6 +8161,7 @@ static struct ibm_struct volume_driver_data = {
|
||||
|
||||
#define FAN_NS_CTRL_STATUS BIT(2) /* Bit which determines control is enabled or not */
|
||||
#define FAN_NS_CTRL BIT(4) /* Bit which determines control is by host or EC */
|
||||
#define FAN_CLOCK_TPM (22500*60) /* Ticks per minute for a 22.5 kHz clock */
|
||||
|
||||
enum { /* Fan control constants */
|
||||
fan_status_offset = 0x2f, /* EC register 0x2f */
|
||||
@@ -8214,6 +8215,7 @@ static int fan_watchdog_maxinterval;
|
||||
|
||||
static bool fan_with_ns_addr;
|
||||
static bool ecfw_with_fan_dec_rpm;
|
||||
static bool fan_speed_in_tpr;
|
||||
|
||||
static struct mutex fan_mutex;
|
||||
|
||||
@@ -8396,8 +8398,11 @@ static int fan_get_speed(unsigned int *speed)
|
||||
!acpi_ec_read(fan_rpm_offset + 1, &hi)))
|
||||
return -EIO;
|
||||
|
||||
if (likely(speed))
|
||||
if (likely(speed)) {
|
||||
*speed = (hi << 8) | lo;
|
||||
if (fan_speed_in_tpr && *speed != 0)
|
||||
*speed = FAN_CLOCK_TPM / *speed;
|
||||
}
|
||||
break;
|
||||
case TPACPI_FAN_RD_TPEC_NS:
|
||||
if (!acpi_ec_read(fan_rpm_status_ns, &lo))
|
||||
@@ -8430,8 +8435,11 @@ static int fan2_get_speed(unsigned int *speed)
|
||||
if (rc)
|
||||
return -EIO;
|
||||
|
||||
if (likely(speed))
|
||||
if (likely(speed)) {
|
||||
*speed = (hi << 8) | lo;
|
||||
if (fan_speed_in_tpr && *speed != 0)
|
||||
*speed = FAN_CLOCK_TPM / *speed;
|
||||
}
|
||||
break;
|
||||
|
||||
case TPACPI_FAN_RD_TPEC_NS:
|
||||
@@ -8959,6 +8967,7 @@ static const struct attribute_group fan_driver_attr_group = {
|
||||
#define TPACPI_FAN_NOFAN 0x0008 /* no fan available */
|
||||
#define TPACPI_FAN_NS 0x0010 /* For EC with non-Standard register addresses */
|
||||
#define TPACPI_FAN_DECRPM 0x0020 /* For ECFW's with RPM in register as decimal */
|
||||
#define TPACPI_FAN_TPR 0x0040 /* Fan speed is in Ticks Per Revolution */
|
||||
|
||||
static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
|
||||
TPACPI_QEC_IBM('1', 'Y', TPACPI_FAN_Q1),
|
||||
@@ -8981,6 +8990,7 @@ static const struct tpacpi_quirk fan_quirk_table[] __initconst = {
|
||||
TPACPI_Q_LNV3('N', '2', 'U', TPACPI_FAN_NS), /* X13 Yoga Gen 2*/
|
||||
TPACPI_Q_LNV3('N', '1', 'O', TPACPI_FAN_NOFAN), /* X1 Tablet (2nd gen) */
|
||||
TPACPI_Q_LNV3('R', '0', 'Q', TPACPI_FAN_DECRPM),/* L480 */
|
||||
TPACPI_Q_LNV('8', 'F', TPACPI_FAN_TPR), /* ThinkPad x120e */
|
||||
};
|
||||
|
||||
static int __init fan_init(struct ibm_init_struct *iibm)
|
||||
@@ -9044,6 +9054,8 @@ static int __init fan_init(struct ibm_init_struct *iibm)
|
||||
|
||||
if (quirks & TPACPI_FAN_Q1)
|
||||
fan_quirk1_setup();
|
||||
if (quirks & TPACPI_FAN_TPR)
|
||||
fan_speed_in_tpr = true;
|
||||
/* Try and probe the 2nd fan */
|
||||
tp_features.second_fan = 1; /* needed for get_speed to work */
|
||||
res = fan2_get_speed(&speed);
|
||||
@@ -10473,6 +10485,10 @@ static struct ibm_struct proxsensor_driver_data = {
|
||||
#define DYTC_MODE_PSC_BALANCE 5 /* Default mode aka balanced */
|
||||
#define DYTC_MODE_PSC_PERFORM 7 /* High power mode aka performance */
|
||||
|
||||
#define DYTC_MODE_PSCV9_LOWPOWER 1 /* Low power mode */
|
||||
#define DYTC_MODE_PSCV9_BALANCE 3 /* Default mode aka balanced */
|
||||
#define DYTC_MODE_PSCV9_PERFORM 4 /* High power mode aka performance */
|
||||
|
||||
#define DYTC_ERR_MASK 0xF /* Bits 0-3 in cmd result are the error result */
|
||||
#define DYTC_ERR_SUCCESS 1 /* CMD completed successful */
|
||||
|
||||
@@ -10493,6 +10509,10 @@ static int dytc_capabilities;
|
||||
static bool dytc_mmc_get_available;
|
||||
static int profile_force;
|
||||
|
||||
static int platform_psc_profile_lowpower = DYTC_MODE_PSC_LOWPOWER;
|
||||
static int platform_psc_profile_balanced = DYTC_MODE_PSC_BALANCE;
|
||||
static int platform_psc_profile_performance = DYTC_MODE_PSC_PERFORM;
|
||||
|
||||
static int convert_dytc_to_profile(int funcmode, int dytcmode,
|
||||
enum platform_profile_option *profile)
|
||||
{
|
||||
@@ -10514,19 +10534,15 @@ static int convert_dytc_to_profile(int funcmode, int dytcmode,
|
||||
}
|
||||
return 0;
|
||||
case DYTC_FUNCTION_PSC:
|
||||
switch (dytcmode) {
|
||||
case DYTC_MODE_PSC_LOWPOWER:
|
||||
if (dytcmode == platform_psc_profile_lowpower)
|
||||
*profile = PLATFORM_PROFILE_LOW_POWER;
|
||||
break;
|
||||
case DYTC_MODE_PSC_BALANCE:
|
||||
else if (dytcmode == platform_psc_profile_balanced)
|
||||
*profile = PLATFORM_PROFILE_BALANCED;
|
||||
break;
|
||||
case DYTC_MODE_PSC_PERFORM:
|
||||
else if (dytcmode == platform_psc_profile_performance)
|
||||
*profile = PLATFORM_PROFILE_PERFORMANCE;
|
||||
break;
|
||||
default: /* Unknown mode */
|
||||
else
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
case DYTC_FUNCTION_AMT:
|
||||
/* For now return balanced. It's the closest we have to 'auto' */
|
||||
@@ -10547,19 +10563,19 @@ static int convert_profile_to_dytc(enum platform_profile_option profile, int *pe
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC))
|
||||
*perfmode = DYTC_MODE_MMC_LOWPOWER;
|
||||
else if (dytc_capabilities & BIT(DYTC_FC_PSC))
|
||||
*perfmode = DYTC_MODE_PSC_LOWPOWER;
|
||||
*perfmode = platform_psc_profile_lowpower;
|
||||
break;
|
||||
case PLATFORM_PROFILE_BALANCED:
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC))
|
||||
*perfmode = DYTC_MODE_MMC_BALANCE;
|
||||
else if (dytc_capabilities & BIT(DYTC_FC_PSC))
|
||||
*perfmode = DYTC_MODE_PSC_BALANCE;
|
||||
*perfmode = platform_psc_profile_balanced;
|
||||
break;
|
||||
case PLATFORM_PROFILE_PERFORMANCE:
|
||||
if (dytc_capabilities & BIT(DYTC_FC_MMC))
|
||||
*perfmode = DYTC_MODE_MMC_PERFORM;
|
||||
else if (dytc_capabilities & BIT(DYTC_FC_PSC))
|
||||
*perfmode = DYTC_MODE_PSC_PERFORM;
|
||||
*perfmode = platform_psc_profile_performance;
|
||||
break;
|
||||
default: /* Unknown profile */
|
||||
return -EOPNOTSUPP;
|
||||
@@ -10748,6 +10764,7 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
|
||||
if (output & BIT(DYTC_QUERY_ENABLE_BIT))
|
||||
dytc_version = (output >> DYTC_QUERY_REV_BIT) & 0xF;
|
||||
|
||||
dbg_printk(TPACPI_DBG_INIT, "DYTC version %d\n", dytc_version);
|
||||
/* Check DYTC is enabled and supports mode setting */
|
||||
if (dytc_version < 5)
|
||||
return -ENODEV;
|
||||
@@ -10786,6 +10803,11 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
|
||||
}
|
||||
} else if (dytc_capabilities & BIT(DYTC_FC_PSC)) { /* PSC MODE */
|
||||
pr_debug("PSC is supported\n");
|
||||
if (dytc_version >= 9) { /* update profiles for DYTC 9 and up */
|
||||
platform_psc_profile_lowpower = DYTC_MODE_PSCV9_LOWPOWER;
|
||||
platform_psc_profile_balanced = DYTC_MODE_PSCV9_BALANCE;
|
||||
platform_psc_profile_performance = DYTC_MODE_PSCV9_PERFORM;
|
||||
}
|
||||
} else {
|
||||
dbg_printk(TPACPI_DBG_INIT, "No DYTC support available\n");
|
||||
return -ENODEV;
|
||||
|
||||
@@ -626,8 +626,7 @@ struct powercap_control_type *powercap_register_control_type(
|
||||
dev_set_name(&control_type->dev, "%s", name);
|
||||
result = device_register(&control_type->dev);
|
||||
if (result) {
|
||||
if (control_type->allocated)
|
||||
kfree(control_type);
|
||||
put_device(&control_type->dev);
|
||||
return ERR_PTR(result);
|
||||
}
|
||||
idr_init(&control_type->idr);
|
||||
|
||||
@@ -661,7 +661,8 @@ static int info_update(void)
|
||||
if (time_after(jiffies, chp_info_expires)) {
|
||||
/* Data is too old, update. */
|
||||
rc = sclp_chp_read_info(&chp_info);
|
||||
chp_info_expires = jiffies + CHP_INFO_UPDATE_INTERVAL ;
|
||||
if (!rc)
|
||||
chp_info_expires = jiffies + CHP_INFO_UPDATE_INTERVAL;
|
||||
}
|
||||
mutex_unlock(&info_lock);
|
||||
|
||||
|
||||
@@ -2866,7 +2866,7 @@ qla1280_64bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)
|
||||
dprintk(3, "S/G Segment phys_addr=%x %x, len=0x%x\n",
|
||||
cpu_to_le32(upper_32_bits(dma_handle)),
|
||||
cpu_to_le32(lower_32_bits(dma_handle)),
|
||||
cpu_to_le32(sg_dma_len(sg_next(s))));
|
||||
cpu_to_le32(sg_dma_len(s)));
|
||||
remseg--;
|
||||
}
|
||||
dprintk(5, "qla1280_64bit_start_scsi: Scatter/gather "
|
||||
|
||||
@@ -245,7 +245,7 @@ static int scsi_realloc_sdev_budget_map(struct scsi_device *sdev,
|
||||
}
|
||||
ret = sbitmap_init_node(&sdev->budget_map,
|
||||
scsi_device_max_queue_depth(sdev),
|
||||
new_shift, GFP_KERNEL,
|
||||
new_shift, GFP_NOIO,
|
||||
sdev->request_queue->node, false, true);
|
||||
if (!ret)
|
||||
sbitmap_resize(&sdev->budget_map, depth);
|
||||
|
||||
@@ -58,8 +58,6 @@ struct time_in_idle {
|
||||
* @max_level: maximum cooling level. One less than total number of valid
|
||||
* cpufreq frequencies.
|
||||
* @em: Reference on the Energy Model of the device
|
||||
* @cdev: thermal_cooling_device pointer to keep track of the
|
||||
* registered cooling device.
|
||||
* @policy: cpufreq policy.
|
||||
* @cooling_ops: cpufreq callbacks to thermal cooling device ops
|
||||
* @idle_time: idle time stats
|
||||
|
||||
@@ -1106,7 +1106,7 @@ static void hvfb_putmem(struct hv_device *hdev, struct fb_info *info)
|
||||
|
||||
if (par->need_docopy) {
|
||||
vfree(par->dio_vp);
|
||||
iounmap(info->screen_base);
|
||||
iounmap(par->mmio_vp);
|
||||
vmbus_free_mmio(par->mem->start, screen_fb_size);
|
||||
} else {
|
||||
hvfb_release_phymem(hdev, info->fix.smem_start,
|
||||
|
||||
@@ -112,7 +112,7 @@ static int is_xen_swiotlb_buffer(struct device *dev, dma_addr_t dma_addr)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
int xen_swiotlb_fixup(void *buf, unsigned long nslabs)
|
||||
int __init xen_swiotlb_fixup(void *buf, unsigned long nslabs)
|
||||
{
|
||||
int rc;
|
||||
unsigned int order = get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT);
|
||||
|
||||
@@ -1786,7 +1786,7 @@ static const char *fuse_get_link(struct dentry *dentry, struct inode *inode,
|
||||
#endif
|
||||
|
||||
if (fc->cache_symlinks)
|
||||
return page_get_link(dentry, inode, callback);
|
||||
return page_get_link_raw(dentry, inode, callback);
|
||||
|
||||
err = -ECHILD;
|
||||
if (!dentry)
|
||||
|
||||
24
fs/namei.c
24
fs/namei.c
@@ -5155,10 +5155,9 @@ const char *vfs_get_link(struct dentry *dentry, struct delayed_call *done)
|
||||
EXPORT_SYMBOL(vfs_get_link);
|
||||
|
||||
/* get the link contents into pagecache */
|
||||
const char *page_get_link(struct dentry *dentry, struct inode *inode,
|
||||
struct delayed_call *callback)
|
||||
static char *__page_get_link(struct dentry *dentry, struct inode *inode,
|
||||
struct delayed_call *callback)
|
||||
{
|
||||
char *kaddr;
|
||||
struct page *page;
|
||||
struct address_space *mapping = inode->i_mapping;
|
||||
|
||||
@@ -5177,8 +5176,23 @@ const char *page_get_link(struct dentry *dentry, struct inode *inode,
|
||||
}
|
||||
set_delayed_call(callback, page_put_link, page);
|
||||
BUG_ON(mapping_gfp_mask(mapping) & __GFP_HIGHMEM);
|
||||
kaddr = page_address(page);
|
||||
nd_terminate_link(kaddr, inode->i_size, PAGE_SIZE - 1);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
const char *page_get_link_raw(struct dentry *dentry, struct inode *inode,
|
||||
struct delayed_call *callback)
|
||||
{
|
||||
return __page_get_link(dentry, inode, callback);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(page_get_link_raw);
|
||||
|
||||
const char *page_get_link(struct dentry *dentry, struct inode *inode,
|
||||
struct delayed_call *callback)
|
||||
{
|
||||
char *kaddr = __page_get_link(dentry, inode, callback);
|
||||
|
||||
if (!IS_ERR(kaddr))
|
||||
nd_terminate_link(kaddr, inode->i_size, PAGE_SIZE - 1);
|
||||
return kaddr;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,9 +43,11 @@ enum utf16_endian;
|
||||
#define MINUS_ONE_T ((size_t)(-1))
|
||||
/* Biggest MFT / smallest cluster */
|
||||
#define MAXIMUM_BYTES_PER_MFT 4096
|
||||
#define MAXIMUM_SHIFT_BYTES_PER_MFT 12
|
||||
#define NTFS_BLOCKS_PER_MFT_RECORD (MAXIMUM_BYTES_PER_MFT / 512)
|
||||
|
||||
#define MAXIMUM_BYTES_PER_INDEX 4096
|
||||
#define MAXIMUM_SHIFT_BYTES_PER_INDEX 12
|
||||
#define NTFS_BLOCKS_PER_INODE (MAXIMUM_BYTES_PER_INDEX / 512)
|
||||
|
||||
/* NTFS specific error code when fixup failed. */
|
||||
|
||||
@@ -680,7 +680,7 @@ static u32 true_sectors_per_clst(const struct NTFS_BOOT *boot)
|
||||
* ntfs_init_from_boot - Init internal info from on-disk boot sector.
|
||||
*/
|
||||
static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
u64 dev_size)
|
||||
u64 dev_size)
|
||||
{
|
||||
struct ntfs_sb_info *sbi = sb->s_fs_info;
|
||||
int err;
|
||||
@@ -705,12 +705,12 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
|
||||
/* 0x55AA is not mandaroty. Thanks Maxim Suhanov*/
|
||||
/*if (0x55 != boot->boot_magic[0] || 0xAA != boot->boot_magic[1])
|
||||
* goto out;
|
||||
* goto out;
|
||||
*/
|
||||
|
||||
boot_sector_size = (u32)boot->bytes_per_sector[1] << 8;
|
||||
if (boot->bytes_per_sector[0] || boot_sector_size < SECTOR_SIZE ||
|
||||
!is_power_of_2(boot_sector_size)) {
|
||||
!is_power_of_2(boot_sector_size)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -733,15 +733,49 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
|
||||
/* Check MFT record size. */
|
||||
if ((boot->record_size < 0 &&
|
||||
SECTOR_SIZE > (2U << (-boot->record_size))) ||
|
||||
(boot->record_size >= 0 && !is_power_of_2(boot->record_size))) {
|
||||
SECTOR_SIZE > (2U << (-boot->record_size))) ||
|
||||
(boot->record_size >= 0 && !is_power_of_2(boot->record_size))) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Calculate cluster size */
|
||||
sbi->cluster_size = boot_sector_size * sct_per_clst;
|
||||
sbi->cluster_bits = blksize_bits(sbi->cluster_size);
|
||||
|
||||
if (boot->record_size >= 0) {
|
||||
record_size = (u32)boot->record_size << sbi->cluster_bits;
|
||||
} else if (-boot->record_size <= MAXIMUM_SHIFT_BYTES_PER_MFT) {
|
||||
record_size = 1u << (-boot->record_size);
|
||||
} else {
|
||||
ntfs_err(sb, "%s: invalid record size %d.", "NTFS",
|
||||
boot->record_size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
sbi->record_size = record_size;
|
||||
sbi->record_bits = blksize_bits(record_size);
|
||||
sbi->attr_size_tr = (5 * record_size >> 4); // ~320 bytes
|
||||
|
||||
if (record_size > MAXIMUM_BYTES_PER_MFT) {
|
||||
ntfs_err(sb, "Unsupported bytes per MFT record %u.",
|
||||
record_size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (boot->index_size >= 0) {
|
||||
sbi->index_size = (u32)boot->index_size << sbi->cluster_bits;
|
||||
} else if (-boot->index_size <= MAXIMUM_SHIFT_BYTES_PER_INDEX) {
|
||||
sbi->index_size = 1u << (-boot->index_size);
|
||||
} else {
|
||||
ntfs_err(sb, "%s: invalid index size %d.", "NTFS",
|
||||
boot->index_size);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check index record size. */
|
||||
if ((boot->index_size < 0 &&
|
||||
SECTOR_SIZE > (2U << (-boot->index_size))) ||
|
||||
(boot->index_size >= 0 && !is_power_of_2(boot->index_size))) {
|
||||
SECTOR_SIZE > (2U << (-boot->index_size))) ||
|
||||
(boot->index_size >= 0 && !is_power_of_2(boot->index_size))) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -762,9 +796,6 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
dev_size += sector_size - 1;
|
||||
}
|
||||
|
||||
sbi->cluster_size = boot_sector_size * sct_per_clst;
|
||||
sbi->cluster_bits = blksize_bits(sbi->cluster_size);
|
||||
|
||||
sbi->mft.lbo = mlcn << sbi->cluster_bits;
|
||||
sbi->mft.lbo2 = mlcn2 << sbi->cluster_bits;
|
||||
|
||||
@@ -785,9 +816,9 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
sbi->cluster_mask = sbi->cluster_size - 1;
|
||||
sbi->cluster_mask_inv = ~(u64)sbi->cluster_mask;
|
||||
sbi->record_size = record_size = boot->record_size < 0
|
||||
? 1 << (-boot->record_size)
|
||||
: (u32)boot->record_size
|
||||
<< sbi->cluster_bits;
|
||||
? 1 << (-boot->record_size)
|
||||
: (u32)boot->record_size
|
||||
<< sbi->cluster_bits;
|
||||
|
||||
if (record_size > MAXIMUM_BYTES_PER_MFT || record_size < SECTOR_SIZE)
|
||||
goto out;
|
||||
@@ -801,8 +832,8 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
ALIGN(sizeof(enum ATTR_TYPE), 8);
|
||||
|
||||
sbi->index_size = boot->index_size < 0
|
||||
? 1u << (-boot->index_size)
|
||||
: (u32)boot->index_size << sbi->cluster_bits;
|
||||
? 1u << (-boot->index_size)
|
||||
: (u32)boot->index_size << sbi->cluster_bits;
|
||||
|
||||
sbi->volume.ser_num = le64_to_cpu(boot->serial_num);
|
||||
|
||||
@@ -871,13 +902,6 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
|
||||
sb->s_maxbytes = 0xFFFFFFFFull << sbi->cluster_bits;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compute the MFT zone at two steps.
|
||||
* It would be nice if we are able to allocate 1/8 of
|
||||
* total clusters for MFT but not more then 512 MB.
|
||||
*/
|
||||
sbi->zone_max = min_t(CLST, 0x20000000 >> sbi->cluster_bits, clusters >> 3);
|
||||
|
||||
err = 0;
|
||||
|
||||
out:
|
||||
|
||||
@@ -2644,10 +2644,11 @@ static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,
|
||||
}
|
||||
|
||||
task_lock(p);
|
||||
if (slack_ns == 0)
|
||||
p->timer_slack_ns = p->default_timer_slack_ns;
|
||||
else
|
||||
p->timer_slack_ns = slack_ns;
|
||||
if (task_is_realtime(p))
|
||||
slack_ns = 0;
|
||||
else if (slack_ns == 0)
|
||||
slack_ns = p->default_timer_slack_ns;
|
||||
p->timer_slack_ns = slack_ns;
|
||||
task_unlock(p);
|
||||
|
||||
out:
|
||||
|
||||
11
fs/select.c
11
fs/select.c
@@ -77,19 +77,16 @@ u64 select_estimate_accuracy(struct timespec64 *tv)
|
||||
{
|
||||
u64 ret;
|
||||
struct timespec64 now;
|
||||
u64 slack = current->timer_slack_ns;
|
||||
|
||||
/*
|
||||
* Realtime tasks get a slack of 0 for obvious reasons.
|
||||
*/
|
||||
|
||||
if (rt_task(current))
|
||||
if (slack == 0)
|
||||
return 0;
|
||||
|
||||
ktime_get_ts64(&now);
|
||||
now = timespec64_sub(*tv, now);
|
||||
ret = __estimate_accuracy(&now);
|
||||
if (ret < current->timer_slack_ns)
|
||||
return current->timer_slack_ns;
|
||||
if (ret < slack)
|
||||
return slack;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1999,7 +1999,7 @@ tcon_exit:
|
||||
|
||||
tcon_error_exit:
|
||||
if (rsp && rsp->hdr.Status == STATUS_BAD_NETWORK_NAME)
|
||||
cifs_tcon_dbg(VFS, "BAD_NETWORK_NAME: %s\n", tree);
|
||||
cifs_dbg(VFS | ONCE, "BAD_NETWORK_NAME: %s\n", tree);
|
||||
goto tcon_exit;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
|
||||
#define VBOXSF_SUPER_MAGIC 0x786f4256 /* 'VBox' little endian */
|
||||
|
||||
static const unsigned char VBSF_MOUNT_SIGNATURE[4] = "\000\377\376\375";
|
||||
static const unsigned char VBSF_MOUNT_SIGNATURE[4] = { '\000', '\377', '\376',
|
||||
'\375' };
|
||||
|
||||
static int follow_symlinks;
|
||||
module_param(follow_symlinks, int, 0444);
|
||||
|
||||
@@ -3395,6 +3395,8 @@ extern const struct file_operations generic_ro_fops;
|
||||
|
||||
extern int readlink_copy(char __user *, int, const char *);
|
||||
extern int page_readlink(struct dentry *, char __user *, int);
|
||||
extern const char *page_get_link_raw(struct dentry *, struct inode *,
|
||||
struct delayed_call *);
|
||||
extern const char *page_get_link(struct dentry *, struct inode *,
|
||||
struct delayed_call *);
|
||||
extern void page_put_link(void *);
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#define PIT_LATCH ((PIT_TICK_RATE + HZ/2) / HZ)
|
||||
|
||||
extern raw_spinlock_t i8253_lock;
|
||||
extern bool i8253_clear_counter_on_shutdown;
|
||||
extern struct clock_event_device i8253_clockevent;
|
||||
extern void clockevent_i8253_init(bool oneshot);
|
||||
extern void clockevent_i8253_disable(void);
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#define NVME_TCP_ADMIN_CCSZ SZ_8K
|
||||
#define NVME_TCP_DIGEST_LENGTH 4
|
||||
#define NVME_TCP_MIN_MAXH2CDATA 4096
|
||||
#define NVME_TCP_MIN_C2HTERM_PLEN 24
|
||||
#define NVME_TCP_MAX_C2HTERM_PLEN 152
|
||||
|
||||
enum nvme_tcp_pfv {
|
||||
NVME_TCP_PFV_1_0 = 0x0,
|
||||
|
||||
@@ -1019,10 +1019,11 @@ void wake_up_q(struct wake_q_head *head)
|
||||
struct task_struct *task;
|
||||
|
||||
task = container_of(node, struct task_struct, wake_q);
|
||||
/* Task can safely be re-inserted now: */
|
||||
node = node->next;
|
||||
task->wake_q.next = NULL;
|
||||
task->wake_q_count = head->count;
|
||||
node = node->next;
|
||||
/* pairs with cmpxchg_relaxed() in __wake_q_add() */
|
||||
WRITE_ONCE(task->wake_q.next, NULL);
|
||||
/* Task can safely be re-inserted now. */
|
||||
|
||||
/*
|
||||
* wake_up_process() executes a full barrier, which pairs with
|
||||
@@ -7585,6 +7586,14 @@ static void __setscheduler_params(struct task_struct *p,
|
||||
else if (fair_policy(policy))
|
||||
p->static_prio = NICE_TO_PRIO(attr->sched_nice);
|
||||
|
||||
/* rt-policy tasks do not have a timerslack */
|
||||
if (task_is_realtime(p)) {
|
||||
p->timer_slack_ns = 0;
|
||||
} else if (p->timer_slack_ns == 0) {
|
||||
/* when switching back to non-rt policy, restore timerslack */
|
||||
p->timer_slack_ns = p->default_timer_slack_ns;
|
||||
}
|
||||
|
||||
/*
|
||||
* __sched_setscheduler() ensures attr->sched_priority == 0 when
|
||||
* !rt_policy. Always setting this ensures that things like
|
||||
|
||||
@@ -2484,6 +2484,8 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
|
||||
error = current->timer_slack_ns;
|
||||
break;
|
||||
case PR_SET_TIMERSLACK:
|
||||
if (task_is_realtime(current))
|
||||
break;
|
||||
if (arg2 <= 0)
|
||||
current->timer_slack_ns =
|
||||
current->default_timer_slack_ns;
|
||||
|
||||
@@ -145,11 +145,6 @@ static struct hrtimer_cpu_base migration_cpu_base = {
|
||||
|
||||
#define migration_base migration_cpu_base.clock_base[0]
|
||||
|
||||
static inline bool is_migration_base(struct hrtimer_clock_base *base)
|
||||
{
|
||||
return base == &migration_base;
|
||||
}
|
||||
|
||||
/*
|
||||
* We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock
|
||||
* means that all timers which are tied to this base via timer->base are
|
||||
@@ -274,11 +269,6 @@ again:
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
static inline bool is_migration_base(struct hrtimer_clock_base *base)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct hrtimer_clock_base *
|
||||
lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
|
||||
{
|
||||
@@ -1377,6 +1367,18 @@ static void hrtimer_sync_wait_running(struct hrtimer_cpu_base *cpu_base,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static __always_inline bool is_migration_base(struct hrtimer_clock_base *base)
|
||||
{
|
||||
return base == &migration_base;
|
||||
}
|
||||
#else
|
||||
static __always_inline bool is_migration_base(struct hrtimer_clock_base *base)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This function is called on PREEMPT_RT kernels when the fast path
|
||||
* deletion of a timer failed because the timer callback function was
|
||||
@@ -2089,14 +2091,9 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode,
|
||||
struct restart_block *restart;
|
||||
struct hrtimer_sleeper t;
|
||||
int ret = 0;
|
||||
u64 slack;
|
||||
|
||||
slack = current->timer_slack_ns;
|
||||
if (dl_task(current) || rt_task(current))
|
||||
slack = 0;
|
||||
|
||||
hrtimer_init_sleeper_on_stack(&t, clockid, mode);
|
||||
hrtimer_set_expires_range_ns(&t.timer, rqtp, slack);
|
||||
hrtimer_set_expires_range_ns(&t.timer, rqtp, current->timer_slack_ns);
|
||||
ret = do_nanosleep(&t, mode);
|
||||
if (ret != -ERESTART_RESTARTBLOCK)
|
||||
goto out;
|
||||
@@ -2275,7 +2272,7 @@ void __init hrtimers_init(void)
|
||||
/**
|
||||
* schedule_hrtimeout_range_clock - sleep until timeout
|
||||
* @expires: timeout value (ktime_t)
|
||||
* @delta: slack in expires timeout (ktime_t) for SCHED_OTHER tasks
|
||||
* @delta: slack in expires timeout (ktime_t)
|
||||
* @mode: timer mode
|
||||
* @clock_id: timer clock to be used
|
||||
*/
|
||||
@@ -2302,13 +2299,6 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Override any slack passed by the user if under
|
||||
* rt contraints.
|
||||
*/
|
||||
if (rt_task(current))
|
||||
delta = 0;
|
||||
|
||||
hrtimer_init_sleeper_on_stack(&t, clock_id, mode);
|
||||
hrtimer_set_expires_range_ns(&t.timer, *expires, delta);
|
||||
hrtimer_sleeper_start_expires(&t, mode);
|
||||
@@ -2328,7 +2318,7 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock);
|
||||
/**
|
||||
* schedule_hrtimeout_range - sleep until timeout
|
||||
* @expires: timeout value (ktime_t)
|
||||
* @delta: slack in expires timeout (ktime_t) for SCHED_OTHER tasks
|
||||
* @delta: slack in expires timeout (ktime_t)
|
||||
* @mode: timer mode
|
||||
*
|
||||
* Make the current task sleep until the given expiry time has
|
||||
|
||||
@@ -3477,23 +3477,30 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, void *data,
|
||||
hci_update_scan(hdev);
|
||||
}
|
||||
|
||||
params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
|
||||
if (params) {
|
||||
switch (params->auto_connect) {
|
||||
case HCI_AUTO_CONN_LINK_LOSS:
|
||||
if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
|
||||
/* Re-enable passive scanning if disconnected device is marked
|
||||
* as auto-connectable.
|
||||
*/
|
||||
if (conn->type == LE_LINK) {
|
||||
params = hci_conn_params_lookup(hdev, &conn->dst,
|
||||
conn->dst_type);
|
||||
if (params) {
|
||||
switch (params->auto_connect) {
|
||||
case HCI_AUTO_CONN_LINK_LOSS:
|
||||
if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
|
||||
break;
|
||||
fallthrough;
|
||||
|
||||
case HCI_AUTO_CONN_DIRECT:
|
||||
case HCI_AUTO_CONN_ALWAYS:
|
||||
hci_pend_le_list_del_init(params);
|
||||
hci_pend_le_list_add(params,
|
||||
&hdev->pend_le_conns);
|
||||
hci_update_passive_scan(hdev);
|
||||
break;
|
||||
fallthrough;
|
||||
|
||||
case HCI_AUTO_CONN_DIRECT:
|
||||
case HCI_AUTO_CONN_ALWAYS:
|
||||
hci_pend_le_list_del_init(params);
|
||||
hci_pend_le_list_add(params, &hdev->pend_le_conns);
|
||||
hci_update_passive_scan(hdev);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -326,6 +326,7 @@ static int netpoll_owner_active(struct net_device *dev)
|
||||
static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
|
||||
{
|
||||
netdev_tx_t status = NETDEV_TX_BUSY;
|
||||
netdev_tx_t ret = NET_XMIT_DROP;
|
||||
struct net_device *dev;
|
||||
unsigned long tries;
|
||||
/* It is up to the caller to keep npinfo alive. */
|
||||
@@ -334,11 +335,12 @@ static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
|
||||
lockdep_assert_irqs_disabled();
|
||||
|
||||
dev = np->dev;
|
||||
rcu_read_lock();
|
||||
npinfo = rcu_dereference_bh(dev->npinfo);
|
||||
|
||||
if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
|
||||
dev_kfree_skb_irq(skb);
|
||||
return NET_XMIT_DROP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* don't get messages out of order, and no recursion */
|
||||
@@ -377,7 +379,10 @@ static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
|
||||
skb_queue_tail(&npinfo->txq, skb);
|
||||
schedule_delayed_work(&npinfo->tx_work,0);
|
||||
}
|
||||
return NETDEV_TX_OK;
|
||||
ret = NETDEV_TX_OK;
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
|
||||
|
||||
@@ -3184,16 +3184,13 @@ static void add_v4_addrs(struct inet6_dev *idev)
|
||||
struct in6_addr addr;
|
||||
struct net_device *dev;
|
||||
struct net *net = dev_net(idev->dev);
|
||||
int scope, plen, offset = 0;
|
||||
int scope, plen;
|
||||
u32 pflags = 0;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
memset(&addr, 0, sizeof(struct in6_addr));
|
||||
/* in case of IP6GRE the dev_addr is an IPv6 and therefore we use only the last 4 bytes */
|
||||
if (idev->dev->addr_len == sizeof(struct in6_addr))
|
||||
offset = sizeof(struct in6_addr) - 4;
|
||||
memcpy(&addr.s6_addr32[3], idev->dev->dev_addr + offset, 4);
|
||||
memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4);
|
||||
|
||||
if (!(idev->dev->flags & IFF_POINTOPOINT) && idev->dev->type == ARPHRD_SIT) {
|
||||
scope = IPV6_ADDR_COMPATv4;
|
||||
@@ -3503,7 +3500,13 @@ static void addrconf_gre_config(struct net_device *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
if (dev->type == ARPHRD_ETHER) {
|
||||
/* Generate the IPv6 link-local address using addrconf_addr_gen(),
|
||||
* unless we have an IPv4 GRE device not bound to an IP address and
|
||||
* which is in EUI64 mode (as __ipv6_isatap_ifid() would fail in this
|
||||
* case). Such devices fall back to add_v4_addrs() instead.
|
||||
*/
|
||||
if (!(dev->type == ARPHRD_IPGRE && *(__be32 *)dev->dev_addr == 0 &&
|
||||
idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)) {
|
||||
addrconf_addr_gen(idev, true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -981,6 +981,8 @@ static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
|
||||
pr_debug("TCP fallback already done (msk=%p)\n", msk);
|
||||
return;
|
||||
}
|
||||
if (WARN_ON_ONCE(!READ_ONCE(msk->allow_infinite_fallback)))
|
||||
return;
|
||||
set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -2854,12 +2854,12 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
|
||||
case IP_VS_SO_GET_SERVICES:
|
||||
{
|
||||
struct ip_vs_get_services *get;
|
||||
int size;
|
||||
size_t size;
|
||||
|
||||
get = (struct ip_vs_get_services *)arg;
|
||||
size = struct_size(get, entrytable, get->num_services);
|
||||
if (*len != size) {
|
||||
pr_err("length: %u != %u\n", *len, size);
|
||||
pr_err("length: %u != %zu\n", *len, size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2895,12 +2895,12 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
|
||||
case IP_VS_SO_GET_DESTS:
|
||||
{
|
||||
struct ip_vs_get_dests *get;
|
||||
int size;
|
||||
size_t size;
|
||||
|
||||
get = (struct ip_vs_get_dests *)arg;
|
||||
size = struct_size(get, entrytable, get->num_dests);
|
||||
if (*len != size) {
|
||||
pr_err("length: %u != %u\n", *len, size);
|
||||
pr_err("length: %u != %zu\n", *len, size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ static int __nf_conncount_add(struct net *net,
|
||||
struct nf_conn *found_ct;
|
||||
unsigned int collect = 0;
|
||||
|
||||
if (time_is_after_eq_jiffies((unsigned long)list->last_gc))
|
||||
if ((u32)jiffies == list->last_gc)
|
||||
goto add_new_node;
|
||||
|
||||
/* check the saved connections */
|
||||
@@ -234,7 +234,7 @@ bool nf_conncount_gc_list(struct net *net,
|
||||
bool ret = false;
|
||||
|
||||
/* don't bother if we just did GC */
|
||||
if (time_is_after_eq_jiffies((unsigned long)READ_ONCE(list->last_gc)))
|
||||
if ((u32)jiffies == READ_ONCE(list->last_gc))
|
||||
return false;
|
||||
|
||||
/* don't bother if other cpu is already doing GC */
|
||||
@@ -377,6 +377,8 @@ restart:
|
||||
|
||||
conn->tuple = *tuple;
|
||||
conn->zone = *zone;
|
||||
conn->cpu = raw_smp_processor_id();
|
||||
conn->jiffies32 = (u32)jiffies;
|
||||
memcpy(rbconn->key, key, sizeof(u32) * data->keylen);
|
||||
|
||||
nf_conncount_list_init(&rbconn->list);
|
||||
|
||||
@@ -240,6 +240,7 @@ static void nft_ct_set_zone_eval(const struct nft_expr *expr,
|
||||
enum ip_conntrack_info ctinfo;
|
||||
u16 value = nft_reg_load16(®s->data[priv->sreg]);
|
||||
struct nf_conn *ct;
|
||||
int oldcnt;
|
||||
|
||||
ct = nf_ct_get(skb, &ctinfo);
|
||||
if (ct) /* already tracked */
|
||||
@@ -260,10 +261,11 @@ static void nft_ct_set_zone_eval(const struct nft_expr *expr,
|
||||
|
||||
ct = this_cpu_read(nft_ct_pcpu_template);
|
||||
|
||||
if (likely(refcount_read(&ct->ct_general.use) == 1)) {
|
||||
refcount_inc(&ct->ct_general.use);
|
||||
__refcount_inc(&ct->ct_general.use, &oldcnt);
|
||||
if (likely(oldcnt == 1)) {
|
||||
nf_ct_zone_add(ct, &zone);
|
||||
} else {
|
||||
refcount_dec(&ct->ct_general.use);
|
||||
/* previous skb got queued to userspace, allocate temporary
|
||||
* one until percpu template can be reused.
|
||||
*/
|
||||
|
||||
@@ -86,7 +86,6 @@ static int ipv4_find_option(struct net *net, struct sk_buff *skb,
|
||||
unsigned char optbuf[sizeof(struct ip_options) + 40];
|
||||
struct ip_options *opt = (struct ip_options *)optbuf;
|
||||
struct iphdr *iph, _iph;
|
||||
unsigned int start;
|
||||
bool found = false;
|
||||
__be32 info;
|
||||
int optlen;
|
||||
@@ -94,7 +93,6 @@ static int ipv4_find_option(struct net *net, struct sk_buff *skb,
|
||||
iph = skb_header_pointer(skb, 0, sizeof(_iph), &_iph);
|
||||
if (!iph)
|
||||
return -EBADMSG;
|
||||
start = sizeof(struct iphdr);
|
||||
|
||||
optlen = iph->ihl * 4 - (int)sizeof(struct iphdr);
|
||||
if (optlen <= 0)
|
||||
@@ -104,7 +102,7 @@ static int ipv4_find_option(struct net *net, struct sk_buff *skb,
|
||||
/* Copy the options since __ip_options_compile() modifies
|
||||
* the options.
|
||||
*/
|
||||
if (skb_copy_bits(skb, start, opt->__data, optlen))
|
||||
if (skb_copy_bits(skb, sizeof(struct iphdr), opt->__data, optlen))
|
||||
return -EBADMSG;
|
||||
opt->optlen = optlen;
|
||||
|
||||
@@ -119,18 +117,18 @@ static int ipv4_find_option(struct net *net, struct sk_buff *skb,
|
||||
found = target == IPOPT_SSRR ? opt->is_strictroute :
|
||||
!opt->is_strictroute;
|
||||
if (found)
|
||||
*offset = opt->srr + start;
|
||||
*offset = opt->srr;
|
||||
break;
|
||||
case IPOPT_RR:
|
||||
if (!opt->rr)
|
||||
break;
|
||||
*offset = opt->rr + start;
|
||||
*offset = opt->rr;
|
||||
found = true;
|
||||
break;
|
||||
case IPOPT_RA:
|
||||
if (!opt->router_alert)
|
||||
break;
|
||||
*offset = opt->router_alert + start;
|
||||
*offset = opt->router_alert;
|
||||
found = true;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -2302,14 +2302,10 @@ int ovs_nla_put_mask(const struct sw_flow *flow, struct sk_buff *skb)
|
||||
OVS_FLOW_ATTR_MASK, true, skb);
|
||||
}
|
||||
|
||||
#define MAX_ACTIONS_BUFSIZE (32 * 1024)
|
||||
|
||||
static struct sw_flow_actions *nla_alloc_flow_actions(int size)
|
||||
{
|
||||
struct sw_flow_actions *sfa;
|
||||
|
||||
WARN_ON_ONCE(size > MAX_ACTIONS_BUFSIZE);
|
||||
|
||||
sfa = kmalloc(kmalloc_size_roundup(sizeof(*sfa) + size), GFP_KERNEL);
|
||||
if (!sfa)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -2465,15 +2461,6 @@ static struct nlattr *reserve_sfa_size(struct sw_flow_actions **sfa,
|
||||
|
||||
new_acts_size = max(next_offset + req_size, ksize(*sfa) * 2);
|
||||
|
||||
if (new_acts_size > MAX_ACTIONS_BUFSIZE) {
|
||||
if ((next_offset + req_size) > MAX_ACTIONS_BUFSIZE) {
|
||||
OVS_NLERR(log, "Flow action size exceeds max %u",
|
||||
MAX_ACTIONS_BUFSIZE);
|
||||
return ERR_PTR(-EMSGSIZE);
|
||||
}
|
||||
new_acts_size = MAX_ACTIONS_BUFSIZE;
|
||||
}
|
||||
|
||||
acts = nla_alloc_flow_actions(new_acts_size);
|
||||
if (IS_ERR(acts))
|
||||
return (void *)acts;
|
||||
@@ -3492,7 +3479,7 @@ int ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
|
||||
int err;
|
||||
u32 mpls_label_count = 0;
|
||||
|
||||
*sfa = nla_alloc_flow_actions(min(nla_len(attr), MAX_ACTIONS_BUFSIZE));
|
||||
*sfa = nla_alloc_flow_actions(nla_len(attr));
|
||||
if (IS_ERR(*sfa))
|
||||
return PTR_ERR(*sfa);
|
||||
|
||||
|
||||
@@ -2200,6 +2200,12 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* Prevent creation of traffic classes with classid TC_H_ROOT */
|
||||
if (clid == TC_H_ROOT) {
|
||||
NL_SET_ERR_MSG(extack, "Cannot create traffic class with classid TC_H_ROOT");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
new_cl = cl;
|
||||
err = -EOPNOTSUPP;
|
||||
if (cops->change)
|
||||
|
||||
@@ -913,7 +913,8 @@ static void gred_destroy(struct Qdisc *sch)
|
||||
for (i = 0; i < table->DPs; i++)
|
||||
gred_destroy_vq(table->tab[i]);
|
||||
|
||||
gred_offload(sch, TC_GRED_DESTROY);
|
||||
if (table->opt)
|
||||
gred_offload(sch, TC_GRED_DESTROY);
|
||||
kfree(table->opt);
|
||||
}
|
||||
|
||||
|
||||
@@ -735,7 +735,7 @@ struct sctp_chunk *sctp_process_strreset_tsnreq(
|
||||
* value SHOULD be the smallest TSN not acknowledged by the
|
||||
* receiver of the request plus 2^31.
|
||||
*/
|
||||
init_tsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map) + (1 << 31);
|
||||
init_tsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map) + (1U << 31);
|
||||
sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_INITIAL,
|
||||
init_tsn, GFP_ATOMIC);
|
||||
|
||||
|
||||
@@ -381,7 +381,7 @@ bool switchdev_port_obj_act_is_deferred(struct net_device *dev,
|
||||
EXPORT_SYMBOL_GPL(switchdev_port_obj_act_is_deferred);
|
||||
|
||||
static ATOMIC_NOTIFIER_HEAD(switchdev_notif_chain);
|
||||
static BLOCKING_NOTIFIER_HEAD(switchdev_blocking_notif_chain);
|
||||
static RAW_NOTIFIER_HEAD(switchdev_blocking_notif_chain);
|
||||
|
||||
/**
|
||||
* register_switchdev_notifier - Register notifier
|
||||
@@ -427,17 +427,27 @@ EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
|
||||
|
||||
int register_switchdev_blocking_notifier(struct notifier_block *nb)
|
||||
{
|
||||
struct blocking_notifier_head *chain = &switchdev_blocking_notif_chain;
|
||||
struct raw_notifier_head *chain = &switchdev_blocking_notif_chain;
|
||||
int err;
|
||||
|
||||
return blocking_notifier_chain_register(chain, nb);
|
||||
rtnl_lock();
|
||||
err = raw_notifier_chain_register(chain, nb);
|
||||
rtnl_unlock();
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(register_switchdev_blocking_notifier);
|
||||
|
||||
int unregister_switchdev_blocking_notifier(struct notifier_block *nb)
|
||||
{
|
||||
struct blocking_notifier_head *chain = &switchdev_blocking_notif_chain;
|
||||
struct raw_notifier_head *chain = &switchdev_blocking_notif_chain;
|
||||
int err;
|
||||
|
||||
return blocking_notifier_chain_unregister(chain, nb);
|
||||
rtnl_lock();
|
||||
err = raw_notifier_chain_unregister(chain, nb);
|
||||
rtnl_unlock();
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unregister_switchdev_blocking_notifier);
|
||||
|
||||
@@ -445,10 +455,11 @@ int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
|
||||
struct switchdev_notifier_info *info,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
ASSERT_RTNL();
|
||||
info->dev = dev;
|
||||
info->extack = extack;
|
||||
return blocking_notifier_call_chain(&switchdev_blocking_notif_chain,
|
||||
val, info);
|
||||
return raw_notifier_call_chain(&switchdev_blocking_notif_chain,
|
||||
val, info);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(call_switchdev_blocking_notifiers);
|
||||
|
||||
|
||||
@@ -1146,6 +1146,13 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
|
||||
{
|
||||
struct cfg80211_internal_bss *scan, *tmp;
|
||||
struct cfg80211_beacon_registration *reg, *treg;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&rdev->wiphy_work_lock, flags);
|
||||
WARN_ON(!list_empty(&rdev->wiphy_work_list));
|
||||
spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags);
|
||||
cancel_work_sync(&rdev->wiphy_work);
|
||||
|
||||
rfkill_destroy(rdev->wiphy.rfkill);
|
||||
list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) {
|
||||
list_del(®->list);
|
||||
|
||||
@@ -10333,6 +10333,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1f66, 0x0105, "Ayaneo Portable Game Player", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x2014, 0x800a, "Positivo ARN50", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x2782, 0x0228, "Infinix ZERO BOOK 13", ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13),
|
||||
SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
|
||||
|
||||
@@ -967,7 +967,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case ARIZONA_OUT3L_ENA_SHIFT:
|
||||
case ARIZONA_OUT3R_ENA_SHIFT:
|
||||
priv->out_up_pending++;
|
||||
priv->out_up_delay += 17;
|
||||
priv->out_up_delay += 17000;
|
||||
break;
|
||||
case ARIZONA_OUT4L_ENA_SHIFT:
|
||||
case ARIZONA_OUT4R_ENA_SHIFT:
|
||||
@@ -977,7 +977,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case WM8997:
|
||||
break;
|
||||
default:
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -999,7 +999,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
||||
if (!priv->out_up_pending && priv->out_up_delay) {
|
||||
dev_dbg(component->dev, "Power up delay: %d\n",
|
||||
priv->out_up_delay);
|
||||
msleep(priv->out_up_delay);
|
||||
fsleep(priv->out_up_delay);
|
||||
priv->out_up_delay = 0;
|
||||
}
|
||||
break;
|
||||
@@ -1017,7 +1017,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case ARIZONA_OUT3L_ENA_SHIFT:
|
||||
case ARIZONA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending++;
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
case ARIZONA_OUT4L_ENA_SHIFT:
|
||||
case ARIZONA_OUT4R_ENA_SHIFT:
|
||||
@@ -1028,10 +1028,10 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
||||
break;
|
||||
case WM8998:
|
||||
case WM1814:
|
||||
priv->out_down_delay += 5;
|
||||
priv->out_down_delay += 5000;
|
||||
break;
|
||||
default:
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -1053,7 +1053,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
||||
if (!priv->out_down_pending && priv->out_down_delay) {
|
||||
dev_dbg(component->dev, "Power down delay: %d\n",
|
||||
priv->out_down_delay);
|
||||
msleep(priv->out_down_delay);
|
||||
fsleep(priv->out_down_delay);
|
||||
priv->out_down_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2322,10 +2322,10 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case CS42L92:
|
||||
case CS47L92:
|
||||
case CS47L93:
|
||||
out_up_delay = 6;
|
||||
out_up_delay = 6000;
|
||||
break;
|
||||
default:
|
||||
out_up_delay = 17;
|
||||
out_up_delay = 17000;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2356,7 +2356,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_up_pending--;
|
||||
if (!priv->out_up_pending) {
|
||||
msleep(priv->out_up_delay);
|
||||
fsleep(priv->out_up_delay);
|
||||
priv->out_up_delay = 0;
|
||||
}
|
||||
break;
|
||||
@@ -2375,7 +2375,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case MADERA_OUT3L_ENA_SHIFT:
|
||||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending++;
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -2392,7 +2392,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
||||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending--;
|
||||
if (!priv->out_down_pending) {
|
||||
msleep(priv->out_down_delay);
|
||||
fsleep(priv->out_down_delay);
|
||||
priv->out_down_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -367,7 +367,7 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
{
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component);
|
||||
u8 tdm_rx_start_slot = 0, asi_cfg_0 = 0, asi_cfg_1 = 0;
|
||||
u8 tdm_rx_start_slot = 0, asi_cfg_0 = 0, asi_cfg_1 = 0, asi_cfg_4 = 0;
|
||||
int ret;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
||||
@@ -376,12 +376,14 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
fallthrough;
|
||||
case SND_SOC_DAIFMT_NB_NF:
|
||||
asi_cfg_1 = TAS2764_TDM_CFG1_RX_RISING;
|
||||
asi_cfg_4 = TAS2764_TDM_CFG4_TX_FALLING;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_IB_IF:
|
||||
asi_cfg_0 ^= TAS2764_TDM_CFG0_FRAME_START;
|
||||
fallthrough;
|
||||
case SND_SOC_DAIFMT_IB_NF:
|
||||
asi_cfg_1 = TAS2764_TDM_CFG1_RX_FALLING;
|
||||
asi_cfg_4 = TAS2764_TDM_CFG4_TX_RISING;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -391,6 +393,12 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_component_update_bits(component, TAS2764_TDM_CFG4,
|
||||
TAS2764_TDM_CFG4_TX_MASK,
|
||||
asi_cfg_4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
asi_cfg_0 ^= TAS2764_TDM_CFG0_FRAME_START;
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
/* Power Control */
|
||||
#define TAS2764_PWR_CTRL TAS2764_REG(0X0, 0x02)
|
||||
#define TAS2764_PWR_CTRL_MASK GENMASK(1, 0)
|
||||
#define TAS2764_PWR_CTRL_MASK GENMASK(2, 0)
|
||||
#define TAS2764_PWR_CTRL_ACTIVE 0x0
|
||||
#define TAS2764_PWR_CTRL_MUTE BIT(0)
|
||||
#define TAS2764_PWR_CTRL_SHUTDOWN BIT(1)
|
||||
@@ -79,6 +79,12 @@
|
||||
#define TAS2764_TDM_CFG3_RXS_SHIFT 0x4
|
||||
#define TAS2764_TDM_CFG3_MASK GENMASK(3, 0)
|
||||
|
||||
/* TDM Configuration Reg4 */
|
||||
#define TAS2764_TDM_CFG4 TAS2764_REG(0X0, 0x0d)
|
||||
#define TAS2764_TDM_CFG4_TX_MASK BIT(0)
|
||||
#define TAS2764_TDM_CFG4_TX_RISING 0x0
|
||||
#define TAS2764_TDM_CFG4_TX_FALLING BIT(0)
|
||||
|
||||
/* TDM Configuration Reg5 */
|
||||
#define TAS2764_TDM_CFG5 TAS2764_REG(0X0, 0x0e)
|
||||
#define TAS2764_TDM_CFG5_VSNS_MASK BIT(6)
|
||||
|
||||
@@ -508,7 +508,7 @@ static int tas2770_codec_probe(struct snd_soc_component *component)
|
||||
}
|
||||
|
||||
static DECLARE_TLV_DB_SCALE(tas2770_digital_tlv, 1100, 50, 0);
|
||||
static DECLARE_TLV_DB_SCALE(tas2770_playback_volume, -12750, 50, 0);
|
||||
static DECLARE_TLV_DB_SCALE(tas2770_playback_volume, -10050, 50, 0);
|
||||
|
||||
static const struct snd_kcontrol_new tas2770_snd_controls[] = {
|
||||
SOC_SINGLE_TLV("Speaker Playback Volume", TAS2770_PLAY_CFG_REG2,
|
||||
|
||||
@@ -302,7 +302,7 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w)
|
||||
} else {
|
||||
wseq = wm5110_no_dre_left_enable;
|
||||
nregs = ARRAY_SIZE(wm5110_no_dre_left_enable);
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_OUT1R_ENA_SHIFT:
|
||||
@@ -312,7 +312,7 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w)
|
||||
} else {
|
||||
wseq = wm5110_no_dre_right_enable;
|
||||
nregs = ARRAY_SIZE(wm5110_no_dre_right_enable);
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -338,7 +338,7 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w)
|
||||
snd_soc_component_update_bits(component,
|
||||
ARIZONA_SPARE_TRIGGERS,
|
||||
ARIZONA_WS_TRG1, 0);
|
||||
priv->out_down_delay += 27;
|
||||
priv->out_down_delay += 27000;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_OUT1R_ENA_SHIFT:
|
||||
@@ -350,7 +350,7 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w)
|
||||
snd_soc_component_update_bits(component,
|
||||
ARIZONA_SPARE_TRIGGERS,
|
||||
ARIZONA_WS_TRG2, 0);
|
||||
priv->out_down_delay += 27;
|
||||
priv->out_down_delay += 27000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1694,20 +1694,6 @@ int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_io_to_priv(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
|
||||
if (!runtime) {
|
||||
dev_warn(dev, "Can't update kctrl when idle\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg)
|
||||
{
|
||||
cfg->cfg.val = cfg->val;
|
||||
|
||||
@@ -742,7 +742,6 @@ struct rsnd_kctrl_cfg_s {
|
||||
#define rsnd_kctrl_vals(x) ((x).val) /* = (x).cfg.val[0] */
|
||||
|
||||
int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
|
||||
int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
|
||||
int rsnd_kctrl_new(struct rsnd_mod *mod,
|
||||
|
||||
@@ -34,6 +34,7 @@ struct rsnd_src {
|
||||
struct rsnd_mod *dma;
|
||||
struct rsnd_kctrl_cfg_s sen; /* sync convert enable */
|
||||
struct rsnd_kctrl_cfg_s sync; /* sync convert */
|
||||
u32 current_sync_rate;
|
||||
int irq;
|
||||
};
|
||||
|
||||
@@ -99,7 +100,7 @@ static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
|
||||
if (!rsnd_src_sync_is_enabled(mod))
|
||||
return rsnd_io_converted_rate(io);
|
||||
|
||||
convert_rate = src->sync.val;
|
||||
convert_rate = src->current_sync_rate;
|
||||
|
||||
if (!convert_rate)
|
||||
convert_rate = rsnd_io_converted_rate(io);
|
||||
@@ -200,13 +201,73 @@ static const u32 chan222222[] = {
|
||||
static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct rsnd_src *src = rsnd_mod_to_src(mod);
|
||||
u32 fin, fout, new_rate;
|
||||
int inc, cnt, rate;
|
||||
u64 base, val;
|
||||
|
||||
if (!runtime)
|
||||
return;
|
||||
|
||||
if (!rsnd_src_sync_is_enabled(mod))
|
||||
return;
|
||||
|
||||
fin = rsnd_src_get_in_rate(priv, io);
|
||||
fout = rsnd_src_get_out_rate(priv, io);
|
||||
|
||||
new_rate = src->sync.val;
|
||||
|
||||
if (!new_rate)
|
||||
new_rate = fout;
|
||||
|
||||
/* Do nothing if no diff */
|
||||
if (new_rate == src->current_sync_rate)
|
||||
return;
|
||||
|
||||
/*
|
||||
* SRCm_IFSVR::INTIFS can change within 1%
|
||||
* see
|
||||
* SRCm_IFSVR::INTIFS Note
|
||||
*/
|
||||
inc = fout / 100;
|
||||
cnt = abs(new_rate - fout) / inc;
|
||||
if (fout > new_rate)
|
||||
inc *= -1;
|
||||
|
||||
/*
|
||||
* After start running SRC, we can update only SRC_IFSVR
|
||||
* for Synchronous Mode
|
||||
*/
|
||||
base = (u64)0x0400000 * fin;
|
||||
rate = fout;
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
val = base;
|
||||
rate += inc;
|
||||
do_div(val, rate);
|
||||
|
||||
rsnd_mod_write(mod, SRC_IFSVR, val);
|
||||
}
|
||||
val = base;
|
||||
do_div(val, new_rate);
|
||||
|
||||
rsnd_mod_write(mod, SRC_IFSVR, val);
|
||||
|
||||
/* update current_sync_rate */
|
||||
src->current_sync_rate = new_rate;
|
||||
}
|
||||
|
||||
static void rsnd_src_init_convert_rate(struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
int is_play = rsnd_io_is_play(io);
|
||||
int use_src = 0;
|
||||
u32 fin, fout;
|
||||
u32 ifscr, fsrate, adinr;
|
||||
u32 ifscr, adinr;
|
||||
u32 cr, route;
|
||||
u32 i_busif, o_busif, tmp;
|
||||
const u32 *bsdsr_table;
|
||||
@@ -244,26 +305,15 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
||||
adinr = rsnd_get_adinr_bit(mod, io) | chan;
|
||||
|
||||
/*
|
||||
* SRC_IFSCR / SRC_IFSVR
|
||||
*/
|
||||
ifscr = 0;
|
||||
fsrate = 0;
|
||||
if (use_src) {
|
||||
u64 n;
|
||||
|
||||
ifscr = 1;
|
||||
n = (u64)0x0400000 * fin;
|
||||
do_div(n, fout);
|
||||
fsrate = n;
|
||||
}
|
||||
|
||||
/*
|
||||
* SRC_IFSCR
|
||||
* SRC_SRCCR / SRC_ROUTE_MODE0
|
||||
*/
|
||||
ifscr = 0;
|
||||
cr = 0x00011110;
|
||||
route = 0x0;
|
||||
if (use_src) {
|
||||
route = 0x1;
|
||||
ifscr = 0x1;
|
||||
|
||||
if (rsnd_src_sync_is_enabled(mod)) {
|
||||
cr |= 0x1;
|
||||
@@ -334,7 +384,6 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
||||
rsnd_mod_write(mod, SRC_SRCIR, 1); /* initialize */
|
||||
rsnd_mod_write(mod, SRC_ADINR, adinr);
|
||||
rsnd_mod_write(mod, SRC_IFSCR, ifscr);
|
||||
rsnd_mod_write(mod, SRC_IFSVR, fsrate);
|
||||
rsnd_mod_write(mod, SRC_SRCCR, cr);
|
||||
rsnd_mod_write(mod, SRC_BSDSR, bsdsr_table[idx]);
|
||||
rsnd_mod_write(mod, SRC_BSISR, bsisr_table[idx]);
|
||||
@@ -347,6 +396,9 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
||||
|
||||
rsnd_adg_set_src_timesel_gen2(mod, io, fin, fout);
|
||||
|
||||
/* update SRC_IFSVR */
|
||||
rsnd_src_set_convert_rate(io, mod);
|
||||
|
||||
return;
|
||||
|
||||
convert_rate_err:
|
||||
@@ -466,7 +518,8 @@ static int rsnd_src_init(struct rsnd_mod *mod,
|
||||
int ret;
|
||||
|
||||
/* reset sync convert_rate */
|
||||
src->sync.val = 0;
|
||||
src->sync.val =
|
||||
src->current_sync_rate = 0;
|
||||
|
||||
ret = rsnd_mod_power_on(mod);
|
||||
if (ret < 0)
|
||||
@@ -474,7 +527,7 @@ static int rsnd_src_init(struct rsnd_mod *mod,
|
||||
|
||||
rsnd_src_activation(mod);
|
||||
|
||||
rsnd_src_set_convert_rate(io, mod);
|
||||
rsnd_src_init_convert_rate(io, mod);
|
||||
|
||||
rsnd_src_status_clear(mod);
|
||||
|
||||
@@ -492,7 +545,8 @@ static int rsnd_src_quit(struct rsnd_mod *mod,
|
||||
rsnd_mod_power_off(mod);
|
||||
|
||||
/* reset sync convert_rate */
|
||||
src->sync.val = 0;
|
||||
src->sync.val =
|
||||
src->current_sync_rate = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -530,6 +584,22 @@ static irqreturn_t rsnd_src_interrupt(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int rsnd_src_kctrl_accept_runtime(struct rsnd_dai_stream *io)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
|
||||
if (!runtime) {
|
||||
struct rsnd_priv *priv = rsnd_io_to_priv(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
|
||||
dev_warn(dev, "\"SRC Out Rate\" can use during running\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int rsnd_src_probe_(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv)
|
||||
@@ -584,7 +654,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
||||
"SRC Out Rate Switch" :
|
||||
"SRC In Rate Switch",
|
||||
rsnd_kctrl_accept_anytime,
|
||||
rsnd_src_set_convert_rate,
|
||||
rsnd_src_init_convert_rate,
|
||||
&src->sen, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -593,7 +663,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
||||
rsnd_io_is_play(io) ?
|
||||
"SRC Out Rate" :
|
||||
"SRC In Rate",
|
||||
rsnd_kctrl_accept_runtime,
|
||||
rsnd_src_kctrl_accept_runtime,
|
||||
rsnd_src_set_convert_rate,
|
||||
&src->sync, 192000);
|
||||
|
||||
|
||||
@@ -282,6 +282,7 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
|
||||
}
|
||||
EXPORT_SYMBOL_NS(hda_codec_i915_exit, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||
|
||||
MODULE_SOFTDEP("pre: snd-hda-codec-hdmi");
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
Reference in New Issue
Block a user