Merge 5.15.100 into android13-5.15-lts
Changes in 5.15.100
net/sched: Retire tcindex classifier
auxdisplay: hd44780: Fix potential memory leak in hd44780_remove()
fs/jfs: fix shift exponent db_agl2size negative
objtool: Fix memory leak in create_static_call_sections()
pwm: sifive: Reduce time the controller lock is held
pwm: sifive: Always let the first pwm_apply_state succeed
pwm: stm32-lp: fix the check on arr and cmp registers update
f2fs: use memcpy_{to,from}_page() where possible
fs: f2fs: initialize fsdata in pagecache_write()
f2fs: allow set compression option of files without blocks
um: vector: Fix memory leak in vector_config
ubi: ensure that VID header offset + VID header size <= alloc, size
ubifs: Fix build errors as symbol undefined
ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted
ubifs: Rectify space budget for ubifs_xrename()
ubifs: Fix wrong dirty space budget for dirty inode
ubifs: do_rename: Fix wrong space budget when target inode's nlink > 1
ubifs: Reserve one leb for each journal head while doing budget
ubi: Fix use-after-free when volume resizing failed
ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume()
ubifs: Fix memory leak in alloc_wbufs()
ubi: Fix possible null-ptr-deref in ubi_free_volume()
ubifs: Re-statistic cleaned znode count if commit failed
ubifs: dirty_cow_znode: Fix memleak in error handling path
ubifs: ubifs_writepage: Mark page dirty after writing inode failed
ubi: fastmap: Fix missed fm_anchor PEB in wear-leveling after disabling fastmap
ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show()
ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed
f2fs: fix to avoid potential memory corruption in __update_iostat_latency()
ext4: use ext4_fc_tl_mem in fast-commit replay path
netfilter: nf_tables: allow to fetch set elements when table has an owner
x86: um: vdso: Add '%rcx' and '%r11' to the syscall clobber list
um: virtio_uml: free command if adding to virtqueue failed
um: virtio_uml: mark device as unregistered when breaking it
um: virtio_uml: move device breaking into workqueue
um: virt-pci: properly remove PCI device from bus
watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in error path
watchdog: Fix kmemleak in watchdog_cdev_register
watchdog: pcwd_usb: Fix attempting to access uninitialized memory
watchdog: sbsa_wdog: Make sure the timeout programming is within the limits
netfilter: ctnetlink: fix possible refcount leak in ctnetlink_create_conntrack()
netfilter: ebtables: fix table blob use-after-free
netfilter: x_tables: fix percpu counter block leak on error path when creating new netns
ipv6: Add lwtunnel encap size of all siblings in nexthop calculation
sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop
octeontx2-pf: Use correct struct reference in test condition
net: fix __dev_kfree_skb_any() vs drop monitor
9p/xen: fix version parsing
9p/xen: fix connection sequence
9p/rdma: unmap receive dma buffer in rdma_request()/post_recv()
net/mlx5e: Verify flow_source cap before using it
net/mlx5: Geneve, Fix handling of Geneve object id as error code
nfc: fix memory leak of se_io context in nfc_genl_se_io
net/sched: transition act_pedit to rcu and percpu stats
net/sched: act_pedit: fix action bind logic
net/sched: act_mpls: fix action bind logic
net/sched: act_sample: fix action bind logic
ARM: dts: spear320-hmi: correct STMPE GPIO compatible
tcp: tcp_check_req() can be called from process context
vc_screen: modify vcs_size() handling in vcs_read()
rtc: sun6i: Always export the internal oscillator
genirq: Refactor accessors to use irq_data_get_affinity_mask
genirq: Add and use an irq_data_update_affinity helper
scsi: ipr: Work around fortify-string warning
rtc: allow rtc_read_alarm without read_alarm callback
loop: loop_set_status_from_info() check before assignment
ASoC: adau7118: don't disable regulators on device unbind
ASoC: zl38060: Remove spurious gpiolib select
ASoC: zl38060 add gpiolib dependency
ASoC: mediatek: mt8195: add missing initialization
thermal: intel: quark_dts: fix error pointer dereference
thermal: intel: BXT_PMIC: select REGMAP instead of depending on it
tracing: Add NULL checks for buffer in ring_buffer_free_read_page()
kernel/printk/index.c: fix memory leak with using debugfs_lookup()
firmware/efi sysfb_efi: Add quirk for Lenovo IdeaPad Duet 3
bootconfig: Increase max nodes of bootconfig from 1024 to 8192 for DCC support
mfd: arizona: Use pm_runtime_resume_and_get() to prevent refcnt leak
IB/hfi1: Update RMT size calculation
iommu/amd: Fix error handling for pdev_pri_ats_enable()
media: uvcvideo: Remove format descriptions
media: uvcvideo: Handle cameras with invalid descriptors
media: uvcvideo: Handle errors from calls to usb_string
media: uvcvideo: Quirk for autosuspend in Logitech B910 and C910
media: uvcvideo: Silence memcpy() run-time false positive warnings
USB: fix memory leak with using debugfs_lookup()
staging: emxx_udc: Add checks for dma_alloc_coherent()
tty: fix out-of-bounds access in tty_driver_lookup_tty()
tty: serial: fsl_lpuart: disable the CTS when send break signal
serial: sc16is7xx: setup GPIO controller later in probe
mei: bus-fixup:upon error print return values of send and receive
tools/iio/iio_utils:fix memory leak
iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_status_word()
iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_config_word()
soundwire: bus_type: Avoid lockdep assert in sdw_drv_probe()
PCI: loongson: Prevent LS7A MRRS increases
USB: dwc3: fix memory leak with using debugfs_lookup()
USB: chipidea: fix memory leak with using debugfs_lookup()
USB: uhci: fix memory leak with using debugfs_lookup()
USB: sl811: fix memory leak with using debugfs_lookup()
USB: fotg210: fix memory leak with using debugfs_lookup()
USB: isp116x: fix memory leak with using debugfs_lookup()
USB: isp1362: fix memory leak with using debugfs_lookup()
USB: gadget: gr_udc: fix memory leak with using debugfs_lookup()
USB: gadget: bcm63xx_udc: fix memory leak with using debugfs_lookup()
USB: gadget: lpc32xx_udc: fix memory leak with using debugfs_lookup()
USB: gadget: pxa25x_udc: fix memory leak with using debugfs_lookup()
USB: gadget: pxa27x_udc: fix memory leak with using debugfs_lookup()
usb: host: xhci: mvebu: Iterate over array indexes instead of using pointer math
USB: ene_usb6250: Allocate enough memory for full object
usb: uvc: Enumerate valid values for color matching
usb: gadget: uvc: Make bSourceID read/write
PCI: Align extra resources for hotplug bridges properly
PCI: Take other bus devices into account when distributing resources
tty: pcn_uart: fix memory leak with using debugfs_lookup()
misc: vmw_balloon: fix memory leak with using debugfs_lookup()
drivers: base: component: fix memory leak with using debugfs_lookup()
drivers: base: dd: fix memory leak with using debugfs_lookup()
kernel/fail_function: fix memory leak with using debugfs_lookup()
PCI: loongson: Add more devices that need MRRS quirk
PCI: Add ACS quirk for Wangxun NICs
phy: rockchip-typec: Fix unsigned comparison with less than zero
soundwire: cadence: Remove wasted space in response_buf
soundwire: cadence: Drain the RX FIFO after an IO timeout
net: tls: avoid hanging tasks on the tx_lock
x86/resctl: fix scheduler confusion with 'current'
drm/display/dp_mst: Fix down/up message handling after sink disconnect
drm/display/dp_mst: Fix down message handling after a packet reception error
Bluetooth: hci_sock: purge socket queues in the destruct() callback
media: uvcvideo: Fix race condition with usb_kill_urb
drm/virtio: Fix error code in virtio_gpu_object_shmem_init()
Revert "scsi: mpt3sas: Fix return value check of dma_get_required_mask()"
scsi: mpt3sas: Don't change DMA mask while reallocating pools
scsi: mpt3sas: re-do lost mpt3sas DMA mask fix
scsi: mpt3sas: Remove usage of dma_get_required_mask() API
malidp: Fix NULL vs IS_ERR() checking
usb: gadget: uvc: fix missing mutex_unlock() if kstrtou8() fails
Linux 5.15.100
Change-Id: Iae7b0b2459239d6e34d96c19839a1c374d054c9d
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -52,7 +52,7 @@ Date: Dec 2014
|
||||
KernelVersion: 4.0
|
||||
Description: Default output terminal descriptors
|
||||
|
||||
All attributes read only:
|
||||
All attributes read only except bSourceID:
|
||||
|
||||
============== =============================================
|
||||
iTerminal index of string descriptor
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 99
|
||||
SUBLEVEL = 100
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ int irq_select_affinity(unsigned int irq)
|
||||
cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0);
|
||||
last_cpu = cpu;
|
||||
|
||||
cpumask_copy(irq_data_get_affinity_mask(data), cpumask_of(cpu));
|
||||
irq_data_update_affinity(data, cpumask_of(cpu));
|
||||
chip->irq_set_affinity(data, cpumask_of(cpu), false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -242,7 +242,7 @@ stmpe811@41 {
|
||||
irq-trigger = <0x1>;
|
||||
|
||||
stmpegpio: stmpe-gpio {
|
||||
compatible = "stmpe,gpio";
|
||||
compatible = "st,stmpe-gpio";
|
||||
reg = <0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
|
||||
@@ -834,7 +834,7 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||
if (iosapic_intr_info[irq].count == 0) {
|
||||
#ifdef CONFIG_SMP
|
||||
/* Clear affinity */
|
||||
cpumask_setall(irq_get_affinity_mask(irq));
|
||||
irq_data_update_affinity(irq_get_irq_data(irq), cpu_all_mask);
|
||||
#endif
|
||||
/* Clear the interrupt information */
|
||||
iosapic_intr_info[irq].dest = 0;
|
||||
|
||||
@@ -57,8 +57,8 @@ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 };
|
||||
void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
|
||||
{
|
||||
if (irq < NR_IRQS) {
|
||||
cpumask_copy(irq_get_affinity_mask(irq),
|
||||
cpumask_of(cpu_logical_id(hwid)));
|
||||
irq_data_update_affinity(irq_get_irq_data(irq),
|
||||
cpumask_of(cpu_logical_id(hwid)));
|
||||
irq_redir[irq] = (char) (redir & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ static int ia64_set_msi_irq_affinity(struct irq_data *idata,
|
||||
msg.data = data;
|
||||
|
||||
pci_write_msi_msg(irq, &msg);
|
||||
cpumask_copy(irq_data_get_affinity_mask(idata), cpumask_of(cpu));
|
||||
irq_data_update_affinity(idata, cpumask_of(cpu));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -132,7 +132,7 @@ static int dmar_msi_set_affinity(struct irq_data *data,
|
||||
msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu));
|
||||
|
||||
dmar_msi_write(irq, &msg);
|
||||
cpumask_copy(irq_data_get_affinity_mask(data), mask);
|
||||
irq_data_update_affinity(data, mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -333,7 +333,7 @@ unsigned long txn_affinity_addr(unsigned int irq, int cpu)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
struct irq_data *d = irq_get_irq_data(irq);
|
||||
cpumask_copy(irq_data_get_affinity_mask(d), cpumask_of(cpu));
|
||||
irq_data_update_affinity(d, cpumask_of(cpu));
|
||||
#endif
|
||||
|
||||
return per_cpu(cpu_data, cpu).txn_addr;
|
||||
|
||||
@@ -770,6 +770,7 @@ static int vector_config(char *str, char **error_out)
|
||||
|
||||
if (parsed == NULL) {
|
||||
*error_out = "vector_config failed to parse parameters";
|
||||
kfree(params);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
@@ -131,8 +131,11 @@ static int um_pci_send_cmd(struct um_pci_device *dev,
|
||||
out ? 1 : 0,
|
||||
posted ? cmd : HANDLE_NO_FREE(cmd),
|
||||
GFP_ATOMIC);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
if (posted)
|
||||
kfree(cmd);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (posted) {
|
||||
virtqueue_kick(dev->cmd_vq);
|
||||
@@ -615,22 +618,33 @@ static void um_pci_virtio_remove(struct virtio_device *vdev)
|
||||
struct um_pci_device *dev = vdev->priv;
|
||||
int i;
|
||||
|
||||
/* Stop all virtqueues */
|
||||
vdev->config->reset(vdev);
|
||||
vdev->config->del_vqs(vdev);
|
||||
|
||||
device_set_wakeup_enable(&vdev->dev, false);
|
||||
|
||||
mutex_lock(&um_pci_mtx);
|
||||
for (i = 0; i < MAX_DEVICES; i++) {
|
||||
if (um_pci_devices[i].dev != dev)
|
||||
continue;
|
||||
|
||||
um_pci_devices[i].dev = NULL;
|
||||
irq_free_desc(dev->irq);
|
||||
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&um_pci_mtx);
|
||||
|
||||
um_pci_rescan();
|
||||
if (i < MAX_DEVICES) {
|
||||
struct pci_dev *pci_dev;
|
||||
|
||||
pci_dev = pci_get_slot(bridge->bus, i);
|
||||
if (pci_dev)
|
||||
pci_stop_and_remove_bus_device_locked(pci_dev);
|
||||
}
|
||||
|
||||
/* Stop all virtqueues */
|
||||
virtio_reset_device(vdev);
|
||||
dev->cmd_vq = NULL;
|
||||
dev->irq_vq = NULL;
|
||||
vdev->config->del_vqs(vdev);
|
||||
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
@@ -168,7 +168,8 @@ static void vhost_user_check_reset(struct virtio_uml_device *vu_dev,
|
||||
if (!vu_dev->registered)
|
||||
return;
|
||||
|
||||
virtio_break_device(&vu_dev->vdev);
|
||||
vu_dev->registered = 0;
|
||||
|
||||
schedule_work(&pdata->conn_broken_wk);
|
||||
}
|
||||
|
||||
@@ -1132,6 +1133,15 @@ void virtio_uml_set_no_vq_suspend(struct virtio_device *vdev,
|
||||
|
||||
static void vu_of_conn_broken(struct work_struct *wk)
|
||||
{
|
||||
struct virtio_uml_platform_data *pdata;
|
||||
struct virtio_uml_device *vu_dev;
|
||||
|
||||
pdata = container_of(wk, struct virtio_uml_platform_data, conn_broken_wk);
|
||||
|
||||
vu_dev = platform_get_drvdata(pdata->pdev);
|
||||
|
||||
virtio_break_device(&vu_dev->vdev);
|
||||
|
||||
/*
|
||||
* We can't remove the device from the devicetree so the only thing we
|
||||
* can do is warn.
|
||||
@@ -1262,8 +1272,14 @@ static int vu_unregister_cmdline_device(struct device *dev, void *data)
|
||||
static void vu_conn_broken(struct work_struct *wk)
|
||||
{
|
||||
struct virtio_uml_platform_data *pdata;
|
||||
struct virtio_uml_device *vu_dev;
|
||||
|
||||
pdata = container_of(wk, struct virtio_uml_platform_data, conn_broken_wk);
|
||||
|
||||
vu_dev = platform_get_drvdata(pdata->pdev);
|
||||
|
||||
virtio_break_device(&vu_dev->vdev);
|
||||
|
||||
vu_unregister_cmdline_device(&pdata->pdev->dev, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ DECLARE_STATIC_KEY_FALSE(rdt_mon_enable_key);
|
||||
* simple as possible.
|
||||
* Must be called with preemption disabled.
|
||||
*/
|
||||
static void __resctrl_sched_in(void)
|
||||
static inline void __resctrl_sched_in(struct task_struct *tsk)
|
||||
{
|
||||
struct resctrl_pqr_state *state = this_cpu_ptr(&pqr_state);
|
||||
u32 closid = state->default_closid;
|
||||
@@ -63,13 +63,13 @@ static void __resctrl_sched_in(void)
|
||||
* Else use the closid/rmid assigned to this cpu.
|
||||
*/
|
||||
if (static_branch_likely(&rdt_alloc_enable_key)) {
|
||||
tmp = READ_ONCE(current->closid);
|
||||
tmp = READ_ONCE(tsk->closid);
|
||||
if (tmp)
|
||||
closid = tmp;
|
||||
}
|
||||
|
||||
if (static_branch_likely(&rdt_mon_enable_key)) {
|
||||
tmp = READ_ONCE(current->rmid);
|
||||
tmp = READ_ONCE(tsk->rmid);
|
||||
if (tmp)
|
||||
rmid = tmp;
|
||||
}
|
||||
@@ -81,17 +81,17 @@ static void __resctrl_sched_in(void)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void resctrl_sched_in(void)
|
||||
static inline void resctrl_sched_in(struct task_struct *tsk)
|
||||
{
|
||||
if (static_branch_likely(&rdt_enable_key))
|
||||
__resctrl_sched_in();
|
||||
__resctrl_sched_in(tsk);
|
||||
}
|
||||
|
||||
void resctrl_cpu_detect(struct cpuinfo_x86 *c);
|
||||
|
||||
#else
|
||||
|
||||
static inline void resctrl_sched_in(void) {}
|
||||
static inline void resctrl_sched_in(struct task_struct *tsk) {}
|
||||
static inline void resctrl_cpu_detect(struct cpuinfo_x86 *c) {}
|
||||
|
||||
#endif /* CONFIG_X86_CPU_RESCTRL */
|
||||
|
||||
@@ -314,7 +314,7 @@ static void update_cpu_closid_rmid(void *info)
|
||||
* executing task might have its own closid selected. Just reuse
|
||||
* the context switch code.
|
||||
*/
|
||||
resctrl_sched_in();
|
||||
resctrl_sched_in(current);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -535,7 +535,7 @@ static void _update_task_closid_rmid(void *task)
|
||||
* Otherwise, the MSR is updated when the task is scheduled in.
|
||||
*/
|
||||
if (task == current)
|
||||
resctrl_sched_in();
|
||||
resctrl_sched_in(task);
|
||||
}
|
||||
|
||||
static void update_task_closid_rmid(struct task_struct *t)
|
||||
|
||||
@@ -216,7 +216,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
switch_fpu_finish(next_fpu);
|
||||
|
||||
/* Load the Intel cache allocation PQR MSR. */
|
||||
resctrl_sched_in();
|
||||
resctrl_sched_in(next_p);
|
||||
|
||||
return prev_p;
|
||||
}
|
||||
|
||||
@@ -656,7 +656,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
}
|
||||
|
||||
/* Load the Intel cache allocation PQR MSR. */
|
||||
resctrl_sched_in();
|
||||
resctrl_sched_in(next_p);
|
||||
|
||||
return prev_p;
|
||||
}
|
||||
|
||||
@@ -17,8 +17,10 @@ int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts)
|
||||
{
|
||||
long ret;
|
||||
|
||||
asm("syscall" : "=a" (ret) :
|
||||
"0" (__NR_clock_gettime), "D" (clock), "S" (ts) : "memory");
|
||||
asm("syscall"
|
||||
: "=a" (ret)
|
||||
: "0" (__NR_clock_gettime), "D" (clock), "S" (ts)
|
||||
: "rcx", "r11", "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -29,8 +31,10 @@ int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
|
||||
{
|
||||
long ret;
|
||||
|
||||
asm("syscall" : "=a" (ret) :
|
||||
"0" (__NR_gettimeofday), "D" (tv), "S" (tz) : "memory");
|
||||
asm("syscall"
|
||||
: "=a" (ret)
|
||||
: "0" (__NR_gettimeofday), "D" (tv), "S" (tz)
|
||||
: "rcx", "r11", "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -322,8 +322,10 @@ static int hd44780_probe(struct platform_device *pdev)
|
||||
static int hd44780_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct charlcd *lcd = platform_get_drvdata(pdev);
|
||||
struct hd44780_common *hdc = lcd->drvdata;
|
||||
|
||||
charlcd_unregister(lcd);
|
||||
kfree(hdc->hd44780);
|
||||
kfree(lcd->drvdata);
|
||||
|
||||
kfree(lcd);
|
||||
|
||||
@@ -130,7 +130,7 @@ static void component_master_debugfs_add(struct master *m)
|
||||
|
||||
static void component_master_debugfs_del(struct master *m)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(dev_name(m->parent), component_debugfs_dir));
|
||||
debugfs_lookup_and_remove(dev_name(m->parent), component_debugfs_dir);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -352,7 +352,7 @@ late_initcall(deferred_probe_initcall);
|
||||
|
||||
static void __exit deferred_probe_exit(void)
|
||||
{
|
||||
debugfs_remove_recursive(debugfs_lookup("devices_deferred", NULL));
|
||||
debugfs_lookup_and_remove("devices_deferred", NULL);
|
||||
}
|
||||
__exitcall(deferred_probe_exit);
|
||||
|
||||
|
||||
@@ -1155,13 +1155,13 @@ loop_set_status_from_info(struct loop_device *lo,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Avoid assigning overflow values */
|
||||
if (info->lo_offset > LLONG_MAX || info->lo_sizelimit > LLONG_MAX)
|
||||
return -EOVERFLOW;
|
||||
|
||||
lo->lo_offset = info->lo_offset;
|
||||
lo->lo_sizelimit = info->lo_sizelimit;
|
||||
|
||||
/* loff_t vars have been assigned __u64 */
|
||||
if (lo->lo_offset < 0 || lo->lo_sizelimit < 0)
|
||||
return -EOVERFLOW;
|
||||
|
||||
memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE);
|
||||
memcpy(lo->lo_crypt_name, info->lo_crypt_name, LO_NAME_SIZE);
|
||||
lo->lo_file_name[LO_NAME_SIZE-1] = 0;
|
||||
|
||||
@@ -266,6 +266,14 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
|
||||
"Lenovo ideapad D330-10IGM"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Lenovo IdeaPad Duet 3 10IGL5 with 1200x1920 portrait screen */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
|
||||
"IdeaPad Duet 3 10IGL5"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
@@ -348,7 +348,7 @@ static bool malidp_check_pages_threshold(struct malidp_plane_state *ms,
|
||||
else
|
||||
sgt = obj->funcs->get_sg_table(obj);
|
||||
|
||||
if (!sgt)
|
||||
if (IS_ERR(sgt))
|
||||
return false;
|
||||
|
||||
sgl = sgt->sgl;
|
||||
|
||||
@@ -3781,6 +3781,9 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
|
||||
set_bit(0, &mgr->payload_mask);
|
||||
mgr->vcpi_mask = 0;
|
||||
mgr->payload_id_table_cleared = false;
|
||||
|
||||
memset(&mgr->down_rep_recv, 0, sizeof(mgr->down_rep_recv));
|
||||
memset(&mgr->up_req_recv, 0, sizeof(mgr->up_req_recv));
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
@@ -3994,7 +3997,7 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)
|
||||
struct drm_dp_sideband_msg_rx *msg = &mgr->down_rep_recv;
|
||||
|
||||
if (!drm_dp_get_one_sb_msg(mgr, false, &mstb))
|
||||
goto out;
|
||||
goto out_clear_reply;
|
||||
|
||||
/* Multi-packet message transmission, don't clear the reply */
|
||||
if (!msg->have_eomt)
|
||||
|
||||
@@ -169,8 +169,9 @@ static int virtio_gpu_object_shmem_init(struct virtio_gpu_device *vgdev,
|
||||
shmem->pages = drm_gem_shmem_get_sg_table(&bo->base.base);
|
||||
if (IS_ERR(shmem->pages)) {
|
||||
drm_gem_shmem_unpin(&bo->base.base);
|
||||
ret = PTR_ERR(shmem->pages);
|
||||
shmem->pages = NULL;
|
||||
return PTR_ERR(shmem->pages);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (use_dma_api) {
|
||||
|
||||
@@ -296,9 +296,12 @@ int mma9551_read_config_word(struct i2c_client *client, u8 app_id,
|
||||
|
||||
ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_CONFIG,
|
||||
reg, NULL, 0, (u8 *)&v, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*val = be16_to_cpu(v);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mma9551_read_config_word);
|
||||
|
||||
@@ -354,9 +357,12 @@ int mma9551_read_status_word(struct i2c_client *client, u8 app_id,
|
||||
|
||||
ret = mma9551_transfer(client, app_id, MMA9551_CMD_READ_STATUS,
|
||||
reg, NULL, 0, (u8 *)&v, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*val = be16_to_cpu(v);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mma9551_read_status_word);
|
||||
|
||||
|
||||
@@ -1055,7 +1055,7 @@ static void read_link_down_reason(struct hfi1_devdata *dd, u8 *ldr);
|
||||
static void handle_temp_err(struct hfi1_devdata *dd);
|
||||
static void dc_shutdown(struct hfi1_devdata *dd);
|
||||
static void dc_start(struct hfi1_devdata *dd);
|
||||
static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp,
|
||||
static int qos_rmt_entries(unsigned int n_krcv_queues, unsigned int *mp,
|
||||
unsigned int *np);
|
||||
static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd);
|
||||
static int wait_link_transfer_active(struct hfi1_devdata *dd, int wait_ms);
|
||||
@@ -13361,7 +13361,6 @@ static int set_up_context_variables(struct hfi1_devdata *dd)
|
||||
int ret;
|
||||
unsigned ngroups;
|
||||
int rmt_count;
|
||||
int user_rmt_reduced;
|
||||
u32 n_usr_ctxts;
|
||||
u32 send_contexts = chip_send_contexts(dd);
|
||||
u32 rcv_contexts = chip_rcv_contexts(dd);
|
||||
@@ -13420,28 +13419,34 @@ static int set_up_context_variables(struct hfi1_devdata *dd)
|
||||
(num_kernel_contexts + n_usr_ctxts),
|
||||
&node_affinity.real_cpu_mask);
|
||||
/*
|
||||
* The RMT entries are currently allocated as shown below:
|
||||
* 1. QOS (0 to 128 entries);
|
||||
* 2. FECN (num_kernel_context - 1 + num_user_contexts +
|
||||
* num_netdev_contexts);
|
||||
* 3. netdev (num_netdev_contexts).
|
||||
* It should be noted that FECN oversubscribe num_netdev_contexts
|
||||
* entries of RMT because both netdev and PSM could allocate any receive
|
||||
* context between dd->first_dyn_alloc_text and dd->num_rcv_contexts,
|
||||
* and PSM FECN must reserve an RMT entry for each possible PSM receive
|
||||
* context.
|
||||
* RMT entries are allocated as follows:
|
||||
* 1. QOS (0 to 128 entries)
|
||||
* 2. FECN (num_kernel_context - 1 [a] + num_user_contexts +
|
||||
* num_netdev_contexts [b])
|
||||
* 3. netdev (NUM_NETDEV_MAP_ENTRIES)
|
||||
*
|
||||
* Notes:
|
||||
* [a] Kernel contexts (except control) are included in FECN if kernel
|
||||
* TID_RDMA is active.
|
||||
* [b] Netdev and user contexts are randomly allocated from the same
|
||||
* context pool, so FECN must cover all contexts in the pool.
|
||||
*/
|
||||
rmt_count = qos_rmt_entries(dd, NULL, NULL) + (num_netdev_contexts * 2);
|
||||
if (HFI1_CAP_IS_KSET(TID_RDMA))
|
||||
rmt_count += num_kernel_contexts - 1;
|
||||
if (rmt_count + n_usr_ctxts > NUM_MAP_ENTRIES) {
|
||||
user_rmt_reduced = NUM_MAP_ENTRIES - rmt_count;
|
||||
dd_dev_err(dd,
|
||||
"RMT size is reducing the number of user receive contexts from %u to %d\n",
|
||||
n_usr_ctxts,
|
||||
user_rmt_reduced);
|
||||
/* recalculate */
|
||||
n_usr_ctxts = user_rmt_reduced;
|
||||
rmt_count = qos_rmt_entries(num_kernel_contexts - 1, NULL, NULL)
|
||||
+ (HFI1_CAP_IS_KSET(TID_RDMA) ? num_kernel_contexts - 1
|
||||
: 0)
|
||||
+ n_usr_ctxts
|
||||
+ num_netdev_contexts
|
||||
+ NUM_NETDEV_MAP_ENTRIES;
|
||||
if (rmt_count > NUM_MAP_ENTRIES) {
|
||||
int over = rmt_count - NUM_MAP_ENTRIES;
|
||||
/* try to squish user contexts, minimum of 1 */
|
||||
if (over >= n_usr_ctxts) {
|
||||
dd_dev_err(dd, "RMT overflow: reduce the requested number of contexts\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dd_dev_err(dd, "RMT overflow: reducing # user contexts from %u to %u\n",
|
||||
n_usr_ctxts, n_usr_ctxts - over);
|
||||
n_usr_ctxts -= over;
|
||||
}
|
||||
|
||||
/* the first N are kernel contexts, the rest are user/netdev contexts */
|
||||
@@ -14298,15 +14303,15 @@ static void clear_rsm_rule(struct hfi1_devdata *dd, u8 rule_index)
|
||||
}
|
||||
|
||||
/* return the number of RSM map table entries that will be used for QOS */
|
||||
static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp,
|
||||
static int qos_rmt_entries(unsigned int n_krcv_queues, unsigned int *mp,
|
||||
unsigned int *np)
|
||||
{
|
||||
int i;
|
||||
unsigned int m, n;
|
||||
u8 max_by_vl = 0;
|
||||
uint max_by_vl = 0;
|
||||
|
||||
/* is QOS active at all? */
|
||||
if (dd->n_krcv_queues <= MIN_KERNEL_KCTXTS ||
|
||||
if (n_krcv_queues < MIN_KERNEL_KCTXTS ||
|
||||
num_vls == 1 ||
|
||||
krcvqsset <= 1)
|
||||
goto no_qos;
|
||||
@@ -14364,7 +14369,7 @@ static void init_qos(struct hfi1_devdata *dd, struct rsm_map_table *rmt)
|
||||
|
||||
if (!rmt)
|
||||
goto bail;
|
||||
rmt_entries = qos_rmt_entries(dd, &m, &n);
|
||||
rmt_entries = qos_rmt_entries(dd->n_krcv_queues - 1, &m, &n);
|
||||
if (rmt_entries == 0)
|
||||
goto bail;
|
||||
qpns_per_vl = 1 << m;
|
||||
|
||||
@@ -1586,27 +1586,29 @@ static int pdev_iommuv2_enable(struct pci_dev *pdev)
|
||||
/* Only allow access to user-accessible pages */
|
||||
ret = pci_enable_pasid(pdev, 0);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
return ret;
|
||||
|
||||
/* First reset the PRI state of the device */
|
||||
ret = pci_reset_pri(pdev);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
goto out_err_pasid;
|
||||
|
||||
/* Enable PRI */
|
||||
/* FIXME: Hardcode number of outstanding requests for now */
|
||||
ret = pci_enable_pri(pdev, 32);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
goto out_err_pasid;
|
||||
|
||||
ret = pci_enable_ats(pdev, PAGE_SHIFT);
|
||||
if (ret)
|
||||
goto out_err;
|
||||
goto out_err_pri;
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
out_err_pri:
|
||||
pci_disable_pri(pdev);
|
||||
|
||||
out_err_pasid:
|
||||
pci_disable_pasid(pdev);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -220,11 +220,11 @@ static int bcm6345_l1_set_affinity(struct irq_data *d,
|
||||
enabled = intc->cpus[old_cpu]->enable_cache[word] & mask;
|
||||
if (enabled)
|
||||
__bcm6345_l1_mask(d);
|
||||
cpumask_copy(irq_data_get_affinity_mask(d), dest);
|
||||
irq_data_update_affinity(d, dest);
|
||||
if (enabled)
|
||||
__bcm6345_l1_unmask(d);
|
||||
} else {
|
||||
cpumask_copy(irq_data_get_affinity_mask(d), dest);
|
||||
irq_data_update_affinity(d, dest);
|
||||
}
|
||||
raw_spin_unlock_irqrestore(&intc->lock, flags);
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
||||
*/
|
||||
|
||||
#include <asm/barrier.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
@@ -1460,6 +1461,10 @@ static void uvc_ctrl_status_event_work(struct work_struct *work)
|
||||
|
||||
uvc_ctrl_status_event(w->chain, w->ctrl, w->data);
|
||||
|
||||
/* The barrier is needed to synchronize with uvc_status_stop(). */
|
||||
if (smp_load_acquire(&dev->flush_status))
|
||||
return;
|
||||
|
||||
/* Resubmit the URB. */
|
||||
w->urb->interval = dev->int_ep->desc.bInterval;
|
||||
ret = usb_submit_urb(w->urb, GFP_KERNEL);
|
||||
|
||||
@@ -252,14 +252,10 @@ static int uvc_parse_format(struct uvc_device *dev,
|
||||
fmtdesc = uvc_format_by_guid(&buffer[5]);
|
||||
|
||||
if (fmtdesc != NULL) {
|
||||
strscpy(format->name, fmtdesc->name,
|
||||
sizeof(format->name));
|
||||
format->fcc = fmtdesc->fcc;
|
||||
} else {
|
||||
dev_info(&streaming->intf->dev,
|
||||
"Unknown video format %pUl\n", &buffer[5]);
|
||||
snprintf(format->name, sizeof(format->name), "%pUl\n",
|
||||
&buffer[5]);
|
||||
format->fcc = 0;
|
||||
}
|
||||
|
||||
@@ -270,8 +266,6 @@ static int uvc_parse_format(struct uvc_device *dev,
|
||||
*/
|
||||
if (dev->quirks & UVC_QUIRK_FORCE_Y8) {
|
||||
if (format->fcc == V4L2_PIX_FMT_YUYV) {
|
||||
strscpy(format->name, "Greyscale 8-bit (Y8 )",
|
||||
sizeof(format->name));
|
||||
format->fcc = V4L2_PIX_FMT_GREY;
|
||||
format->bpp = 8;
|
||||
width_multiplier = 2;
|
||||
@@ -312,7 +306,6 @@ static int uvc_parse_format(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
strscpy(format->name, "MJPEG", sizeof(format->name));
|
||||
format->fcc = V4L2_PIX_FMT_MJPEG;
|
||||
format->flags = UVC_FMT_FLAG_COMPRESSED;
|
||||
format->bpp = 0;
|
||||
@@ -328,17 +321,7 @@ static int uvc_parse_format(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (buffer[8] & 0x7f) {
|
||||
case 0:
|
||||
strscpy(format->name, "SD-DV", sizeof(format->name));
|
||||
break;
|
||||
case 1:
|
||||
strscpy(format->name, "SDL-DV", sizeof(format->name));
|
||||
break;
|
||||
case 2:
|
||||
strscpy(format->name, "HD-DV", sizeof(format->name));
|
||||
break;
|
||||
default:
|
||||
if ((buffer[8] & 0x7f) > 2) {
|
||||
uvc_dbg(dev, DESCR,
|
||||
"device %d videostreaming interface %d: unknown DV format %u\n",
|
||||
dev->udev->devnum,
|
||||
@@ -346,9 +329,6 @@ static int uvc_parse_format(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
strlcat(format->name, buffer[8] & (1 << 7) ? " 60Hz" : " 50Hz",
|
||||
sizeof(format->name));
|
||||
|
||||
format->fcc = V4L2_PIX_FMT_DV;
|
||||
format->flags = UVC_FMT_FLAG_COMPRESSED | UVC_FMT_FLAG_STREAM;
|
||||
format->bpp = 0;
|
||||
@@ -375,7 +355,7 @@ static int uvc_parse_format(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
uvc_dbg(dev, DESCR, "Found format %s\n", format->name);
|
||||
uvc_dbg(dev, DESCR, "Found format %p4cc", &format->fcc);
|
||||
|
||||
buflen -= buffer[0];
|
||||
buffer += buffer[0];
|
||||
@@ -872,10 +852,8 @@ static int uvc_parse_vendor_control(struct uvc_device *dev,
|
||||
+ n;
|
||||
memcpy(unit->extension.bmControls, &buffer[23+p], 2*n);
|
||||
|
||||
if (buffer[24+p+2*n] != 0)
|
||||
usb_string(udev, buffer[24+p+2*n], unit->name,
|
||||
sizeof(unit->name));
|
||||
else
|
||||
if (buffer[24+p+2*n] == 0 ||
|
||||
usb_string(udev, buffer[24+p+2*n], unit->name, sizeof(unit->name)) < 0)
|
||||
sprintf(unit->name, "Extension %u", buffer[3]);
|
||||
|
||||
list_add_tail(&unit->list, &dev->entities);
|
||||
@@ -999,15 +977,15 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
memcpy(term->media.bmTransportModes, &buffer[10+n], p);
|
||||
}
|
||||
|
||||
if (buffer[7] != 0)
|
||||
usb_string(udev, buffer[7], term->name,
|
||||
sizeof(term->name));
|
||||
else if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA)
|
||||
sprintf(term->name, "Camera %u", buffer[3]);
|
||||
else if (UVC_ENTITY_TYPE(term) == UVC_ITT_MEDIA_TRANSPORT_INPUT)
|
||||
sprintf(term->name, "Media %u", buffer[3]);
|
||||
else
|
||||
sprintf(term->name, "Input %u", buffer[3]);
|
||||
if (buffer[7] == 0 ||
|
||||
usb_string(udev, buffer[7], term->name, sizeof(term->name)) < 0) {
|
||||
if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA)
|
||||
sprintf(term->name, "Camera %u", buffer[3]);
|
||||
if (UVC_ENTITY_TYPE(term) == UVC_ITT_MEDIA_TRANSPORT_INPUT)
|
||||
sprintf(term->name, "Media %u", buffer[3]);
|
||||
else
|
||||
sprintf(term->name, "Input %u", buffer[3]);
|
||||
}
|
||||
|
||||
list_add_tail(&term->list, &dev->entities);
|
||||
break;
|
||||
@@ -1039,10 +1017,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
|
||||
memcpy(term->baSourceID, &buffer[7], 1);
|
||||
|
||||
if (buffer[8] != 0)
|
||||
usb_string(udev, buffer[8], term->name,
|
||||
sizeof(term->name));
|
||||
else
|
||||
if (buffer[8] == 0 ||
|
||||
usb_string(udev, buffer[8], term->name, sizeof(term->name)) < 0)
|
||||
sprintf(term->name, "Output %u", buffer[3]);
|
||||
|
||||
list_add_tail(&term->list, &dev->entities);
|
||||
@@ -1064,10 +1040,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
|
||||
memcpy(unit->baSourceID, &buffer[5], p);
|
||||
|
||||
if (buffer[5+p] != 0)
|
||||
usb_string(udev, buffer[5+p], unit->name,
|
||||
sizeof(unit->name));
|
||||
else
|
||||
if (buffer[5+p] == 0 ||
|
||||
usb_string(udev, buffer[5+p], unit->name, sizeof(unit->name)) < 0)
|
||||
sprintf(unit->name, "Selector %u", buffer[3]);
|
||||
|
||||
list_add_tail(&unit->list, &dev->entities);
|
||||
@@ -1097,10 +1071,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
if (dev->uvc_version >= 0x0110)
|
||||
unit->processing.bmVideoStandards = buffer[9+n];
|
||||
|
||||
if (buffer[8+n] != 0)
|
||||
usb_string(udev, buffer[8+n], unit->name,
|
||||
sizeof(unit->name));
|
||||
else
|
||||
if (buffer[8+n] == 0 ||
|
||||
usb_string(udev, buffer[8+n], unit->name, sizeof(unit->name)) < 0)
|
||||
sprintf(unit->name, "Processing %u", buffer[3]);
|
||||
|
||||
list_add_tail(&unit->list, &dev->entities);
|
||||
@@ -1128,10 +1100,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
unit->extension.bmControls = (u8 *)unit + sizeof(*unit);
|
||||
memcpy(unit->extension.bmControls, &buffer[23+p], n);
|
||||
|
||||
if (buffer[23+p+n] != 0)
|
||||
usb_string(udev, buffer[23+p+n], unit->name,
|
||||
sizeof(unit->name));
|
||||
else
|
||||
if (buffer[23+p+n] == 0 ||
|
||||
usb_string(udev, buffer[23+p+n], unit->name, sizeof(unit->name)) < 0)
|
||||
sprintf(unit->name, "Extension %u", buffer[3]);
|
||||
|
||||
list_add_tail(&unit->list, &dev->entities);
|
||||
@@ -2435,6 +2405,24 @@ static const struct usb_device_id uvc_ids[] = {
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = (kernel_ulong_t)&uvc_quirk_probe_minmax },
|
||||
/* Logitech, Webcam C910 */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = 0x046d,
|
||||
.idProduct = 0x0821,
|
||||
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_INFO_QUIRK(UVC_QUIRK_WAKE_AUTOSUSPEND)},
|
||||
/* Logitech, Webcam B910 */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = 0x046d,
|
||||
.idProduct = 0x0823,
|
||||
.bInterfaceClass = USB_CLASS_VIDEO,
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_INFO_QUIRK(UVC_QUIRK_WAKE_AUTOSUSPEND)},
|
||||
/* Logitech Quickcam Fusion */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
|
||||
@@ -37,7 +37,7 @@ static int uvc_mc_create_links(struct uvc_video_chain *chain,
|
||||
continue;
|
||||
|
||||
remote = uvc_entity_by_id(chain->dev, entity->baSourceID[i]);
|
||||
if (remote == NULL)
|
||||
if (remote == NULL || remote->num_pads == 0)
|
||||
return -EINVAL;
|
||||
|
||||
source = (UVC_ENTITY_TYPE(remote) == UVC_TT_STREAMING)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
||||
*/
|
||||
|
||||
#include <asm/barrier.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -309,5 +310,41 @@ int uvc_status_start(struct uvc_device *dev, gfp_t flags)
|
||||
|
||||
void uvc_status_stop(struct uvc_device *dev)
|
||||
{
|
||||
struct uvc_ctrl_work *w = &dev->async_ctrl;
|
||||
|
||||
/*
|
||||
* Prevent the asynchronous control handler from requeing the URB. The
|
||||
* barrier is needed so the flush_status change is visible to other
|
||||
* CPUs running the asynchronous handler before usb_kill_urb() is
|
||||
* called below.
|
||||
*/
|
||||
smp_store_release(&dev->flush_status, true);
|
||||
|
||||
/*
|
||||
* Cancel any pending asynchronous work. If any status event was queued,
|
||||
* process it synchronously.
|
||||
*/
|
||||
if (cancel_work_sync(&w->work))
|
||||
uvc_ctrl_status_event(w->chain, w->ctrl, w->data);
|
||||
|
||||
/* Kill the urb. */
|
||||
usb_kill_urb(dev->int_urb);
|
||||
|
||||
/*
|
||||
* The URB completion handler may have queued asynchronous work. This
|
||||
* won't resubmit the URB as flush_status is set, but it needs to be
|
||||
* cancelled before returning or it could then race with a future
|
||||
* uvc_status_start() call.
|
||||
*/
|
||||
if (cancel_work_sync(&w->work))
|
||||
uvc_ctrl_status_event(w->chain, w->ctrl, w->data);
|
||||
|
||||
/*
|
||||
* From this point, there are no events on the queue and the status URB
|
||||
* is dead. No events will be queued until uvc_status_start() is called.
|
||||
* The barrier is needed to make sure that flush_status is visible to
|
||||
* uvc_ctrl_status_event_work() when uvc_status_start() will be called
|
||||
* again.
|
||||
*/
|
||||
smp_store_release(&dev->flush_status, false);
|
||||
}
|
||||
|
||||
@@ -657,8 +657,6 @@ static int uvc_ioctl_enum_fmt(struct uvc_streaming *stream,
|
||||
fmt->flags = 0;
|
||||
if (format->flags & UVC_FMT_FLAG_COMPRESSED)
|
||||
fmt->flags |= V4L2_FMT_FLAG_COMPRESSED;
|
||||
strscpy(fmt->description, format->name, sizeof(fmt->description));
|
||||
fmt->description[sizeof(fmt->description) - 1] = 0;
|
||||
fmt->pixelformat = format->fcc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1334,7 +1334,9 @@ static void uvc_video_decode_meta(struct uvc_streaming *stream,
|
||||
if (has_scr)
|
||||
memcpy(stream->clock.last_scr, scr, 6);
|
||||
|
||||
memcpy(&meta->length, mem, length);
|
||||
meta->length = mem[0];
|
||||
meta->flags = mem[1];
|
||||
memcpy(meta->buf, &mem[2], length - 2);
|
||||
meta_buf->bytesused += length + sizeof(meta->ns) + sizeof(meta->sof);
|
||||
|
||||
uvc_dbg(stream->dev, FRAME,
|
||||
@@ -1951,6 +1953,17 @@ static int uvc_video_start_transfer(struct uvc_streaming *stream,
|
||||
"Selecting alternate setting %u (%u B/frame bandwidth)\n",
|
||||
altsetting, best_psize);
|
||||
|
||||
/*
|
||||
* Some devices, namely the Logitech C910 and B910, are unable
|
||||
* to recover from a USB autosuspend, unless the alternate
|
||||
* setting of the streaming interface is toggled.
|
||||
*/
|
||||
if (stream->dev->quirks & UVC_QUIRK_WAKE_AUTOSUSPEND) {
|
||||
usb_set_interface(stream->dev->udev, intfnum,
|
||||
altsetting);
|
||||
usb_set_interface(stream->dev->udev, intfnum, 0);
|
||||
}
|
||||
|
||||
ret = usb_set_interface(stream->dev->udev, intfnum, altsetting);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
#define UVC_QUIRK_RESTORE_CTRLS_ON_INIT 0x00000400
|
||||
#define UVC_QUIRK_FORCE_Y8 0x00000800
|
||||
#define UVC_QUIRK_FORCE_BPP 0x00001000
|
||||
#define UVC_QUIRK_WAKE_AUTOSUSPEND 0x00002000
|
||||
|
||||
/* Format flags */
|
||||
#define UVC_FMT_FLAG_COMPRESSED 0x00000001
|
||||
@@ -265,8 +266,6 @@ struct uvc_format {
|
||||
u32 fcc;
|
||||
u32 flags;
|
||||
|
||||
char name[32];
|
||||
|
||||
unsigned int nframes;
|
||||
struct uvc_frame *frame;
|
||||
};
|
||||
@@ -558,6 +557,7 @@ struct uvc_device {
|
||||
/* Status Interrupt Endpoint */
|
||||
struct usb_host_endpoint *int_ep;
|
||||
struct urb *int_urb;
|
||||
bool flush_status;
|
||||
u8 *status;
|
||||
struct input_dev *input;
|
||||
char input_phys[64];
|
||||
|
||||
@@ -45,7 +45,7 @@ int arizona_clk32k_enable(struct arizona *arizona)
|
||||
if (arizona->clk32k_ref == 1) {
|
||||
switch (arizona->pdata.clk32k_src) {
|
||||
case ARIZONA_32KZ_MCLK1:
|
||||
ret = pm_runtime_get_sync(arizona->dev);
|
||||
ret = pm_runtime_resume_and_get(arizona->dev);
|
||||
if (ret != 0)
|
||||
goto err_ref;
|
||||
ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]);
|
||||
|
||||
@@ -175,7 +175,7 @@ static int mei_fwver(struct mei_cl_device *cldev)
|
||||
ret = __mei_cl_send(cldev->cl, (u8 *)&req, sizeof(req), 0,
|
||||
MEI_CL_IO_TX_BLOCKING);
|
||||
if (ret < 0) {
|
||||
dev_err(&cldev->dev, "Could not send ReqFWVersion cmd\n");
|
||||
dev_err(&cldev->dev, "Could not send ReqFWVersion cmd ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@ static int mei_fwver(struct mei_cl_device *cldev)
|
||||
* Should be at least one version block,
|
||||
* error out if nothing found
|
||||
*/
|
||||
dev_err(&cldev->dev, "Could not read FW version\n");
|
||||
dev_err(&cldev->dev, "Could not read FW version ret = %d\n", bytes_recv);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -337,7 +337,7 @@ static int mei_nfc_if_version(struct mei_cl *cl,
|
||||
ret = __mei_cl_send(cl, (u8 *)&cmd, sizeof(cmd), 0,
|
||||
MEI_CL_IO_TX_BLOCKING);
|
||||
if (ret < 0) {
|
||||
dev_err(bus->dev, "Could not send IF version cmd\n");
|
||||
dev_err(bus->dev, "Could not send IF version cmd ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -352,7 +352,7 @@ static int mei_nfc_if_version(struct mei_cl *cl,
|
||||
bytes_recv = __mei_cl_recv(cl, (u8 *)reply, if_version_length, &vtag,
|
||||
0, 0);
|
||||
if (bytes_recv < 0 || (size_t)bytes_recv < if_version_length) {
|
||||
dev_err(bus->dev, "Could not read IF version\n");
|
||||
dev_err(bus->dev, "Could not read IF version ret = %d\n", bytes_recv);
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -1711,7 +1711,7 @@ static void __init vmballoon_debugfs_init(struct vmballoon *b)
|
||||
static void __exit vmballoon_debugfs_exit(struct vmballoon *b)
|
||||
{
|
||||
static_key_disable(&balloon_stat_enabled.key);
|
||||
debugfs_remove(debugfs_lookup("vmmemctl", NULL));
|
||||
debugfs_lookup_and_remove("vmmemctl", NULL);
|
||||
kfree(b->stats);
|
||||
b->stats = NULL;
|
||||
}
|
||||
|
||||
@@ -468,6 +468,7 @@ static int uif_init(struct ubi_device *ubi)
|
||||
err = ubi_add_volume(ubi, ubi->volumes[i]);
|
||||
if (err) {
|
||||
ubi_err(ubi, "cannot add volume %d", i);
|
||||
ubi->volumes[i] = NULL;
|
||||
goto out_volumes;
|
||||
}
|
||||
}
|
||||
@@ -663,6 +664,12 @@ static int io_init(struct ubi_device *ubi, int max_beb_per1024)
|
||||
ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size);
|
||||
ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size);
|
||||
|
||||
if (ubi->vid_hdr_offset && ((ubi->vid_hdr_offset + UBI_VID_HDR_SIZE) >
|
||||
ubi->vid_hdr_alsize)) {
|
||||
ubi_err(ubi, "VID header offset %d too large.", ubi->vid_hdr_offset);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dbg_gen("min_io_size %d", ubi->min_io_size);
|
||||
dbg_gen("max_write_size %d", ubi->max_write_size);
|
||||
dbg_gen("hdrs_min_io_size %d", ubi->hdrs_min_io_size);
|
||||
|
||||
@@ -146,13 +146,15 @@ void ubi_refill_pools(struct ubi_device *ubi)
|
||||
if (ubi->fm_anchor) {
|
||||
wl_tree_add(ubi->fm_anchor, &ubi->free);
|
||||
ubi->free_count++;
|
||||
ubi->fm_anchor = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* All available PEBs are in ubi->free, now is the time to get
|
||||
* the best anchor PEBs.
|
||||
*/
|
||||
ubi->fm_anchor = ubi_wl_get_fm_peb(ubi, 1);
|
||||
if (!ubi->fm_disabled)
|
||||
/*
|
||||
* All available PEBs are in ubi->free, now is the time to get
|
||||
* the best anchor PEBs.
|
||||
*/
|
||||
ubi->fm_anchor = ubi_wl_get_fm_peb(ubi, 1);
|
||||
|
||||
for (;;) {
|
||||
enough = 0;
|
||||
|
||||
@@ -464,7 +464,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
|
||||
for (i = 0; i < -pebs; i++) {
|
||||
err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i);
|
||||
if (err)
|
||||
goto out_acc;
|
||||
goto out_free;
|
||||
}
|
||||
spin_lock(&ubi->volumes_lock);
|
||||
ubi->rsvd_pebs += pebs;
|
||||
@@ -512,8 +512,10 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
|
||||
ubi->avail_pebs += pebs;
|
||||
spin_unlock(&ubi->volumes_lock);
|
||||
}
|
||||
return err;
|
||||
|
||||
out_free:
|
||||
kfree(new_eba_tbl);
|
||||
ubi_eba_destroy_table(new_eba_tbl);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -580,6 +582,7 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol)
|
||||
if (err) {
|
||||
ubi_err(ubi, "cannot add character device for volume %d, error %d",
|
||||
vol_id, err);
|
||||
vol_release(&vol->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -590,15 +593,14 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol)
|
||||
vol->dev.groups = volume_dev_groups;
|
||||
dev_set_name(&vol->dev, "%s_%d", ubi->ubi_name, vol->vol_id);
|
||||
err = device_register(&vol->dev);
|
||||
if (err)
|
||||
goto out_cdev;
|
||||
if (err) {
|
||||
cdev_del(&vol->cdev);
|
||||
put_device(&vol->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
self_check_volumes(ubi);
|
||||
return err;
|
||||
|
||||
out_cdev:
|
||||
cdev_del(&vol->cdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -886,8 +886,11 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
|
||||
|
||||
err = do_sync_erase(ubi, e1, vol_id, lnum, 0);
|
||||
if (err) {
|
||||
if (e2)
|
||||
if (e2) {
|
||||
spin_lock(&ubi->wl_lock);
|
||||
wl_entry_destroy(ubi, e2);
|
||||
spin_unlock(&ubi->wl_lock);
|
||||
}
|
||||
goto out_ro;
|
||||
}
|
||||
|
||||
@@ -969,11 +972,11 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
|
||||
spin_lock(&ubi->wl_lock);
|
||||
ubi->move_from = ubi->move_to = NULL;
|
||||
ubi->move_to_put = ubi->wl_scheduled = 0;
|
||||
wl_entry_destroy(ubi, e1);
|
||||
wl_entry_destroy(ubi, e2);
|
||||
spin_unlock(&ubi->wl_lock);
|
||||
|
||||
ubi_free_vid_buf(vidb);
|
||||
wl_entry_destroy(ubi, e1);
|
||||
wl_entry_destroy(ubi, e2);
|
||||
|
||||
out_ro:
|
||||
ubi_ro_mode(ubi);
|
||||
@@ -1120,14 +1123,18 @@ static int __erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk)
|
||||
/* Re-schedule the LEB for erasure */
|
||||
err1 = schedule_erase(ubi, e, vol_id, lnum, 0, false);
|
||||
if (err1) {
|
||||
spin_lock(&ubi->wl_lock);
|
||||
wl_entry_destroy(ubi, e);
|
||||
spin_unlock(&ubi->wl_lock);
|
||||
err = err1;
|
||||
goto out_ro;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
spin_lock(&ubi->wl_lock);
|
||||
wl_entry_destroy(ubi, e);
|
||||
spin_unlock(&ubi->wl_lock);
|
||||
if (err != -EIO)
|
||||
/*
|
||||
* If this is not %-EIO, we have no idea what to do. Scheduling
|
||||
@@ -1243,6 +1250,18 @@ int ubi_wl_put_peb(struct ubi_device *ubi, int vol_id, int lnum,
|
||||
retry:
|
||||
spin_lock(&ubi->wl_lock);
|
||||
e = ubi->lookuptbl[pnum];
|
||||
if (!e) {
|
||||
/*
|
||||
* This wl entry has been removed for some errors by other
|
||||
* process (eg. wear leveling worker), corresponding process
|
||||
* (except __erase_worker, which cannot concurrent with
|
||||
* ubi_wl_put_peb) will set ubi ro_mode at the same time,
|
||||
* just ignore this wl entry.
|
||||
*/
|
||||
spin_unlock(&ubi->wl_lock);
|
||||
up_read(&ubi->fm_protect);
|
||||
return 0;
|
||||
}
|
||||
if (e == ubi->move_from) {
|
||||
/*
|
||||
* User is putting the physical eraseblock which was selected to
|
||||
|
||||
@@ -748,7 +748,7 @@ static int otx2_prepare_ipv6_flow(struct ethtool_rx_flow_spec *fsp,
|
||||
|
||||
/* NPC profile doesn't extract AH/ESP header fields */
|
||||
if ((ah_esp_mask->spi & ah_esp_hdr->spi) ||
|
||||
(ah_esp_mask->tclass & ah_esp_mask->tclass))
|
||||
(ah_esp_mask->tclass & ah_esp_hdr->tclass))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (flow_type == AH_V6_FLOW)
|
||||
|
||||
@@ -962,7 +962,8 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
|
||||
dest.vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
|
||||
flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
|
||||
|
||||
if (rep->vport == MLX5_VPORT_UPLINK)
|
||||
if (MLX5_CAP_ESW_FLOWTABLE(on_esw->dev, flow_source) &&
|
||||
rep->vport == MLX5_VPORT_UPLINK)
|
||||
spec->flow_context.flow_source = MLX5_FLOW_CONTEXT_FLOW_SOURCE_LOCAL_VPORT;
|
||||
|
||||
flow_rule = mlx5_add_flow_rules(on_esw->fdb_table.offloads.slow_fdb,
|
||||
|
||||
@@ -105,6 +105,7 @@ int mlx5_geneve_tlv_option_add(struct mlx5_geneve *geneve, struct geneve_opt *op
|
||||
geneve->opt_type = opt->type;
|
||||
geneve->obj_id = res;
|
||||
geneve->refcount++;
|
||||
res = 0;
|
||||
}
|
||||
|
||||
unlock:
|
||||
|
||||
@@ -674,6 +674,12 @@ int st_nci_se_io(struct nci_dev *ndev, u32 se_idx,
|
||||
ST_NCI_EVT_TRANSMIT_DATA, apdu,
|
||||
apdu_length);
|
||||
default:
|
||||
/* Need to free cb_context here as at the moment we can't
|
||||
* clearly indicate to the caller if the callback function
|
||||
* would be called (and free it) or not. In both cases a
|
||||
* negative value may be returned to the caller.
|
||||
*/
|
||||
kfree(cb_context);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,6 +236,12 @@ int st21nfca_hci_se_io(struct nfc_hci_dev *hdev, u32 se_idx,
|
||||
ST21NFCA_EVT_TRANSMIT_DATA,
|
||||
apdu, apdu_length);
|
||||
default:
|
||||
/* Need to free cb_context here as at the moment we can't
|
||||
* clearly indicate to the caller if the callback function
|
||||
* would be called (and free it) or not. In both cases a
|
||||
* negative value may be returned to the caller.
|
||||
*/
|
||||
kfree(cb_context);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -677,7 +677,7 @@ static int iosapic_set_affinity_irq(struct irq_data *d,
|
||||
if (dest_cpu < 0)
|
||||
return -1;
|
||||
|
||||
cpumask_copy(irq_data_get_affinity_mask(d), cpumask_of(dest_cpu));
|
||||
irq_data_update_affinity(d, cpumask_of(dest_cpu));
|
||||
vi->txn_addr = txn_affinity_addr(d->irq, dest_cpu);
|
||||
|
||||
spin_lock_irqsave(&iosapic_lock, flags);
|
||||
|
||||
@@ -13,9 +13,14 @@
|
||||
#include "../pci.h"
|
||||
|
||||
/* Device IDs */
|
||||
#define DEV_PCIE_PORT_0 0x7a09
|
||||
#define DEV_PCIE_PORT_1 0x7a19
|
||||
#define DEV_PCIE_PORT_2 0x7a29
|
||||
#define DEV_LS2K_PCIE_PORT0 0x1a05
|
||||
#define DEV_LS7A_PCIE_PORT0 0x7a09
|
||||
#define DEV_LS7A_PCIE_PORT1 0x7a19
|
||||
#define DEV_LS7A_PCIE_PORT2 0x7a29
|
||||
#define DEV_LS7A_PCIE_PORT3 0x7a39
|
||||
#define DEV_LS7A_PCIE_PORT4 0x7a49
|
||||
#define DEV_LS7A_PCIE_PORT5 0x7a59
|
||||
#define DEV_LS7A_PCIE_PORT6 0x7a69
|
||||
|
||||
#define DEV_LS2K_APB 0x7a02
|
||||
#define DEV_LS7A_CONF 0x7a10
|
||||
@@ -38,11 +43,11 @@ static void bridge_class_quirk(struct pci_dev *dev)
|
||||
dev->class = PCI_CLASS_BRIDGE_PCI << 8;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_PCIE_PORT_0, bridge_class_quirk);
|
||||
DEV_LS7A_PCIE_PORT0, bridge_class_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_PCIE_PORT_1, bridge_class_quirk);
|
||||
DEV_LS7A_PCIE_PORT1, bridge_class_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_PCIE_PORT_2, bridge_class_quirk);
|
||||
DEV_LS7A_PCIE_PORT2, bridge_class_quirk);
|
||||
|
||||
static void system_bus_quirk(struct pci_dev *pdev)
|
||||
{
|
||||
@@ -60,37 +65,33 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_LPC, system_bus_quirk);
|
||||
|
||||
static void loongson_mrrs_quirk(struct pci_dev *dev)
|
||||
static void loongson_mrrs_quirk(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_bus *bus = dev->bus;
|
||||
struct pci_dev *bridge;
|
||||
static const struct pci_device_id bridge_devids[] = {
|
||||
{ PCI_VDEVICE(LOONGSON, DEV_PCIE_PORT_0) },
|
||||
{ PCI_VDEVICE(LOONGSON, DEV_PCIE_PORT_1) },
|
||||
{ PCI_VDEVICE(LOONGSON, DEV_PCIE_PORT_2) },
|
||||
{ 0, },
|
||||
};
|
||||
/*
|
||||
* Some Loongson PCIe ports have h/w limitations of maximum read
|
||||
* request size. They can't handle anything larger than this. So
|
||||
* force this limit on any devices attached under these ports.
|
||||
*/
|
||||
struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus);
|
||||
|
||||
/* look for the matching bridge */
|
||||
while (!pci_is_root_bus(bus)) {
|
||||
bridge = bus->self;
|
||||
bus = bus->parent;
|
||||
/*
|
||||
* Some Loongson PCIe ports have a h/w limitation of
|
||||
* 256 bytes maximum read request size. They can't handle
|
||||
* anything larger than this. So force this limit on
|
||||
* any devices attached under these ports.
|
||||
*/
|
||||
if (pci_match_id(bridge_devids, bridge)) {
|
||||
if (pcie_get_readrq(dev) > 256) {
|
||||
pci_info(dev, "limiting MRRS to 256\n");
|
||||
pcie_set_readrq(dev, 256);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
bridge->no_inc_mrrs = 1;
|
||||
}
|
||||
DECLARE_PCI_FIXUP_ENABLE(PCI_ANY_ID, PCI_ANY_ID, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS2K_PCIE_PORT0, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT0, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT1, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT2, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT3, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT4, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT5, loongson_mrrs_quirk);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_LOONGSON,
|
||||
DEV_LS7A_PCIE_PORT6, loongson_mrrs_quirk);
|
||||
|
||||
static void __iomem *cfg1_map(struct loongson_pci *priv, int bus,
|
||||
unsigned int devfn, int where)
|
||||
|
||||
@@ -5970,6 +5970,7 @@ int pcie_set_readrq(struct pci_dev *dev, int rq)
|
||||
{
|
||||
u16 v;
|
||||
int ret;
|
||||
struct pci_host_bridge *bridge = pci_find_host_bridge(dev->bus);
|
||||
|
||||
if (rq < 128 || rq > 4096 || !is_power_of_2(rq))
|
||||
return -EINVAL;
|
||||
@@ -5988,6 +5989,15 @@ int pcie_set_readrq(struct pci_dev *dev, int rq)
|
||||
|
||||
v = (ffs(rq) - 8) << 12;
|
||||
|
||||
if (bridge->no_inc_mrrs) {
|
||||
int max_mrrs = pcie_get_readrq(dev);
|
||||
|
||||
if (rq > max_mrrs) {
|
||||
pci_info(dev, "can't set Max_Read_Request_Size to %d; max is %d\n", rq, max_mrrs);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
ret = pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL,
|
||||
PCI_EXP_DEVCTL_READRQ, v);
|
||||
|
||||
|
||||
@@ -4823,6 +4823,26 @@ static int pci_quirk_brcm_acs(struct pci_dev *dev, u16 acs_flags)
|
||||
PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wangxun 10G/1G NICs have no ACS capability, and on multi-function
|
||||
* devices, peer-to-peer transactions are not be used between the functions.
|
||||
* So add an ACS quirk for below devices to isolate functions.
|
||||
* SFxxx 1G NICs(em).
|
||||
* RP1000/RP2000 10G NICs(sp).
|
||||
*/
|
||||
static int pci_quirk_wangxun_nic_acs(struct pci_dev *dev, u16 acs_flags)
|
||||
{
|
||||
switch (dev->device) {
|
||||
case 0x0100 ... 0x010F:
|
||||
case 0x1001:
|
||||
case 0x2001:
|
||||
return pci_acs_ctrl_enabled(acs_flags,
|
||||
PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static const struct pci_dev_acs_enabled {
|
||||
u16 vendor;
|
||||
u16 device;
|
||||
@@ -4968,6 +4988,8 @@ static const struct pci_dev_acs_enabled {
|
||||
{ PCI_VENDOR_ID_NXP, 0x8d9b, pci_quirk_nxp_rp_acs },
|
||||
/* Zhaoxin Root/Downstream Ports */
|
||||
{ PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs },
|
||||
/* Wangxun nics */
|
||||
{ PCI_VENDOR_ID_WANGXUN, PCI_ANY_ID, pci_quirk_wangxun_nic_acs },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
|
||||
@@ -1878,12 +1878,67 @@ static void adjust_bridge_window(struct pci_dev *bridge, struct resource *res,
|
||||
add_size = size - new_size;
|
||||
pci_dbg(bridge, "bridge window %pR shrunken by %pa\n", res,
|
||||
&add_size);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
res->end = res->start + new_size - 1;
|
||||
remove_from_list(add_list, res);
|
||||
}
|
||||
|
||||
static void remove_dev_resource(struct resource *avail, struct pci_dev *dev,
|
||||
struct resource *res)
|
||||
{
|
||||
resource_size_t size, align, tmp;
|
||||
|
||||
size = resource_size(res);
|
||||
if (!size)
|
||||
return;
|
||||
|
||||
align = pci_resource_alignment(dev, res);
|
||||
align = align ? ALIGN(avail->start, align) - avail->start : 0;
|
||||
tmp = align + size;
|
||||
avail->start = min(avail->start + tmp, avail->end + 1);
|
||||
}
|
||||
|
||||
static void remove_dev_resources(struct pci_dev *dev, struct resource *io,
|
||||
struct resource *mmio,
|
||||
struct resource *mmio_pref)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
||||
struct resource *res = &dev->resource[i];
|
||||
|
||||
if (resource_type(res) == IORESOURCE_IO) {
|
||||
remove_dev_resource(io, dev, res);
|
||||
} else if (resource_type(res) == IORESOURCE_MEM) {
|
||||
|
||||
/*
|
||||
* Make sure prefetchable memory is reduced from
|
||||
* the correct resource. Specifically we put 32-bit
|
||||
* prefetchable memory in non-prefetchable window
|
||||
* if there is an 64-bit pretchable window.
|
||||
*
|
||||
* See comments in __pci_bus_size_bridges() for
|
||||
* more information.
|
||||
*/
|
||||
if ((res->flags & IORESOURCE_PREFETCH) &&
|
||||
((res->flags & IORESOURCE_MEM_64) ==
|
||||
(mmio_pref->flags & IORESOURCE_MEM_64)))
|
||||
remove_dev_resource(mmio_pref, dev, res);
|
||||
else
|
||||
remove_dev_resource(mmio, dev, res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* io, mmio and mmio_pref contain the total amount of bridge window space
|
||||
* available. This includes the minimal space needed to cover all the
|
||||
* existing devices on the bus and the possible extra space that can be
|
||||
* shared with the bridges.
|
||||
*/
|
||||
static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
||||
struct list_head *add_list,
|
||||
struct resource io,
|
||||
@@ -1893,7 +1948,7 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
||||
unsigned int normal_bridges = 0, hotplug_bridges = 0;
|
||||
struct resource *io_res, *mmio_res, *mmio_pref_res;
|
||||
struct pci_dev *dev, *bridge = bus->self;
|
||||
resource_size_t io_per_hp, mmio_per_hp, mmio_pref_per_hp, align;
|
||||
resource_size_t io_per_b, mmio_per_b, mmio_pref_per_b, align;
|
||||
|
||||
io_res = &bridge->resource[PCI_BRIDGE_IO_WINDOW];
|
||||
mmio_res = &bridge->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||
@@ -1937,94 +1992,88 @@ static void pci_bus_distribute_available_resources(struct pci_bus *bus,
|
||||
normal_bridges++;
|
||||
}
|
||||
|
||||
/*
|
||||
* There is only one bridge on the bus so it gets all available
|
||||
* resources which it can then distribute to the possible hotplug
|
||||
* bridges below.
|
||||
*/
|
||||
if (hotplug_bridges + normal_bridges == 1) {
|
||||
dev = list_first_entry(&bus->devices, struct pci_dev, bus_list);
|
||||
if (dev->subordinate)
|
||||
pci_bus_distribute_available_resources(dev->subordinate,
|
||||
add_list, io, mmio, mmio_pref);
|
||||
if (!(hotplug_bridges + normal_bridges))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Calculate the amount of space we can forward from "bus" to any
|
||||
* downstream buses, i.e., the space left over after assigning the
|
||||
* BARs and windows on "bus".
|
||||
*/
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
if (!dev->is_virtfn)
|
||||
remove_dev_resources(dev, &io, &mmio, &mmio_pref);
|
||||
}
|
||||
|
||||
if (hotplug_bridges == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Calculate the total amount of extra resource space we can
|
||||
* pass to bridges below this one. This is basically the
|
||||
* extra space reduced by the minimal required space for the
|
||||
* non-hotplug bridges.
|
||||
* If there is at least one hotplug bridge on this bus it gets all
|
||||
* the extra resource space that was left after the reductions
|
||||
* above.
|
||||
*
|
||||
* If there are no hotplug bridges the extra resource space is
|
||||
* split between non-hotplug bridges. This is to allow possible
|
||||
* hotplug bridges below them to get the extra space as well.
|
||||
*/
|
||||
if (hotplug_bridges) {
|
||||
io_per_b = div64_ul(resource_size(&io), hotplug_bridges);
|
||||
mmio_per_b = div64_ul(resource_size(&mmio), hotplug_bridges);
|
||||
mmio_pref_per_b = div64_ul(resource_size(&mmio_pref),
|
||||
hotplug_bridges);
|
||||
} else {
|
||||
io_per_b = div64_ul(resource_size(&io), normal_bridges);
|
||||
mmio_per_b = div64_ul(resource_size(&mmio), normal_bridges);
|
||||
mmio_pref_per_b = div64_ul(resource_size(&mmio_pref),
|
||||
normal_bridges);
|
||||
}
|
||||
|
||||
for_each_pci_bridge(dev, bus) {
|
||||
resource_size_t used_size;
|
||||
struct resource *res;
|
||||
|
||||
if (dev->is_hotplug_bridge)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Reduce the available resource space by what the
|
||||
* bridge and devices below it occupy.
|
||||
*/
|
||||
res = &dev->resource[PCI_BRIDGE_IO_WINDOW];
|
||||
align = pci_resource_alignment(dev, res);
|
||||
align = align ? ALIGN(io.start, align) - io.start : 0;
|
||||
used_size = align + resource_size(res);
|
||||
if (!res->parent)
|
||||
io.start = min(io.start + used_size, io.end + 1);
|
||||
|
||||
res = &dev->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||
align = pci_resource_alignment(dev, res);
|
||||
align = align ? ALIGN(mmio.start, align) - mmio.start : 0;
|
||||
used_size = align + resource_size(res);
|
||||
if (!res->parent)
|
||||
mmio.start = min(mmio.start + used_size, mmio.end + 1);
|
||||
|
||||
res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW];
|
||||
align = pci_resource_alignment(dev, res);
|
||||
align = align ? ALIGN(mmio_pref.start, align) -
|
||||
mmio_pref.start : 0;
|
||||
used_size = align + resource_size(res);
|
||||
if (!res->parent)
|
||||
mmio_pref.start = min(mmio_pref.start + used_size,
|
||||
mmio_pref.end + 1);
|
||||
}
|
||||
|
||||
io_per_hp = div64_ul(resource_size(&io), hotplug_bridges);
|
||||
mmio_per_hp = div64_ul(resource_size(&mmio), hotplug_bridges);
|
||||
mmio_pref_per_hp = div64_ul(resource_size(&mmio_pref),
|
||||
hotplug_bridges);
|
||||
|
||||
/*
|
||||
* Go over devices on this bus and distribute the remaining
|
||||
* resource space between hotplug bridges.
|
||||
*/
|
||||
for_each_pci_bridge(dev, bus) {
|
||||
struct pci_bus *b;
|
||||
|
||||
b = dev->subordinate;
|
||||
if (!b || !dev->is_hotplug_bridge)
|
||||
if (!b)
|
||||
continue;
|
||||
if (hotplug_bridges && !dev->is_hotplug_bridge)
|
||||
continue;
|
||||
|
||||
res = &dev->resource[PCI_BRIDGE_IO_WINDOW];
|
||||
|
||||
/*
|
||||
* Distribute available extra resources equally between
|
||||
* hotplug-capable downstream ports taking alignment into
|
||||
* account.
|
||||
* Make sure the split resource space is properly aligned
|
||||
* for bridge windows (align it down to avoid going above
|
||||
* what is available).
|
||||
*/
|
||||
io.end = io.start + io_per_hp - 1;
|
||||
mmio.end = mmio.start + mmio_per_hp - 1;
|
||||
mmio_pref.end = mmio_pref.start + mmio_pref_per_hp - 1;
|
||||
align = pci_resource_alignment(dev, res);
|
||||
io.end = align ? io.start + ALIGN_DOWN(io_per_b, align) - 1
|
||||
: io.start + io_per_b - 1;
|
||||
|
||||
/*
|
||||
* The x_per_b holds the extra resource space that can be
|
||||
* added for each bridge but there is the minimal already
|
||||
* reserved as well so adjust x.start down accordingly to
|
||||
* cover the whole space.
|
||||
*/
|
||||
io.start -= resource_size(res);
|
||||
|
||||
res = &dev->resource[PCI_BRIDGE_MEM_WINDOW];
|
||||
align = pci_resource_alignment(dev, res);
|
||||
mmio.end = align ? mmio.start + ALIGN_DOWN(mmio_per_b, align) - 1
|
||||
: mmio.start + mmio_per_b - 1;
|
||||
mmio.start -= resource_size(res);
|
||||
|
||||
res = &dev->resource[PCI_BRIDGE_PREF_MEM_WINDOW];
|
||||
align = pci_resource_alignment(dev, res);
|
||||
mmio_pref.end = align ? mmio_pref.start +
|
||||
ALIGN_DOWN(mmio_pref_per_b, align) - 1
|
||||
: mmio_pref.start + mmio_pref_per_b - 1;
|
||||
mmio_pref.start -= resource_size(res);
|
||||
|
||||
pci_bus_distribute_available_resources(b, add_list, io, mmio,
|
||||
mmio_pref);
|
||||
|
||||
io.start += io_per_hp;
|
||||
mmio.start += mmio_per_hp;
|
||||
mmio_pref.start += mmio_pref_per_hp;
|
||||
io.start += io.end + 1;
|
||||
mmio.start += mmio.end + 1;
|
||||
mmio_pref.start += mmio_pref.end + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -808,9 +808,8 @@ static int tcphy_get_mode(struct rockchip_typec_phy *tcphy)
|
||||
struct extcon_dev *edev = tcphy->extcon;
|
||||
union extcon_property_value property;
|
||||
unsigned int id;
|
||||
bool ufp, dp;
|
||||
u8 mode;
|
||||
int ret;
|
||||
int ret, ufp, dp;
|
||||
|
||||
if (!edev)
|
||||
return MODE_DFP_USB;
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
struct pwm_sifive_ddata {
|
||||
struct pwm_chip chip;
|
||||
struct mutex lock; /* lock to protect user_count */
|
||||
struct mutex lock; /* lock to protect user_count and approx_period */
|
||||
struct notifier_block notifier;
|
||||
struct clk *clk;
|
||||
void __iomem *regs;
|
||||
@@ -76,6 +76,7 @@ static void pwm_sifive_free(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
mutex_unlock(&ddata->lock);
|
||||
}
|
||||
|
||||
/* Called holding ddata->lock */
|
||||
static void pwm_sifive_update_clock(struct pwm_sifive_ddata *ddata,
|
||||
unsigned long rate)
|
||||
{
|
||||
@@ -163,7 +164,6 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_lock(&ddata->lock);
|
||||
cur_state = pwm->state;
|
||||
enabled = cur_state.enabled;
|
||||
|
||||
@@ -182,14 +182,23 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
/* The hardware cannot generate a 100% duty cycle */
|
||||
frac = min(frac, (1U << PWM_SIFIVE_CMPWIDTH) - 1);
|
||||
|
||||
mutex_lock(&ddata->lock);
|
||||
if (state->period != ddata->approx_period) {
|
||||
if (ddata->user_count != 1) {
|
||||
/*
|
||||
* Don't let a 2nd user change the period underneath the 1st user.
|
||||
* However if ddate->approx_period == 0 this is the first time we set
|
||||
* any period, so let whoever gets here first set the period so other
|
||||
* users who agree on the period won't fail.
|
||||
*/
|
||||
if (ddata->user_count != 1 && ddata->approx_period) {
|
||||
mutex_unlock(&ddata->lock);
|
||||
ret = -EBUSY;
|
||||
goto exit;
|
||||
}
|
||||
ddata->approx_period = state->period;
|
||||
pwm_sifive_update_clock(ddata, clk_get_rate(ddata->clk));
|
||||
}
|
||||
mutex_unlock(&ddata->lock);
|
||||
|
||||
writel(frac, ddata->regs + PWM_SIFIVE_PWMCMP(pwm->hwpwm));
|
||||
|
||||
@@ -198,7 +207,6 @@ static int pwm_sifive_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
|
||||
exit:
|
||||
clk_disable(ddata->clk);
|
||||
mutex_unlock(&ddata->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm,
|
||||
|
||||
/* ensure CMP & ARR registers are properly written */
|
||||
ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val,
|
||||
(val & STM32_LPTIM_CMPOK_ARROK),
|
||||
(val & STM32_LPTIM_CMPOK_ARROK) == STM32_LPTIM_CMPOK_ARROK,
|
||||
100, 1000);
|
||||
if (ret) {
|
||||
dev_err(priv->chip.dev, "ARR/CMP registers write issue\n");
|
||||
|
||||
@@ -392,7 +392,7 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
||||
return err;
|
||||
if (!rtc->ops) {
|
||||
err = -ENODEV;
|
||||
} else if (!test_bit(RTC_FEATURE_ALARM, rtc->features) || !rtc->ops->read_alarm) {
|
||||
} else if (!test_bit(RTC_FEATURE_ALARM, rtc->features)) {
|
||||
err = -EINVAL;
|
||||
} else {
|
||||
memset(alarm, 0, sizeof(struct rtc_wkalrm));
|
||||
|
||||
@@ -128,7 +128,6 @@ struct sun6i_rtc_clk_data {
|
||||
unsigned int fixed_prescaler : 16;
|
||||
unsigned int has_prescaler : 1;
|
||||
unsigned int has_out_clk : 1;
|
||||
unsigned int export_iosc : 1;
|
||||
unsigned int has_losc_en : 1;
|
||||
unsigned int has_auto_swt : 1;
|
||||
};
|
||||
@@ -260,10 +259,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
|
||||
/* Yes, I know, this is ugly. */
|
||||
sun6i_rtc = rtc;
|
||||
|
||||
/* Only read IOSC name from device tree if it is exported */
|
||||
if (rtc->data->export_iosc)
|
||||
of_property_read_string_index(node, "clock-output-names", 2,
|
||||
&iosc_name);
|
||||
of_property_read_string_index(node, "clock-output-names", 2,
|
||||
&iosc_name);
|
||||
|
||||
rtc->int_osc = clk_hw_register_fixed_rate_with_accuracy(NULL,
|
||||
iosc_name,
|
||||
@@ -304,13 +301,10 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
|
||||
goto err_register;
|
||||
}
|
||||
|
||||
clk_data->num = 2;
|
||||
clk_data->num = 3;
|
||||
clk_data->hws[0] = &rtc->hw;
|
||||
clk_data->hws[1] = __clk_get_hw(rtc->ext_losc);
|
||||
if (rtc->data->export_iosc) {
|
||||
clk_data->hws[2] = rtc->int_osc;
|
||||
clk_data->num = 3;
|
||||
}
|
||||
clk_data->hws[2] = rtc->int_osc;
|
||||
of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
|
||||
return;
|
||||
|
||||
@@ -350,7 +344,6 @@ static const struct sun6i_rtc_clk_data sun8i_h3_rtc_data = {
|
||||
.fixed_prescaler = 32,
|
||||
.has_prescaler = 1,
|
||||
.has_out_clk = 1,
|
||||
.export_iosc = 1,
|
||||
};
|
||||
|
||||
static void __init sun8i_h3_rtc_clk_init(struct device_node *node)
|
||||
@@ -368,7 +361,6 @@ static const struct sun6i_rtc_clk_data sun50i_h6_rtc_data = {
|
||||
.fixed_prescaler = 32,
|
||||
.has_prescaler = 1,
|
||||
.has_out_clk = 1,
|
||||
.export_iosc = 1,
|
||||
.has_losc_en = 1,
|
||||
.has_auto_swt = 1,
|
||||
};
|
||||
|
||||
@@ -1516,23 +1516,22 @@ static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
|
||||
}
|
||||
|
||||
/**
|
||||
* strip_and_pad_whitespace - Strip and pad trailing whitespace.
|
||||
* @i: index into buffer
|
||||
* @buf: string to modify
|
||||
* strip_whitespace - Strip and pad trailing whitespace.
|
||||
* @i: size of buffer
|
||||
* @buf: string to modify
|
||||
*
|
||||
* This function will strip all trailing whitespace, pad the end
|
||||
* of the string with a single space, and NULL terminate the string.
|
||||
* This function will strip all trailing whitespace and
|
||||
* NUL terminate the string.
|
||||
*
|
||||
* Return value:
|
||||
* new length of string
|
||||
**/
|
||||
static int strip_and_pad_whitespace(int i, char *buf)
|
||||
static void strip_whitespace(int i, char *buf)
|
||||
{
|
||||
if (i < 1)
|
||||
return;
|
||||
i--;
|
||||
while (i && buf[i] == ' ')
|
||||
i--;
|
||||
buf[i+1] = ' ';
|
||||
buf[i+2] = '\0';
|
||||
return i + 2;
|
||||
buf[i+1] = '\0';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1547,19 +1546,21 @@ static int strip_and_pad_whitespace(int i, char *buf)
|
||||
static void ipr_log_vpd_compact(char *prefix, struct ipr_hostrcb *hostrcb,
|
||||
struct ipr_vpd *vpd)
|
||||
{
|
||||
char buffer[IPR_VENDOR_ID_LEN + IPR_PROD_ID_LEN + IPR_SERIAL_NUM_LEN + 3];
|
||||
int i = 0;
|
||||
char vendor_id[IPR_VENDOR_ID_LEN + 1];
|
||||
char product_id[IPR_PROD_ID_LEN + 1];
|
||||
char sn[IPR_SERIAL_NUM_LEN + 1];
|
||||
|
||||
memcpy(buffer, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN);
|
||||
i = strip_and_pad_whitespace(IPR_VENDOR_ID_LEN - 1, buffer);
|
||||
memcpy(vendor_id, vpd->vpids.vendor_id, IPR_VENDOR_ID_LEN);
|
||||
strip_whitespace(IPR_VENDOR_ID_LEN, vendor_id);
|
||||
|
||||
memcpy(&buffer[i], vpd->vpids.product_id, IPR_PROD_ID_LEN);
|
||||
i = strip_and_pad_whitespace(i + IPR_PROD_ID_LEN - 1, buffer);
|
||||
memcpy(product_id, vpd->vpids.product_id, IPR_PROD_ID_LEN);
|
||||
strip_whitespace(IPR_PROD_ID_LEN, product_id);
|
||||
|
||||
memcpy(&buffer[i], vpd->sn, IPR_SERIAL_NUM_LEN);
|
||||
buffer[IPR_SERIAL_NUM_LEN + i] = '\0';
|
||||
memcpy(sn, vpd->sn, IPR_SERIAL_NUM_LEN);
|
||||
strip_whitespace(IPR_SERIAL_NUM_LEN, sn);
|
||||
|
||||
ipr_hcam_err(hostrcb, "%s VPID/SN: %s\n", prefix, buffer);
|
||||
ipr_hcam_err(hostrcb, "%s VPID/SN: %s %s %s\n", prefix,
|
||||
vendor_id, product_id, sn);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2990,19 +2990,25 @@ static int
|
||||
_base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev)
|
||||
{
|
||||
struct sysinfo s;
|
||||
u64 coherent_dma_mask, dma_mask;
|
||||
|
||||
if (ioc->is_mcpu_endpoint ||
|
||||
sizeof(dma_addr_t) == 4 || ioc->use_32bit_dma ||
|
||||
dma_get_required_mask(&pdev->dev) <= DMA_BIT_MASK(32))
|
||||
if (ioc->is_mcpu_endpoint || sizeof(dma_addr_t) == 4) {
|
||||
ioc->dma_mask = 32;
|
||||
coherent_dma_mask = dma_mask = DMA_BIT_MASK(32);
|
||||
/* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */
|
||||
else if (ioc->hba_mpi_version_belonged > MPI2_VERSION)
|
||||
} else if (ioc->hba_mpi_version_belonged > MPI2_VERSION) {
|
||||
ioc->dma_mask = 63;
|
||||
else
|
||||
coherent_dma_mask = dma_mask = DMA_BIT_MASK(63);
|
||||
} else {
|
||||
ioc->dma_mask = 64;
|
||||
coherent_dma_mask = dma_mask = DMA_BIT_MASK(64);
|
||||
}
|
||||
|
||||
if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(ioc->dma_mask)) ||
|
||||
dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(ioc->dma_mask)))
|
||||
if (ioc->use_32bit_dma)
|
||||
coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
if (dma_set_mask(&pdev->dev, dma_mask) ||
|
||||
dma_set_coherent_mask(&pdev->dev, coherent_dma_mask))
|
||||
return -ENODEV;
|
||||
|
||||
if (ioc->dma_mask > 32) {
|
||||
|
||||
@@ -72,7 +72,7 @@ static int intc_set_affinity(struct irq_data *data,
|
||||
if (!cpumask_intersects(cpumask, cpu_online_mask))
|
||||
return -1;
|
||||
|
||||
cpumask_copy(irq_data_get_affinity_mask(data), cpumask);
|
||||
irq_data_update_affinity(data, cpumask);
|
||||
|
||||
return IRQ_SET_MASK_OK_NOCOPY;
|
||||
}
|
||||
|
||||
@@ -105,20 +105,19 @@ static int sdw_drv_probe(struct device *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&slave->sdw_dev_lock);
|
||||
|
||||
ret = drv->probe(slave, id);
|
||||
if (ret) {
|
||||
name = drv->name;
|
||||
if (!name)
|
||||
name = drv->driver.name;
|
||||
mutex_unlock(&slave->sdw_dev_lock);
|
||||
|
||||
dev_err(dev, "Probe of %s failed: %d\n", name, ret);
|
||||
dev_pm_domain_detach(dev, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_lock(&slave->sdw_dev_lock);
|
||||
|
||||
/* device is probed so let's read the properties now */
|
||||
if (drv->ops && drv->ops->read_prop)
|
||||
drv->ops->read_prop(slave);
|
||||
@@ -167,14 +166,12 @@ static int sdw_drv_remove(struct device *dev)
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&slave->sdw_dev_lock);
|
||||
|
||||
slave->probed = false;
|
||||
mutex_unlock(&slave->sdw_dev_lock);
|
||||
|
||||
if (drv->remove)
|
||||
ret = drv->remove(slave);
|
||||
|
||||
mutex_unlock(&slave->sdw_dev_lock);
|
||||
|
||||
dev_pm_domain_detach(dev, false);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -556,6 +556,29 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns,
|
||||
return SDW_CMD_OK;
|
||||
}
|
||||
|
||||
static void cdns_read_response(struct sdw_cdns *cdns)
|
||||
{
|
||||
u32 num_resp, cmd_base;
|
||||
int i;
|
||||
|
||||
/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */
|
||||
BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
|
||||
|
||||
num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
|
||||
num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
|
||||
if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
|
||||
dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
|
||||
num_resp = ARRAY_SIZE(cdns->response_buf);
|
||||
}
|
||||
|
||||
cmd_base = CDNS_MCP_CMD_BASE;
|
||||
|
||||
for (i = 0; i < num_resp; i++) {
|
||||
cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
|
||||
cmd_base += CDNS_MCP_CMD_WORD_LEN;
|
||||
}
|
||||
}
|
||||
|
||||
static enum sdw_command_response
|
||||
_cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
|
||||
int offset, int count, bool defer)
|
||||
@@ -597,6 +620,10 @@ _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
|
||||
dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
|
||||
cmd, msg->dev_num, msg->addr, msg->len);
|
||||
msg->len = 0;
|
||||
|
||||
/* Drain anything in the RX_FIFO */
|
||||
cdns_read_response(cdns);
|
||||
|
||||
return SDW_CMD_TIMEOUT;
|
||||
}
|
||||
|
||||
@@ -765,22 +792,6 @@ EXPORT_SYMBOL(cdns_reset_page_addr);
|
||||
* IRQ handling
|
||||
*/
|
||||
|
||||
static void cdns_read_response(struct sdw_cdns *cdns)
|
||||
{
|
||||
u32 num_resp, cmd_base;
|
||||
int i;
|
||||
|
||||
num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
|
||||
num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
|
||||
|
||||
cmd_base = CDNS_MCP_CMD_BASE;
|
||||
|
||||
for (i = 0; i < num_resp; i++) {
|
||||
cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
|
||||
cmd_base += CDNS_MCP_CMD_WORD_LEN;
|
||||
}
|
||||
}
|
||||
|
||||
static int cdns_update_slave_status(struct sdw_cdns *cdns,
|
||||
u64 slave_intstat)
|
||||
{
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
#define SDW_CADENCE_GSYNC_KHZ 4 /* 4 kHz */
|
||||
#define SDW_CADENCE_GSYNC_HZ (SDW_CADENCE_GSYNC_KHZ * 1000)
|
||||
|
||||
/*
|
||||
* The Cadence IP supports up to 32 entries in the FIFO, though implementations
|
||||
* can configure the IP to have a smaller FIFO.
|
||||
*/
|
||||
#define CDNS_MCP_IP_MAX_CMD_LEN 32
|
||||
|
||||
/**
|
||||
* struct sdw_cdns_pdi: PDI (Physical Data Interface) instance
|
||||
*
|
||||
@@ -119,7 +125,12 @@ struct sdw_cdns {
|
||||
struct sdw_bus bus;
|
||||
unsigned int instance;
|
||||
|
||||
u32 response_buf[0x80];
|
||||
/*
|
||||
* The datasheet says the RX FIFO AVAIL can be 2 entries more
|
||||
* than the FIFO capacity, so allow for this.
|
||||
*/
|
||||
u32 response_buf[CDNS_MCP_IP_MAX_CMD_LEN + 2];
|
||||
|
||||
struct completion tx_complete;
|
||||
struct sdw_defer *defer;
|
||||
|
||||
|
||||
@@ -2590,10 +2590,15 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep,
|
||||
req->unaligned = false;
|
||||
|
||||
if (req->unaligned) {
|
||||
if (!ep->virt_buf)
|
||||
if (!ep->virt_buf) {
|
||||
ep->virt_buf = dma_alloc_coherent(udc->dev, PAGE_SIZE,
|
||||
&ep->phys_buf,
|
||||
GFP_ATOMIC | GFP_DMA);
|
||||
if (!ep->virt_buf) {
|
||||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
if (ep->epnum > 0) {
|
||||
if (ep->direct == USB_DIR_IN)
|
||||
memcpy(ep->virt_buf, req->req.buf,
|
||||
|
||||
@@ -64,7 +64,8 @@ endmenu
|
||||
|
||||
config INTEL_BXT_PMIC_THERMAL
|
||||
tristate "Intel Broxton PMIC thermal driver"
|
||||
depends on X86 && INTEL_SOC_PMIC_BXTWC && REGMAP
|
||||
depends on X86 && INTEL_SOC_PMIC_BXTWC
|
||||
select REGMAP
|
||||
help
|
||||
Select this driver for Intel Broxton PMIC with ADC channels monitoring
|
||||
system temperature measurements and alerts.
|
||||
|
||||
@@ -415,22 +415,14 @@ MODULE_DEVICE_TABLE(x86cpu, qrk_thermal_ids);
|
||||
|
||||
static int __init intel_quark_thermal_init(void)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
if (!x86_match_cpu(qrk_thermal_ids) || !iosf_mbi_available())
|
||||
return -ENODEV;
|
||||
|
||||
soc_dts = alloc_soc_dts();
|
||||
if (IS_ERR(soc_dts)) {
|
||||
err = PTR_ERR(soc_dts);
|
||||
goto err_free;
|
||||
}
|
||||
if (IS_ERR(soc_dts))
|
||||
return PTR_ERR(soc_dts);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free:
|
||||
free_soc_dts(soc_dts);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit intel_quark_thermal_exit(void)
|
||||
|
||||
@@ -1484,12 +1484,32 @@ static void lpuart_break_ctl(struct uart_port *port, int break_state)
|
||||
|
||||
static void lpuart32_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
unsigned long temp;
|
||||
unsigned long temp, modem;
|
||||
struct tty_struct *tty;
|
||||
unsigned int cflag = 0;
|
||||
|
||||
tty = tty_port_tty_get(&port->state->port);
|
||||
if (tty) {
|
||||
cflag = tty->termios.c_cflag;
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
temp = lpuart32_read(port, UARTCTRL) & ~UARTCTRL_SBK;
|
||||
modem = lpuart32_read(port, UARTMODIR);
|
||||
|
||||
if (break_state != 0)
|
||||
if (break_state != 0) {
|
||||
temp |= UARTCTRL_SBK;
|
||||
/*
|
||||
* LPUART CTS has higher priority than SBK, need to disable CTS before
|
||||
* asserting SBK to avoid any interference if flow control is enabled.
|
||||
*/
|
||||
if (cflag & CRTSCTS && modem & UARTMODIR_TXCTSE)
|
||||
lpuart32_write(port, modem & ~UARTMODIR_TXCTSE, UARTMODIR);
|
||||
} else {
|
||||
/* Re-enable the CTS when break off. */
|
||||
if (cflag & CRTSCTS && !(modem & UARTMODIR_TXCTSE))
|
||||
lpuart32_write(port, modem | UARTMODIR_TXCTSE, UARTMODIR);
|
||||
}
|
||||
|
||||
lpuart32_write(port, temp, UARTCTRL);
|
||||
}
|
||||
|
||||
@@ -1821,7 +1821,7 @@ static void pch_uart_exit_port(struct eg20t_port *priv)
|
||||
char name[32];
|
||||
|
||||
snprintf(name, sizeof(name), "uart%d_regs", priv->port.line);
|
||||
debugfs_remove(debugfs_lookup(name, NULL));
|
||||
debugfs_lookup_and_remove(name, NULL);
|
||||
uart_remove_one_port(&pch_uart_driver, &priv->port);
|
||||
free_page((unsigned long)priv->rxbuf.buf);
|
||||
}
|
||||
|
||||
@@ -1245,25 +1245,6 @@ static int sc16is7xx_probe(struct device *dev,
|
||||
}
|
||||
sched_set_fifo(s->kworker_task);
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
if (devtype->nr_gpio) {
|
||||
/* Setup GPIO cotroller */
|
||||
s->gpio.owner = THIS_MODULE;
|
||||
s->gpio.parent = dev;
|
||||
s->gpio.label = dev_name(dev);
|
||||
s->gpio.direction_input = sc16is7xx_gpio_direction_input;
|
||||
s->gpio.get = sc16is7xx_gpio_get;
|
||||
s->gpio.direction_output = sc16is7xx_gpio_direction_output;
|
||||
s->gpio.set = sc16is7xx_gpio_set;
|
||||
s->gpio.base = -1;
|
||||
s->gpio.ngpio = devtype->nr_gpio;
|
||||
s->gpio.can_sleep = 1;
|
||||
ret = gpiochip_add_data(&s->gpio, s);
|
||||
if (ret)
|
||||
goto out_thread;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* reset device, purging any pending irq / data */
|
||||
regmap_write(s->regmap, SC16IS7XX_IOCONTROL_REG << SC16IS7XX_REG_SHIFT,
|
||||
SC16IS7XX_IOCONTROL_SRESET_BIT);
|
||||
@@ -1329,6 +1310,25 @@ static int sc16is7xx_probe(struct device *dev,
|
||||
s->p[u].irda_mode = true;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
if (devtype->nr_gpio) {
|
||||
/* Setup GPIO cotroller */
|
||||
s->gpio.owner = THIS_MODULE;
|
||||
s->gpio.parent = dev;
|
||||
s->gpio.label = dev_name(dev);
|
||||
s->gpio.direction_input = sc16is7xx_gpio_direction_input;
|
||||
s->gpio.get = sc16is7xx_gpio_get;
|
||||
s->gpio.direction_output = sc16is7xx_gpio_direction_output;
|
||||
s->gpio.set = sc16is7xx_gpio_set;
|
||||
s->gpio.base = -1;
|
||||
s->gpio.ngpio = devtype->nr_gpio;
|
||||
s->gpio.can_sleep = 1;
|
||||
ret = gpiochip_add_data(&s->gpio, s);
|
||||
if (ret)
|
||||
goto out_thread;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Setup interrupt. We first try to acquire the IRQ line as level IRQ.
|
||||
* If that succeeds, we can allow sharing the interrupt as well.
|
||||
@@ -1348,18 +1348,19 @@ static int sc16is7xx_probe(struct device *dev,
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
out_ports:
|
||||
for (i--; i >= 0; i--) {
|
||||
uart_remove_one_port(&sc16is7xx_uart, &s->p[i].port);
|
||||
clear_bit(s->p[i].port.line, &sc16is7xx_lines);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
if (devtype->nr_gpio)
|
||||
gpiochip_remove(&s->gpio);
|
||||
|
||||
out_thread:
|
||||
#endif
|
||||
|
||||
out_ports:
|
||||
for (i--; i >= 0; i--) {
|
||||
uart_remove_one_port(&sc16is7xx_uart, &s->p[i].port);
|
||||
clear_bit(s->p[i].port.line, &sc16is7xx_lines);
|
||||
}
|
||||
|
||||
kthread_stop(s->kworker_task);
|
||||
|
||||
out_clk:
|
||||
|
||||
@@ -1244,14 +1244,16 @@ static struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
|
||||
{
|
||||
struct tty_struct *tty;
|
||||
|
||||
if (driver->ops->lookup)
|
||||
if (driver->ops->lookup) {
|
||||
if (!file)
|
||||
tty = ERR_PTR(-EIO);
|
||||
else
|
||||
tty = driver->ops->lookup(driver, file, idx);
|
||||
else
|
||||
} else {
|
||||
if (idx >= driver->num)
|
||||
return ERR_PTR(-EINVAL);
|
||||
tty = driver->ttys[idx];
|
||||
|
||||
}
|
||||
if (!IS_ERR(tty))
|
||||
tty_kref_get(tty);
|
||||
return tty;
|
||||
|
||||
@@ -415,10 +415,8 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
|
||||
*/
|
||||
size = vcs_size(vc, attr, uni_mode);
|
||||
if (size < 0) {
|
||||
if (read)
|
||||
break;
|
||||
ret = size;
|
||||
goto unlock_out;
|
||||
break;
|
||||
}
|
||||
if (pos >= size)
|
||||
break;
|
||||
|
||||
@@ -364,5 +364,5 @@ void dbg_create_files(struct ci_hdrc *ci)
|
||||
*/
|
||||
void dbg_remove_files(struct ci_hdrc *ci)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(dev_name(ci->dev), usb_debug_root));
|
||||
debugfs_lookup_and_remove(dev_name(ci->dev), usb_debug_root);
|
||||
}
|
||||
|
||||
@@ -1036,7 +1036,7 @@ static void usb_debugfs_init(void)
|
||||
|
||||
static void usb_debugfs_cleanup(void)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup("devices", usb_debug_root));
|
||||
debugfs_lookup_and_remove("devices", usb_debug_root);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1104,6 +1104,7 @@ struct dwc3_scratchpad_array {
|
||||
* @num_ep_resized: carries the current number endpoints which have had its tx
|
||||
* fifo resized.
|
||||
* @clear_stall_protocol: endpoint number that requires a delayed status phase.
|
||||
* @debug_root: root debugfs directory for this device to put its files in.
|
||||
*/
|
||||
struct dwc3 {
|
||||
struct work_struct drd_work;
|
||||
@@ -1314,6 +1315,7 @@ struct dwc3 {
|
||||
int max_cfg_eps;
|
||||
int last_fifo_depth;
|
||||
int num_ep_resized;
|
||||
struct dentry *debug_root;
|
||||
|
||||
ANDROID_KABI_USE(1, struct{ u8 clear_stall_protocol; u8 padding1;
|
||||
u8 padding2; u8 padding3; u8 padding4; u8 padding5;
|
||||
|
||||
@@ -414,11 +414,14 @@ static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
extern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep);
|
||||
extern void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep);
|
||||
extern void dwc3_debugfs_init(struct dwc3 *d);
|
||||
extern void dwc3_debugfs_exit(struct dwc3 *d);
|
||||
#else
|
||||
static inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
|
||||
{ }
|
||||
static inline void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep)
|
||||
{ }
|
||||
static inline void dwc3_debugfs_init(struct dwc3 *d)
|
||||
{ }
|
||||
static inline void dwc3_debugfs_exit(struct dwc3 *d)
|
||||
|
||||
@@ -873,27 +873,23 @@ static const struct dwc3_ep_file_map dwc3_ep_file_map[] = {
|
||||
{ "GDBGEPINFO", &dwc3_ep_info_register_fops, },
|
||||
};
|
||||
|
||||
static void dwc3_debugfs_create_endpoint_files(struct dwc3_ep *dep,
|
||||
struct dentry *parent)
|
||||
void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
|
||||
{
|
||||
struct dentry *dir;
|
||||
int i;
|
||||
|
||||
dir = debugfs_create_dir(dep->name, dep->dwc->debug_root);
|
||||
for (i = 0; i < ARRAY_SIZE(dwc3_ep_file_map); i++) {
|
||||
const struct file_operations *fops = dwc3_ep_file_map[i].fops;
|
||||
const char *name = dwc3_ep_file_map[i].name;
|
||||
|
||||
debugfs_create_file(name, 0444, parent, dep, fops);
|
||||
debugfs_create_file(name, 0444, dir, dep, fops);
|
||||
}
|
||||
}
|
||||
|
||||
void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
|
||||
void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep)
|
||||
{
|
||||
struct dentry *dir;
|
||||
struct dentry *root;
|
||||
|
||||
root = debugfs_lookup(dev_name(dep->dwc->dev), usb_debug_root);
|
||||
dir = debugfs_create_dir(dep->name, root);
|
||||
dwc3_debugfs_create_endpoint_files(dep, dir);
|
||||
debugfs_lookup_and_remove(dep->name, dep->dwc->debug_root);
|
||||
}
|
||||
|
||||
void dwc3_debugfs_init(struct dwc3 *dwc)
|
||||
@@ -911,6 +907,7 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
|
||||
dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
|
||||
|
||||
root = debugfs_create_dir(dev_name(dwc->dev), usb_debug_root);
|
||||
dwc->debug_root = root;
|
||||
debugfs_create_regset32("regdump", 0444, root, dwc->regset);
|
||||
debugfs_create_file("lsp_dump", 0644, root, dwc, &dwc3_lsp_fops);
|
||||
|
||||
@@ -929,6 +926,6 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
|
||||
|
||||
void dwc3_debugfs_exit(struct dwc3 *dwc)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(dev_name(dwc->dev), usb_debug_root));
|
||||
debugfs_lookup_and_remove(dev_name(dwc->dev), usb_debug_root);
|
||||
kfree(dwc->regset);
|
||||
}
|
||||
|
||||
@@ -3164,9 +3164,7 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
|
||||
list_del(&dep->endpoint.ep_list);
|
||||
}
|
||||
|
||||
debugfs_remove_recursive(debugfs_lookup(dep->name,
|
||||
debugfs_lookup(dev_name(dep->dwc->dev),
|
||||
usb_debug_root)));
|
||||
dwc3_debugfs_remove_endpoint_dir(dep);
|
||||
kfree(dep);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -483,11 +483,68 @@ UVC_ATTR_RO(uvcg_default_output_, cname, aname)
|
||||
UVCG_DEFAULT_OUTPUT_ATTR(b_terminal_id, bTerminalID, 8);
|
||||
UVCG_DEFAULT_OUTPUT_ATTR(w_terminal_type, wTerminalType, 16);
|
||||
UVCG_DEFAULT_OUTPUT_ATTR(b_assoc_terminal, bAssocTerminal, 8);
|
||||
UVCG_DEFAULT_OUTPUT_ATTR(b_source_id, bSourceID, 8);
|
||||
UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, 8);
|
||||
|
||||
#undef UVCG_DEFAULT_OUTPUT_ATTR
|
||||
|
||||
static ssize_t uvcg_default_output_b_source_id_show(struct config_item *item,
|
||||
char *page)
|
||||
{
|
||||
struct config_group *group = to_config_group(item);
|
||||
struct f_uvc_opts *opts;
|
||||
struct config_item *opts_item;
|
||||
struct mutex *su_mutex = &group->cg_subsys->su_mutex;
|
||||
struct uvc_output_terminal_descriptor *cd;
|
||||
int result;
|
||||
|
||||
mutex_lock(su_mutex); /* for navigating configfs hierarchy */
|
||||
|
||||
opts_item = group->cg_item.ci_parent->ci_parent->
|
||||
ci_parent->ci_parent;
|
||||
opts = to_f_uvc_opts(opts_item);
|
||||
cd = &opts->uvc_output_terminal;
|
||||
|
||||
mutex_lock(&opts->lock);
|
||||
result = sprintf(page, "%u\n", le8_to_cpu(cd->bSourceID));
|
||||
mutex_unlock(&opts->lock);
|
||||
|
||||
mutex_unlock(su_mutex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t uvcg_default_output_b_source_id_store(struct config_item *item,
|
||||
const char *page, size_t len)
|
||||
{
|
||||
struct config_group *group = to_config_group(item);
|
||||
struct f_uvc_opts *opts;
|
||||
struct config_item *opts_item;
|
||||
struct mutex *su_mutex = &group->cg_subsys->su_mutex;
|
||||
struct uvc_output_terminal_descriptor *cd;
|
||||
int result;
|
||||
u8 num;
|
||||
|
||||
result = kstrtou8(page, 0, &num);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
mutex_lock(su_mutex); /* for navigating configfs hierarchy */
|
||||
|
||||
opts_item = group->cg_item.ci_parent->ci_parent->
|
||||
ci_parent->ci_parent;
|
||||
opts = to_f_uvc_opts(opts_item);
|
||||
cd = &opts->uvc_output_terminal;
|
||||
|
||||
mutex_lock(&opts->lock);
|
||||
cd->bSourceID = num;
|
||||
mutex_unlock(&opts->lock);
|
||||
|
||||
mutex_unlock(su_mutex);
|
||||
|
||||
return len;
|
||||
}
|
||||
UVC_ATTR(uvcg_default_output_, b_source_id, bSourceID);
|
||||
|
||||
static struct configfs_attribute *uvcg_default_output_attrs[] = {
|
||||
&uvcg_default_output_attr_b_terminal_id,
|
||||
&uvcg_default_output_attr_w_terminal_type,
|
||||
|
||||
@@ -2259,7 +2259,7 @@ static void bcm63xx_udc_init_debugfs(struct bcm63xx_udc *udc)
|
||||
*/
|
||||
static void bcm63xx_udc_cleanup_debugfs(struct bcm63xx_udc *udc)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(udc->gadget.name, usb_debug_root));
|
||||
debugfs_lookup_and_remove(udc->gadget.name, usb_debug_root);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
||||
@@ -215,7 +215,7 @@ static void gr_dfs_create(struct gr_udc *dev)
|
||||
|
||||
static void gr_dfs_delete(struct gr_udc *dev)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(dev_name(dev->dev), usb_debug_root));
|
||||
debugfs_lookup_and_remove(dev_name(dev->dev), usb_debug_root);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_USB_GADGET_DEBUG_FS */
|
||||
|
||||
@@ -532,7 +532,7 @@ static void create_debug_file(struct lpc32xx_udc *udc)
|
||||
|
||||
static void remove_debug_file(struct lpc32xx_udc *udc)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(debug_filename, NULL));
|
||||
debugfs_lookup_and_remove(debug_filename, NULL);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -1341,7 +1341,7 @@ DEFINE_SHOW_ATTRIBUTE(udc_debug);
|
||||
debugfs_create_file(dev->gadget.name, \
|
||||
S_IRUGO, NULL, dev, &udc_debug_fops); \
|
||||
} while (0)
|
||||
#define remove_debug_files(dev) debugfs_remove(debugfs_lookup(dev->gadget.name, NULL))
|
||||
#define remove_debug_files(dev) debugfs_lookup_and_remove(dev->gadget.name, NULL)
|
||||
|
||||
#else /* !CONFIG_USB_GADGET_DEBUG_FILES */
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ static void pxa_init_debugfs(struct pxa_udc *udc)
|
||||
|
||||
static void pxa_cleanup_debugfs(struct pxa_udc *udc)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(udc->gadget.name, usb_debug_root));
|
||||
debugfs_lookup_and_remove(udc->gadget.name, usb_debug_root);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -862,7 +862,7 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)
|
||||
{
|
||||
struct usb_bus *bus = &fotg210_to_hcd(fotg210)->self;
|
||||
|
||||
debugfs_remove(debugfs_lookup(bus->bus_name, fotg210_debug_root));
|
||||
debugfs_lookup_and_remove(bus->bus_name, fotg210_debug_root);
|
||||
}
|
||||
|
||||
/* handshake - spin reading hc until handshake completes or fails
|
||||
|
||||
@@ -1206,7 +1206,7 @@ static void create_debug_file(struct isp116x *isp116x)
|
||||
|
||||
static void remove_debug_file(struct isp116x *isp116x)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup(hcd_name, usb_debug_root));
|
||||
debugfs_lookup_and_remove(hcd_name, usb_debug_root);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -2170,7 +2170,7 @@ static void create_debug_file(struct isp1362_hcd *isp1362_hcd)
|
||||
|
||||
static void remove_debug_file(struct isp1362_hcd *isp1362_hcd)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup("isp1362", usb_debug_root));
|
||||
debugfs_lookup_and_remove("isp1362", usb_debug_root);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@@ -1501,7 +1501,7 @@ static void create_debug_file(struct sl811 *sl811)
|
||||
|
||||
static void remove_debug_file(struct sl811 *sl811)
|
||||
{
|
||||
debugfs_remove(debugfs_lookup("sl811h", usb_debug_root));
|
||||
debugfs_lookup_and_remove("sl811h", usb_debug_root);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@@ -536,8 +536,8 @@ static void release_uhci(struct uhci_hcd *uhci)
|
||||
uhci->is_initialized = 0;
|
||||
spin_unlock_irq(&uhci->lock);
|
||||
|
||||
debugfs_remove(debugfs_lookup(uhci_to_hcd(uhci)->self.bus_name,
|
||||
uhci_debugfs_root));
|
||||
debugfs_lookup_and_remove(uhci_to_hcd(uhci)->self.bus_name,
|
||||
uhci_debugfs_root);
|
||||
|
||||
for (i = 0; i < UHCI_NUM_SKELQH; i++)
|
||||
uhci_free_qh(uhci, uhci->skelqh[i]);
|
||||
@@ -700,7 +700,7 @@ static int uhci_start(struct usb_hcd *hcd)
|
||||
uhci->frame, uhci->frame_dma_handle);
|
||||
|
||||
err_alloc_frame:
|
||||
debugfs_remove(debugfs_lookup(hcd->self.bus_name, uhci_debugfs_root));
|
||||
debugfs_lookup_and_remove(hcd->self.bus_name, uhci_debugfs_root);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ static void xhci_mvebu_mbus_config(void __iomem *base,
|
||||
|
||||
/* Program each DRAM CS in a seperate window */
|
||||
for (win = 0; win < dram->num_cs; win++) {
|
||||
const struct mbus_dram_window *cs = dram->cs + win;
|
||||
const struct mbus_dram_window *cs = &dram->cs[win];
|
||||
|
||||
writel(((cs->size - 1) & 0xffff0000) | (cs->mbus_attr << 8) |
|
||||
(dram->mbus_dram_target_id << 4) | 1,
|
||||
|
||||
@@ -939,7 +939,7 @@ static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageDa
|
||||
struct ms_lib_type_extdat ExtraData;
|
||||
struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
|
||||
|
||||
PageBuffer = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
|
||||
PageBuffer = kzalloc(MS_BYTES_PER_PAGE * 2, GFP_KERNEL);
|
||||
if (PageBuffer == NULL)
|
||||
return (u32)-1;
|
||||
|
||||
|
||||
@@ -206,10 +206,9 @@ static int at91_wdt_init(struct platform_device *pdev, struct at91wdt *wdt)
|
||||
"min heartbeat and max heartbeat might be too close for the system to handle it correctly\n");
|
||||
|
||||
if ((tmp & AT91_WDT_WDFIEN) && wdt->irq) {
|
||||
err = request_irq(wdt->irq, wdt_interrupt,
|
||||
IRQF_SHARED | IRQF_IRQPOLL |
|
||||
IRQF_NO_SUSPEND,
|
||||
pdev->name, wdt);
|
||||
err = devm_request_irq(dev, wdt->irq, wdt_interrupt,
|
||||
IRQF_SHARED | IRQF_IRQPOLL | IRQF_NO_SUSPEND,
|
||||
pdev->name, wdt);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -325,7 +325,8 @@ static int usb_pcwd_set_heartbeat(struct usb_pcwd_private *usb_pcwd, int t)
|
||||
static int usb_pcwd_get_temperature(struct usb_pcwd_private *usb_pcwd,
|
||||
int *temperature)
|
||||
{
|
||||
unsigned char msb, lsb;
|
||||
unsigned char msb = 0x00;
|
||||
unsigned char lsb = 0x00;
|
||||
|
||||
usb_pcwd_send_command(usb_pcwd, CMD_READ_TEMP, &msb, &lsb);
|
||||
|
||||
@@ -341,7 +342,8 @@ static int usb_pcwd_get_temperature(struct usb_pcwd_private *usb_pcwd,
|
||||
static int usb_pcwd_get_timeleft(struct usb_pcwd_private *usb_pcwd,
|
||||
int *time_left)
|
||||
{
|
||||
unsigned char msb, lsb;
|
||||
unsigned char msb = 0x00;
|
||||
unsigned char lsb = 0x00;
|
||||
|
||||
/* Read the time that's left before rebooting */
|
||||
/* Note: if the board is not yet armed then we will read 0xFFFF */
|
||||
|
||||
@@ -150,6 +150,7 @@ static int sbsa_gwdt_set_timeout(struct watchdog_device *wdd,
|
||||
struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd);
|
||||
|
||||
wdd->timeout = timeout;
|
||||
timeout = clamp_t(unsigned int, timeout, 1, wdd->max_hw_heartbeat_ms / 1000);
|
||||
|
||||
if (action)
|
||||
sbsa_gwdt_reg_write(gwdt->clk * timeout, gwdt);
|
||||
|
||||
@@ -1044,8 +1044,8 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)
|
||||
if (wdd->id == 0) {
|
||||
misc_deregister(&watchdog_miscdev);
|
||||
old_wd_data = NULL;
|
||||
put_device(&wd_data->dev);
|
||||
}
|
||||
put_device(&wd_data->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -528,9 +528,10 @@ static void bind_evtchn_to_cpu(evtchn_port_t evtchn, unsigned int cpu,
|
||||
BUG_ON(irq == -1);
|
||||
|
||||
if (IS_ENABLED(CONFIG_SMP) && force_affinity) {
|
||||
cpumask_copy(irq_get_affinity_mask(irq), cpumask_of(cpu));
|
||||
cpumask_copy(irq_get_effective_affinity_mask(irq),
|
||||
cpumask_of(cpu));
|
||||
struct irq_data *data = irq_get_irq_data(irq);
|
||||
|
||||
irq_data_update_affinity(data, cpumask_of(cpu));
|
||||
irq_data_update_effective_affinity(data, cpumask_of(cpu));
|
||||
}
|
||||
|
||||
xen_evtchn_port_bind_to_cpu(evtchn, cpu, info->cpu);
|
||||
|
||||
@@ -1282,8 +1282,14 @@ struct dentry_info_args {
|
||||
char *dname;
|
||||
};
|
||||
|
||||
/* Same as struct ext4_fc_tl, but uses native endianness fields */
|
||||
struct ext4_fc_tl_mem {
|
||||
u16 fc_tag;
|
||||
u16 fc_len;
|
||||
};
|
||||
|
||||
static inline void tl_to_darg(struct dentry_info_args *darg,
|
||||
struct ext4_fc_tl *tl, u8 *val)
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
struct ext4_fc_dentry_info fcd;
|
||||
|
||||
@@ -1295,16 +1301,18 @@ static inline void tl_to_darg(struct dentry_info_args *darg,
|
||||
darg->dname_len = tl->fc_len - sizeof(struct ext4_fc_dentry_info);
|
||||
}
|
||||
|
||||
static inline void ext4_fc_get_tl(struct ext4_fc_tl *tl, u8 *val)
|
||||
static inline void ext4_fc_get_tl(struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
memcpy(tl, val, EXT4_FC_TAG_BASE_LEN);
|
||||
tl->fc_len = le16_to_cpu(tl->fc_len);
|
||||
tl->fc_tag = le16_to_cpu(tl->fc_tag);
|
||||
struct ext4_fc_tl tl_disk;
|
||||
|
||||
memcpy(&tl_disk, val, EXT4_FC_TAG_BASE_LEN);
|
||||
tl->fc_len = le16_to_cpu(tl_disk.fc_len);
|
||||
tl->fc_tag = le16_to_cpu(tl_disk.fc_tag);
|
||||
}
|
||||
|
||||
/* Unlink replay function */
|
||||
static int ext4_fc_replay_unlink(struct super_block *sb, struct ext4_fc_tl *tl,
|
||||
u8 *val)
|
||||
static int ext4_fc_replay_unlink(struct super_block *sb,
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
struct inode *inode, *old_parent;
|
||||
struct qstr entry;
|
||||
@@ -1401,8 +1409,8 @@ static int ext4_fc_replay_link_internal(struct super_block *sb,
|
||||
}
|
||||
|
||||
/* Link replay function */
|
||||
static int ext4_fc_replay_link(struct super_block *sb, struct ext4_fc_tl *tl,
|
||||
u8 *val)
|
||||
static int ext4_fc_replay_link(struct super_block *sb,
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct dentry_info_args darg;
|
||||
@@ -1456,8 +1464,8 @@ static int ext4_fc_record_modified_inode(struct super_block *sb, int ino)
|
||||
/*
|
||||
* Inode replay function
|
||||
*/
|
||||
static int ext4_fc_replay_inode(struct super_block *sb, struct ext4_fc_tl *tl,
|
||||
u8 *val)
|
||||
static int ext4_fc_replay_inode(struct super_block *sb,
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
struct ext4_fc_inode fc_inode;
|
||||
struct ext4_inode *raw_inode;
|
||||
@@ -1557,8 +1565,8 @@ static int ext4_fc_replay_inode(struct super_block *sb, struct ext4_fc_tl *tl,
|
||||
* inode for which we are trying to create a dentry here, should already have
|
||||
* been replayed before we start here.
|
||||
*/
|
||||
static int ext4_fc_replay_create(struct super_block *sb, struct ext4_fc_tl *tl,
|
||||
u8 *val)
|
||||
static int ext4_fc_replay_create(struct super_block *sb,
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
int ret = 0;
|
||||
struct inode *inode = NULL;
|
||||
@@ -1657,7 +1665,7 @@ int ext4_fc_record_regions(struct super_block *sb, int ino,
|
||||
|
||||
/* Replay add range tag */
|
||||
static int ext4_fc_replay_add_range(struct super_block *sb,
|
||||
struct ext4_fc_tl *tl, u8 *val)
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
struct ext4_fc_add_range fc_add_ex;
|
||||
struct ext4_extent newex, *ex;
|
||||
@@ -1778,8 +1786,8 @@ static int ext4_fc_replay_add_range(struct super_block *sb,
|
||||
|
||||
/* Replay DEL_RANGE tag */
|
||||
static int
|
||||
ext4_fc_replay_del_range(struct super_block *sb, struct ext4_fc_tl *tl,
|
||||
u8 *val)
|
||||
ext4_fc_replay_del_range(struct super_block *sb,
|
||||
struct ext4_fc_tl_mem *tl, u8 *val)
|
||||
{
|
||||
struct inode *inode;
|
||||
struct ext4_fc_del_range lrange;
|
||||
@@ -1972,7 +1980,7 @@ static int ext4_fc_replay_scan(journal_t *journal,
|
||||
struct ext4_fc_replay_state *state;
|
||||
int ret = JBD2_FC_REPLAY_CONTINUE;
|
||||
struct ext4_fc_add_range ext;
|
||||
struct ext4_fc_tl tl;
|
||||
struct ext4_fc_tl_mem tl;
|
||||
struct ext4_fc_tail tail;
|
||||
__u8 *start, *end, *cur, *val;
|
||||
struct ext4_fc_head head;
|
||||
@@ -2091,7 +2099,7 @@ static int ext4_fc_replay(journal_t *journal, struct buffer_head *bh,
|
||||
{
|
||||
struct super_block *sb = journal->j_private;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
struct ext4_fc_tl tl;
|
||||
struct ext4_fc_tl_mem tl;
|
||||
__u8 *start, *end, *cur, *val;
|
||||
int ret = JBD2_FC_REPLAY_CONTINUE;
|
||||
struct ext4_fc_replay_state *state = &sbi->s_fc_replay_state;
|
||||
|
||||
@@ -3937,7 +3937,7 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (inode->i_size != 0) {
|
||||
if (F2FS_HAS_BLOCKS(inode)) {
|
||||
ret = -EFBIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,6 @@ bool f2fs_may_inline_dentry(struct inode *inode)
|
||||
void f2fs_do_read_inline_data(struct page *page, struct page *ipage)
|
||||
{
|
||||
struct inode *inode = page->mapping->host;
|
||||
void *src_addr, *dst_addr;
|
||||
|
||||
if (PageUptodate(page))
|
||||
return;
|
||||
@@ -75,11 +74,8 @@ void f2fs_do_read_inline_data(struct page *page, struct page *ipage)
|
||||
zero_user_segment(page, MAX_INLINE_DATA(inode), PAGE_SIZE);
|
||||
|
||||
/* Copy the whole inline data block */
|
||||
src_addr = inline_data_addr(inode, ipage);
|
||||
dst_addr = kmap_atomic(page);
|
||||
memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
|
||||
flush_dcache_page(page);
|
||||
kunmap_atomic(dst_addr);
|
||||
memcpy_to_page(page, 0, inline_data_addr(inode, ipage),
|
||||
MAX_INLINE_DATA(inode));
|
||||
if (!PageUptodate(page))
|
||||
SetPageUptodate(page);
|
||||
}
|
||||
@@ -264,7 +260,6 @@ int f2fs_convert_inline_inode(struct inode *inode)
|
||||
|
||||
int f2fs_write_inline_data(struct inode *inode, struct page *page)
|
||||
{
|
||||
void *src_addr, *dst_addr;
|
||||
struct dnode_of_data dn;
|
||||
int err;
|
||||
|
||||
@@ -281,10 +276,8 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)
|
||||
f2fs_bug_on(F2FS_I_SB(inode), page->index);
|
||||
|
||||
f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true);
|
||||
src_addr = kmap_atomic(page);
|
||||
dst_addr = inline_data_addr(inode, dn.inode_page);
|
||||
memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode));
|
||||
kunmap_atomic(src_addr);
|
||||
memcpy_from_page(inline_data_addr(inode, dn.inode_page),
|
||||
page, 0, MAX_INLINE_DATA(inode));
|
||||
set_page_dirty(dn.inode_page);
|
||||
|
||||
f2fs_clear_page_cache_dirty_tag(page);
|
||||
|
||||
@@ -195,8 +195,12 @@ static inline void __update_iostat_latency(struct bio_iostat_ctx *iostat_ctx,
|
||||
return;
|
||||
|
||||
ts_diff = jiffies - iostat_ctx->submit_ts;
|
||||
if (iotype >= META_FLUSH)
|
||||
if (iotype == META_FLUSH) {
|
||||
iotype = META;
|
||||
} else if (iotype >= NR_PAGE_TYPE) {
|
||||
f2fs_warn(sbi, "%s: %d over NR_PAGE_TYPE", __func__, iotype);
|
||||
return;
|
||||
}
|
||||
|
||||
if (rw == 0) {
|
||||
idx = READ_IO;
|
||||
|
||||
@@ -2480,7 +2480,6 @@ static ssize_t f2fs_quota_read(struct super_block *sb, int type, char *data,
|
||||
size_t toread;
|
||||
loff_t i_size = i_size_read(inode);
|
||||
struct page *page;
|
||||
char *kaddr;
|
||||
|
||||
if (off > i_size)
|
||||
return 0;
|
||||
@@ -2514,9 +2513,7 @@ static ssize_t f2fs_quota_read(struct super_block *sb, int type, char *data,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
kaddr = kmap_atomic(page);
|
||||
memcpy(data, kaddr + offset, tocopy);
|
||||
kunmap_atomic(kaddr);
|
||||
memcpy_from_page(data, page, offset, tocopy);
|
||||
f2fs_put_page(page, 1);
|
||||
|
||||
offset = 0;
|
||||
@@ -2538,7 +2535,6 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type,
|
||||
size_t towrite = len;
|
||||
struct page *page;
|
||||
void *fsdata = NULL;
|
||||
char *kaddr;
|
||||
int err = 0;
|
||||
int tocopy;
|
||||
|
||||
@@ -2557,10 +2553,7 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type,
|
||||
break;
|
||||
}
|
||||
|
||||
kaddr = kmap_atomic(page);
|
||||
memcpy(kaddr + offset, data, tocopy);
|
||||
kunmap_atomic(kaddr);
|
||||
flush_dcache_page(page);
|
||||
memcpy_to_page(page, offset, data, tocopy);
|
||||
|
||||
a_ops->write_end(NULL, mapping, off, tocopy, tocopy,
|
||||
page, fsdata);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user