Merge tag 'v4.19.325-cip127' of https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip into android13-4.19-kona
version 4.19.325-cip127 * tag 'v4.19.325-cip127' of https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip: CIP: Bump version suffix to -cip127 after merge from cip/linux-4.19.y-st tree Update localversion-st, tree is up-to-date with 5.10.247. usb: uas: fix urb unmapping issue when the uas device is remove during ongoing data transfer scsi: pm80xx: Set phy->enable_completion only when we drm/amd/display: Check NULL before accessing wifi: ath10k: Fix connection after GTK rekeying pinctrl: single: fix bias pull up/down handling in pin_config_set ovl: fix UAF in ovl_dentry_update_reval by moving dput() in ovl_link_up fs: writeback: fix use-after-free in __mark_inode_dirty() libceph: fix potential use-after-free in have_mon_and_osd_map() drm: sti: fix device leaks at component probe USB: serial: option: add support for Rolling RW101R-GL USB: serial: ftdi_sio: add support for u-blox EVK-M101 usb: storage: sddr55: Reject out-of-bound new_pba USB: storage: Remove subclass and protocol overrides from Novatek quirk usb: storage: Fix memory leak in USB bulk transport usb: gadget: f_eem: Fix memory leak in eem_unwrap slimbus: ngd: Fix reference count leak in qcom_slim_ngd_notify_slaves dm-verity: fix unreliable memory allocation can: sun4i_can: sun4i_can_interrupt(): fix max irq loop handling can: sja1000: fix max irq loop handling atm/fore200e: Fix possible data race in fore200e_open() MIPS: mm: Prevent a TLB shutdown on initial uniquification iio:common:ssp_sensors: Fix an error handling path ssp_probe() spi: bcm63xx: fix premature CS deassertion on RX-only transactions net: sxgbe: fix potential NULL dereference in sxgbe_rx() can: kvaser_usb: leaf: Fix potential infinite loop in command parsers mtd: onenand: Pass correct pointer to IRQ handler fsdax: mark the iomap argument to dax_iomap_sector as const net: sctp: Fix some typos iommu/amd: Skip enabling command/event buffers for kdump nvme-fc: use lock accessing port_state and rport state net: netpoll: fix incorrect refcount handling causing incorrect cleanup net: ethernet: ti: netcp: Standardize knav_dma_open_channel to return NULL on error tipc: Fix use-after-free in tipc_mon_reinit_self(). sctp: prevent possible shift-out-of-bounds in sctp_transport_update_rto Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF wifi: brcmfmac: fix crash while sending Action Frames in standalone AP Mode net/sched: sch_qfq: Fix null-deref in agg_dequeue Input: pegasus-notetaker - fix potential out-of-bounds access Input: remove third argument of usb_maxpacket() usb: deprecate the third argument of usb_maxpacket() ata: libata-scsi: Fix system suspend for a security locked drive fs/proc: fix uaf in proc_readdir_de() pmdomain: imx: Fix reference count leak in imx_gpc_remove pmdomain: arm: scmi: Fix genpd leak on provider registration failure net: qede: Initialize qede_ll_ops with designated initializer uio_hv_generic: Set event for all channels on the device ALSA: usb-audio: fix uac2 clock source at terminal parser kconfig/nconf: Initialize the default locale at startup kconfig/mconf: Initialize the default locale at startup vsock: Ignore signal/timeout on connect() if already established s390/ctcm: Fix double-kfree net: openvswitch: remove never-working support for setting nsh fields mlxsw: spectrum: Fix memory leak in mlxsw_sp_flower_stats() MIPS: Malta: Fix !EVA SOC-it PCI MMIO scsi: target: tcm_loop: Fix segfault in tcm_loop_tpg_address_show() scsi: sg: Do not sleep in atomic context Input: cros_ec_keyb - fix an invalid memory access be2net: pass wrb_params in case of OS2BMC HID: quirks: work around VID/PID conflict for 0x4c4a/0x4155 isdn: mISDN: hfcsusb: fix memory leak in hfcsusb_probe() spi: Try to get ACPI GPIO IRQ earlier ipv4: route: Prevent rt_bind_exception() from rebinding stale fnhe strparser: Fix signed/unsigned mismatch bug gcov: add support for GCC 15 mm/ksm: fix flag-dropping behavior in ksm_madvise ALSA: usb-audio: Fix NULL pointer dereference in snd_usb_mixer_controls_badd ASoC: cs4271: Fix regulator leak on probe failure regulator: fixed: use dev_err_probe for register Bluetooth: L2CAP: export l2cap_chan_hold for modules net_sched: remove need_resched() from qdisc_run() net/mlx5e: Fix maxrate wraparound in threshold between units net: sched: act_ife: initialize struct tc_ife to fix KMSAN kernel-infoleak Bluetooth: 6lowpan: Don't hold spin lock over sleeping functions Bluetooth: 6lowpan: fix BDADDR_LE vs ADDR_LE_DEV address type confusion Bluetooth: 6lowpan: reset link-local header on ipv6 recv path net: fec: correct rx_bytes statistic for the case SHIFT16 is set ASoC: max98090/91: fixed max98091 ALSA widget powering up/down HID: quirks: avoid Cooler Master MM712 dongle wakeup bug NFS4: Fix state renewals missing after boot extcon: adc-jack: Cleanup wakeup source only if it was enabled net: usb: qmi_wwan: initialize MAC header offset in qmimux_rx_fixup sctp: Prevent TOCTOU out-of-bounds write sctp: Hold RCU read lock while iterating over address list net: vlan: sync VLAN features with lower device ceph: add checking of wait_for_completion_killable() return value fbdev: Add bounds checking in bit_putcs to fix vmalloc-out-of-bounds ACPI: property: Return present device nodes only on fwnode interface 9p: sysfs_init: don't hardcode error to ENOMEM 9p: fix /sys/fs/9p/caches overwriting itself fs/hpfs: Fix error code for new_inode() failure in mkdir/create/mknod/symlink ACPICA: Update dsmethod.c to get rid of unused variable warning page_pool: Clamp pool size to max 16K pages Bluetooth: bcsp: receive data only if registered Bluetooth: SCO: Fix UAF on sco_conn_free net: macb: avoid dealing with endianness in macb_set_hwaddr() nfs4_setup_readdir(): insufficient locking for ->d_parent->d_inode dereferencing NFSv4.1: fix mount hang after CREATE_SESSION failure NFSv4: handle ERR_GRACE on delegation recalls remoteproc: qcom: q6v5: Avoid handling handover twice sparc/module: Add R_SPARC_UA64 relocation handling net: intel: fm10k: Fix parameter idx set but not used jfs: fix uninitialized waitqueue in transaction manager jfs: Verify inode mode when loading from disk ipv6: np->rxpmtu race annotation usb: xhci: plat: Facilitate using autosuspend for xhci plat devices usb: mon: Increase BUFF_MAX to 64 MiB to support multi-MB URBs allow finish_no_open(file, ERR_PTR(-E...)) scsi: lpfc: Define size of debugfs entry for xri rebalancing scsi: lpfc: Check return status of lpfc_reset_flush_io_context during TGT_RESET selftests/Makefile: include $(INSTALL_DEP_TARGETS) in clean target to clean net/lib dependency net/cls_cgroup: Fix task_get_classid() during qdisc run media: redrat3: use int type to store negative error codes net: sh_eth: Disable WoL if system can not suspend usb: gadget: f_hid: Fix zero length packet transfer net: call cond_resched() less often in __release_sock() ALSA: usb-audio: apply quirk for MOONDROP Quark2 net: nfc: nci: Increase NCI_DATA_TIMEOUT to 3000 ms dmaengine: mv_xor: match alloc_wc and free_wc scsi: pm8001: Use int instead of u32 to store error codes mips: lantiq: xway: sysctrl: rename stp clock mips: lantiq: danube: add missing properties to cpu node media: fix uninitialized symbol warnings extcon: adc-jack: Fix wakeup source leaks on device unbind rds: Fix endianness annotation for RDS_MPATH_HASH net: Call trace_sock_exceed_buf_limit() for memcg failure with SK_MEM_RECV. char: misc: Does not request module for miscdevice with dynamic minor usb: gadget: f_ncm: Fix MAC assignment NCM ethernet iio: adc: spear_adc: mask SPEAR_ADC_STATUS channel and avg sample before setting register media: imon: make send_packet() more robust net: ipv6: fix field-spanning memcpy warning in AH output bridge: Redirect to backup port when port is administratively down media: pci: ivtv: Don't create fake v4l2_fh drm/amdkfd: return -ENOTTY for unsupported IOCTLs selftests/net: Ensure assert() triggers in psock_tpacket.c selftests/net: Replace non-standard __WORDSIZE with sizeof(long) * 8 PCI: Disable MSI on RDC PCI to PCIe bridges drm/nouveau: replace snprintf() with scnprintf() in nvkm_snprintbf() mfd: madera: Work around false-positive -Wininitialized warning mfd: stmpe: Remove IRQ domain upon removal tools/power x86_energy_perf_policy: Prefer driver HWP limits tools/power x86_energy_perf_policy: Enhance HWP enable tools/cpupower: Fix incorrect size in cpuidle_state_disable() hwmon: (dell-smm) Add support for Dell OptiPlex 7040 uprobe: Do not emulate/sstep original instruction when ip is changed clocksource/drivers/vf-pit: Replace raw_readl/writel to readl/writel video: backlight: lp855x_bl: Set correct EPROM start for LP8556 tee: allow a driver to allocate a tee_device without a pool ACPICA: dispatcher: Use acpi_ds_clear_operands() in acpi_ds_call_control_method() irqchip/gic-v2m: Handle Multiple MSI base IRQ Alignment arc: Fix __fls() const-foldability via __builtin_clzl() cpufreq/longhaul: handle NULL policy in longhaul_exit selftests/bpf: Fix bpf_prog_detach2 usage in test_lirc_mode2 ACPI: video: force native for Lenovo 82K8 memstick: Add timeout to prevent indefinite waiting bpf: Don't use %pK through printk spi: loopback-test: Don't use %pK through printk soc: qcom: smem: Fix endian-unaware access of num_entries usb: gadget: f_fs: Fix epfile null pointer access after ep enable. serial: 8250_dw: Use devm_clk_get_optional() to get the input clock can: gs_usb: increase max interface to U8_MAX devcoredump: Fix circular locking dependency with devcd->mutex. x86/resctrl: Fix miscount of bandwidth event when reactivating previously unavailable RMID net: phy: dp83867: Disable EEE support as not implemented regmap: slimbus: fix bus_context pointer in regmap init calls usbnet: Prevents free active kevent wifi: ath10k: Fix memory leak on unsupported WMI command ASoC: qdsp6: q6asm: do not sleep while atomic fbdev: pvr2fb: Fix leftover reference to ONCHIP_NR_DMA_CHANNELS fbdev: bitblit: bound-check glyph index in bit_putcs* ACPI: video: Fix use-after-free in acpi_video_switch_brightness() fbdev: atyfb: Check if pll_ops->init_pll failed net: usb: asix_devices: Check return value of usbnet_get_endpoints btrfs: use smp_mb__after_atomic() when forcing COW in create_pending_snapshot() x86/bugs: Fix reporting of LFENCE retpoline Conflicts: drivers/slimbus/qcom-ngd-ctrl.c drivers/usb/gadget/function/f_fs.c drivers/usb/host/xhci-plat.c Change-Id: Id995e84f0ff2c819145f7ebd62bc8dcd47fbbb47
This commit is contained in:
commit
e0479e4a5b
187 files changed
+1212
-744
No files matched your search
@@ -374,6 +374,8 @@ static inline __attribute__ ((const)) int fls(unsigned long x)
|
||||
*/
|
||||
static inline __attribute__ ((const)) int __fls(unsigned long x)
|
||||
{
|
||||
if (__builtin_constant_p(x))
|
||||
return x ? BITS_PER_LONG - 1 - __builtin_clzl(x) : 0;
|
||||
/* FLS insn has exactly same semantics as the API */
|
||||
return __builtin_arc_fls(x);
|
||||
}
|
||||
|
||||
@@ -5,8 +5,12 @@
|
||||
compatible = "lantiq,xway", "lantiq,danube";
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "mips,mips24Kc";
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -461,7 +461,7 @@ void __init ltq_soc_init(void)
|
||||
/* add our generic xway clocks */
|
||||
clkdev_add_pmu("10000000.fpi", NULL, 0, 0, PMU_FPI);
|
||||
clkdev_add_pmu("1e100a00.gptu", NULL, 1, 0, PMU_GPT);
|
||||
clkdev_add_pmu("1e100bb0.stp", NULL, 1, 0, PMU_STP);
|
||||
clkdev_add_pmu("1e100bb0.gpio", NULL, 1, 0, PMU_STP);
|
||||
clkdev_add_pmu("1e100c00.serial", NULL, 0, 0, PMU_ASC1);
|
||||
clkdev_add_pmu("1e104100.dma", NULL, 1, 0, PMU_DMA);
|
||||
clkdev_add_pmu("1e100800.spi", NULL, 1, 0, PMU_SPI);
|
||||
|
||||
+64
-38
@@ -15,6 +15,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sort.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cpu-type.h>
|
||||
@@ -484,54 +485,78 @@ static int __init set_ntlb(char *str)
|
||||
|
||||
__setup("ntlb=", set_ntlb);
|
||||
|
||||
/* Initialise all TLB entries with unique values */
|
||||
|
||||
/* Comparison function for EntryHi VPN fields. */
|
||||
static int r4k_vpn_cmp(const void *a, const void *b)
|
||||
{
|
||||
long v = *(unsigned long *)a - *(unsigned long *)b;
|
||||
int s = sizeof(long) > sizeof(int) ? sizeof(long) * 8 - 1: 0;
|
||||
return s ? (v != 0) | v >> s : v;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialise all TLB entries with unique values that do not clash with
|
||||
* what we have been handed over and what we'll be using ourselves.
|
||||
*/
|
||||
static void r4k_tlb_uniquify(void)
|
||||
{
|
||||
int entry = num_wired_entries();
|
||||
unsigned long tlb_vpns[1 << MIPS_CONF1_TLBS_SIZE];
|
||||
int tlbsize = current_cpu_data.tlbsize;
|
||||
int start = num_wired_entries();
|
||||
unsigned long vpn_mask;
|
||||
int cnt, ent, idx, i;
|
||||
|
||||
vpn_mask = GENMASK(cpu_vmbits - 1, 13);
|
||||
vpn_mask |= IS_ENABLED(CONFIG_64BIT) ? 3ULL << 62 : 1 << 31;
|
||||
|
||||
htw_stop();
|
||||
|
||||
for (i = start, cnt = 0; i < tlbsize; i++, cnt++) {
|
||||
unsigned long vpn;
|
||||
|
||||
write_c0_index(i);
|
||||
mtc0_tlbr_hazard();
|
||||
tlb_read();
|
||||
tlb_read_hazard();
|
||||
vpn = read_c0_entryhi();
|
||||
vpn &= vpn_mask & PAGE_MASK;
|
||||
tlb_vpns[cnt] = vpn;
|
||||
|
||||
/* Prevent any large pages from overlapping regular ones. */
|
||||
write_c0_pagemask(read_c0_pagemask() & PM_DEFAULT_MASK);
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_write_indexed();
|
||||
tlbw_use_hazard();
|
||||
}
|
||||
|
||||
sort(tlb_vpns, cnt, sizeof(tlb_vpns[0]), r4k_vpn_cmp, NULL);
|
||||
|
||||
write_c0_pagemask(PM_DEFAULT_MASK);
|
||||
write_c0_entrylo0(0);
|
||||
write_c0_entrylo1(0);
|
||||
|
||||
while (entry < current_cpu_data.tlbsize) {
|
||||
unsigned long asid_mask = cpu_asid_mask(¤t_cpu_data);
|
||||
unsigned long asid = 0;
|
||||
int idx;
|
||||
idx = 0;
|
||||
ent = tlbsize;
|
||||
for (i = start; i < tlbsize; i++)
|
||||
while (1) {
|
||||
unsigned long entryhi, vpn;
|
||||
|
||||
/* Skip wired MMID to make ginvt_mmid work */
|
||||
if (cpu_has_mmid)
|
||||
asid = MMID_KERNEL_WIRED + 1;
|
||||
entryhi = UNIQUE_ENTRYHI(ent);
|
||||
vpn = entryhi & vpn_mask & PAGE_MASK;
|
||||
|
||||
/* Check for match before using UNIQUE_ENTRYHI */
|
||||
do {
|
||||
if (cpu_has_mmid) {
|
||||
write_c0_memorymapid(asid);
|
||||
write_c0_entryhi(UNIQUE_ENTRYHI(entry));
|
||||
} else {
|
||||
write_c0_entryhi(UNIQUE_ENTRYHI(entry) | asid);
|
||||
}
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_probe();
|
||||
tlb_probe_hazard();
|
||||
idx = read_c0_index();
|
||||
/* No match or match is on current entry */
|
||||
if (idx < 0 || idx == entry)
|
||||
if (idx >= cnt || vpn < tlb_vpns[idx]) {
|
||||
write_c0_entryhi(entryhi);
|
||||
write_c0_index(i);
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_write_indexed();
|
||||
ent++;
|
||||
break;
|
||||
/*
|
||||
* If we hit a match, we need to try again with
|
||||
* a different ASID.
|
||||
*/
|
||||
asid++;
|
||||
} while (asid < asid_mask);
|
||||
|
||||
if (idx >= 0 && idx != entry)
|
||||
panic("Unable to uniquify TLB entry %d", idx);
|
||||
|
||||
write_c0_index(entry);
|
||||
mtc0_tlbw_hazard();
|
||||
tlb_write_indexed();
|
||||
entry++;
|
||||
}
|
||||
} else if (vpn == tlb_vpns[idx]) {
|
||||
ent++;
|
||||
} else {
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
|
||||
tlbw_use_hazard();
|
||||
htw_start();
|
||||
@@ -578,6 +603,7 @@ static void r4k_tlb_configure(void)
|
||||
|
||||
/* From this point on the ARC firmware is dead. */
|
||||
r4k_tlb_uniquify();
|
||||
local_flush_tlb_all();
|
||||
|
||||
/* Did I tell you that ARC SUCKS? */
|
||||
}
|
||||
|
||||
@@ -244,16 +244,22 @@ mips_pci_controller:
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Setup the Malta max (2GB) memory for PCI DMA in host bridge
|
||||
* in transparent addressing mode.
|
||||
* Set up memory mapping in host bridge for PCI DMA masters,
|
||||
* in transparent addressing mode. For EVA use the Malta
|
||||
* maximum of 2 GiB memory in the alias space at 0x80000000
|
||||
* as per PHYS_OFFSET. Otherwise use 256 MiB of memory in
|
||||
* the regular space, avoiding mapping the PCI MMIO window
|
||||
* for DMA as it seems to confuse the system controller's
|
||||
* logic, causing PCI MMIO to stop working.
|
||||
*/
|
||||
mask = PHYS_OFFSET | PCI_BASE_ADDRESS_MEM_PREFETCH;
|
||||
MSC_WRITE(MSC01_PCI_BAR0, mask);
|
||||
MSC_WRITE(MSC01_PCI_HEAD4, mask);
|
||||
mask = PHYS_OFFSET ? PHYS_OFFSET : 0xf0000000;
|
||||
MSC_WRITE(MSC01_PCI_BAR0,
|
||||
mask | PCI_BASE_ADDRESS_MEM_PREFETCH);
|
||||
MSC_WRITE(MSC01_PCI_HEAD4,
|
||||
PHYS_OFFSET | PCI_BASE_ADDRESS_MEM_PREFETCH);
|
||||
|
||||
mask &= MSC01_PCI_BAR0_SIZE_MSK;
|
||||
MSC_WRITE(MSC01_PCI_P2SCMSKL, mask);
|
||||
MSC_WRITE(MSC01_PCI_P2SCMAPL, mask);
|
||||
MSC_WRITE(MSC01_PCI_P2SCMAPL, PHYS_OFFSET);
|
||||
|
||||
/* Don't handle target retries indefinitely. */
|
||||
if ((data & MSC01_PCI_CFG_MAXRTRY_MSK) ==
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
#define R_SPARC_7 43
|
||||
#define R_SPARC_5 44
|
||||
#define R_SPARC_6 45
|
||||
#define R_SPARC_UA64 54
|
||||
|
||||
/* Bits present in AT_HWCAP, primarily for Sparc32. */
|
||||
#define HWCAP_SPARC_FLUSH 0x00000001
|
||||
|
||||
@@ -117,6 +117,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
||||
break;
|
||||
#ifdef CONFIG_SPARC64
|
||||
case R_SPARC_64:
|
||||
case R_SPARC_UA64:
|
||||
location[0] = v >> 56;
|
||||
location[1] = v >> 48;
|
||||
location[2] = v >> 40;
|
||||
|
||||
@@ -1188,7 +1188,7 @@ set_mode:
|
||||
static const char * const spectre_v2_strings[] = {
|
||||
[SPECTRE_V2_NONE] = "Vulnerable",
|
||||
[SPECTRE_V2_RETPOLINE] = "Mitigation: Retpolines",
|
||||
[SPECTRE_V2_LFENCE] = "Mitigation: LFENCE",
|
||||
[SPECTRE_V2_LFENCE] = "Vulnerable: LFENCE",
|
||||
[SPECTRE_V2_EIBRS] = "Mitigation: Enhanced / Automatic IBRS",
|
||||
[SPECTRE_V2_EIBRS_LFENCE] = "Mitigation: Enhanced / Automatic IBRS + LFENCE",
|
||||
[SPECTRE_V2_EIBRS_RETPOLINE] = "Mitigation: Enhanced / Automatic IBRS + Retpolines",
|
||||
@@ -2269,9 +2269,6 @@ static char *pbrsb_eibrs_state(void)
|
||||
|
||||
static ssize_t spectre_v2_show_state(char *buf)
|
||||
{
|
||||
if (spectre_v2_enabled == SPECTRE_V2_LFENCE)
|
||||
return sysfs_emit(buf, "Vulnerable: LFENCE\n");
|
||||
|
||||
if (spectre_v2_enabled == SPECTRE_V2_EIBRS && unprivileged_ebpf_enabled())
|
||||
return sysfs_emit(buf, "Vulnerable: eIBRS with unprivileged eBPF\n");
|
||||
|
||||
|
||||
@@ -235,11 +235,19 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr)
|
||||
|
||||
static u64 __mon_event_count(u32 rmid, struct rmid_read *rr)
|
||||
{
|
||||
struct mbm_state *m;
|
||||
struct mbm_state *m = NULL;
|
||||
u64 chunks, tval;
|
||||
|
||||
tval = __rmid_read(rmid, rr->evtid);
|
||||
if (tval & (RMID_VAL_ERROR | RMID_VAL_UNAVAIL)) {
|
||||
if (tval & RMID_VAL_UNAVAIL) {
|
||||
if (rr->evtid == QOS_L3_MBM_TOTAL_EVENT_ID)
|
||||
m = &rr->d->mbm_total[rmid];
|
||||
else if (rr->evtid == QOS_L3_MBM_LOCAL_EVENT_ID)
|
||||
m = &rr->d->mbm_local[rmid];
|
||||
if (m)
|
||||
m->prev_msr = 0;
|
||||
}
|
||||
return tval;
|
||||
}
|
||||
switch (rr->evtid) {
|
||||
|
||||
@@ -2037,8 +2037,10 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
|
||||
struct acpi_video_device *dev;
|
||||
|
||||
mutex_lock(&video->device_list_lock);
|
||||
list_for_each_entry(dev, &video->video_device_list, entry)
|
||||
list_for_each_entry(dev, &video->video_device_list, entry) {
|
||||
acpi_video_dev_remove_notify_handler(dev);
|
||||
cancel_delayed_work_sync(&dev->switch_brightness_work);
|
||||
}
|
||||
mutex_unlock(&video->device_list_lock);
|
||||
|
||||
acpi_video_bus_stop_devices(video);
|
||||
|
||||
@@ -462,7 +462,6 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
struct acpi_walk_state *next_walk_state = NULL;
|
||||
union acpi_operand_object *obj_desc;
|
||||
struct acpi_evaluate_info *info;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ds_call_control_method, this_walk_state);
|
||||
|
||||
@@ -543,14 +542,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
* Delete the operands on the previous walkstate operand stack
|
||||
* (they were copied to new objects)
|
||||
*/
|
||||
for (i = 0; i < obj_desc->method.param_count; i++) {
|
||||
acpi_ut_remove_reference(this_walk_state->operands[i]);
|
||||
this_walk_state->operands[i] = NULL;
|
||||
}
|
||||
|
||||
/* Clear the operand stack */
|
||||
|
||||
this_walk_state->num_operands = 0;
|
||||
acpi_ds_clear_operands(this_walk_state);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
"**** Begin nested execution of [%4.4s] **** WalkState=%p\n",
|
||||
|
||||
+23
-1
@@ -1034,6 +1034,28 @@ struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* acpi_get_next_present_subnode - Return the next present child node handle
|
||||
* @fwnode: Firmware node to find the next child node for.
|
||||
* @child: Handle to one of the device's child nodes or a null handle.
|
||||
*
|
||||
* Like acpi_get_next_subnode(), but the device nodes returned by
|
||||
* acpi_get_next_present_subnode() are guaranteed to be present.
|
||||
*
|
||||
* Returns: The fwnode handle of the next present sub-node.
|
||||
*/
|
||||
static struct fwnode_handle *
|
||||
acpi_get_next_present_subnode(const struct fwnode_handle *fwnode,
|
||||
struct fwnode_handle *child)
|
||||
{
|
||||
do {
|
||||
child = acpi_get_next_subnode(fwnode, child);
|
||||
} while (is_acpi_device_node(child) &&
|
||||
!acpi_device_is_present(to_acpi_device_node(child)));
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_node_get_parent - Return parent fwnode of this fwnode
|
||||
* @fwnode: Firmware node whose parent to get
|
||||
@@ -1307,7 +1329,7 @@ acpi_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
|
||||
.property_read_string_array = \
|
||||
acpi_fwnode_property_read_string_array, \
|
||||
.get_parent = acpi_node_get_parent, \
|
||||
.get_next_child_node = acpi_get_next_subnode, \
|
||||
.get_next_child_node = acpi_get_next_present_subnode, \
|
||||
.get_named_child_node = acpi_fwnode_get_named_child_node, \
|
||||
.get_reference_args = acpi_fwnode_get_reference_args, \
|
||||
.graph_get_next_endpoint = \
|
||||
|
||||
@@ -540,6 +540,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"),
|
||||
},
|
||||
},
|
||||
/* https://gitlab.freedesktop.org/drm/amd/-/issues/4512 */
|
||||
{
|
||||
.callback = video_detect_force_native,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "82K8"),
|
||||
},
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
|
||||
@@ -1194,6 +1194,14 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
|
||||
ata_scsi_set_sense(dev, cmd, NOT_READY, 0x04, 0x21);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ata_id_is_locked(dev->id)) {
|
||||
/* Security locked */
|
||||
/* LOGICAL UNIT ACCESS NOT AUTHORIZED */
|
||||
ata_scsi_set_sense(dev, cmd, DATA_PROTECT, 0x74, 0x71);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Use ata_to_sense_error() to map status register bits
|
||||
* onto sense key, asc & ascq.
|
||||
*/
|
||||
|
||||
@@ -1469,7 +1469,9 @@ fore200e_open(struct atm_vcc *vcc)
|
||||
|
||||
vcc->dev_data = NULL;
|
||||
|
||||
mutex_lock(&fore200e->rate_mtx);
|
||||
fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
|
||||
mutex_unlock(&fore200e->rate_mtx);
|
||||
|
||||
kfree(fore200e_vcc);
|
||||
return -EINVAL;
|
||||
|
||||
+84
-54
@@ -30,50 +30,46 @@ struct devcd_entry {
|
||||
void *data;
|
||||
size_t datalen;
|
||||
/*
|
||||
* Here, mutex is required to serialize the calls to del_wk work between
|
||||
* user/kernel space which happens when devcd is added with device_add()
|
||||
* and that sends uevent to user space. User space reads the uevents,
|
||||
* and calls to devcd_data_write() which try to modify the work which is
|
||||
* not even initialized/queued from devcoredump.
|
||||
* There are 2 races for which mutex is required.
|
||||
*
|
||||
* The first race is between device creation and userspace writing to
|
||||
* schedule immediately destruction.
|
||||
*
|
||||
* This race is handled by arming the timer before device creation, but
|
||||
* when device creation fails the timer still exists.
|
||||
*
|
||||
* cpu0(X) cpu1(Y)
|
||||
* To solve this, hold the mutex during device_add(), and set
|
||||
* init_completed on success before releasing the mutex.
|
||||
*
|
||||
* dev_coredump() uevent sent to user space
|
||||
* device_add() ======================> user space process Y reads the
|
||||
* uevents writes to devcd fd
|
||||
* which results into writes to
|
||||
* That way the timer will never fire until device_add() is called,
|
||||
* it will do nothing if init_completed is not set. The timer is also
|
||||
* cancelled in that case.
|
||||
*
|
||||
* devcd_data_write()
|
||||
* mod_delayed_work()
|
||||
* try_to_grab_pending()
|
||||
* del_timer()
|
||||
* debug_assert_init()
|
||||
* INIT_DELAYED_WORK()
|
||||
* schedule_delayed_work()
|
||||
*
|
||||
*
|
||||
* Also, mutex alone would not be enough to avoid scheduling of
|
||||
* del_wk work after it get flush from a call to devcd_free()
|
||||
* mentioned as below.
|
||||
*
|
||||
* disabled_store()
|
||||
* devcd_free()
|
||||
* mutex_lock() devcd_data_write()
|
||||
* flush_delayed_work()
|
||||
* mutex_unlock()
|
||||
* mutex_lock()
|
||||
* mod_delayed_work()
|
||||
* mutex_unlock()
|
||||
* So, delete_work flag is required.
|
||||
* The second race involves multiple parallel invocations of devcd_free(),
|
||||
* add a deleted flag so only 1 can call the destructor.
|
||||
*/
|
||||
struct mutex mutex;
|
||||
bool delete_work;
|
||||
bool init_completed, deleted;
|
||||
struct module *owner;
|
||||
ssize_t (*read)(char *buffer, loff_t offset, size_t count,
|
||||
void *data, size_t datalen);
|
||||
void (*free)(void *data);
|
||||
/*
|
||||
* If nothing interferes and device_add() was returns success,
|
||||
* del_wk will destroy the device after the timer fires.
|
||||
*
|
||||
* Multiple userspace processes can interfere in the working of the timer:
|
||||
* - Writing to the coredump will reschedule the timer to run immediately,
|
||||
* if still armed.
|
||||
*
|
||||
* This is handled by using "if (cancel_delayed_work()) {
|
||||
* schedule_delayed_work() }", to prevent re-arming after having
|
||||
* been previously fired.
|
||||
* - Writing to /sys/class/devcoredump/disabled will destroy the
|
||||
* coredump synchronously.
|
||||
* This is handled by using disable_delayed_work_sync(), and then
|
||||
* checking if deleted flag is set with &devcd->mutex held.
|
||||
*/
|
||||
struct delayed_work del_wk;
|
||||
struct device *failing_dev;
|
||||
};
|
||||
@@ -102,14 +98,27 @@ static void devcd_dev_release(struct device *dev)
|
||||
kfree(devcd);
|
||||
}
|
||||
|
||||
static void __devcd_del(struct devcd_entry *devcd)
|
||||
{
|
||||
devcd->deleted = true;
|
||||
device_del(&devcd->devcd_dev);
|
||||
put_device(&devcd->devcd_dev);
|
||||
}
|
||||
|
||||
static void devcd_del(struct work_struct *wk)
|
||||
{
|
||||
struct devcd_entry *devcd;
|
||||
bool init_completed;
|
||||
|
||||
devcd = container_of(wk, struct devcd_entry, del_wk.work);
|
||||
|
||||
device_del(&devcd->devcd_dev);
|
||||
put_device(&devcd->devcd_dev);
|
||||
/* devcd->mutex serializes against dev_coredumpm_timeout */
|
||||
mutex_lock(&devcd->mutex);
|
||||
init_completed = devcd->init_completed;
|
||||
mutex_unlock(&devcd->mutex);
|
||||
|
||||
if (init_completed)
|
||||
__devcd_del(devcd);
|
||||
}
|
||||
|
||||
static ssize_t devcd_data_read(struct file *filp, struct kobject *kobj,
|
||||
@@ -129,12 +138,12 @@ static ssize_t devcd_data_write(struct file *filp, struct kobject *kobj,
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct devcd_entry *devcd = dev_to_devcd(dev);
|
||||
|
||||
mutex_lock(&devcd->mutex);
|
||||
if (!devcd->delete_work) {
|
||||
devcd->delete_work = true;
|
||||
mod_delayed_work(system_wq, &devcd->del_wk, 0);
|
||||
}
|
||||
mutex_unlock(&devcd->mutex);
|
||||
/*
|
||||
* Although it's tempting to use mod_delayed work here,
|
||||
* that will cause a reschedule if the timer already fired.
|
||||
*/
|
||||
if (cancel_delayed_work(&devcd->del_wk))
|
||||
schedule_delayed_work(&devcd->del_wk, 0);
|
||||
|
||||
return count;
|
||||
}
|
||||
@@ -162,11 +171,21 @@ static int devcd_free(struct device *dev, void *data)
|
||||
{
|
||||
struct devcd_entry *devcd = dev_to_devcd(dev);
|
||||
|
||||
/*
|
||||
* To prevent a race with devcd_data_write(), cancel work and
|
||||
* complete manually instead.
|
||||
*
|
||||
* We cannot rely on the return value of
|
||||
* cancel_delayed_work_sync() here, because it might be in the
|
||||
* middle of a cancel_delayed_work + schedule_delayed_work pair.
|
||||
*
|
||||
* devcd->mutex here guards against multiple parallel invocations
|
||||
* of devcd_free().
|
||||
*/
|
||||
cancel_delayed_work_sync(&devcd->del_wk);
|
||||
mutex_lock(&devcd->mutex);
|
||||
if (!devcd->delete_work)
|
||||
devcd->delete_work = true;
|
||||
|
||||
flush_delayed_work(&devcd->del_wk);
|
||||
if (!devcd->deleted)
|
||||
__devcd_del(devcd);
|
||||
mutex_unlock(&devcd->mutex);
|
||||
return 0;
|
||||
}
|
||||
@@ -190,12 +209,10 @@ static ssize_t disabled_show(struct class *class, struct class_attribute *attr,
|
||||
* put_device() <- last reference
|
||||
* error = fn(dev, data) devcd_dev_release()
|
||||
* devcd_free(dev, data) kfree(devcd)
|
||||
* mutex_lock(&devcd->mutex);
|
||||
*
|
||||
*
|
||||
* In the above diagram, It looks like disabled_store() would be racing with parallely
|
||||
* running devcd_del() and result in memory abort while acquiring devcd->mutex which
|
||||
* is called after kfree of devcd memory after dropping its last reference with
|
||||
* In the above diagram, it looks like disabled_store() would be racing with parallelly
|
||||
* running devcd_del() and result in memory abort after dropping its last reference with
|
||||
* put_device(). However, this will not happens as fn(dev, data) runs
|
||||
* with its own reference to device via klist_node so it is not its last reference.
|
||||
* so, above situation would not occur.
|
||||
@@ -366,7 +383,7 @@ void dev_coredumpm(struct device *dev, struct module *owner,
|
||||
devcd->read = read;
|
||||
devcd->free = free;
|
||||
devcd->failing_dev = get_device(dev);
|
||||
devcd->delete_work = false;
|
||||
devcd->deleted = false;
|
||||
|
||||
mutex_init(&devcd->mutex);
|
||||
device_initialize(&devcd->devcd_dev);
|
||||
@@ -375,8 +392,14 @@ void dev_coredumpm(struct device *dev, struct module *owner,
|
||||
atomic_inc_return(&devcd_count));
|
||||
devcd->devcd_dev.class = &devcd_class;
|
||||
|
||||
mutex_lock(&devcd->mutex);
|
||||
dev_set_uevent_suppress(&devcd->devcd_dev, true);
|
||||
|
||||
/* devcd->mutex prevents devcd_del() completing until init finishes */
|
||||
mutex_lock(&devcd->mutex);
|
||||
devcd->init_completed = false;
|
||||
INIT_DELAYED_WORK(&devcd->del_wk, devcd_del);
|
||||
schedule_delayed_work(&devcd->del_wk, DEVCD_TIMEOUT);
|
||||
|
||||
if (device_add(&devcd->devcd_dev))
|
||||
goto put_device;
|
||||
|
||||
@@ -390,13 +413,20 @@ void dev_coredumpm(struct device *dev, struct module *owner,
|
||||
|
||||
dev_set_uevent_suppress(&devcd->devcd_dev, false);
|
||||
kobject_uevent(&devcd->devcd_dev.kobj, KOBJ_ADD);
|
||||
INIT_DELAYED_WORK(&devcd->del_wk, devcd_del);
|
||||
schedule_delayed_work(&devcd->del_wk, DEVCD_TIMEOUT);
|
||||
|
||||
/*
|
||||
* Safe to run devcd_del() now that we are done with devcd_dev.
|
||||
* Alternatively we could have taken a ref on devcd_dev before
|
||||
* dropping the lock.
|
||||
*/
|
||||
devcd->init_completed = true;
|
||||
mutex_unlock(&devcd->mutex);
|
||||
return;
|
||||
put_device:
|
||||
put_device(&devcd->devcd_dev);
|
||||
mutex_unlock(&devcd->mutex);
|
||||
cancel_delayed_work_sync(&devcd->del_wk);
|
||||
put_device(&devcd->devcd_dev);
|
||||
|
||||
put_module:
|
||||
module_put(owner);
|
||||
free:
|
||||
|
||||
@@ -48,8 +48,7 @@ struct regmap *__regmap_init_slimbus(struct slim_device *slimbus,
|
||||
if (IS_ERR(bus))
|
||||
return ERR_CAST(bus);
|
||||
|
||||
return __regmap_init(&slimbus->dev, bus, &slimbus->dev, config,
|
||||
lock_key, lock_name);
|
||||
return __regmap_init(&slimbus->dev, bus, slimbus, config, lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__regmap_init_slimbus);
|
||||
|
||||
@@ -63,8 +62,7 @@ struct regmap *__devm_regmap_init_slimbus(struct slim_device *slimbus,
|
||||
if (IS_ERR(bus))
|
||||
return ERR_CAST(bus);
|
||||
|
||||
return __devm_regmap_init(&slimbus->dev, bus, &slimbus, config,
|
||||
lock_key, lock_name);
|
||||
return __devm_regmap_init(&slimbus->dev, bus, slimbus, config, lock_key, lock_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__devm_regmap_init_slimbus);
|
||||
|
||||
|
||||
@@ -3268,6 +3268,9 @@ static void btusb_disconnect(struct usb_interface *intf)
|
||||
|
||||
hci_unregister_dev(hdev);
|
||||
|
||||
if (data->oob_wake_irq)
|
||||
device_init_wakeup(&data->udev->dev, false);
|
||||
|
||||
if (intf == data->intf) {
|
||||
if (data->isoc)
|
||||
usb_driver_release_interface(&btusb_driver, data->isoc);
|
||||
@@ -3278,14 +3281,11 @@ static void btusb_disconnect(struct usb_interface *intf)
|
||||
usb_driver_release_interface(&btusb_driver, data->diag);
|
||||
usb_driver_release_interface(&btusb_driver, data->intf);
|
||||
} else if (intf == data->diag) {
|
||||
usb_driver_release_interface(&btusb_driver, data->intf);
|
||||
if (data->isoc)
|
||||
usb_driver_release_interface(&btusb_driver, data->isoc);
|
||||
usb_driver_release_interface(&btusb_driver, data->intf);
|
||||
}
|
||||
|
||||
if (data->oob_wake_irq)
|
||||
device_init_wakeup(&data->udev->dev, false);
|
||||
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
|
||||
|
||||
@@ -597,6 +597,9 @@ static int bcsp_recv(struct hci_uart *hu, const void *data, int count)
|
||||
struct bcsp_struct *bcsp = hu->priv;
|
||||
const unsigned char *ptr;
|
||||
|
||||
if (!test_bit(HCI_UART_REGISTERED, &hu->flags))
|
||||
return -EUNATCH;
|
||||
|
||||
BT_DBG("hu %p count %d rx_state %d rx_count %ld",
|
||||
hu, count, bcsp->rx_state, bcsp->rx_count);
|
||||
|
||||
|
||||
+5
-3
@@ -113,7 +113,8 @@ static int misc_open(struct inode *inode, struct file *file)
|
||||
}
|
||||
}
|
||||
|
||||
if (!new_fops) {
|
||||
/* Only request module for fixed minor code */
|
||||
if (!new_fops && minor < MISC_DYNAMIC_MINOR) {
|
||||
mutex_unlock(&misc_mtx);
|
||||
request_module("char-major-%d-%d", MISC_MAJOR, minor);
|
||||
mutex_lock(&misc_mtx);
|
||||
@@ -124,10 +125,11 @@ static int misc_open(struct inode *inode, struct file *file)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!new_fops)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!new_fops)
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
* Place the miscdevice in the file's
|
||||
* private_data so it can be used by the
|
||||
|
||||
@@ -39,30 +39,30 @@ static unsigned long cycle_per_jiffy;
|
||||
|
||||
static inline void pit_timer_enable(void)
|
||||
{
|
||||
__raw_writel(PITTCTRL_TEN | PITTCTRL_TIE, clkevt_base + PITTCTRL);
|
||||
writel(PITTCTRL_TEN | PITTCTRL_TIE, clkevt_base + PITTCTRL);
|
||||
}
|
||||
|
||||
static inline void pit_timer_disable(void)
|
||||
{
|
||||
__raw_writel(0, clkevt_base + PITTCTRL);
|
||||
writel(0, clkevt_base + PITTCTRL);
|
||||
}
|
||||
|
||||
static inline void pit_irq_acknowledge(void)
|
||||
{
|
||||
__raw_writel(PITTFLG_TIF, clkevt_base + PITTFLG);
|
||||
writel(PITTFLG_TIF, clkevt_base + PITTFLG);
|
||||
}
|
||||
|
||||
static u64 notrace pit_read_sched_clock(void)
|
||||
{
|
||||
return ~__raw_readl(clksrc_base + PITCVAL);
|
||||
return ~readl(clksrc_base + PITCVAL);
|
||||
}
|
||||
|
||||
static int __init pit_clocksource_init(unsigned long rate)
|
||||
{
|
||||
/* set the max load value and start the clock source counter */
|
||||
__raw_writel(0, clksrc_base + PITTCTRL);
|
||||
__raw_writel(~0UL, clksrc_base + PITLDVAL);
|
||||
__raw_writel(PITTCTRL_TEN, clksrc_base + PITTCTRL);
|
||||
writel(0, clksrc_base + PITTCTRL);
|
||||
writel(~0UL, clksrc_base + PITLDVAL);
|
||||
writel(PITTCTRL_TEN, clksrc_base + PITTCTRL);
|
||||
|
||||
sched_clock_register(pit_read_sched_clock, 32, rate);
|
||||
return clocksource_mmio_init(clksrc_base + PITCVAL, "vf-pit", rate,
|
||||
@@ -80,7 +80,7 @@ static int pit_set_next_event(unsigned long delta,
|
||||
* hardware requirement.
|
||||
*/
|
||||
pit_timer_disable();
|
||||
__raw_writel(delta - 1, clkevt_base + PITLDVAL);
|
||||
writel(delta - 1, clkevt_base + PITLDVAL);
|
||||
pit_timer_enable();
|
||||
|
||||
return 0;
|
||||
@@ -136,8 +136,8 @@ static struct irqaction pit_timer_irq = {
|
||||
|
||||
static int __init pit_clockevent_init(unsigned long rate, int irq)
|
||||
{
|
||||
__raw_writel(0, clkevt_base + PITTCTRL);
|
||||
__raw_writel(PITTFLG_TIF, clkevt_base + PITTFLG);
|
||||
writel(0, clkevt_base + PITTCTRL);
|
||||
writel(PITTFLG_TIF, clkevt_base + PITTFLG);
|
||||
|
||||
BUG_ON(setup_irq(irq, &pit_timer_irq));
|
||||
|
||||
@@ -193,7 +193,7 @@ static int __init pit_timer_init(struct device_node *np)
|
||||
cycle_per_jiffy = clk_rate / (HZ);
|
||||
|
||||
/* enable the pit module */
|
||||
__raw_writel(~PITMCR_MDIS, timer_base + PITMCR);
|
||||
writel(~PITMCR_MDIS, timer_base + PITMCR);
|
||||
|
||||
ret = pit_clocksource_init(clk_rate);
|
||||
if (ret)
|
||||
|
||||
@@ -956,6 +956,9 @@ static void __exit longhaul_exit(void)
|
||||
struct cpufreq_policy *policy = cpufreq_cpu_get(0);
|
||||
int i;
|
||||
|
||||
if (unlikely(!policy))
|
||||
return;
|
||||
|
||||
for (i = 0; i < numscales; i++) {
|
||||
if (mults[i] == maxmult) {
|
||||
struct cpufreq_freqs freqs;
|
||||
|
||||
@@ -1021,7 +1021,7 @@ static int mv_xor_channel_remove(struct mv_xor_chan *mv_chan)
|
||||
|
||||
dma_async_device_unregister(&mv_chan->dmadev);
|
||||
|
||||
dma_free_coherent(dev, MV_XOR_POOL_SIZE,
|
||||
dma_free_wc(dev, MV_XOR_POOL_SIZE,
|
||||
mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool);
|
||||
dma_unmap_single(dev, mv_chan->dummy_src_addr,
|
||||
MV_XOR_MIN_BYTE_COUNT, DMA_FROM_DEVICE);
|
||||
@@ -1169,7 +1169,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev,
|
||||
err_free_irq:
|
||||
free_irq(mv_chan->irq, mv_chan);
|
||||
err_free_dma:
|
||||
dma_free_coherent(&pdev->dev, MV_XOR_POOL_SIZE,
|
||||
dma_free_wc(&pdev->dev, MV_XOR_POOL_SIZE,
|
||||
mv_chan->dma_desc_pool_virt, mv_chan->dma_desc_pool);
|
||||
err_unmap_dst:
|
||||
dma_unmap_single(dma_dev->dev, mv_chan->dummy_dst_addr,
|
||||
|
||||
@@ -168,6 +168,8 @@ static int adc_jack_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct adc_jack_data *data = platform_get_drvdata(pdev);
|
||||
|
||||
if (data->wakeup_source)
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
free_irq(data->irq, data);
|
||||
cancel_work_sync(&data->handler.work);
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ static int scmi_pd_power_off(struct generic_pm_domain *domain)
|
||||
|
||||
static int scmi_pm_domain_probe(struct scmi_device *sdev)
|
||||
{
|
||||
int num_domains, i;
|
||||
int num_domains, i, ret;
|
||||
struct device *dev = &sdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct scmi_pm_domain *scmi_pd;
|
||||
@@ -106,9 +106,18 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev)
|
||||
scmi_pd_data->domains = domains;
|
||||
scmi_pd_data->num_domains = num_domains;
|
||||
|
||||
ret = of_genpd_add_provider_onecell(np, scmi_pd_data);
|
||||
if (ret)
|
||||
goto err_rm_genpds;
|
||||
|
||||
dev_set_drvdata(dev, scmi_pd_data);
|
||||
|
||||
return of_genpd_add_provider_onecell(np, scmi_pd_data);
|
||||
return 0;
|
||||
err_rm_genpds:
|
||||
for (i = num_domains - 1; i >= 0; i--)
|
||||
pm_genpd_remove(domains[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void scmi_pm_domain_remove(struct scmi_device *sdev)
|
||||
|
||||
@@ -1630,8 +1630,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
unsigned int usize, asize;
|
||||
int retcode = -EINVAL;
|
||||
|
||||
if (nr >= AMDKFD_CORE_IOCTL_COUNT)
|
||||
if (nr >= AMDKFD_CORE_IOCTL_COUNT) {
|
||||
retcode = -ENOTTY;
|
||||
goto err_i1;
|
||||
}
|
||||
|
||||
if ((nr >= AMDKFD_COMMAND_START) && (nr < AMDKFD_COMMAND_END)) {
|
||||
u32 amdkfd_size;
|
||||
@@ -1644,8 +1646,10 @@ static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
asize = amdkfd_size;
|
||||
|
||||
cmd = ioctl->cmd;
|
||||
} else
|
||||
} else {
|
||||
retcode = -ENOTTY;
|
||||
goto err_i1;
|
||||
}
|
||||
|
||||
dev_dbg(kfd_device, "ioctl cmd 0x%x (#%d), arg 0x%lx\n", cmd, nr, arg);
|
||||
|
||||
|
||||
@@ -298,9 +298,14 @@ bool dc_stream_get_scanoutpos(const struct dc_stream_state *stream,
|
||||
{
|
||||
uint8_t i;
|
||||
bool ret = false;
|
||||
struct dc *core_dc = stream->ctx->dc;
|
||||
struct resource_context *res_ctx =
|
||||
&core_dc->current_state->res_ctx;
|
||||
struct dc *dc;
|
||||
struct resource_context *res_ctx;
|
||||
|
||||
if (!stream->ctx)
|
||||
return false;
|
||||
|
||||
dc = stream->ctx->dc;
|
||||
res_ctx = &dc->current_state->res_ctx;
|
||||
|
||||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
struct timing_generator *tg = res_ctx->pipe_ctx[i].stream_res.tg;
|
||||
|
||||
@@ -44,7 +44,7 @@ nvkm_snprintbf(char *data, int size, const struct nvkm_bitfield *bf, u32 value)
|
||||
bool space = false;
|
||||
while (size >= 1 && bf->name) {
|
||||
if (value & bf->mask) {
|
||||
int this = snprintf(data, size, "%s%s",
|
||||
int this = scnprintf(data, size, "%s%s",
|
||||
space ? " " : "", bf->name);
|
||||
size -= this;
|
||||
data += this;
|
||||
|
||||
@@ -141,12 +141,17 @@ struct sti_vtg {
|
||||
struct sti_vtg *of_vtg_find(struct device_node *np)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct sti_vtg *vtg;
|
||||
|
||||
pdev = of_find_device_by_node(np);
|
||||
if (!pdev)
|
||||
return NULL;
|
||||
|
||||
return (struct sti_vtg *)platform_get_drvdata(pdev);
|
||||
vtg = platform_get_drvdata(pdev);
|
||||
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return vtg;
|
||||
}
|
||||
|
||||
static void vtg_reset(struct sti_vtg *vtg)
|
||||
|
||||
@@ -298,6 +298,9 @@
|
||||
#define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500
|
||||
#define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff
|
||||
|
||||
#define USB_VENDOR_ID_COOLER_MASTER 0x2516
|
||||
#define USB_DEVICE_ID_COOLER_MASTER_MICE_DONGLE 0x01b7
|
||||
|
||||
#define USB_VENDOR_ID_CORSAIR 0x1b1c
|
||||
#define USB_DEVICE_ID_CORSAIR_K90 0x1b02
|
||||
|
||||
@@ -1294,8 +1297,8 @@
|
||||
#define USB_VENDOR_ID_UGTIZER 0x2179
|
||||
#define USB_DEVICE_ID_UGTIZER_TABLET_GP0610 0x0053
|
||||
|
||||
#define USB_VENDOR_ID_SMARTLINKTECHNOLOGY 0x4c4a
|
||||
#define USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155 0x4155
|
||||
#define USB_VENDOR_ID_JIELI_SDK_DEFAULT 0x4c4a
|
||||
#define USB_DEVICE_ID_JIELI_SDK_4155 0x4155
|
||||
|
||||
#define USB_VENDOR_ID_QVR5 0x045e
|
||||
#define USB_VENDOR_ID_QVR32A 0x04b4
|
||||
|
||||
@@ -59,6 +59,7 @@ static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_THROTTLE), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_COOLER_MASTER, USB_DEVICE_ID_COOLER_MASTER_MICE_DONGLE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K65RGB_RAPIDFIRE), HID_QUIRK_NO_INIT_REPORTS | HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K70RGB), HID_QUIRK_NO_INIT_REPORTS },
|
||||
@@ -918,7 +919,6 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
#endif
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_HP_5MP_CAMERA_5473) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SMARTLINKTECHNOLOGY, USB_DEVICE_ID_SMARTLINKTECHNOLOGY_4155) },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -1068,6 +1068,18 @@ bool hid_ignore(struct hid_device *hdev)
|
||||
strncmp(hdev->name, "QTEC0001", 8) != 0)
|
||||
return true;
|
||||
break;
|
||||
case USB_VENDOR_ID_JIELI_SDK_DEFAULT:
|
||||
/*
|
||||
* Multiple USB devices with identical IDs (mic & touchscreen).
|
||||
* The touch screen requires hid core processing, but the
|
||||
* microphone does not. They can be distinguished by manufacturer
|
||||
* and serial number.
|
||||
*/
|
||||
if (hdev->product == USB_DEVICE_ID_JIELI_SDK_4155 &&
|
||||
strncmp(hdev->name, "SmartlinkTechnology", 19) == 0 &&
|
||||
strncmp(hdev->uniq, "20201111000001", 14) == 0)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (hdev->type == HID_TYPE_USBMOUSE &&
|
||||
|
||||
@@ -972,6 +972,13 @@ static const struct dmi_system_id i8k_dmi_table[] __initconst = {
|
||||
},
|
||||
.driver_data = (void *)&i8k_config_data[DELL_PRECISION_490],
|
||||
},
|
||||
{
|
||||
.ident = "Dell OptiPlex 7040",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "OptiPlex 7040"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Dell Precision",
|
||||
.matches = {
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/completion.h>
|
||||
@@ -30,9 +31,9 @@
|
||||
|
||||
/* Bit definitions for SPEAR_ADC_STATUS */
|
||||
#define SPEAR_ADC_STATUS_START_CONVERSION BIT(0)
|
||||
#define SPEAR_ADC_STATUS_CHANNEL_NUM(x) ((x) << 1)
|
||||
#define SPEAR_ADC_STATUS_CHANNEL_NUM_MASK GENMASK(3, 1)
|
||||
#define SPEAR_ADC_STATUS_ADC_ENABLE BIT(4)
|
||||
#define SPEAR_ADC_STATUS_AVG_SAMPLE(x) ((x) << 5)
|
||||
#define SPEAR_ADC_STATUS_AVG_SAMPLE_MASK GENMASK(8, 5)
|
||||
#define SPEAR_ADC_STATUS_VREF_INTERNAL BIT(9)
|
||||
|
||||
#define SPEAR_ADC_DATA_MASK 0x03ff
|
||||
@@ -149,8 +150,8 @@ static int spear_adc_read_raw(struct iio_dev *indio_dev,
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
|
||||
status = SPEAR_ADC_STATUS_CHANNEL_NUM(chan->channel) |
|
||||
SPEAR_ADC_STATUS_AVG_SAMPLE(st->avg_samples) |
|
||||
status = FIELD_PREP(SPEAR_ADC_STATUS_CHANNEL_NUM_MASK, chan->channel) |
|
||||
FIELD_PREP(SPEAR_ADC_STATUS_AVG_SAMPLE_MASK, st->avg_samples) |
|
||||
SPEAR_ADC_STATUS_START_CONVERSION |
|
||||
SPEAR_ADC_STATUS_ADC_ENABLE;
|
||||
if (st->vref_external == 0)
|
||||
|
||||
@@ -543,7 +543,7 @@ static int ssp_probe(struct spi_device *spi)
|
||||
ret = spi_setup(spi);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "Failed to setup spi\n");
|
||||
return ret;
|
||||
goto err_setup_spi;
|
||||
}
|
||||
|
||||
data->fw_dl_state = SSP_FW_DL_STATE_NONE;
|
||||
@@ -608,6 +608,8 @@ err_read_reg:
|
||||
err_setup_irq:
|
||||
mutex_destroy(&data->pending_lock);
|
||||
mutex_destroy(&data->comm_lock);
|
||||
err_setup_spi:
|
||||
mfd_remove_devices(&spi->dev);
|
||||
|
||||
dev_err(&spi->dev, "Probe failed!\n");
|
||||
|
||||
|
||||
@@ -242,6 +242,12 @@ static int cros_ec_keyb_work(struct notifier_block *nb,
|
||||
case EC_MKBP_EVENT_KEY_MATRIX:
|
||||
pm_wakeup_event(ckdev->dev, 0);
|
||||
|
||||
if (!ckdev->idev) {
|
||||
dev_warn_once(ckdev->dev,
|
||||
"Unexpected key matrix event\n");
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
if (ckdev->ec->event_size != ckdev->cols) {
|
||||
dev_err(ckdev->dev,
|
||||
"Discarded incomplete key matrix event.\n");
|
||||
|
||||
@@ -642,7 +642,7 @@ static int ati_remote2_urb_init(struct ati_remote2 *ar2)
|
||||
return -ENOMEM;
|
||||
|
||||
pipe = usb_rcvintpipe(udev, ar2->ep[i]->bEndpointAddress);
|
||||
maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
|
||||
maxp = usb_maxpacket(udev, pipe);
|
||||
maxp = maxp > 4 ? 4 : maxp;
|
||||
|
||||
usb_fill_int_urb(ar2->urb[i], udev, pipe, ar2->buf[i], maxp,
|
||||
|
||||
@@ -752,7 +752,7 @@ static int cm109_usb_probe(struct usb_interface *intf,
|
||||
|
||||
/* get a handle to the interrupt data pipe */
|
||||
pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
|
||||
ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
|
||||
ret = usb_maxpacket(udev, pipe);
|
||||
if (ret != USB_PKT_LEN)
|
||||
dev_err(&intf->dev, "invalid payload size %d, expected %d\n",
|
||||
ret, USB_PKT_LEN);
|
||||
|
||||
@@ -373,7 +373,7 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i
|
||||
|
||||
/* get a handle to the interrupt data pipe */
|
||||
pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
|
||||
maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
|
||||
maxp = usb_maxpacket(udev, pipe);
|
||||
|
||||
if (maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX) {
|
||||
printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n",
|
||||
|
||||
@@ -918,7 +918,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
/* get a handle to the interrupt data pipe */
|
||||
pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
|
||||
ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
|
||||
ret = usb_maxpacket(udev, pipe);
|
||||
if (ret != USB_PKT_LEN)
|
||||
dev_err(&intf->dev, "invalid payload size %d, expected %zd\n",
|
||||
ret, USB_PKT_LEN);
|
||||
|
||||
@@ -143,7 +143,7 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_
|
||||
return -ENODEV;
|
||||
|
||||
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
|
||||
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
|
||||
maxp = usb_maxpacket(dev, pipe);
|
||||
|
||||
acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
|
||||
@@ -62,6 +62,9 @@
|
||||
#define BUTTON_PRESSED 0xb5
|
||||
#define COMMAND_VERSION 0xa9
|
||||
|
||||
/* 1 Status + 1 Color + 2 X + 2 Y = 6 bytes */
|
||||
#define NOTETAKER_PACKET_SIZE 6
|
||||
|
||||
/* in xy data packet */
|
||||
#define BATTERY_NO_REPORT 0x40
|
||||
#define BATTERY_LOW 0x41
|
||||
@@ -295,7 +298,13 @@ static int pegasus_probe(struct usb_interface *intf,
|
||||
pegasus->intf = intf;
|
||||
|
||||
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
|
||||
pegasus->data_len = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
|
||||
pegasus->data_len = usb_maxpacket(dev, pipe);
|
||||
if (pegasus->data_len < NOTETAKER_PACKET_SIZE) {
|
||||
dev_err(&intf->dev, "packet size is too small (%d)\n",
|
||||
pegasus->data_len);
|
||||
error = -EINVAL;
|
||||
goto err_free_mem;
|
||||
}
|
||||
|
||||
pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL,
|
||||
&pegasus->data_dma);
|
||||
|
||||
@@ -641,11 +641,16 @@ static void iommu_enable_command_buffer(struct amd_iommu *iommu)
|
||||
|
||||
BUG_ON(iommu->cmd_buf == NULL);
|
||||
|
||||
entry = iommu_virt_to_phys(iommu->cmd_buf);
|
||||
entry |= MMIO_CMD_SIZE_512;
|
||||
|
||||
memcpy_toio(iommu->mmio_base + MMIO_CMD_BUF_OFFSET,
|
||||
&entry, sizeof(entry));
|
||||
if (!is_kdump_kernel()) {
|
||||
/*
|
||||
* Command buffer is re-used for kdump kernel and setting
|
||||
* of MMIO register is not required.
|
||||
*/
|
||||
entry = iommu_virt_to_phys(iommu->cmd_buf);
|
||||
entry |= MMIO_CMD_SIZE_512;
|
||||
memcpy_toio(iommu->mmio_base + MMIO_CMD_BUF_OFFSET,
|
||||
&entry, sizeof(entry));
|
||||
}
|
||||
|
||||
amd_iommu_reset_cmd_buffer(iommu);
|
||||
}
|
||||
@@ -678,10 +683,15 @@ static void iommu_enable_event_buffer(struct amd_iommu *iommu)
|
||||
|
||||
BUG_ON(iommu->evt_buf == NULL);
|
||||
|
||||
entry = iommu_virt_to_phys(iommu->evt_buf) | EVT_LEN_MASK;
|
||||
|
||||
memcpy_toio(iommu->mmio_base + MMIO_EVT_BUF_OFFSET,
|
||||
&entry, sizeof(entry));
|
||||
if (!is_kdump_kernel()) {
|
||||
/*
|
||||
* Event buffer is re-used for kdump kernel and setting
|
||||
* of MMIO register is not required.
|
||||
*/
|
||||
entry = iommu_virt_to_phys(iommu->evt_buf) | EVT_LEN_MASK;
|
||||
memcpy_toio(iommu->mmio_base + MMIO_EVT_BUF_OFFSET,
|
||||
&entry, sizeof(entry));
|
||||
}
|
||||
|
||||
/* set head and tail to zero manually */
|
||||
writel(0x00, iommu->mmio_base + MMIO_EVT_HEAD_OFFSET);
|
||||
|
||||
@@ -168,14 +168,19 @@ static int gicv2m_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
|
||||
unsigned int nr_irqs, void *args)
|
||||
{
|
||||
struct v2m_data *v2m = NULL, *tmp;
|
||||
int hwirq, offset, i, err = 0;
|
||||
int hwirq, i, err = 0;
|
||||
unsigned long offset;
|
||||
unsigned long align_mask = nr_irqs - 1;
|
||||
|
||||
spin_lock(&v2m_lock);
|
||||
list_for_each_entry(tmp, &v2m_nodes, entry) {
|
||||
offset = bitmap_find_free_region(tmp->bm, tmp->nr_spis,
|
||||
get_count_order(nr_irqs));
|
||||
if (offset >= 0) {
|
||||
unsigned long align_off = tmp->spi_start - (tmp->spi_start & ~align_mask);
|
||||
|
||||
offset = bitmap_find_next_zero_area_off(tmp->bm, tmp->nr_spis, 0,
|
||||
nr_irqs, align_mask, align_off);
|
||||
if (offset < tmp->nr_spis) {
|
||||
v2m = tmp;
|
||||
bitmap_set(v2m->bm, offset, nr_irqs);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1917,13 +1917,13 @@ out:
|
||||
mISDN_freebchannel(&hw->bch[1]);
|
||||
mISDN_freebchannel(&hw->bch[0]);
|
||||
mISDN_freedchannel(&hw->dch);
|
||||
kfree(hw);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
int err;
|
||||
struct hfcsusb *hw;
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct usb_host_interface *iface = intf->cur_altsetting;
|
||||
@@ -2114,20 +2114,28 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
if (!hw->ctrl_urb) {
|
||||
pr_warn("%s: No memory for control urb\n",
|
||||
driver_info->vend_name);
|
||||
kfree(hw);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto err_free_hw;
|
||||
}
|
||||
|
||||
pr_info("%s: %s: detected \"%s\" (%s, if=%d alt=%d)\n",
|
||||
hw->name, __func__, driver_info->vend_name,
|
||||
conf_str[small_match], ifnum, alt_used);
|
||||
|
||||
if (setup_instance(hw, dev->dev.parent))
|
||||
return -EIO;
|
||||
if (setup_instance(hw, dev->dev.parent)) {
|
||||
err = -EIO;
|
||||
goto err_free_urb;
|
||||
}
|
||||
|
||||
hw->intf = intf;
|
||||
usb_set_intfdata(hw->intf, hw);
|
||||
return 0;
|
||||
|
||||
err_free_urb:
|
||||
usb_free_urb(hw->ctrl_urb);
|
||||
err_free_hw:
|
||||
kfree(hw);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* function called when an active device is removed */
|
||||
|
||||
@@ -321,11 +321,7 @@ static int fec_alloc_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio)
|
||||
if (fio->bufs[n])
|
||||
continue;
|
||||
|
||||
fio->bufs[n] = mempool_alloc(&v->fec->prealloc_pool, GFP_NOWAIT);
|
||||
if (unlikely(!fio->bufs[n])) {
|
||||
DMERR("failed to allocate FEC buffer");
|
||||
return -ENOMEM;
|
||||
}
|
||||
fio->bufs[n] = mempool_alloc(&v->fec->prealloc_pool, GFP_NOIO);
|
||||
}
|
||||
|
||||
/* try to allocate the maximum number of buffers */
|
||||
|
||||
@@ -294,9 +294,9 @@ static int get_key_avermedia_cardbus(struct IR_i2c *ir, enum rc_proto *protocol,
|
||||
|
||||
static int ir_key_poll(struct IR_i2c *ir)
|
||||
{
|
||||
enum rc_proto protocol;
|
||||
u32 scancode;
|
||||
u8 toggle;
|
||||
enum rc_proto protocol = 0;
|
||||
u32 scancode = 0;
|
||||
u8 toggle = 0;
|
||||
int rc;
|
||||
|
||||
dev_dbg(&ir->rc->dev, "%s\n", __func__);
|
||||
|
||||
@@ -159,14 +159,12 @@ static int snd_ivtv_pcm_capture_open(struct snd_pcm_substream *substream)
|
||||
|
||||
s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM];
|
||||
|
||||
v4l2_fh_init(&item.fh, &s->vdev);
|
||||
item.itv = itv;
|
||||
item.type = s->type;
|
||||
|
||||
/* See if the stream is available */
|
||||
if (ivtv_claim_stream(&item, item.type)) {
|
||||
/* No, it's already in use */
|
||||
v4l2_fh_exit(&item.fh);
|
||||
snd_ivtv_unlock(itvsc);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@@ -325,6 +325,7 @@ struct ivtv_queue {
|
||||
};
|
||||
|
||||
struct ivtv; /* forward reference */
|
||||
struct ivtv_open_id;
|
||||
|
||||
struct ivtv_stream {
|
||||
/* These first four fields are always set, even if the stream
|
||||
@@ -335,7 +336,7 @@ struct ivtv_stream {
|
||||
int type; /* stream type */
|
||||
u32 caps; /* V4L2 capabilities */
|
||||
|
||||
struct v4l2_fh *fh; /* pointer to the streaming filehandle */
|
||||
struct ivtv_open_id *id; /* pointer to the streaming ivtv_open_id */
|
||||
spinlock_t qlock; /* locks access to the queues */
|
||||
unsigned long s_flags; /* status flags, see above */
|
||||
int dma; /* can be PCI_DMA_TODEVICE, PCI_DMA_FROMDEVICE or PCI_DMA_NONE */
|
||||
|
||||
@@ -50,16 +50,16 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)
|
||||
|
||||
if (test_and_set_bit(IVTV_F_S_CLAIMED, &s->s_flags)) {
|
||||
/* someone already claimed this stream */
|
||||
if (s->fh == &id->fh) {
|
||||
if (s->id == id) {
|
||||
/* yes, this file descriptor did. So that's OK. */
|
||||
return 0;
|
||||
}
|
||||
if (s->fh == NULL && (type == IVTV_DEC_STREAM_TYPE_VBI ||
|
||||
if (s->id == NULL && (type == IVTV_DEC_STREAM_TYPE_VBI ||
|
||||
type == IVTV_ENC_STREAM_TYPE_VBI)) {
|
||||
/* VBI is handled already internally, now also assign
|
||||
the file descriptor to this stream for external
|
||||
reading of the stream. */
|
||||
s->fh = &id->fh;
|
||||
s->id = id;
|
||||
IVTV_DEBUG_INFO("Start Read VBI\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -67,7 +67,7 @@ int ivtv_claim_stream(struct ivtv_open_id *id, int type)
|
||||
IVTV_DEBUG_INFO("Stream %d is busy\n", type);
|
||||
return -EBUSY;
|
||||
}
|
||||
s->fh = &id->fh;
|
||||
s->id = id;
|
||||
if (type == IVTV_DEC_STREAM_TYPE_VBI) {
|
||||
/* Enable reinsertion interrupt */
|
||||
ivtv_clear_irq_mask(itv, IVTV_IRQ_DEC_VBI_RE_INSERT);
|
||||
@@ -105,7 +105,7 @@ void ivtv_release_stream(struct ivtv_stream *s)
|
||||
struct ivtv *itv = s->itv;
|
||||
struct ivtv_stream *s_vbi;
|
||||
|
||||
s->fh = NULL;
|
||||
s->id = NULL;
|
||||
if ((s->type == IVTV_DEC_STREAM_TYPE_VBI || s->type == IVTV_ENC_STREAM_TYPE_VBI) &&
|
||||
test_bit(IVTV_F_S_INTERNAL_USE, &s->s_flags)) {
|
||||
/* this stream is still in use internally */
|
||||
@@ -137,7 +137,7 @@ void ivtv_release_stream(struct ivtv_stream *s)
|
||||
/* was already cleared */
|
||||
return;
|
||||
}
|
||||
if (s_vbi->fh) {
|
||||
if (s_vbi->id) {
|
||||
/* VBI stream still claimed by a file descriptor */
|
||||
return;
|
||||
}
|
||||
@@ -361,7 +361,7 @@ static ssize_t ivtv_read(struct ivtv_stream *s, char __user *ubuf, size_t tot_co
|
||||
size_t tot_written = 0;
|
||||
int single_frame = 0;
|
||||
|
||||
if (atomic_read(&itv->capturing) == 0 && s->fh == NULL) {
|
||||
if (atomic_read(&itv->capturing) == 0 && s->id == NULL) {
|
||||
/* shouldn't happen */
|
||||
IVTV_DEBUG_WARN("Stream %s not initialized before read\n", s->name);
|
||||
return -EIO;
|
||||
@@ -831,7 +831,7 @@ void ivtv_stop_capture(struct ivtv_open_id *id, int gop_end)
|
||||
id->type == IVTV_ENC_STREAM_TYPE_VBI) &&
|
||||
test_bit(IVTV_F_S_INTERNAL_USE, &s->s_flags)) {
|
||||
/* Also used internally, don't stop capturing */
|
||||
s->fh = NULL;
|
||||
s->id = NULL;
|
||||
}
|
||||
else {
|
||||
ivtv_stop_v4l2_encode_stream(s, gop_end);
|
||||
@@ -915,7 +915,7 @@ int ivtv_v4l2_close(struct file *filp)
|
||||
v4l2_fh_exit(fh);
|
||||
|
||||
/* Easy case first: this stream was never claimed by us */
|
||||
if (s->fh != &id->fh)
|
||||
if (s->id != id)
|
||||
goto close_done;
|
||||
|
||||
/* 'Unclaim' this stream */
|
||||
|
||||
@@ -317,7 +317,7 @@ static void dma_post(struct ivtv_stream *s)
|
||||
ivtv_process_vbi_data(itv, buf, 0, s->type);
|
||||
s->q_dma.bytesused += buf->bytesused;
|
||||
}
|
||||
if (s->fh == NULL) {
|
||||
if (s->id == NULL) {
|
||||
ivtv_queue_move(s, &s->q_dma, NULL, &s->q_free, 0);
|
||||
return;
|
||||
}
|
||||
@@ -342,7 +342,7 @@ static void dma_post(struct ivtv_stream *s)
|
||||
set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
|
||||
}
|
||||
|
||||
if (s->fh)
|
||||
if (s->id)
|
||||
wake_up(&s->waitq);
|
||||
}
|
||||
|
||||
|
||||
+37
-24
@@ -661,12 +661,15 @@ static int send_packet(struct imon_context *ictx)
|
||||
smp_rmb(); /* ensure later readers know we're not busy */
|
||||
pr_err_ratelimited("error submitting urb(%d)\n", retval);
|
||||
} else {
|
||||
/* Wait for transmission to complete (or abort) */
|
||||
retval = wait_for_completion_interruptible(
|
||||
&ictx->tx.finished);
|
||||
if (retval) {
|
||||
/* Wait for transmission to complete (or abort or timeout) */
|
||||
retval = wait_for_completion_interruptible_timeout(&ictx->tx.finished, 10 * HZ);
|
||||
if (retval <= 0) {
|
||||
usb_kill_urb(ictx->tx_urb);
|
||||
pr_err_ratelimited("task interrupted\n");
|
||||
if (retval < 0)
|
||||
ictx->tx.status = retval;
|
||||
else
|
||||
ictx->tx.status = -ETIMEDOUT;
|
||||
}
|
||||
|
||||
ictx->tx.busy = false;
|
||||
@@ -1768,14 +1771,6 @@ static void usb_rx_callback_intf0(struct urb *urb)
|
||||
if (!ictx)
|
||||
return;
|
||||
|
||||
/*
|
||||
* if we get a callback before we're done configuring the hardware, we
|
||||
* can't yet process the data, as there's nowhere to send it, but we
|
||||
* still need to submit a new rx URB to avoid wedging the hardware
|
||||
*/
|
||||
if (!ictx->dev_present_intf0)
|
||||
goto out;
|
||||
|
||||
switch (urb->status) {
|
||||
case -ENOENT: /* usbcore unlink successful! */
|
||||
return;
|
||||
@@ -1784,16 +1779,29 @@ static void usb_rx_callback_intf0(struct urb *urb)
|
||||
break;
|
||||
|
||||
case 0:
|
||||
imon_incoming_packet(ictx, urb, intfnum);
|
||||
/*
|
||||
* if we get a callback before we're done configuring the hardware, we
|
||||
* can't yet process the data, as there's nowhere to send it, but we
|
||||
* still need to submit a new rx URB to avoid wedging the hardware
|
||||
*/
|
||||
if (ictx->dev_present_intf0)
|
||||
imon_incoming_packet(ictx, urb, intfnum);
|
||||
break;
|
||||
|
||||
case -ECONNRESET:
|
||||
case -EILSEQ:
|
||||
case -EPROTO:
|
||||
case -EPIPE:
|
||||
dev_warn(ictx->dev, "imon %s: status(%d)\n",
|
||||
__func__, urb->status);
|
||||
return;
|
||||
|
||||
default:
|
||||
dev_warn(ictx->dev, "imon %s: status(%d): ignored\n",
|
||||
__func__, urb->status);
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
@@ -1809,14 +1817,6 @@ static void usb_rx_callback_intf1(struct urb *urb)
|
||||
if (!ictx)
|
||||
return;
|
||||
|
||||
/*
|
||||
* if we get a callback before we're done configuring the hardware, we
|
||||
* can't yet process the data, as there's nowhere to send it, but we
|
||||
* still need to submit a new rx URB to avoid wedging the hardware
|
||||
*/
|
||||
if (!ictx->dev_present_intf1)
|
||||
goto out;
|
||||
|
||||
switch (urb->status) {
|
||||
case -ENOENT: /* usbcore unlink successful! */
|
||||
return;
|
||||
@@ -1825,16 +1825,29 @@ static void usb_rx_callback_intf1(struct urb *urb)
|
||||
break;
|
||||
|
||||
case 0:
|
||||
imon_incoming_packet(ictx, urb, intfnum);
|
||||
/*
|
||||
* if we get a callback before we're done configuring the hardware, we
|
||||
* can't yet process the data, as there's nowhere to send it, but we
|
||||
* still need to submit a new rx URB to avoid wedging the hardware
|
||||
*/
|
||||
if (ictx->dev_present_intf1)
|
||||
imon_incoming_packet(ictx, urb, intfnum);
|
||||
break;
|
||||
|
||||
case -ECONNRESET:
|
||||
case -EILSEQ:
|
||||
case -EPROTO:
|
||||
case -EPIPE:
|
||||
dev_warn(ictx->dev, "imon %s: status(%d)\n",
|
||||
__func__, urb->status);
|
||||
return;
|
||||
|
||||
default:
|
||||
dev_warn(ictx->dev, "imon %s: status(%d): ignored\n",
|
||||
__func__, urb->status);
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
|
||||
@@ -433,7 +433,7 @@ static int redrat3_send_cmd(int cmd, struct redrat3_dev *rr3)
|
||||
static int redrat3_enable_detector(struct redrat3_dev *rr3)
|
||||
{
|
||||
struct device *dev = rr3->dev;
|
||||
u8 ret;
|
||||
int ret;
|
||||
|
||||
ret = redrat3_send_cmd(RR3_RC_DET_ENABLE, rr3);
|
||||
if (ret != 0)
|
||||
|
||||
@@ -1099,12 +1099,12 @@ fail:
|
||||
|
||||
static void xc_debug_dump(struct xc4000_priv *priv)
|
||||
{
|
||||
u16 adc_envelope;
|
||||
u16 adc_envelope = 0;
|
||||
u32 freq_error_hz = 0;
|
||||
u16 lock_status;
|
||||
u16 lock_status = 0;
|
||||
u32 hsync_freq_hz = 0;
|
||||
u16 frame_lines;
|
||||
u16 quality;
|
||||
u16 frame_lines = 0;
|
||||
u16 quality = 0;
|
||||
u16 signal = 0;
|
||||
u16 noise = 0;
|
||||
u8 hw_majorversion = 0, hw_minorversion = 0;
|
||||
|
||||
@@ -632,14 +632,14 @@ static int xc5000_fwupload(struct dvb_frontend *fe,
|
||||
|
||||
static void xc_debug_dump(struct xc5000_priv *priv)
|
||||
{
|
||||
u16 adc_envelope;
|
||||
u16 adc_envelope = 0;
|
||||
u32 freq_error_hz = 0;
|
||||
u16 lock_status;
|
||||
u16 lock_status = 0;
|
||||
u32 hsync_freq_hz = 0;
|
||||
u16 frame_lines;
|
||||
u16 quality;
|
||||
u16 snr;
|
||||
u16 totalgain;
|
||||
u16 frame_lines = 0;
|
||||
u16 quality = 0;
|
||||
u16 snr = 0;
|
||||
u16 totalgain = 0;
|
||||
u8 hw_majorversion = 0, hw_minorversion = 0;
|
||||
u8 fw_majorversion = 0, fw_minorversion = 0;
|
||||
u16 fw_buildversion = 0;
|
||||
|
||||
@@ -373,7 +373,9 @@ int memstick_set_rw_addr(struct memstick_dev *card)
|
||||
{
|
||||
card->next_request = h_memstick_set_rw_addr;
|
||||
memstick_new_req(card->host);
|
||||
wait_for_completion(&card->mrq_complete);
|
||||
if (!wait_for_completion_timeout(&card->mrq_complete,
|
||||
msecs_to_jiffies(500)))
|
||||
card->current_mrq.error = -ETIMEDOUT;
|
||||
|
||||
return card->current_mrq.error;
|
||||
}
|
||||
@@ -407,7 +409,9 @@ static struct memstick_dev *memstick_alloc_card(struct memstick_host *host)
|
||||
|
||||
card->next_request = h_memstick_read_dev_id;
|
||||
memstick_new_req(host);
|
||||
wait_for_completion(&card->mrq_complete);
|
||||
if (!wait_for_completion_timeout(&card->mrq_complete,
|
||||
msecs_to_jiffies(500)))
|
||||
card->current_mrq.error = -ETIMEDOUT;
|
||||
|
||||
if (card->current_mrq.error)
|
||||
goto err_out;
|
||||
|
||||
@@ -345,7 +345,7 @@ int madera_dev_init(struct madera *madera)
|
||||
struct device *dev = madera->dev;
|
||||
unsigned int hwid;
|
||||
int (*patch_fn)(struct madera *) = NULL;
|
||||
const struct mfd_cell *mfd_devs;
|
||||
const struct mfd_cell *mfd_devs = NULL;
|
||||
int n_devs = 0;
|
||||
int i, ret;
|
||||
|
||||
@@ -496,7 +496,7 @@ int madera_dev_init(struct madera *madera)
|
||||
goto err_reset;
|
||||
}
|
||||
|
||||
if (!n_devs) {
|
||||
if (!n_devs || !mfd_devs) {
|
||||
dev_err(madera->dev, "Device ID 0x%x not a %s\n", hwid,
|
||||
madera->type_name);
|
||||
ret = -ENODEV;
|
||||
|
||||
@@ -1428,6 +1428,9 @@ int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)
|
||||
|
||||
int stmpe_remove(struct stmpe *stmpe)
|
||||
{
|
||||
if (stmpe->domain)
|
||||
irq_domain_remove(stmpe->domain);
|
||||
|
||||
if (!IS_ERR(stmpe->vio) && regulator_is_enabled(stmpe->vio))
|
||||
regulator_disable(stmpe->vio);
|
||||
if (!IS_ERR(stmpe->vcc) && regulator_is_enabled(stmpe->vcc))
|
||||
|
||||
@@ -912,7 +912,7 @@ static int s3c_onenand_probe(struct platform_device *pdev)
|
||||
err = devm_request_irq(&pdev->dev, r->start,
|
||||
s5pc110_onenand_irq,
|
||||
IRQF_SHARED, "onenand",
|
||||
&onenand);
|
||||
onenand);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "failed to get irq\n");
|
||||
return err;
|
||||
|
||||
@@ -512,8 +512,8 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
|
||||
if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
|
||||
goto out;
|
||||
|
||||
while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
|
||||
(n < SJA1000_MAX_IRQ)) {
|
||||
while ((n < SJA1000_MAX_IRQ) &&
|
||||
(isrc = priv->read_reg(priv, SJA1000_IR))) {
|
||||
|
||||
status = priv->read_reg(priv, SJA1000_SR);
|
||||
/* check for absent controller due to hw unplug */
|
||||
|
||||
@@ -645,8 +645,8 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
|
||||
u8 isrc, status;
|
||||
int n = 0;
|
||||
|
||||
while ((isrc = readl(priv->base + SUN4I_REG_INT_ADDR)) &&
|
||||
(n < SUN4I_CAN_MAX_IRQ)) {
|
||||
while ((n < SUN4I_CAN_MAX_IRQ) &&
|
||||
(isrc = readl(priv->base + SUN4I_REG_INT_ADDR))) {
|
||||
n++;
|
||||
status = readl(priv->base + SUN4I_REG_STA_ADDR);
|
||||
|
||||
|
||||
@@ -164,10 +164,6 @@ struct gs_host_frame {
|
||||
#define GS_MAX_TX_URBS 10
|
||||
/* Only launch a max of GS_MAX_RX_URBS usb requests at a time. */
|
||||
#define GS_MAX_RX_URBS 30
|
||||
/* Maximum number of interfaces the driver supports per device.
|
||||
* Current hardware only supports 2 interfaces. The future may vary.
|
||||
*/
|
||||
#define GS_MAX_INTF 2
|
||||
|
||||
struct gs_tx_context {
|
||||
struct gs_can *dev;
|
||||
@@ -198,10 +194,11 @@ struct gs_can {
|
||||
|
||||
/* usb interface struct */
|
||||
struct gs_usb {
|
||||
struct gs_can *canch[GS_MAX_INTF];
|
||||
struct usb_anchor rx_submitted;
|
||||
struct usb_device *udev;
|
||||
u8 active_channels;
|
||||
u8 channel_cnt;
|
||||
struct gs_can *canch[];
|
||||
};
|
||||
|
||||
/* 'allocate' a tx context.
|
||||
@@ -329,7 +326,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
|
||||
}
|
||||
|
||||
/* device reports out of range channel id */
|
||||
if (hf->channel >= GS_MAX_INTF)
|
||||
if (hf->channel >= usbcan->channel_cnt)
|
||||
goto device_detach;
|
||||
|
||||
dev = usbcan->canch[hf->channel];
|
||||
@@ -417,7 +414,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
|
||||
/* USB failure take down all interfaces */
|
||||
if (rc == -ENODEV) {
|
||||
device_detach:
|
||||
for (rc = 0; rc < GS_MAX_INTF; rc++) {
|
||||
for (rc = 0; rc < usbcan->channel_cnt; rc++) {
|
||||
if (usbcan->canch[rc])
|
||||
netif_device_detach(usbcan->canch[rc]->netdev);
|
||||
}
|
||||
@@ -999,20 +996,22 @@ static int gs_usb_probe(struct usb_interface *intf,
|
||||
icount = dconf->icount + 1;
|
||||
dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
|
||||
|
||||
if (icount > GS_MAX_INTF) {
|
||||
if (icount > type_max(typeof(dev->channel_cnt))) {
|
||||
dev_err(&intf->dev,
|
||||
"Driver cannot handle more that %d CAN interfaces\n",
|
||||
GS_MAX_INTF);
|
||||
"Driver cannot handle more that %u CAN interfaces\n",
|
||||
type_max(typeof(dev->channel_cnt)));
|
||||
kfree(dconf);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
dev = kzalloc(struct_size(dev, canch, icount), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
kfree(dconf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev->channel_cnt = icount;
|
||||
|
||||
init_usb_anchor(&dev->rx_submitted);
|
||||
|
||||
usb_set_intfdata(intf, dev);
|
||||
@@ -1053,7 +1052,7 @@ static void gs_usb_disconnect(struct usb_interface *intf)
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < GS_MAX_INTF; i++)
|
||||
for (i = 0; i < dev->channel_cnt; i++)
|
||||
if (dev->canch[i])
|
||||
gs_destroy_candev(dev->canch[i]);
|
||||
|
||||
|
||||
@@ -609,7 +609,7 @@ static int kvaser_usb_leaf_wait_cmd(const struct kvaser_usb *dev, u8 id,
|
||||
* for further details.
|
||||
*/
|
||||
if (tmp->len == 0) {
|
||||
pos = round_up(pos,
|
||||
pos = round_up(pos + 1,
|
||||
le16_to_cpu
|
||||
(dev->bulk_in->wMaxPacketSize));
|
||||
continue;
|
||||
@@ -1571,7 +1571,7 @@ static void kvaser_usb_leaf_read_bulk_callback(struct kvaser_usb *dev,
|
||||
* number of events in case of a heavy rx load on the bus.
|
||||
*/
|
||||
if (cmd->len == 0) {
|
||||
pos = round_up(pos, le16_to_cpu
|
||||
pos = round_up(pos + 1, le16_to_cpu
|
||||
(dev->bulk_in->wMaxPacketSize));
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -267,9 +267,9 @@ static void macb_set_hwaddr(struct macb *bp)
|
||||
u32 bottom;
|
||||
u16 top;
|
||||
|
||||
bottom = cpu_to_le32(*((u32 *)bp->dev->dev_addr));
|
||||
bottom = get_unaligned_le32(bp->dev->dev_addr);
|
||||
macb_or_gem_writel(bp, SA1B, bottom);
|
||||
top = cpu_to_le16(*((u16 *)(bp->dev->dev_addr + 4)));
|
||||
top = get_unaligned_le16(bp->dev->dev_addr + 4);
|
||||
macb_or_gem_writel(bp, SA1T, top);
|
||||
|
||||
/* Clear unused address register sets */
|
||||
|
||||
@@ -1301,7 +1301,8 @@ static void be_xmit_flush(struct be_adapter *adapter, struct be_tx_obj *txo)
|
||||
(adapter->bmc_filt_mask & BMC_FILT_MULTICAST)
|
||||
|
||||
static bool be_send_pkt_to_bmc(struct be_adapter *adapter,
|
||||
struct sk_buff **skb)
|
||||
struct sk_buff **skb,
|
||||
struct be_wrb_params *wrb_params)
|
||||
{
|
||||
struct ethhdr *eh = (struct ethhdr *)(*skb)->data;
|
||||
bool os2bmc = false;
|
||||
@@ -1365,7 +1366,7 @@ done:
|
||||
* to BMC, asic expects the vlan to be inline in the packet.
|
||||
*/
|
||||
if (os2bmc)
|
||||
*skb = be_insert_vlan_in_pkt(adapter, *skb, NULL);
|
||||
*skb = be_insert_vlan_in_pkt(adapter, *skb, wrb_params);
|
||||
|
||||
return os2bmc;
|
||||
}
|
||||
@@ -1392,7 +1393,7 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
/* if os2bmc is enabled and if the pkt is destined to bmc,
|
||||
* enqueue the pkt a 2nd time with mgmt bit set.
|
||||
*/
|
||||
if (be_send_pkt_to_bmc(adapter, &skb)) {
|
||||
if (be_send_pkt_to_bmc(adapter, &skb, &wrb_params)) {
|
||||
BE_WRB_F_SET(wrb_params.features, OS2BMC, 1);
|
||||
wrb_cnt = be_xmit_enqueue(adapter, txo, skb, &wrb_params);
|
||||
if (unlikely(!wrb_cnt))
|
||||
|
||||
@@ -1527,6 +1527,8 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
|
||||
ndev->stats.rx_packets++;
|
||||
pkt_len = fec16_to_cpu(bdp->cbd_datlen);
|
||||
ndev->stats.rx_bytes += pkt_len;
|
||||
if (fep->quirks & FEC_QUIRK_HAS_RACC)
|
||||
ndev->stats.rx_bytes -= 2;
|
||||
|
||||
index = fec_enet_get_bd_index(bdp, &rxq->bd);
|
||||
skb = rxq->rx_skbuff[index];
|
||||
|
||||
@@ -447,17 +447,16 @@ void fm10k_update_hw_stats_q(struct fm10k_hw *hw, struct fm10k_hw_stats_q *q,
|
||||
/**
|
||||
* fm10k_unbind_hw_stats_q - Unbind the queue counters from their queues
|
||||
* @q: pointer to the ring of hardware statistics queue
|
||||
* @idx: index pointing to the start of the ring iteration
|
||||
* @count: number of queues to iterate over
|
||||
*
|
||||
* Function invalidates the index values for the queues so any updates that
|
||||
* may have happened are ignored and the base for the queue stats is reset.
|
||||
**/
|
||||
void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 idx, u32 count)
|
||||
void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 count)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < count; i++, idx++, q++) {
|
||||
for (i = 0; i < count; i++, q++) {
|
||||
q->rx_stats_idx = 0;
|
||||
q->tx_stats_idx = 0;
|
||||
}
|
||||
|
||||
@@ -43,6 +43,6 @@ u32 fm10k_read_hw_stats_32b(struct fm10k_hw *hw, u32 addr,
|
||||
void fm10k_update_hw_stats_q(struct fm10k_hw *hw, struct fm10k_hw_stats_q *q,
|
||||
u32 idx, u32 count);
|
||||
#define fm10k_unbind_hw_stats_32b(s) ((s)->base_h = 0)
|
||||
void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 idx, u32 count);
|
||||
void fm10k_unbind_hw_stats_q(struct fm10k_hw_stats_q *q, u32 count);
|
||||
s32 fm10k_get_host_state_generic(struct fm10k_hw *hw, bool *host_ready);
|
||||
#endif /* _FM10K_COMMON_H_ */
|
||||
@@ -1510,7 +1510,7 @@ static void fm10k_rebind_hw_stats_pf(struct fm10k_hw *hw,
|
||||
fm10k_unbind_hw_stats_32b(&stats->nodesc_drop);
|
||||
|
||||
/* Unbind Queue Statistics */
|
||||
fm10k_unbind_hw_stats_q(stats->q, 0, hw->mac.max_queues);
|
||||
fm10k_unbind_hw_stats_q(stats->q, hw->mac.max_queues);
|
||||
|
||||
/* Reinitialize bases for all stats */
|
||||
fm10k_update_hw_stats_pf(hw, stats);
|
||||
|
||||
@@ -460,7 +460,7 @@ static void fm10k_rebind_hw_stats_vf(struct fm10k_hw *hw,
|
||||
struct fm10k_hw_stats *stats)
|
||||
{
|
||||
/* Unbind Queue Statistics */
|
||||
fm10k_unbind_hw_stats_q(stats->q, 0, hw->mac.max_queues);
|
||||
fm10k_unbind_hw_stats_q(stats->q, hw->mac.max_queues);
|
||||
|
||||
/* Reinitialize bases for all stats */
|
||||
fm10k_update_hw_stats_vf(hw, stats);
|
||||
|
||||
@@ -579,18 +579,19 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev,
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
u8 max_bw_value[IEEE_8021QAZ_MAX_TCS];
|
||||
u8 max_bw_unit[IEEE_8021QAZ_MAX_TCS];
|
||||
__u64 upper_limit_mbps = roundup(255 * MLX5E_100MB, MLX5E_1GB);
|
||||
__u64 upper_limit_mbps;
|
||||
int i;
|
||||
|
||||
memset(max_bw_value, 0, sizeof(max_bw_value));
|
||||
memset(max_bw_unit, 0, sizeof(max_bw_unit));
|
||||
upper_limit_mbps = 255 * MLX5E_100MB;
|
||||
|
||||
for (i = 0; i <= mlx5_max_tc(mdev); i++) {
|
||||
if (!maxrate->tc_maxrate[i]) {
|
||||
max_bw_unit[i] = MLX5_BW_NO_LIMIT;
|
||||
continue;
|
||||
}
|
||||
if (maxrate->tc_maxrate[i] < upper_limit_mbps) {
|
||||
if (maxrate->tc_maxrate[i] <= upper_limit_mbps) {
|
||||
max_bw_value[i] = div_u64(maxrate->tc_maxrate[i],
|
||||
MLX5E_100MB);
|
||||
max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1;
|
||||
|
||||
@@ -480,8 +480,10 @@ int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,
|
||||
return -EINVAL;
|
||||
|
||||
rule = mlxsw_sp_acl_rule_lookup(mlxsw_sp, ruleset, f->cookie);
|
||||
if (!rule)
|
||||
return -EINVAL;
|
||||
if (!rule) {
|
||||
err = -EINVAL;
|
||||
goto err_rule_get_stats;
|
||||
}
|
||||
|
||||
err = mlxsw_sp_acl_rule_get_stats(mlxsw_sp, rule, &packets, &bytes,
|
||||
&lastuse);
|
||||
|
||||
@@ -227,7 +227,7 @@ static struct pci_driver qede_pci_driver = {
|
||||
};
|
||||
|
||||
static struct qed_eth_cb_ops qede_ll_ops = {
|
||||
{
|
||||
.common = {
|
||||
#ifdef CONFIG_RFS_ACCEL
|
||||
.arfs_filter_op = qede_arfs_filter_op,
|
||||
#endif
|
||||
|
||||
@@ -2377,6 +2377,7 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static void sh_eth_get_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
@@ -2403,6 +2404,7 @@ static int sh_eth_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct ethtool_ops sh_eth_ethtool_ops = {
|
||||
.get_regs_len = sh_eth_get_regs_len,
|
||||
@@ -2418,8 +2420,10 @@ static const struct ethtool_ops sh_eth_ethtool_ops = {
|
||||
.set_ringparam = sh_eth_set_ringparam,
|
||||
.get_link_ksettings = phy_ethtool_get_link_ksettings,
|
||||
.set_link_ksettings = phy_ethtool_set_link_ksettings,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.get_wol = sh_eth_get_wol,
|
||||
.set_wol = sh_eth_set_wol,
|
||||
#endif
|
||||
};
|
||||
|
||||
/* network device open function */
|
||||
|
||||
@@ -1515,8 +1515,10 @@ static int sxgbe_rx(struct sxgbe_priv_data *priv, int limit)
|
||||
|
||||
skb = priv->rxq[qnum]->rx_skbuff[entry];
|
||||
|
||||
if (unlikely(!skb))
|
||||
if (unlikely(!skb)) {
|
||||
netdev_err(priv->dev, "rx descriptor is not consistent\n");
|
||||
break;
|
||||
}
|
||||
|
||||
prefetch(skb->data - NET_IP_ALIGN);
|
||||
priv->rxq[qnum]->rx_skbuff[entry] = NULL;
|
||||
|
||||
@@ -1353,10 +1353,10 @@ int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe)
|
||||
|
||||
tx_pipe->dma_channel = knav_dma_open_channel(dev,
|
||||
tx_pipe->dma_chan_name, &config);
|
||||
if (IS_ERR(tx_pipe->dma_channel)) {
|
||||
if (!tx_pipe->dma_channel) {
|
||||
dev_err(dev, "failed opening tx chan(%s)\n",
|
||||
tx_pipe->dma_chan_name);
|
||||
ret = PTR_ERR(tx_pipe->dma_channel);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -1374,7 +1374,7 @@ int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe)
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (!IS_ERR_OR_NULL(tx_pipe->dma_channel))
|
||||
if (tx_pipe->dma_channel)
|
||||
knav_dma_close_channel(tx_pipe->dma_channel);
|
||||
tx_pipe->dma_channel = NULL;
|
||||
return ret;
|
||||
@@ -1693,10 +1693,10 @@ static int netcp_setup_navigator_resources(struct net_device *ndev)
|
||||
|
||||
netcp->rx_channel = knav_dma_open_channel(netcp->netcp_device->device,
|
||||
netcp->dma_chan_name, &config);
|
||||
if (IS_ERR(netcp->rx_channel)) {
|
||||
if (!netcp->rx_channel) {
|
||||
dev_err(netcp->ndev_dev, "failed opening rx chan(%s\n",
|
||||
netcp->dma_chan_name);
|
||||
ret = PTR_ERR(netcp->rx_channel);
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
@@ -248,6 +248,12 @@ static int dp83867_config_init(struct phy_device *phydev)
|
||||
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4, val);
|
||||
}
|
||||
|
||||
/* Although the DP83867 reports EEE capability through the
|
||||
* MDIO_PCS_EEE_ABLE and MDIO_AN_EEE_ADV registers, the feature
|
||||
* is not actually implemented in hardware.
|
||||
*/
|
||||
phydev->eee_broken_modes = MDIO_EEE_100TX | MDIO_EEE_1000T;
|
||||
|
||||
if (phy_interface_is_rgmii(phydev)) {
|
||||
val = phy_read(phydev, MII_DP83867_PHYCTRL);
|
||||
if (val < 0)
|
||||
|
||||
@@ -242,7 +242,9 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
int i;
|
||||
unsigned long gpio_bits = dev->driver_info->data;
|
||||
|
||||
usbnet_get_endpoints(dev,intf);
|
||||
ret = usbnet_get_endpoints(dev, intf);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* Toggle the GPIOs in a manufacturer/model specific way */
|
||||
for (i = 2; i >= 0; i--) {
|
||||
@@ -693,7 +695,9 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
u32 phyid;
|
||||
struct asix_common_private *priv;
|
||||
|
||||
usbnet_get_endpoints(dev, intf);
|
||||
ret = usbnet_get_endpoints(dev, intf);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Maybe the boot loader passed the MAC address via device tree */
|
||||
if (!eth_platform_get_mac_address(&dev->udev->dev, buf)) {
|
||||
@@ -1075,7 +1079,9 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
int ret;
|
||||
u8 buf[ETH_ALEN] = {0};
|
||||
|
||||
usbnet_get_endpoints(dev,intf);
|
||||
ret = usbnet_get_endpoints(dev, intf);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Get the MAC address */
|
||||
ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf, 0);
|
||||
|
||||
@@ -232,6 +232,12 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
return 0;
|
||||
skbn->dev = net;
|
||||
|
||||
/* Raw IP packets don't have a MAC header, but other subsystems
|
||||
* (like xfrm) may still access MAC header offsets, so they must
|
||||
* be initialized.
|
||||
*/
|
||||
skb_reset_mac_header(skbn);
|
||||
|
||||
switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) {
|
||||
case 0x40:
|
||||
skbn->protocol = htons(ETH_P_IP);
|
||||
|
||||
@@ -1633,6 +1633,8 @@ void usbnet_disconnect (struct usb_interface *intf)
|
||||
net = dev->net;
|
||||
unregister_netdev (net);
|
||||
|
||||
cancel_work_sync(&dev->kevent);
|
||||
|
||||
while ((urb = usb_get_from_anchor(&dev->deferred))) {
|
||||
dev_kfree_skb(urb->context);
|
||||
kfree(urb->sg);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
#include "hif.h"
|
||||
#include "core.h"
|
||||
@@ -268,8 +269,15 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
|
||||
if (cmd == DISABLE_KEY) {
|
||||
arg.key_cipher = WMI_CIPHER_NONE;
|
||||
arg.key_data = NULL;
|
||||
if (flags & WMI_KEY_GROUP) {
|
||||
/* Not all hardware handles group-key deletion operation
|
||||
* correctly. Replace the key with a junk value to invalidate it.
|
||||
*/
|
||||
get_random_bytes(key->key, key->keylen);
|
||||
} else {
|
||||
arg.key_cipher = WMI_CIPHER_NONE;
|
||||
arg.key_data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return ath10k_wmi_vdev_install_key(arvif->ar, &arg);
|
||||
|
||||
@@ -1871,6 +1871,7 @@ int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
|
||||
if (cmd_id == WMI_CMD_UNSUPPORTED) {
|
||||
ath10k_warn(ar, "wmi command %d is not supported by firmware\n",
|
||||
cmd_id);
|
||||
dev_kfree_skb_any(skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -4866,8 +4866,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, freq=%d\n",
|
||||
*cookie, le16_to_cpu(action_frame->len), freq);
|
||||
|
||||
ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg),
|
||||
af_params);
|
||||
ack = brcmf_p2p_send_action_frame(vif->ifp, af_params);
|
||||
|
||||
cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
|
||||
GFP_KERNEL);
|
||||
|
||||
@@ -1480,6 +1480,7 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
|
||||
/**
|
||||
* brcmf_p2p_tx_action_frame() - send action frame over fil.
|
||||
*
|
||||
* @ifp: interface to transmit on.
|
||||
* @p2p: p2p info struct for vif.
|
||||
* @af_params: action frame data/info.
|
||||
*
|
||||
@@ -1489,10 +1490,10 @@ int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
|
||||
* The WLC_E_ACTION_FRAME_COMPLETE event will be received when the action
|
||||
* frame is transmitted.
|
||||
*/
|
||||
static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
|
||||
static s32 brcmf_p2p_tx_action_frame(struct brcmf_if *ifp,
|
||||
struct brcmf_p2p_info *p2p,
|
||||
struct brcmf_fil_af_params_le *af_params)
|
||||
{
|
||||
struct brcmf_cfg80211_vif *vif;
|
||||
s32 err = 0;
|
||||
s32 timeout = 0;
|
||||
|
||||
@@ -1502,8 +1503,7 @@ static s32 brcmf_p2p_tx_action_frame(struct brcmf_p2p_info *p2p,
|
||||
clear_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status);
|
||||
clear_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status);
|
||||
|
||||
vif = p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
|
||||
err = brcmf_fil_bsscfg_data_set(vif->ifp, "actframe", af_params,
|
||||
err = brcmf_fil_bsscfg_data_set(ifp, "actframe", af_params,
|
||||
sizeof(*af_params));
|
||||
if (err) {
|
||||
brcmf_err(" sending action frame has failed\n");
|
||||
@@ -1644,16 +1644,14 @@ static s32 brcmf_p2p_pub_af_tx(struct brcmf_cfg80211_info *cfg,
|
||||
/**
|
||||
* brcmf_p2p_send_action_frame() - send action frame .
|
||||
*
|
||||
* @cfg: driver private data for cfg80211 interface.
|
||||
* @ndev: net device to transmit on.
|
||||
* @ifp: interface to transmit on.
|
||||
* @af_params: configuration data for action frame.
|
||||
*/
|
||||
bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
|
||||
struct net_device *ndev,
|
||||
bool brcmf_p2p_send_action_frame(struct brcmf_if *ifp,
|
||||
struct brcmf_fil_af_params_le *af_params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
|
||||
struct brcmf_p2p_info *p2p = &cfg->p2p;
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_fil_action_frame_le *action_frame;
|
||||
struct brcmf_config_af_params config_af_params;
|
||||
struct afx_hdl *afx_hdl = &p2p->afx_hdl;
|
||||
@@ -1779,7 +1777,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
|
||||
tx_retry = 0;
|
||||
while (!p2p->block_gon_req_tx &&
|
||||
(ack == false) && (tx_retry < P2P_AF_TX_MAX_RETRY)) {
|
||||
ack = !brcmf_p2p_tx_action_frame(p2p, af_params);
|
||||
ack = !brcmf_p2p_tx_action_frame(ifp, p2p, af_params);
|
||||
tx_retry++;
|
||||
}
|
||||
if (ack == false) {
|
||||
@@ -2133,7 +2131,6 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
|
||||
|
||||
WARN_ON(p2p_ifp->bsscfgidx != bsscfgidx);
|
||||
|
||||
init_completion(&p2p->send_af_done);
|
||||
INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
|
||||
init_completion(&p2p->afx_hdl.act_frm_scan);
|
||||
init_completion(&p2p->wait_next_af);
|
||||
@@ -2384,6 +2381,8 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
|
||||
pri_ifp = brcmf_get_ifp(cfg->pub, 0);
|
||||
p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
|
||||
|
||||
init_completion(&p2p->send_af_done);
|
||||
|
||||
if (p2pdev_forced) {
|
||||
err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
|
||||
if (IS_ERR(err_ptr)) {
|
||||
|
||||
@@ -176,8 +176,7 @@ int brcmf_p2p_notify_action_frame_rx(struct brcmf_if *ifp,
|
||||
int brcmf_p2p_notify_action_tx_complete(struct brcmf_if *ifp,
|
||||
const struct brcmf_event_msg *e,
|
||||
void *data);
|
||||
bool brcmf_p2p_send_action_frame(struct brcmf_cfg80211_info *cfg,
|
||||
struct net_device *ndev,
|
||||
bool brcmf_p2p_send_action_frame(struct brcmf_if *ifp,
|
||||
struct brcmf_fil_af_params_le *af_params);
|
||||
bool brcmf_p2p_scan_finding_common_channel(struct brcmf_cfg80211_info *cfg,
|
||||
struct brcmf_bss_info_le *bi);
|
||||
|
||||
@@ -2606,16 +2606,23 @@ static int
|
||||
nvme_fc_create_association(struct nvme_fc_ctrl *ctrl)
|
||||
{
|
||||
struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
bool changed;
|
||||
|
||||
++ctrl->ctrl.nr_reconnects;
|
||||
|
||||
if (ctrl->rport->remoteport.port_state != FC_OBJSTATE_ONLINE)
|
||||
spin_lock_irqsave(&ctrl->rport->lock, flags);
|
||||
if (ctrl->rport->remoteport.port_state != FC_OBJSTATE_ONLINE) {
|
||||
spin_unlock_irqrestore(&ctrl->rport->lock, flags);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (nvme_fc_ctlr_active_on_rport(ctrl))
|
||||
if (nvme_fc_ctlr_active_on_rport(ctrl)) {
|
||||
spin_unlock_irqrestore(&ctrl->rport->lock, flags);
|
||||
return -ENOTUNIQ;
|
||||
}
|
||||
spin_unlock_irqrestore(&ctrl->rport->lock, flags);
|
||||
|
||||
/*
|
||||
* Create the admin queue
|
||||
|
||||
@@ -2518,6 +2518,7 @@ static void quirk_disable_msi(struct pci_dev *dev)
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0xa238, quirk_disable_msi);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x5a3f, quirk_disable_msi);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_RDC, 0x1031, quirk_disable_msi);
|
||||
|
||||
/*
|
||||
* The APC bridge device in AMD 780 family northbridges has some random
|
||||
|
||||
@@ -562,8 +562,10 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev,
|
||||
break;
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
if (arg)
|
||||
if (arg) {
|
||||
pcs_pinconf_clear_bias(pctldev, pin);
|
||||
data = pcs->read(pcs->base + offset);
|
||||
}
|
||||
/* fall through */
|
||||
case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
|
||||
data &= ~func->conf[i].mask;
|
||||
|
||||
@@ -178,8 +178,9 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
|
||||
drvdata->dev = devm_regulator_register(&pdev->dev, &drvdata->desc,
|
||||
&cfg);
|
||||
if (IS_ERR(drvdata->dev)) {
|
||||
ret = PTR_ERR(drvdata->dev);
|
||||
dev_err(&pdev->dev, "Failed to register regulator: %d\n", ret);
|
||||
ret = dev_err_probe(&pdev->dev, PTR_ERR(drvdata->dev),
|
||||
"Failed to register regulator: %ld\n",
|
||||
PTR_ERR(drvdata->dev));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -121,6 +121,11 @@ static irqreturn_t q6v5_handover_interrupt(int irq, void *data)
|
||||
{
|
||||
struct qcom_q6v5 *q6v5 = data;
|
||||
|
||||
if (q6v5->handover_issued) {
|
||||
dev_err(q6v5->dev, "Handover signaled, but it already happened\n");
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (q6v5->handover)
|
||||
q6v5->handover(q6v5);
|
||||
|
||||
|
||||
@@ -711,7 +711,6 @@ static void mpc_rcvd_sweep_req(struct mpcg_info *mpcginfo)
|
||||
|
||||
grp->sweep_req_pend_num--;
|
||||
ctcmpc_send_sweep_resp(ch);
|
||||
kfree(mpcginfo);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
/* hbqinfo output buffer size */
|
||||
#define LPFC_HBQINFO_SIZE 8192
|
||||
|
||||
/* hdwqinfo output buffer size */
|
||||
#define LPFC_HDWQINFO_SIZE 8192
|
||||
|
||||
/* nvmestat output buffer size */
|
||||
#define LPFC_NVMESTAT_SIZE 8192
|
||||
#define LPFC_NVMEKTIME_SIZE 8192
|
||||
|
||||
@@ -5194,7 +5194,7 @@ lpfc_chk_tgt_mapped(struct lpfc_vport *vport, struct scsi_cmnd *cmnd)
|
||||
/**
|
||||
* lpfc_reset_flush_io_context -
|
||||
* @vport: The virtual port (scsi_host) for the flush context
|
||||
* @tgt_id: If aborting by Target contect - specifies the target id
|
||||
* @tgt_id: If aborting by Target context - specifies the target id
|
||||
* @lun_id: If aborting by Lun context - specifies the lun id
|
||||
* @context: specifies the context level to flush at.
|
||||
*
|
||||
@@ -5352,8 +5352,14 @@ lpfc_target_reset_handler(struct scsi_cmnd *cmnd)
|
||||
pnode->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
}
|
||||
lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
|
||||
LPFC_CTX_TGT);
|
||||
status = lpfc_reset_flush_io_context(vport, tgt_id, lun_id,
|
||||
LPFC_CTX_TGT);
|
||||
if (status != SUCCESS) {
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
|
||||
"0726 Target Reset flush status x%x\n",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
return FAST_IO_FAIL;
|
||||
}
|
||||
|
||||
@@ -5497,7 +5503,7 @@ lpfc_host_reset_handler(struct scsi_cmnd *cmnd)
|
||||
int rc, ret = SUCCESS;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
|
||||
"3172 SCSI layer issued Host Reset Data:\n");
|
||||
"3172 SCSI layer issued Host Reset\n");
|
||||
|
||||
lpfc_offline_prep(phba, LPFC_MBX_WAIT);
|
||||
lpfc_offline(phba);
|
||||
|
||||
@@ -577,7 +577,7 @@ static int pm8001_set_nvmd(struct pm8001_hba_info *pm8001_ha)
|
||||
struct pm8001_ioctl_payload *payload;
|
||||
DECLARE_COMPLETION_ONSTACK(completion);
|
||||
u8 *ioctlbuffer;
|
||||
u32 ret;
|
||||
int ret;
|
||||
u32 length = 1024 * 5 + sizeof(*payload) - 1;
|
||||
|
||||
if (pm8001_ha->fw_image->size > 4096) {
|
||||
|
||||
@@ -160,7 +160,6 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
DECLARE_COMPLETION_ONSTACK(completion);
|
||||
unsigned long flags;
|
||||
pm8001_ha = sas_phy->ha->lldd_ha;
|
||||
pm8001_ha->phy[phy_id].enable_completion = &completion;
|
||||
switch (func) {
|
||||
case PHY_FUNC_SET_LINK_RATE:
|
||||
rates = funcdata;
|
||||
@@ -173,6 +172,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
rates->maximum_linkrate;
|
||||
}
|
||||
if (pm8001_ha->phy[phy_id].phy_state == 0) {
|
||||
pm8001_ha->phy[phy_id].enable_completion = &completion;
|
||||
PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id);
|
||||
wait_for_completion(&completion);
|
||||
}
|
||||
@@ -181,6 +181,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
break;
|
||||
case PHY_FUNC_HARD_RESET:
|
||||
if (pm8001_ha->phy[phy_id].phy_state == 0) {
|
||||
pm8001_ha->phy[phy_id].enable_completion = &completion;
|
||||
PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id);
|
||||
wait_for_completion(&completion);
|
||||
}
|
||||
@@ -189,6 +190,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
break;
|
||||
case PHY_FUNC_LINK_RESET:
|
||||
if (pm8001_ha->phy[phy_id].phy_state == 0) {
|
||||
pm8001_ha->phy[phy_id].enable_completion = &completion;
|
||||
PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id);
|
||||
wait_for_completion(&completion);
|
||||
}
|
||||
|
||||
+9
-1
@@ -2223,9 +2223,17 @@ sg_remove_sfp_usercontext(struct work_struct *work)
|
||||
write_lock_irqsave(&sfp->rq_list_lock, iflags);
|
||||
while (!list_empty(&sfp->rq_list)) {
|
||||
srp = list_first_entry(&sfp->rq_list, Sg_request, entry);
|
||||
sg_finish_rem_req(srp);
|
||||
list_del(&srp->entry);
|
||||
write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
|
||||
|
||||
sg_finish_rem_req(srp);
|
||||
/*
|
||||
* sg_rq_end_io() uses srp->parentfp. Hence, only clear
|
||||
* srp->parentfp after blk_mq_free_request() has been called.
|
||||
*/
|
||||
srp->parentfp = NULL;
|
||||
|
||||
write_lock_irqsave(&sfp->rq_list_lock, iflags);
|
||||
}
|
||||
write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
|
||||
|
||||
|
||||
@@ -535,6 +535,8 @@ static int imx_gpc_remove(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
of_node_put(pgc_node);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -856,7 +856,7 @@ static u32 qcom_smem_get_item_count(struct qcom_smem *smem)
|
||||
if (IS_ERR_OR_NULL(ptable))
|
||||
return SMEM_ITEM_COUNT;
|
||||
|
||||
info = (struct smem_info *)&ptable->entry[ptable->num_entries];
|
||||
info = (struct smem_info *)&ptable->entry[le32_to_cpu(ptable->num_entries)];
|
||||
if (memcmp(info->magic, SMEM_INFO_MAGIC, sizeof(info->magic)))
|
||||
return SMEM_ITEM_COUNT;
|
||||
|
||||
|
||||
@@ -420,7 +420,7 @@ static int of_channel_match_helper(struct device_node *np, const char *name,
|
||||
* @name: slave channel name
|
||||
* @config: dma configuration parameters
|
||||
*
|
||||
* Returns pointer to appropriate DMA channel on success or error.
|
||||
* Return: Pointer to appropriate DMA channel on success or NULL on error.
|
||||
*/
|
||||
void *knav_dma_open_channel(struct device *dev, const char *name,
|
||||
struct knav_dma_cfg *config)
|
||||
@@ -433,13 +433,13 @@ void *knav_dma_open_channel(struct device *dev, const char *name,
|
||||
|
||||
if (!kdev) {
|
||||
pr_err("keystone-navigator-dma driver not registered\n");
|
||||
return (void *)-EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
chan_num = of_channel_match_helper(dev->of_node, name, &instance);
|
||||
if (chan_num < 0) {
|
||||
dev_err(kdev->dev, "No DMA instace with name %s\n", name);
|
||||
return (void *)-EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dev_dbg(kdev->dev, "initializing %s channel %d from DMA %s\n",
|
||||
@@ -450,7 +450,7 @@ void *knav_dma_open_channel(struct device *dev, const char *name,
|
||||
if (config->direction != DMA_MEM_TO_DEV &&
|
||||
config->direction != DMA_DEV_TO_MEM) {
|
||||
dev_err(kdev->dev, "bad direction\n");
|
||||
return (void *)-EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Look for correct dma instance */
|
||||
@@ -462,7 +462,7 @@ void *knav_dma_open_channel(struct device *dev, const char *name,
|
||||
}
|
||||
if (!found) {
|
||||
dev_err(kdev->dev, "No DMA instace with name %s\n", instance);
|
||||
return (void *)-EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Look for correct dma channel from dma instance */
|
||||
@@ -483,14 +483,14 @@ void *knav_dma_open_channel(struct device *dev, const char *name,
|
||||
if (!found) {
|
||||
dev_err(kdev->dev, "channel %d is not in DMA %s\n",
|
||||
chan_num, instance);
|
||||
return (void *)-EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (atomic_read(&chan->ref_count) >= 1) {
|
||||
if (!check_config(chan, config)) {
|
||||
dev_err(kdev->dev, "channel %d config miss-match\n",
|
||||
chan_num);
|
||||
return (void *)-EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -265,6 +265,20 @@ static int bcm63xx_txrx_bufs(struct spi_device *spi, struct spi_transfer *first,
|
||||
|
||||
if (t->rx_buf) {
|
||||
do_rx = true;
|
||||
|
||||
/*
|
||||
* In certain hardware implementations, there appears to be a
|
||||
* hidden accumulator that tracks the number of bytes written into
|
||||
* the hardware FIFO, and this accumulator overrides the length in
|
||||
* the SPI_MSG_CTL register.
|
||||
*
|
||||
* Therefore, for read-only transfers, we need to write some dummy
|
||||
* value into the FIFO to keep the accumulator tracking the correct
|
||||
* length.
|
||||
*/
|
||||
if (!t->tx_buf)
|
||||
memset_io(bs->tx_io + len, 0xFF, t->len);
|
||||
|
||||
/* prepend is half-duplex write only */
|
||||
if (t == first)
|
||||
prepend_len = 0;
|
||||
|
||||
@@ -412,7 +412,7 @@ static void spi_test_dump_message(struct spi_device *spi,
|
||||
int i;
|
||||
u8 b;
|
||||
|
||||
dev_info(&spi->dev, " spi_msg@%pK\n", msg);
|
||||
dev_info(&spi->dev, " spi_msg@%p\n", msg);
|
||||
if (msg->status)
|
||||
dev_info(&spi->dev, " status: %i\n",
|
||||
msg->status);
|
||||
@@ -422,15 +422,15 @@ static void spi_test_dump_message(struct spi_device *spi,
|
||||
msg->actual_length);
|
||||
|
||||
list_for_each_entry(xfer, &msg->transfers, transfer_list) {
|
||||
dev_info(&spi->dev, " spi_transfer@%pK\n", xfer);
|
||||
dev_info(&spi->dev, " spi_transfer@%p\n", xfer);
|
||||
dev_info(&spi->dev, " len: %i\n", xfer->len);
|
||||
dev_info(&spi->dev, " tx_buf: %pK\n", xfer->tx_buf);
|
||||
dev_info(&spi->dev, " tx_buf: %p\n", xfer->tx_buf);
|
||||
if (dump_data && xfer->tx_buf)
|
||||
spi_test_print_hex_dump(" TX: ",
|
||||
xfer->tx_buf,
|
||||
xfer->len);
|
||||
|
||||
dev_info(&spi->dev, " rx_buf: %pK\n", xfer->rx_buf);
|
||||
dev_info(&spi->dev, " rx_buf: %p\n", xfer->rx_buf);
|
||||
if (dump_data && xfer->rx_buf)
|
||||
spi_test_print_hex_dump(" RX: ",
|
||||
xfer->rx_buf,
|
||||
@@ -523,7 +523,7 @@ static int spi_check_rx_ranges(struct spi_device *spi,
|
||||
/* if still not found then something has modified too much */
|
||||
/* we could list the "closest" transfer here... */
|
||||
dev_err(&spi->dev,
|
||||
"loopback strangeness - rx changed outside of allowed range at: %pK\n",
|
||||
"loopback strangeness - rx changed outside of allowed range at: %p\n",
|
||||
addr);
|
||||
/* do not return, only set ret,
|
||||
* so that we list all addresses
|
||||
@@ -661,7 +661,7 @@ static int spi_test_translate(struct spi_device *spi,
|
||||
}
|
||||
|
||||
dev_err(&spi->dev,
|
||||
"PointerRange [%pK:%pK[ not in range [%pK:%pK[ or [%pK:%pK[\n",
|
||||
"PointerRange [%p:%p[ not in range [%p:%p[ or [%p:%p[\n",
|
||||
*ptr, *ptr + len,
|
||||
RX(0), RX(SPI_TEST_MAX_SIZE),
|
||||
TX(0), TX(SPI_TEST_MAX_SIZE));
|
||||
|
||||
Loaded 100 of 187 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user