mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Merge b5dc5b7de7 ("cxl/port: Fix cxl_bus_rescan() vs bus_rescan_devices()") into android14-6.1-lts
Steps on the way to 6.1.116 Resolves merge conflicts in: net/wireless/core.c Change-Id: Ia10a58f63842e7bbc9440d960071985de9a399b8 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -4,8 +4,6 @@
|
||||
* Copyright (C) 2017 SiFive
|
||||
*/
|
||||
|
||||
#define GENERATING_ASM_OFFSETS
|
||||
|
||||
#include <linux/kbuild.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
@@ -65,7 +65,7 @@ void __cpu_die(unsigned int cpu)
|
||||
if (cpu_ops[cpu]->cpu_is_stopped)
|
||||
ret = cpu_ops[cpu]->cpu_is_stopped(cpu);
|
||||
if (ret)
|
||||
pr_warn("CPU%d may not have stopped: %d\n", cpu, ret);
|
||||
pr_warn("CPU%u may not have stopped: %d\n", cpu, ret);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -59,7 +59,7 @@ extra_header_fields:
|
||||
.long efi_header_end - _start // SizeOfHeaders
|
||||
.long 0 // CheckSum
|
||||
.short IMAGE_SUBSYSTEM_EFI_APPLICATION // Subsystem
|
||||
.short 0 // DllCharacteristics
|
||||
.short IMAGE_DLL_CHARACTERISTICS_NX_COMPAT // DllCharacteristics
|
||||
.quad 0 // SizeOfStackReserve
|
||||
.quad 0 // SizeOfStackCommit
|
||||
.quad 0 // SizeOfHeapReserve
|
||||
|
||||
@@ -132,8 +132,6 @@
|
||||
#define REG_PTR(insn, pos, regs) \
|
||||
(ulong *)((ulong)(regs) + REG_OFFSET(insn, pos))
|
||||
|
||||
#define GET_RM(insn) (((insn) >> 12) & 7)
|
||||
|
||||
#define GET_RS1(insn, regs) (*REG_PTR(insn, SH_RS1, regs))
|
||||
#define GET_RS2(insn, regs) (*REG_PTR(insn, SH_RS2, regs))
|
||||
#define GET_RS1S(insn, regs) (*REG_PTR(RVC_RS1S(insn), 0, regs))
|
||||
|
||||
@@ -18,6 +18,7 @@ obj-vdso = $(patsubst %, %.o, $(vdso-syms)) note.o
|
||||
|
||||
ccflags-y := -fno-stack-protector
|
||||
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
||||
ccflags-y += -fno-builtin
|
||||
|
||||
ifneq ($(c-gettimeofday-y),)
|
||||
CFLAGS_vgettimeofday.o += -fPIC -include $(c-gettimeofday-y)
|
||||
|
||||
@@ -597,9 +597,7 @@ static int blk_rq_map_user_bvec(struct request *rq, const struct iov_iter *iter)
|
||||
if (nsegs >= nr_segs || bytes > UINT_MAX - bv->bv_len)
|
||||
goto put_bio;
|
||||
if (bytes + bv->bv_len > nr_iter)
|
||||
goto put_bio;
|
||||
if (bv->bv_offset + bv->bv_len > PAGE_SIZE)
|
||||
goto put_bio;
|
||||
break;
|
||||
|
||||
nsegs++;
|
||||
bytes += bv->bv_len;
|
||||
|
||||
@@ -857,7 +857,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
|
||||
|
||||
/* Store CPU Logical ID */
|
||||
cpc_ptr->cpu_id = pr->id;
|
||||
spin_lock_init(&cpc_ptr->rmw_lock);
|
||||
raw_spin_lock_init(&cpc_ptr->rmw_lock);
|
||||
|
||||
/* Parse PSD data for this CPU */
|
||||
ret = acpi_get_psd(cpc_ptr, handle);
|
||||
@@ -1077,6 +1077,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
|
||||
int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu);
|
||||
struct cpc_reg *reg = ®_res->cpc_entry.reg;
|
||||
struct cpc_desc *cpc_desc;
|
||||
unsigned long flags;
|
||||
|
||||
size = GET_BIT_WIDTH(reg);
|
||||
|
||||
@@ -1116,7 +1117,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
spin_lock(&cpc_desc->rmw_lock);
|
||||
raw_spin_lock_irqsave(&cpc_desc->rmw_lock, flags);
|
||||
switch (size) {
|
||||
case 8:
|
||||
prev_val = readb_relaxed(vaddr);
|
||||
@@ -1131,7 +1132,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
|
||||
prev_val = readq_relaxed(vaddr);
|
||||
break;
|
||||
default:
|
||||
spin_unlock(&cpc_desc->rmw_lock);
|
||||
raw_spin_unlock_irqrestore(&cpc_desc->rmw_lock, flags);
|
||||
return -EFAULT;
|
||||
}
|
||||
val = MASK_VAL_WRITE(reg, prev_val, val);
|
||||
@@ -1164,7 +1165,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
|
||||
}
|
||||
|
||||
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
|
||||
spin_unlock(&cpc_desc->rmw_lock);
|
||||
raw_spin_unlock_irqrestore(&cpc_desc->rmw_lock, flags);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/swiotlb.h>
|
||||
@@ -2559,7 +2558,6 @@ static const char *dev_uevent_name(struct kobject *kobj)
|
||||
static int dev_uevent(struct kobject *kobj, struct kobj_uevent_env *env)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct device_driver *driver;
|
||||
int retval = 0;
|
||||
|
||||
/* add device node properties if present */
|
||||
@@ -2588,12 +2586,8 @@ static int dev_uevent(struct kobject *kobj, struct kobj_uevent_env *env)
|
||||
if (dev->type && dev->type->name)
|
||||
add_uevent_var(env, "DEVTYPE=%s", dev->type->name);
|
||||
|
||||
/* Synchronize with module_remove_driver() */
|
||||
rcu_read_lock();
|
||||
driver = READ_ONCE(dev->driver);
|
||||
if (driver)
|
||||
add_uevent_var(env, "DRIVER=%s", driver->name);
|
||||
rcu_read_unlock();
|
||||
if (dev->driver)
|
||||
add_uevent_var(env, "DRIVER=%s", dev->driver->name);
|
||||
|
||||
/* Add common DT information about the device */
|
||||
of_device_uevent(dev, env);
|
||||
@@ -2663,8 +2657,11 @@ static ssize_t uevent_show(struct device *dev, struct device_attribute *attr,
|
||||
if (!env)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Synchronize with really_probe() */
|
||||
device_lock(dev);
|
||||
/* let the kset specific function add its keys */
|
||||
retval = kset->uevent_ops->uevent(&dev->kobj, env);
|
||||
device_unlock(dev);
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include "base.h"
|
||||
|
||||
static char *make_driver_name(struct device_driver *drv)
|
||||
@@ -78,9 +77,6 @@ void module_remove_driver(struct device_driver *drv)
|
||||
if (!drv)
|
||||
return;
|
||||
|
||||
/* Synchronize with dev_uevent() */
|
||||
synchronize_rcu();
|
||||
|
||||
sysfs_remove_link(&drv->p->kobj, "module");
|
||||
|
||||
if (drv->owner)
|
||||
|
||||
@@ -509,7 +509,8 @@ static int cxl_acpi_probe(struct platform_device *pdev)
|
||||
return rc;
|
||||
|
||||
/* In case PCI is scanned before ACPI re-trigger memdev attach */
|
||||
return cxl_bus_rescan();
|
||||
cxl_bus_rescan();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id cxl_acpi_ids[] = {
|
||||
@@ -533,7 +534,19 @@ static struct platform_driver cxl_acpi_driver = {
|
||||
.id_table = cxl_test_ids,
|
||||
};
|
||||
|
||||
module_platform_driver(cxl_acpi_driver);
|
||||
static int __init cxl_acpi_init(void)
|
||||
{
|
||||
return platform_driver_register(&cxl_acpi_driver);
|
||||
}
|
||||
|
||||
static void __exit cxl_acpi_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&cxl_acpi_driver);
|
||||
cxl_bus_drain();
|
||||
}
|
||||
|
||||
module_init(cxl_acpi_init);
|
||||
module_exit(cxl_acpi_exit);
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_IMPORT_NS(CXL);
|
||||
MODULE_IMPORT_NS(ACPI);
|
||||
|
||||
@@ -1786,12 +1786,34 @@ static void cxl_bus_remove(struct device *dev)
|
||||
|
||||
static struct workqueue_struct *cxl_bus_wq;
|
||||
|
||||
int cxl_bus_rescan(void)
|
||||
static int cxl_rescan_attach(struct device *dev, void *data)
|
||||
{
|
||||
return bus_rescan_devices(&cxl_bus_type);
|
||||
int rc = device_attach(dev);
|
||||
|
||||
dev_vdbg(dev, "rescan: %s\n", rc ? "attach" : "detached");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cxl_bus_rescan_queue(struct work_struct *w)
|
||||
{
|
||||
bus_for_each_dev(&cxl_bus_type, NULL, NULL, cxl_rescan_attach);
|
||||
}
|
||||
|
||||
void cxl_bus_rescan(void)
|
||||
{
|
||||
static DECLARE_WORK(rescan_work, cxl_bus_rescan_queue);
|
||||
|
||||
queue_work(cxl_bus_wq, &rescan_work);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, CXL);
|
||||
|
||||
void cxl_bus_drain(void)
|
||||
{
|
||||
drain_workqueue(cxl_bus_wq);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_bus_drain, CXL);
|
||||
|
||||
bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd)
|
||||
{
|
||||
return queue_work(cxl_bus_wq, &cxlmd->detach_work);
|
||||
|
||||
@@ -564,7 +564,8 @@ struct cxl_port *devm_cxl_add_port(struct device *host, struct device *uport,
|
||||
struct cxl_dport *parent_dport);
|
||||
struct cxl_port *find_cxl_root(struct device *dev);
|
||||
int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd);
|
||||
int cxl_bus_rescan(void);
|
||||
void cxl_bus_rescan(void);
|
||||
void cxl_bus_drain(void);
|
||||
struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd,
|
||||
struct cxl_dport **dport);
|
||||
bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd);
|
||||
|
||||
@@ -763,7 +763,7 @@ static int sdei_device_freeze(struct device *dev)
|
||||
int err;
|
||||
|
||||
/* unregister private events */
|
||||
cpuhp_remove_state(sdei_entry_point);
|
||||
cpuhp_remove_state(sdei_hp_state);
|
||||
|
||||
err = sdei_unregister_shared();
|
||||
if (err)
|
||||
|
||||
@@ -642,7 +642,7 @@ static int ad7124_write_raw(struct iio_dev *indio_dev,
|
||||
|
||||
switch (info) {
|
||||
case IIO_CHAN_INFO_SAMP_FREQ:
|
||||
if (val2 != 0) {
|
||||
if (val2 != 0 || val == 0) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -522,7 +522,7 @@ static int veml6030_read_raw(struct iio_dev *indio_dev,
|
||||
}
|
||||
if (mask == IIO_CHAN_INFO_PROCESSED) {
|
||||
*val = (reg * data->cur_resolution) / 10000;
|
||||
*val2 = (reg * data->cur_resolution) % 10000;
|
||||
*val2 = (reg * data->cur_resolution) % 10000 * 100;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
}
|
||||
*val = reg;
|
||||
|
||||
@@ -258,7 +258,6 @@ static int gru_get_cpu_resources(int dsr_bytes, void **cb, void **dsr)
|
||||
int lcpu;
|
||||
|
||||
BUG_ON(dsr_bytes > GRU_NUM_KERNEL_DSR_BYTES);
|
||||
preempt_disable();
|
||||
bs = gru_lock_kernel_context(-1);
|
||||
lcpu = uv_blade_processor_id();
|
||||
*cb = bs->kernel_cb + lcpu * GRU_HANDLE_STRIDE;
|
||||
@@ -272,7 +271,6 @@ static int gru_get_cpu_resources(int dsr_bytes, void **cb, void **dsr)
|
||||
static void gru_free_cpu_resources(void *cb, void *dsr)
|
||||
{
|
||||
gru_unlock_kernel_context(uv_numa_blade_id());
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -941,10 +941,8 @@ vm_fault_t gru_fault(struct vm_fault *vmf)
|
||||
|
||||
again:
|
||||
mutex_lock(>s->ts_ctxlock);
|
||||
preempt_disable();
|
||||
|
||||
if (gru_check_context_placement(gts)) {
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
gru_unload_context(gts, 1);
|
||||
return VM_FAULT_NOPAGE;
|
||||
@@ -953,7 +951,6 @@ again:
|
||||
if (!gts->ts_gru) {
|
||||
STAT(load_user_context);
|
||||
if (!gru_assign_gru_context(gts)) {
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(GRU_ASSIGN_DELAY); /* true hack ZZZ */
|
||||
@@ -969,7 +966,6 @@ again:
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
|
||||
return VM_FAULT_NOPAGE;
|
||||
|
||||
@@ -65,7 +65,6 @@ static struct gru_tlb_global_handle *get_lock_tgh_handle(struct gru_state
|
||||
struct gru_tlb_global_handle *tgh;
|
||||
int n;
|
||||
|
||||
preempt_disable();
|
||||
if (uv_numa_blade_id() == gru->gs_blade_id)
|
||||
n = get_on_blade_tgh(gru);
|
||||
else
|
||||
@@ -79,7 +78,6 @@ static struct gru_tlb_global_handle *get_lock_tgh_handle(struct gru_state
|
||||
static void get_unlock_tgh_handle(struct gru_tlb_global_handle *tgh)
|
||||
{
|
||||
unlock_tgh_handle(tgh);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -105,10 +105,6 @@ static struct net_device * __init mvme147lance_probe(void)
|
||||
macaddr[3] = address&0xff;
|
||||
eth_hw_addr_set(dev, macaddr);
|
||||
|
||||
printk("%s: MVME147 at 0x%08lx, irq %d, Hardware Address %pM\n",
|
||||
dev->name, dev->base_addr, MVME147_LANCE_IRQ,
|
||||
dev->dev_addr);
|
||||
|
||||
lp = netdev_priv(dev);
|
||||
lp->ram = __get_dma_pages(GFP_ATOMIC, 3); /* 32K */
|
||||
if (!lp->ram) {
|
||||
@@ -138,6 +134,9 @@ static struct net_device * __init mvme147lance_probe(void)
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
netdev_info(dev, "MVME147 at 0x%08lx, irq %d, Hardware Address %pM\n",
|
||||
dev->base_addr, MVME147_LANCE_IRQ, dev->dev_addr);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
||||
@@ -3035,9 +3035,14 @@ ath10k_wmi_tlv_op_cleanup_mgmt_tx_send(struct ath10k *ar,
|
||||
struct sk_buff *msdu)
|
||||
{
|
||||
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
|
||||
struct ath10k_mgmt_tx_pkt_addr *pkt_addr;
|
||||
struct ath10k_wmi *wmi = &ar->wmi;
|
||||
|
||||
idr_remove(&wmi->mgmt_pending_tx, cb->msdu_id);
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
pkt_addr = idr_remove(&wmi->mgmt_pending_tx, cb->msdu_id);
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
kfree(pkt_addr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2440,6 +2440,7 @@ wmi_process_mgmt_tx_comp(struct ath10k *ar, struct mgmt_tx_compl_params *param)
|
||||
dma_unmap_single(ar->dev, pkt_addr->paddr,
|
||||
msdu->len, DMA_TO_DEVICE);
|
||||
info = IEEE80211_SKB_CB(msdu);
|
||||
kfree(pkt_addr);
|
||||
|
||||
if (param->status) {
|
||||
info->flags &= ~IEEE80211_TX_STAT_ACK;
|
||||
@@ -9581,6 +9582,7 @@ static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr,
|
||||
dma_unmap_single(ar->dev, pkt_addr->paddr,
|
||||
msdu->len, DMA_TO_DEVICE);
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
kfree(pkt_addr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4972,6 +4972,8 @@ il_pci_resume(struct device *device)
|
||||
*/
|
||||
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
|
||||
|
||||
_il_wr(il, CSR_INT, 0xffffffff);
|
||||
_il_wr(il, CSR_FH_INT_STATUS, 0xffffffff);
|
||||
il_enable_interrupts(il);
|
||||
|
||||
if (!(_il_rd(il, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW))
|
||||
|
||||
@@ -1252,7 +1252,7 @@ static ssize_t fc_rport_set_marginal_state(struct device *dev,
|
||||
*/
|
||||
if (rport->port_state == FC_PORTSTATE_ONLINE)
|
||||
rport->port_state = port_state;
|
||||
else
|
||||
else if (port_state != rport->port_state)
|
||||
return -EINVAL;
|
||||
} else if (port_state == FC_PORTSTATE_ONLINE) {
|
||||
/*
|
||||
@@ -1262,7 +1262,7 @@ static ssize_t fc_rport_set_marginal_state(struct device *dev,
|
||||
*/
|
||||
if (rport->port_state == FC_PORTSTATE_MARGINAL)
|
||||
rport->port_state = port_state;
|
||||
else
|
||||
else if (port_state != rport->port_state)
|
||||
return -EINVAL;
|
||||
} else
|
||||
return -EINVAL;
|
||||
|
||||
@@ -129,12 +129,15 @@ static unsigned long ad9832_calc_freqreg(unsigned long mclk, unsigned long fout)
|
||||
static int ad9832_write_frequency(struct ad9832_state *st,
|
||||
unsigned int addr, unsigned long fout)
|
||||
{
|
||||
unsigned long clk_freq;
|
||||
unsigned long regval;
|
||||
|
||||
if (fout > (clk_get_rate(st->mclk) / 2))
|
||||
clk_freq = clk_get_rate(st->mclk);
|
||||
|
||||
if (!clk_freq || fout > (clk_freq / 2))
|
||||
return -EINVAL;
|
||||
|
||||
regval = ad9832_calc_freqreg(clk_get_rate(st->mclk), fout);
|
||||
regval = ad9832_calc_freqreg(clk_freq, fout);
|
||||
|
||||
st->freq_data[0] = cpu_to_be16((AD9832_CMD_FRE8BITSW << CMD_SHIFT) |
|
||||
(addr << ADD_SHIFT) |
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
@@ -50,6 +50,8 @@
|
||||
#define POWER_BUDGET 500 /* in mA; use 8 for low-power port testing */
|
||||
#define POWER_BUDGET_3 900 /* in mA */
|
||||
|
||||
#define DUMMY_TIMER_INT_NSECS 125000 /* 1 microframe */
|
||||
|
||||
static const char driver_name[] = "dummy_hcd";
|
||||
static const char driver_desc[] = "USB Host+Gadget Emulator";
|
||||
|
||||
@@ -240,7 +242,7 @@ enum dummy_rh_state {
|
||||
struct dummy_hcd {
|
||||
struct dummy *dum;
|
||||
enum dummy_rh_state rh_state;
|
||||
struct timer_list timer;
|
||||
struct hrtimer timer;
|
||||
u32 port_status;
|
||||
u32 old_status;
|
||||
unsigned long re_timeout;
|
||||
@@ -252,6 +254,7 @@ struct dummy_hcd {
|
||||
u32 stream_en_ep;
|
||||
u8 num_stream[30 / 2];
|
||||
|
||||
unsigned timer_pending:1;
|
||||
unsigned active:1;
|
||||
unsigned old_active:1;
|
||||
unsigned resuming:1;
|
||||
@@ -1302,8 +1305,11 @@ static int dummy_urb_enqueue(
|
||||
urb->error_count = 1; /* mark as a new urb */
|
||||
|
||||
/* kick the scheduler, it'll do the rest */
|
||||
if (!timer_pending(&dum_hcd->timer))
|
||||
mod_timer(&dum_hcd->timer, jiffies + 1);
|
||||
if (!dum_hcd->timer_pending) {
|
||||
dum_hcd->timer_pending = 1;
|
||||
hrtimer_start(&dum_hcd->timer, ns_to_ktime(DUMMY_TIMER_INT_NSECS),
|
||||
HRTIMER_MODE_REL_SOFT);
|
||||
}
|
||||
|
||||
done:
|
||||
spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
|
||||
@@ -1322,9 +1328,10 @@ static int dummy_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
|
||||
spin_lock_irqsave(&dum_hcd->dum->lock, flags);
|
||||
|
||||
rc = usb_hcd_check_unlink_urb(hcd, urb, status);
|
||||
if (!rc && dum_hcd->rh_state != DUMMY_RH_RUNNING &&
|
||||
!list_empty(&dum_hcd->urbp_list))
|
||||
mod_timer(&dum_hcd->timer, jiffies);
|
||||
if (rc == 0 && !dum_hcd->timer_pending) {
|
||||
dum_hcd->timer_pending = 1;
|
||||
hrtimer_start(&dum_hcd->timer, ns_to_ktime(0), HRTIMER_MODE_REL_SOFT);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
|
||||
return rc;
|
||||
@@ -1778,7 +1785,7 @@ static int handle_control_request(struct dummy_hcd *dum_hcd, struct urb *urb,
|
||||
* drivers except that the callbacks are invoked from soft interrupt
|
||||
* context.
|
||||
*/
|
||||
static void dummy_timer(struct timer_list *t)
|
||||
static enum hrtimer_restart dummy_timer(struct hrtimer *t)
|
||||
{
|
||||
struct dummy_hcd *dum_hcd = from_timer(dum_hcd, t, timer);
|
||||
struct dummy *dum = dum_hcd->dum;
|
||||
@@ -1809,16 +1816,15 @@ static void dummy_timer(struct timer_list *t)
|
||||
break;
|
||||
}
|
||||
|
||||
/* FIXME if HZ != 1000 this will probably misbehave ... */
|
||||
|
||||
/* look at each urb queued by the host side driver */
|
||||
spin_lock_irqsave(&dum->lock, flags);
|
||||
dum_hcd->timer_pending = 0;
|
||||
|
||||
if (!dum_hcd->udev) {
|
||||
dev_err(dummy_dev(dum_hcd),
|
||||
"timer fired with no URBs pending?\n");
|
||||
spin_unlock_irqrestore(&dum->lock, flags);
|
||||
return;
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
dum_hcd->next_frame_urbp = NULL;
|
||||
|
||||
@@ -1994,12 +2000,17 @@ return_urb:
|
||||
if (list_empty(&dum_hcd->urbp_list)) {
|
||||
usb_put_dev(dum_hcd->udev);
|
||||
dum_hcd->udev = NULL;
|
||||
} else if (dum_hcd->rh_state == DUMMY_RH_RUNNING) {
|
||||
} else if (!dum_hcd->timer_pending &&
|
||||
dum_hcd->rh_state == DUMMY_RH_RUNNING) {
|
||||
/* want a 1 msec delay here */
|
||||
mod_timer(&dum_hcd->timer, jiffies + msecs_to_jiffies(1));
|
||||
dum_hcd->timer_pending = 1;
|
||||
hrtimer_start(&dum_hcd->timer, ns_to_ktime(DUMMY_TIMER_INT_NSECS),
|
||||
HRTIMER_MODE_REL_SOFT);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dum->lock, flags);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@@ -2387,8 +2398,10 @@ static int dummy_bus_resume(struct usb_hcd *hcd)
|
||||
} else {
|
||||
dum_hcd->rh_state = DUMMY_RH_RUNNING;
|
||||
set_link_state(dum_hcd);
|
||||
if (!list_empty(&dum_hcd->urbp_list))
|
||||
mod_timer(&dum_hcd->timer, jiffies);
|
||||
if (!list_empty(&dum_hcd->urbp_list)) {
|
||||
dum_hcd->timer_pending = 1;
|
||||
hrtimer_start(&dum_hcd->timer, ns_to_ktime(0), HRTIMER_MODE_REL_SOFT);
|
||||
}
|
||||
hcd->state = HC_STATE_RUNNING;
|
||||
}
|
||||
spin_unlock_irq(&dum_hcd->dum->lock);
|
||||
@@ -2466,7 +2479,8 @@ static DEVICE_ATTR_RO(urbs);
|
||||
|
||||
static int dummy_start_ss(struct dummy_hcd *dum_hcd)
|
||||
{
|
||||
timer_setup(&dum_hcd->timer, dummy_timer, 0);
|
||||
hrtimer_init(&dum_hcd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT);
|
||||
dum_hcd->timer.function = dummy_timer;
|
||||
dum_hcd->rh_state = DUMMY_RH_RUNNING;
|
||||
dum_hcd->stream_en_ep = 0;
|
||||
INIT_LIST_HEAD(&dum_hcd->urbp_list);
|
||||
@@ -2495,7 +2509,8 @@ static int dummy_start(struct usb_hcd *hcd)
|
||||
return dummy_start_ss(dum_hcd);
|
||||
|
||||
spin_lock_init(&dum_hcd->dum->lock);
|
||||
timer_setup(&dum_hcd->timer, dummy_timer, 0);
|
||||
hrtimer_init(&dum_hcd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT);
|
||||
dum_hcd->timer.function = dummy_timer;
|
||||
dum_hcd->rh_state = DUMMY_RH_RUNNING;
|
||||
|
||||
INIT_LIST_HEAD(&dum_hcd->urbp_list);
|
||||
@@ -2514,8 +2529,12 @@ static int dummy_start(struct usb_hcd *hcd)
|
||||
|
||||
static void dummy_stop(struct usb_hcd *hcd)
|
||||
{
|
||||
device_remove_file(dummy_dev(hcd_to_dummy_hcd(hcd)), &dev_attr_urbs);
|
||||
dev_info(dummy_dev(hcd_to_dummy_hcd(hcd)), "stopped\n");
|
||||
struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
|
||||
|
||||
hrtimer_cancel(&dum_hcd->timer);
|
||||
dum_hcd->timer_pending = 0;
|
||||
device_remove_file(dummy_dev(dum_hcd), &dev_attr_urbs);
|
||||
dev_info(dummy_dev(dum_hcd), "stopped\n");
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@@ -519,7 +519,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
pm_runtime_put_noidle(&dev->dev);
|
||||
|
||||
if (pci_choose_state(dev, PMSG_SUSPEND) == PCI_D0)
|
||||
pm_runtime_forbid(&dev->dev);
|
||||
pm_runtime_get(&dev->dev);
|
||||
else if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
|
||||
pm_runtime_allow(&dev->dev);
|
||||
|
||||
@@ -546,7 +546,9 @@ static void xhci_pci_remove(struct pci_dev *dev)
|
||||
|
||||
xhci->xhc_state |= XHCI_STATE_REMOVING;
|
||||
|
||||
if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
|
||||
if (pci_choose_state(dev, PMSG_SUSPEND) == PCI_D0)
|
||||
pm_runtime_put(&dev->dev);
|
||||
else if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
|
||||
pm_runtime_forbid(&dev->dev);
|
||||
|
||||
if (xhci->shared_hcd) {
|
||||
|
||||
@@ -628,7 +628,7 @@ void devm_usb_put_phy(struct device *dev, struct usb_phy *phy)
|
||||
{
|
||||
int r;
|
||||
|
||||
r = devres_destroy(dev, devm_usb_phy_release, devm_usb_phy_match, phy);
|
||||
r = devres_release(dev, devm_usb_phy_release, devm_usb_phy_match, phy);
|
||||
dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_usb_put_phy);
|
||||
|
||||
@@ -2165,6 +2165,7 @@ void typec_port_register_altmodes(struct typec_port *port,
|
||||
altmodes[index] = alt;
|
||||
index++;
|
||||
}
|
||||
fwnode_handle_put(altmodes_node);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(typec_port_register_altmodes);
|
||||
|
||||
|
||||
25
fs/afs/dir.c
25
fs/afs/dir.c
@@ -12,6 +12,7 @@
|
||||
#include <linux/swap.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/iversion.h>
|
||||
#include <linux/task_io_accounting_ops.h>
|
||||
#include "internal.h"
|
||||
#include "afs_fs.h"
|
||||
@@ -1808,6 +1809,8 @@ error:
|
||||
|
||||
static void afs_rename_success(struct afs_operation *op)
|
||||
{
|
||||
struct afs_vnode *vnode = AFS_FS_I(d_inode(op->dentry));
|
||||
|
||||
_enter("op=%08x", op->debug_id);
|
||||
|
||||
op->ctime = op->file[0].scb.status.mtime_client;
|
||||
@@ -1817,6 +1820,22 @@ static void afs_rename_success(struct afs_operation *op)
|
||||
op->ctime = op->file[1].scb.status.mtime_client;
|
||||
afs_vnode_commit_status(op, &op->file[1]);
|
||||
}
|
||||
|
||||
/* If we're moving a subdir between dirs, we need to update
|
||||
* its DV counter too as the ".." will be altered.
|
||||
*/
|
||||
if (S_ISDIR(vnode->netfs.inode.i_mode) &&
|
||||
op->file[0].vnode != op->file[1].vnode) {
|
||||
u64 new_dv;
|
||||
|
||||
write_seqlock(&vnode->cb_lock);
|
||||
|
||||
new_dv = vnode->status.data_version + 1;
|
||||
vnode->status.data_version = new_dv;
|
||||
inode_set_iversion_raw(&vnode->netfs.inode, new_dv);
|
||||
|
||||
write_sequnlock(&vnode->cb_lock);
|
||||
}
|
||||
}
|
||||
|
||||
static void afs_rename_edit_dir(struct afs_operation *op)
|
||||
@@ -1858,6 +1877,12 @@ static void afs_rename_edit_dir(struct afs_operation *op)
|
||||
&vnode->fid, afs_edit_dir_for_rename_2);
|
||||
}
|
||||
|
||||
if (S_ISDIR(vnode->netfs.inode.i_mode) &&
|
||||
new_dvnode != orig_dvnode &&
|
||||
test_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
|
||||
afs_edit_dir_update_dotdot(vnode, new_dvnode,
|
||||
afs_edit_dir_for_rename_sub);
|
||||
|
||||
new_inode = d_inode(new_dentry);
|
||||
if (new_inode) {
|
||||
spin_lock(&new_inode->i_lock);
|
||||
|
||||
@@ -126,10 +126,10 @@ static struct folio *afs_dir_get_folio(struct afs_vnode *vnode, pgoff_t index)
|
||||
/*
|
||||
* Scan a directory block looking for a dirent of the right name.
|
||||
*/
|
||||
static int afs_dir_scan_block(union afs_xdr_dir_block *block, struct qstr *name,
|
||||
static int afs_dir_scan_block(const union afs_xdr_dir_block *block, const struct qstr *name,
|
||||
unsigned int blocknum)
|
||||
{
|
||||
union afs_xdr_dirent *de;
|
||||
const union afs_xdr_dirent *de;
|
||||
u64 bitmap;
|
||||
int d, len, n;
|
||||
|
||||
@@ -491,3 +491,90 @@ error:
|
||||
clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
|
||||
goto out_unmap;
|
||||
}
|
||||
|
||||
/*
|
||||
* Edit a subdirectory that has been moved between directories to update the
|
||||
* ".." entry.
|
||||
*/
|
||||
void afs_edit_dir_update_dotdot(struct afs_vnode *vnode, struct afs_vnode *new_dvnode,
|
||||
enum afs_edit_dir_reason why)
|
||||
{
|
||||
union afs_xdr_dir_block *block;
|
||||
union afs_xdr_dirent *de;
|
||||
struct folio *folio;
|
||||
unsigned int nr_blocks, b;
|
||||
pgoff_t index;
|
||||
loff_t i_size;
|
||||
int slot;
|
||||
|
||||
_enter("");
|
||||
|
||||
i_size = i_size_read(&vnode->netfs.inode);
|
||||
if (i_size < AFS_DIR_BLOCK_SIZE) {
|
||||
clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
|
||||
return;
|
||||
}
|
||||
nr_blocks = i_size / AFS_DIR_BLOCK_SIZE;
|
||||
|
||||
/* Find a block that has sufficient slots available. Each folio
|
||||
* contains two or more directory blocks.
|
||||
*/
|
||||
for (b = 0; b < nr_blocks; b++) {
|
||||
index = b / AFS_DIR_BLOCKS_PER_PAGE;
|
||||
folio = afs_dir_get_folio(vnode, index);
|
||||
if (!folio)
|
||||
goto error;
|
||||
|
||||
block = kmap_local_folio(folio, b * AFS_DIR_BLOCK_SIZE - folio_pos(folio));
|
||||
|
||||
/* Abandon the edit if we got a callback break. */
|
||||
if (!test_bit(AFS_VNODE_DIR_VALID, &vnode->flags))
|
||||
goto invalidated;
|
||||
|
||||
slot = afs_dir_scan_block(block, &dotdot_name, b);
|
||||
if (slot >= 0)
|
||||
goto found_dirent;
|
||||
|
||||
kunmap_local(block);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
}
|
||||
|
||||
/* Didn't find the dirent to clobber. Download the directory again. */
|
||||
trace_afs_edit_dir(vnode, why, afs_edit_dir_update_nodd,
|
||||
0, 0, 0, 0, "..");
|
||||
clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
|
||||
goto out;
|
||||
|
||||
found_dirent:
|
||||
de = &block->dirents[slot];
|
||||
de->u.vnode = htonl(new_dvnode->fid.vnode);
|
||||
de->u.unique = htonl(new_dvnode->fid.unique);
|
||||
|
||||
trace_afs_edit_dir(vnode, why, afs_edit_dir_update_dd, b, slot,
|
||||
ntohl(de->u.vnode), ntohl(de->u.unique), "..");
|
||||
|
||||
kunmap_local(block);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
inode_set_iversion_raw(&vnode->netfs.inode, vnode->status.data_version);
|
||||
|
||||
out:
|
||||
_leave("");
|
||||
return;
|
||||
|
||||
invalidated:
|
||||
kunmap_local(block);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
trace_afs_edit_dir(vnode, why, afs_edit_dir_update_inval,
|
||||
0, 0, 0, 0, "..");
|
||||
clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
|
||||
goto out;
|
||||
|
||||
error:
|
||||
trace_afs_edit_dir(vnode, why, afs_edit_dir_update_error,
|
||||
0, 0, 0, 0, "..");
|
||||
clear_bit(AFS_VNODE_DIR_VALID, &vnode->flags);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1043,6 +1043,8 @@ extern void afs_check_for_remote_deletion(struct afs_operation *);
|
||||
extern void afs_edit_dir_add(struct afs_vnode *, struct qstr *, struct afs_fid *,
|
||||
enum afs_edit_dir_reason);
|
||||
extern void afs_edit_dir_remove(struct afs_vnode *, struct qstr *, enum afs_edit_dir_reason);
|
||||
void afs_edit_dir_update_dotdot(struct afs_vnode *vnode, struct afs_vnode *new_dvnode,
|
||||
enum afs_edit_dir_reason why);
|
||||
|
||||
/*
|
||||
* dir_silly.c
|
||||
|
||||
@@ -1061,23 +1061,6 @@ int iomap_file_buffered_write_punch_delalloc(struct inode *inode,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iomap_file_buffered_write_punch_delalloc);
|
||||
|
||||
bool iomap_want_unshare_iter(const struct iomap_iter *iter)
|
||||
{
|
||||
/*
|
||||
* Don't bother with blocks that are not shared to start with; or
|
||||
* mappings that cannot be shared, such as inline data, delalloc
|
||||
* reservations, holes or unwritten extents.
|
||||
*
|
||||
* Note that we use srcmap directly instead of iomap_iter_srcmap as
|
||||
* unsharing requires providing a separate source map, and the presence
|
||||
* of one is a good indicator that unsharing is needed, unlike
|
||||
* IOMAP_F_SHARED which can be set for any data that goes into the COW
|
||||
* fork for XFS.
|
||||
*/
|
||||
return (iter->iomap.flags & IOMAP_F_SHARED) &&
|
||||
iter->srcmap.type == IOMAP_MAPPED;
|
||||
}
|
||||
|
||||
static loff_t iomap_unshare_iter(struct iomap_iter *iter)
|
||||
{
|
||||
loff_t pos = iter->pos;
|
||||
|
||||
@@ -981,6 +981,11 @@ void nfs_delegation_mark_returned(struct inode *inode,
|
||||
}
|
||||
|
||||
nfs_mark_delegation_revoked(delegation);
|
||||
clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
|
||||
spin_unlock(&delegation->lock);
|
||||
if (nfs_detach_delegation(NFS_I(inode), delegation, NFS_SERVER(inode)))
|
||||
nfs_put_delegation(delegation);
|
||||
goto out_rcu_unlock;
|
||||
|
||||
out_clear_returning:
|
||||
clear_bit(NFS_DELEGATION_RETURNING, &delegation->flags);
|
||||
|
||||
@@ -157,6 +157,9 @@ static int nilfs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
|
||||
/* slow symlink */
|
||||
inode->i_op = &nilfs_symlink_inode_operations;
|
||||
inode_nohighmem(inode);
|
||||
mapping_set_gfp_mask(inode->i_mapping,
|
||||
mapping_gfp_constraint(inode->i_mapping,
|
||||
~__GFP_FS));
|
||||
inode->i_mapping->a_ops = &nilfs_aops;
|
||||
err = page_symlink(inode, symname, l);
|
||||
if (err)
|
||||
|
||||
@@ -102,7 +102,9 @@ void ni_clear(struct ntfs_inode *ni)
|
||||
{
|
||||
struct rb_node *node;
|
||||
|
||||
if (!ni->vfs_inode.i_nlink && ni->mi.mrec && is_rec_inuse(ni->mi.mrec))
|
||||
if (!ni->vfs_inode.i_nlink && ni->mi.mrec &&
|
||||
is_rec_inuse(ni->mi.mrec) &&
|
||||
!(ni->mi.sbi->flags & NTFS_FLAGS_LOG_REPLAYING))
|
||||
ni_delete_all(ni);
|
||||
|
||||
al_destroy(ni);
|
||||
|
||||
@@ -524,11 +524,15 @@ struct inode *ntfs_iget5(struct super_block *sb, const struct MFT_REF *ref,
|
||||
if (inode->i_state & I_NEW)
|
||||
inode = ntfs_read_mft(inode, name, ref);
|
||||
else if (ref->seq != ntfs_i(inode)->mi.mrec->seq) {
|
||||
/* Inode overlaps? */
|
||||
_ntfs_bad_inode(inode);
|
||||
/*
|
||||
* Sequence number is not expected.
|
||||
* Looks like inode was reused but caller uses the old reference
|
||||
*/
|
||||
iput(inode);
|
||||
inode = ERR_PTR(-ESTALE);
|
||||
}
|
||||
|
||||
if (IS_ERR(inode) && name)
|
||||
if (IS_ERR(inode))
|
||||
ntfs_set_state(sb->s_fs_info, NTFS_DIRTY_ERROR);
|
||||
|
||||
return inode;
|
||||
|
||||
@@ -236,6 +236,9 @@ static inline ssize_t decompress_chunk(u8 *unc, u8 *unc_end, const u8 *cmpr,
|
||||
|
||||
/* Do decompression until pointers are inside range. */
|
||||
while (up < unc_end && cmpr < cmpr_end) {
|
||||
// return err if more than LZNT_CHUNK_SIZE bytes are written
|
||||
if (up - unc > LZNT_CHUNK_SIZE)
|
||||
return -EINVAL;
|
||||
/* Correct index */
|
||||
while (unc + s_max_off[index] < up)
|
||||
index += 1;
|
||||
|
||||
@@ -79,7 +79,7 @@ static struct dentry *ntfs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
if (err < 0)
|
||||
inode = ERR_PTR(err);
|
||||
else {
|
||||
ni_lock(ni);
|
||||
ni_lock_dir(ni);
|
||||
inode = dir_search_u(dir, uni, NULL);
|
||||
ni_unlock(ni);
|
||||
}
|
||||
|
||||
@@ -329,7 +329,7 @@ struct mft_inode {
|
||||
|
||||
/* Nested class for ntfs_inode::ni_lock. */
|
||||
enum ntfs_inode_mutex_lock_class {
|
||||
NTFS_INODE_MUTEX_DIRTY,
|
||||
NTFS_INODE_MUTEX_DIRTY = 1,
|
||||
NTFS_INODE_MUTEX_SECURITY,
|
||||
NTFS_INODE_MUTEX_OBJID,
|
||||
NTFS_INODE_MUTEX_REPARSE,
|
||||
|
||||
@@ -65,7 +65,7 @@ struct cpc_desc {
|
||||
int write_cmd_status;
|
||||
int write_cmd_id;
|
||||
/* Lock used for RMW operations in cpc_write() */
|
||||
spinlock_t rmw_lock;
|
||||
raw_spinlock_t rmw_lock;
|
||||
struct cpc_register_resource cpc_regs[MAX_CPC_REG_ENT];
|
||||
struct acpi_psd_package domain_info;
|
||||
struct kobject kobj;
|
||||
|
||||
@@ -102,26 +102,26 @@
|
||||
#define __noscs __attribute__((__no_sanitize__("shadow-call-stack")))
|
||||
#endif
|
||||
|
||||
#if __has_attribute(__no_sanitize_address__)
|
||||
#define __no_sanitize_address __attribute__((no_sanitize_address))
|
||||
#ifdef __SANITIZE_HWADDRESS__
|
||||
#define __no_sanitize_address __attribute__((__no_sanitize__("hwaddress")))
|
||||
#else
|
||||
#define __no_sanitize_address
|
||||
#define __no_sanitize_address __attribute__((__no_sanitize_address__))
|
||||
#endif
|
||||
|
||||
#if defined(__SANITIZE_THREAD__) && __has_attribute(__no_sanitize_thread__)
|
||||
#define __no_sanitize_thread __attribute__((no_sanitize_thread))
|
||||
#define __no_sanitize_thread __attribute__((__no_sanitize_thread__))
|
||||
#else
|
||||
#define __no_sanitize_thread
|
||||
#endif
|
||||
|
||||
#if __has_attribute(__no_sanitize_undefined__)
|
||||
#define __no_sanitize_undefined __attribute__((no_sanitize_undefined))
|
||||
#define __no_sanitize_undefined __attribute__((__no_sanitize_undefined__))
|
||||
#else
|
||||
#define __no_sanitize_undefined
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_KCOV) && __has_attribute(__no_sanitize_coverage__)
|
||||
#define __no_sanitize_coverage __attribute__((no_sanitize_coverage))
|
||||
#define __no_sanitize_coverage __attribute__((__no_sanitize_coverage__))
|
||||
#else
|
||||
#define __no_sanitize_coverage
|
||||
#endif
|
||||
|
||||
@@ -230,6 +230,25 @@ static inline const struct iomap *iomap_iter_srcmap(const struct iomap_iter *i)
|
||||
return &i->iomap;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the range needs to be unshared for a FALLOC_FL_UNSHARE_RANGE
|
||||
* operation.
|
||||
*
|
||||
* Don't bother with blocks that are not shared to start with; or mappings that
|
||||
* cannot be shared, such as inline data, delalloc reservations, holes or
|
||||
* unwritten extents.
|
||||
*
|
||||
* Note that we use srcmap directly instead of iomap_iter_srcmap as unsharing
|
||||
* requires providing a separate source map, and the presence of one is a good
|
||||
* indicator that unsharing is needed, unlike IOMAP_F_SHARED which can be set
|
||||
* for any data that goes into the COW fork for XFS.
|
||||
*/
|
||||
static inline bool iomap_want_unshare_iter(const struct iomap_iter *iter)
|
||||
{
|
||||
return (iter->iomap.flags & IOMAP_F_SHARED) &&
|
||||
iter->srcmap.type == IOMAP_MAPPED;
|
||||
}
|
||||
|
||||
ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
|
||||
const struct iomap_ops *ops);
|
||||
int iomap_file_buffered_write_punch_delalloc(struct inode *inode,
|
||||
@@ -243,7 +262,6 @@ bool iomap_release_folio(struct folio *folio, gfp_t gfp_flags);
|
||||
void iomap_invalidate_folio(struct folio *folio, size_t offset, size_t len);
|
||||
int iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
|
||||
const struct iomap_ops *ops);
|
||||
bool iomap_want_unshare_iter(const struct iomap_iter *iter);
|
||||
int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len,
|
||||
bool *did_zero, const struct iomap_ops *ops);
|
||||
int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
|
||||
|
||||
@@ -18,97 +18,6 @@
|
||||
#ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
||||
#define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
||||
|
||||
enum afs_call_trace {
|
||||
afs_call_trace_alloc,
|
||||
afs_call_trace_free,
|
||||
afs_call_trace_get,
|
||||
afs_call_trace_put,
|
||||
afs_call_trace_wake,
|
||||
afs_call_trace_work,
|
||||
};
|
||||
|
||||
enum afs_server_trace {
|
||||
afs_server_trace_alloc,
|
||||
afs_server_trace_callback,
|
||||
afs_server_trace_destroy,
|
||||
afs_server_trace_free,
|
||||
afs_server_trace_gc,
|
||||
afs_server_trace_get_by_addr,
|
||||
afs_server_trace_get_by_uuid,
|
||||
afs_server_trace_get_caps,
|
||||
afs_server_trace_get_install,
|
||||
afs_server_trace_get_new_cbi,
|
||||
afs_server_trace_get_probe,
|
||||
afs_server_trace_give_up_cb,
|
||||
afs_server_trace_purging,
|
||||
afs_server_trace_put_call,
|
||||
afs_server_trace_put_cbi,
|
||||
afs_server_trace_put_find_rsq,
|
||||
afs_server_trace_put_probe,
|
||||
afs_server_trace_put_slist,
|
||||
afs_server_trace_put_slist_isort,
|
||||
afs_server_trace_put_uuid_rsq,
|
||||
afs_server_trace_update,
|
||||
};
|
||||
|
||||
|
||||
enum afs_volume_trace {
|
||||
afs_volume_trace_alloc,
|
||||
afs_volume_trace_free,
|
||||
afs_volume_trace_get_alloc_sbi,
|
||||
afs_volume_trace_get_cell_insert,
|
||||
afs_volume_trace_get_new_op,
|
||||
afs_volume_trace_get_query_alias,
|
||||
afs_volume_trace_put_cell_dup,
|
||||
afs_volume_trace_put_cell_root,
|
||||
afs_volume_trace_put_destroy_sbi,
|
||||
afs_volume_trace_put_free_fc,
|
||||
afs_volume_trace_put_put_op,
|
||||
afs_volume_trace_put_query_alias,
|
||||
afs_volume_trace_put_validate_fc,
|
||||
afs_volume_trace_remove,
|
||||
};
|
||||
|
||||
enum afs_cell_trace {
|
||||
afs_cell_trace_alloc,
|
||||
afs_cell_trace_free,
|
||||
afs_cell_trace_get_queue_dns,
|
||||
afs_cell_trace_get_queue_manage,
|
||||
afs_cell_trace_get_queue_new,
|
||||
afs_cell_trace_get_vol,
|
||||
afs_cell_trace_insert,
|
||||
afs_cell_trace_manage,
|
||||
afs_cell_trace_put_candidate,
|
||||
afs_cell_trace_put_destroy,
|
||||
afs_cell_trace_put_queue_fail,
|
||||
afs_cell_trace_put_queue_work,
|
||||
afs_cell_trace_put_vol,
|
||||
afs_cell_trace_see_source,
|
||||
afs_cell_trace_see_ws,
|
||||
afs_cell_trace_unuse_alias,
|
||||
afs_cell_trace_unuse_check_alias,
|
||||
afs_cell_trace_unuse_delete,
|
||||
afs_cell_trace_unuse_fc,
|
||||
afs_cell_trace_unuse_lookup,
|
||||
afs_cell_trace_unuse_mntpt,
|
||||
afs_cell_trace_unuse_no_pin,
|
||||
afs_cell_trace_unuse_parse,
|
||||
afs_cell_trace_unuse_pin,
|
||||
afs_cell_trace_unuse_probe,
|
||||
afs_cell_trace_unuse_sbi,
|
||||
afs_cell_trace_unuse_ws,
|
||||
afs_cell_trace_use_alias,
|
||||
afs_cell_trace_use_check_alias,
|
||||
afs_cell_trace_use_fc,
|
||||
afs_cell_trace_use_fc_alias,
|
||||
afs_cell_trace_use_lookup,
|
||||
afs_cell_trace_use_mntpt,
|
||||
afs_cell_trace_use_pin,
|
||||
afs_cell_trace_use_probe,
|
||||
afs_cell_trace_use_sbi,
|
||||
afs_cell_trace_wait,
|
||||
};
|
||||
|
||||
enum afs_fs_operation {
|
||||
afs_FS_FetchData = 130, /* AFS Fetch file data */
|
||||
afs_FS_FetchACL = 131, /* AFS Fetch file ACL */
|
||||
@@ -202,121 +111,6 @@ enum yfs_cm_operation {
|
||||
yfs_CB_CallBack = 64204,
|
||||
};
|
||||
|
||||
enum afs_edit_dir_op {
|
||||
afs_edit_dir_create,
|
||||
afs_edit_dir_create_error,
|
||||
afs_edit_dir_create_inval,
|
||||
afs_edit_dir_create_nospc,
|
||||
afs_edit_dir_delete,
|
||||
afs_edit_dir_delete_error,
|
||||
afs_edit_dir_delete_inval,
|
||||
afs_edit_dir_delete_noent,
|
||||
};
|
||||
|
||||
enum afs_edit_dir_reason {
|
||||
afs_edit_dir_for_create,
|
||||
afs_edit_dir_for_link,
|
||||
afs_edit_dir_for_mkdir,
|
||||
afs_edit_dir_for_rename_0,
|
||||
afs_edit_dir_for_rename_1,
|
||||
afs_edit_dir_for_rename_2,
|
||||
afs_edit_dir_for_rmdir,
|
||||
afs_edit_dir_for_silly_0,
|
||||
afs_edit_dir_for_silly_1,
|
||||
afs_edit_dir_for_symlink,
|
||||
afs_edit_dir_for_unlink,
|
||||
};
|
||||
|
||||
enum afs_eproto_cause {
|
||||
afs_eproto_bad_status,
|
||||
afs_eproto_cb_count,
|
||||
afs_eproto_cb_fid_count,
|
||||
afs_eproto_cellname_len,
|
||||
afs_eproto_file_type,
|
||||
afs_eproto_ibulkst_cb_count,
|
||||
afs_eproto_ibulkst_count,
|
||||
afs_eproto_motd_len,
|
||||
afs_eproto_offline_msg_len,
|
||||
afs_eproto_volname_len,
|
||||
afs_eproto_yvl_fsendpt4_len,
|
||||
afs_eproto_yvl_fsendpt6_len,
|
||||
afs_eproto_yvl_fsendpt_num,
|
||||
afs_eproto_yvl_fsendpt_type,
|
||||
afs_eproto_yvl_vlendpt4_len,
|
||||
afs_eproto_yvl_vlendpt6_len,
|
||||
afs_eproto_yvl_vlendpt_type,
|
||||
};
|
||||
|
||||
enum afs_io_error {
|
||||
afs_io_error_cm_reply,
|
||||
afs_io_error_extract,
|
||||
afs_io_error_fs_probe_fail,
|
||||
afs_io_error_vl_lookup_fail,
|
||||
afs_io_error_vl_probe_fail,
|
||||
};
|
||||
|
||||
enum afs_file_error {
|
||||
afs_file_error_dir_bad_magic,
|
||||
afs_file_error_dir_big,
|
||||
afs_file_error_dir_missing_page,
|
||||
afs_file_error_dir_name_too_long,
|
||||
afs_file_error_dir_over_end,
|
||||
afs_file_error_dir_small,
|
||||
afs_file_error_dir_unmarked_ext,
|
||||
afs_file_error_mntpt,
|
||||
afs_file_error_writeback_fail,
|
||||
};
|
||||
|
||||
enum afs_flock_event {
|
||||
afs_flock_acquired,
|
||||
afs_flock_callback_break,
|
||||
afs_flock_defer_unlock,
|
||||
afs_flock_extend_fail,
|
||||
afs_flock_fail_other,
|
||||
afs_flock_fail_perm,
|
||||
afs_flock_no_lockers,
|
||||
afs_flock_release_fail,
|
||||
afs_flock_silly_delete,
|
||||
afs_flock_timestamp,
|
||||
afs_flock_try_to_lock,
|
||||
afs_flock_vfs_lock,
|
||||
afs_flock_vfs_locking,
|
||||
afs_flock_waited,
|
||||
afs_flock_waiting,
|
||||
afs_flock_work_extending,
|
||||
afs_flock_work_retry,
|
||||
afs_flock_work_unlocking,
|
||||
afs_flock_would_block,
|
||||
};
|
||||
|
||||
enum afs_flock_operation {
|
||||
afs_flock_op_copy_lock,
|
||||
afs_flock_op_flock,
|
||||
afs_flock_op_grant,
|
||||
afs_flock_op_lock,
|
||||
afs_flock_op_release_lock,
|
||||
afs_flock_op_return_ok,
|
||||
afs_flock_op_return_eagain,
|
||||
afs_flock_op_return_edeadlk,
|
||||
afs_flock_op_return_error,
|
||||
afs_flock_op_set_lock,
|
||||
afs_flock_op_unlock,
|
||||
afs_flock_op_wake,
|
||||
};
|
||||
|
||||
enum afs_cb_break_reason {
|
||||
afs_cb_break_no_break,
|
||||
afs_cb_break_no_promise,
|
||||
afs_cb_break_for_callback,
|
||||
afs_cb_break_for_deleted,
|
||||
afs_cb_break_for_lapsed,
|
||||
afs_cb_break_for_s_reinit,
|
||||
afs_cb_break_for_unlink,
|
||||
afs_cb_break_for_v_break,
|
||||
afs_cb_break_for_volume_callback,
|
||||
afs_cb_break_for_zap,
|
||||
};
|
||||
|
||||
#endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */
|
||||
|
||||
/*
|
||||
@@ -391,6 +185,7 @@ enum afs_cb_break_reason {
|
||||
EM(afs_cell_trace_unuse_fc, "UNU fc ") \
|
||||
EM(afs_cell_trace_unuse_lookup, "UNU lookup") \
|
||||
EM(afs_cell_trace_unuse_mntpt, "UNU mntpt ") \
|
||||
EM(afs_cell_trace_unuse_no_pin, "UNU no-pin") \
|
||||
EM(afs_cell_trace_unuse_parse, "UNU parse ") \
|
||||
EM(afs_cell_trace_unuse_pin, "UNU pin ") \
|
||||
EM(afs_cell_trace_unuse_probe, "UNU probe ") \
|
||||
@@ -500,7 +295,11 @@ enum afs_cb_break_reason {
|
||||
EM(afs_edit_dir_delete, "delete") \
|
||||
EM(afs_edit_dir_delete_error, "d_err ") \
|
||||
EM(afs_edit_dir_delete_inval, "d_invl") \
|
||||
E_(afs_edit_dir_delete_noent, "d_nent")
|
||||
EM(afs_edit_dir_delete_noent, "d_nent") \
|
||||
EM(afs_edit_dir_update_dd, "u_ddot") \
|
||||
EM(afs_edit_dir_update_error, "u_fail") \
|
||||
EM(afs_edit_dir_update_inval, "u_invl") \
|
||||
E_(afs_edit_dir_update_nodd, "u_nodd")
|
||||
|
||||
#define afs_edit_dir_reasons \
|
||||
EM(afs_edit_dir_for_create, "Create") \
|
||||
@@ -509,6 +308,7 @@ enum afs_cb_break_reason {
|
||||
EM(afs_edit_dir_for_rename_0, "Renam0") \
|
||||
EM(afs_edit_dir_for_rename_1, "Renam1") \
|
||||
EM(afs_edit_dir_for_rename_2, "Renam2") \
|
||||
EM(afs_edit_dir_for_rename_sub, "RnmSub") \
|
||||
EM(afs_edit_dir_for_rmdir, "RmDir ") \
|
||||
EM(afs_edit_dir_for_silly_0, "S_Ren0") \
|
||||
EM(afs_edit_dir_for_silly_1, "S_Ren1") \
|
||||
@@ -614,6 +414,32 @@ enum afs_cb_break_reason {
|
||||
EM(afs_cb_break_for_volume_callback, "break-v-cb") \
|
||||
E_(afs_cb_break_for_zap, "break-zap")
|
||||
|
||||
/*
|
||||
* Generate enums for tracing information.
|
||||
*/
|
||||
#ifndef __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY
|
||||
#define __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY
|
||||
|
||||
#undef EM
|
||||
#undef E_
|
||||
#define EM(a, b) a,
|
||||
#define E_(a, b) a
|
||||
|
||||
enum afs_call_trace { afs_call_traces } __mode(byte);
|
||||
enum afs_cb_break_reason { afs_cb_break_reasons } __mode(byte);
|
||||
enum afs_cell_trace { afs_cell_traces } __mode(byte);
|
||||
enum afs_edit_dir_op { afs_edit_dir_ops } __mode(byte);
|
||||
enum afs_edit_dir_reason { afs_edit_dir_reasons } __mode(byte);
|
||||
enum afs_eproto_cause { afs_eproto_causes } __mode(byte);
|
||||
enum afs_file_error { afs_file_errors } __mode(byte);
|
||||
enum afs_flock_event { afs_flock_events } __mode(byte);
|
||||
enum afs_flock_operation { afs_flock_operations } __mode(byte);
|
||||
enum afs_io_error { afs_io_errors } __mode(byte);
|
||||
enum afs_server_trace { afs_server_traces } __mode(byte);
|
||||
enum afs_volume_trace { afs_volume_traces } __mode(byte);
|
||||
|
||||
#endif /* end __AFS_GENERATE_TRACE_ENUMS_ONCE_ONLY */
|
||||
|
||||
/*
|
||||
* Export enum symbols via userspace.
|
||||
*/
|
||||
|
||||
@@ -24,6 +24,23 @@
|
||||
DEFINE_STATIC_KEY_ARRAY_FALSE(cgroup_bpf_enabled_key, MAX_CGROUP_BPF_ATTACH_TYPE);
|
||||
EXPORT_SYMBOL(cgroup_bpf_enabled_key);
|
||||
|
||||
/*
|
||||
* cgroup bpf destruction makes heavy use of work items and there can be a lot
|
||||
* of concurrent destructions. Use a separate workqueue so that cgroup bpf
|
||||
* destruction work items don't end up filling up max_active of system_wq
|
||||
* which may lead to deadlock.
|
||||
*/
|
||||
static struct workqueue_struct *cgroup_bpf_destroy_wq;
|
||||
|
||||
static int __init cgroup_bpf_wq_init(void)
|
||||
{
|
||||
cgroup_bpf_destroy_wq = alloc_workqueue("cgroup_bpf_destroy", 0, 1);
|
||||
if (!cgroup_bpf_destroy_wq)
|
||||
panic("Failed to alloc workqueue for cgroup bpf destroy.\n");
|
||||
return 0;
|
||||
}
|
||||
core_initcall(cgroup_bpf_wq_init);
|
||||
|
||||
/* __always_inline is necessary to prevent indirect call through run_prog
|
||||
* function pointer.
|
||||
*/
|
||||
@@ -334,7 +351,7 @@ static void cgroup_bpf_release_fn(struct percpu_ref *ref)
|
||||
struct cgroup *cgrp = container_of(ref, struct cgroup, bpf.refcnt);
|
||||
|
||||
INIT_WORK(&cgrp->bpf.release_work, cgroup_bpf_release);
|
||||
queue_work(system_wq, &cgrp->bpf.release_work);
|
||||
queue_work(cgroup_bpf_destroy_wq, &cgrp->bpf.release_work);
|
||||
}
|
||||
|
||||
/* Get underlying bpf_prog of bpf_prog_list entry, regardless if it's through
|
||||
|
||||
@@ -3001,7 +3001,8 @@ static int ieee80211_get_tx_power(struct wiphy *wiphy,
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
|
||||
if (local->ops->get_txpower)
|
||||
if (local->ops->get_txpower &&
|
||||
(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
|
||||
return drv_get_txpower(local, sdata, dbm);
|
||||
|
||||
if (!local->use_chanctx)
|
||||
|
||||
@@ -7159,6 +7159,7 @@ enum {
|
||||
ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
|
||||
ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
@@ -7193,6 +7194,7 @@ enum {
|
||||
ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
ALC255_FIXUP_HEADSET_MODE,
|
||||
ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
|
||||
@@ -7658,6 +7660,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_limit_int_mic_boost,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
|
||||
},
|
||||
[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
@@ -7938,6 +7946,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_limit_int_mic_boost,
|
||||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
|
||||
},
|
||||
[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
@@ -10294,6 +10308,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||
{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
|
||||
{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
|
||||
{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
|
||||
{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET, .name = "dell-headset4-quiet"},
|
||||
{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
|
||||
{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
|
||||
{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
|
||||
@@ -10841,16 +10856,16 @@ static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
|
||||
SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
{0x19, 0x40000000},
|
||||
{0x1b, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
|
||||
{0x19, 0x40000000},
|
||||
{0x1b, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
{0x19, 0x40000000},
|
||||
{0x1a, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
{0x19, 0x40000000},
|
||||
{0x1a, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
|
||||
SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
|
||||
{0x19, 0x40000000},
|
||||
{0x1a, 0x40000000}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
|
||||
|
||||
@@ -3465,6 +3465,9 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
|
||||
break;
|
||||
err = dell_dock_mixer_init(mixer);
|
||||
break;
|
||||
case USB_ID(0x0bda, 0x402e): /* Dell WD19 dock */
|
||||
err = dell_dock_mixer_create(mixer);
|
||||
break;
|
||||
|
||||
case USB_ID(0x2a39, 0x3fd2): /* RME ADI-2 Pro */
|
||||
case USB_ID(0x2a39, 0x3fd3): /* RME ADI-2 DAC */
|
||||
|
||||
@@ -68,6 +68,7 @@ static int detach_port(char *port)
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
ret = -1;
|
||||
err("Invalid port %s > maxports %d",
|
||||
port, vhci_driver->nports);
|
||||
goto call_driver_close;
|
||||
|
||||
Reference in New Issue
Block a user