mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-05 19:31:57 -04:00
This is the 5.4.302 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmkwI4sACgkQONu9yGCS aT46Mg//f9a0IiDkO2ybqt7JAStVCkQ5MM2CgPjlgHGyns6hWyxUES5twrVrTO0v mdYmeXLztyFSArUHMnoWcUK1O4IVUVK32SX3eEMFy81ojX+LpYm/m5TZg3tU1rvq jaTE0i6ihmwG48ciB63i28TxQfhY8QuVJTEV400Ro+ILY2hs1l6c6DYf9i0S/v4g gKDQpzuwR0AnGNFI+D6D6D0D8jbLVcBYnAndyvDrLYTIILczf7nJ66ZePYTBvlg3 rIiIMjG0BX0V2ctPmez3mz0BDTpnZY4pwIwIG8K/bX4UZrgOKJPSZWh1SzbASaGN vTJQwRs9nGHvM/kK9CUUsi1+hhaAl7UmQEiRJ06BkXlR7chFCcL/fI/VEQjf12wL dyw6/RR/rXPxLbLxCYk+9C9ANTE/ByirLKSeJkNT/yoeiCSpaFuKxtoYkNslBK/B i0/Qweez0IzJuVUtUp/2/PrkNKyCaEbbqhDerbnLhU/0lcnT0fkFlFoLLLNzxNdt hj6RRJrcpoQB+Qrkf0+5Sxx6W1feP5clZJ2nRSL+rtUNEzCWk7HVh4GprCyvDn6i xjINN9Yh40suJkuKaE0+IrPF1tcL3/128OaT3e0VlL57wK5M4YmJTwrb7g4mlR2/ 31Z4bL1IFYju9WYPW2fWHrdrZUH4h22vLcpW6Q/VFdG0wTC6wVc= =Wt2i -----END PGP SIGNATURE----- Merge tag 'android11-5.4.302_r00' into android11-5.4 This merges the android11-5.4.302_r00 tag into the android11-5.4 branch, catching it up with the latest LTS releases. It contains the following commits: *ca00e0f525Merge 5.4.302 into android11-5.4-lts |\ | *9e3157c56eLinux 5.4.302 | *c4e746651bInput: pegasus-notetaker - fix potential out-of-bounds access | *a643fecbcaInput: remove third argument of usb_maxpacket() | *2c6d503287usb: deprecate the third argument of usb_maxpacket() | *ce9e6c5f2aata: libata-scsi: Fix system suspend for a security locked drive | *1d1596d68afs/proc: fix uaf in proc_readdir_de() | *e45dfc5368pmdomain: imx: Fix reference count leak in imx_gpc_remove | *18249a167fpmdomain: arm: scmi: Fix genpd leak on provider registration failure | *8e6a50edadnet: netpoll: fix incorrect refcount handling causing incorrect cleanup | *274eed81c5net: qede: Initialize qede_ll_ops with designated initializer | *3d2e0711ecuio_hv_generic: Set event for all channels on the device | *af6b10a13fnet: ethernet: ti: netcp: Standardize knav_dma_open_channel to return NULL on error | *52437be5aaALSA: usb-audio: fix uac2 clock source at terminal parser | *e6a7b787camm/page_alloc: fix hash table order logging in alloc_large_system_hash() | *59cd20f678kconfig/nconf: Initialize the default locale at startup | *518a59533ckconfig/mconf: Initialize the default locale at startup | *3f71753935vsock: Ignore signal/timeout on connect() if already established | *06f1dd1de0s390/ctcm: Fix double-kfree | *3415faa1fcnet: openvswitch: remove never-working support for setting nsh fields | *607333b38fmlxsw: spectrum: Fix memory leak in mlxsw_sp_flower_stats() | *1c74ded6a1MIPS: Malta: Fix !EVA SOC-it PCI MMIO | *63f511d385scsi: target: tcm_loop: Fix segfault in tcm_loop_tpg_address_show() | *11eeee00c9scsi: sg: Do not sleep in atomic context | *7bfd959187Input: cros_ec_keyb - fix an invalid memory access | *48d59b60ddbe2net: pass wrb_params in case of OS2BMC | *b086e52f7cHID: quirks: work around VID/PID conflict for 0x4c4a/0x4155 | *475032fa2bisdn: mISDN: hfcsusb: fix memory leak in hfcsusb_probe() | *1f0ab37f10EDAC/altera: Use INTTEST register for Ethernet and USB SBE injection | *66ed3bf485EDAC/altera: Handle OCRAM ECC enable after warm reset | *1b796dd045spi: Try to get ACPI GPIO IRQ earlier | *69d35c1216ipv4: route: Prevent rt_bind_exception() from rebinding stale fnhe | *af5a7f06b6strparser: Fix signed/unsigned mismatch bug | *b7a984e9a2gcov: add support for GCC 15 | *850f1ea245mm/ksm: fix flag-dropping behavior in ksm_madvise | *23aea9c74aALSA: usb-audio: Fix NULL pointer dereference in snd_usb_mixer_controls_badd | *e585598450drm/vmwgfx: Validate command header size against SVGA_CMD_MAX_DATASIZE | *335c071417ASoC: cs4271: Fix regulator leak on probe failure | *31a148f1d0regulator: fixed: fix GPIO descriptor leak on register failure | *81e24e73caregulator: fixed: use dev_err_probe for register | *b38db473f5Bluetooth: L2CAP: export l2cap_chan_hold for modules | *2576c2f43fnet_sched: limit try_bulk_dequeue_skb() batches | *08f5ecb3c0net_sched: remove need_resched() from qdisc_run() | *4170b07e2bnet/mlx5e: Fix wraparound in rate limiting for values above 255 Gbps | *ad2467e714net/mlx5e: Fix maxrate wraparound in threshold between units | *918e063304net: sched: act_ife: initialize struct tc_ife to fix KMSAN kernel-infoleak | *be0715d4f3wifi: mac80211: skip rate verification for not captured PSDUs | *272c55f512net: mdio: fix resource leak in mdiobus_register_device() | *5f541300b0tipc: Fix use-after-free in tipc_mon_reinit_self(). | *201fee25fdtipc: simplify the finalize work queue | *0e0413e331sctp: prevent possible shift-out-of-bounds in sctp_transport_update_rto | *203a0dace3sctp: get netns from asoc and ep base | *05d5df4913Bluetooth: 6lowpan: Don't hold spin lock over sleeping functions | *9b1a83c678Bluetooth: 6lowpan: fix BDADDR_LE vs ADDR_LE_DEV address type confusion | *ea46a1d217Bluetooth: 6lowpan: reset link-local header on ipv6 recv path | *297dbf8798Bluetooth: btusb: reorder cleanup in btusb_disconnect to avoid UAF | *e78b093badnet: fec: correct rx_bytes statistic for the case SHIFT16 is set | *c2ec6ebd8eASoC: max98090/91: fixed max98091 ALSA widget powering up/down | *8c79e31d2eHID: quirks: avoid Cooler Master MM712 dongle wakeup bug | *06ab1272b5NFS4: Fix state renewals missing after boot | *46326dde84compiler_types: Move unused static inline functions warning to W=2 | *788b15a1efextcon: adc-jack: Cleanup wakeup source only if it was enabled | *9649275aeetracing: Fix memory leaks in create_field_var() | *d693c47fb9net: usb: qmi_wwan: initialize MAC header offset in qmimux_rx_fixup | *b106a68df0sctp: Prevent TOCTOU out-of-bounds write | *5add5db8b1sctp: Hold RCU read lock while iterating over address list | *df9575104enet: dsa: b53: stop reading ARL entries if search is done | *41ca514a9anet: dsa: b53: fix enabling ip multicast | *ebe2678916net: dsa: b53: fix resetting speed and pause on forced link | *a62ee3d6bbnet: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325 | *7218ad9150net: dsa/b53: change b53_force_port_config() pause argument | *bb10c0723bnet: vlan: sync VLAN features with lower device | *3b88b1e46bceph: add checking of wait_for_completion_killable() return value | *996bfaa737fbdev: Add bounds checking in bit_putcs to fix vmalloc-out-of-bounds | *7d06e91943ACPI: property: Return present device nodes only on fwnode interface | *76e881b62b9p: sysfs_init: don't hardcode error to ENOMEM | *1831e39b099p: fix /sys/fs/9p/caches overwriting itself | *4c821ffa2afs/hpfs: Fix error code for new_inode() failure in mkdir/create/mknod/symlink | *8de07ebecfACPICA: Update dsmethod.c to get rid of unused variable warning | *c6564ff6b5orangefs: fix xattr related buffer overflow... | *3614d5bf02page_pool: Clamp pool size to max 16K pages | *39a7d40314Bluetooth: bcsp: receive data only if registered | *5770713575Bluetooth: SCO: Fix UAF on sco_conn_free | *0c5e86a184net: macb: avoid dealing with endianness in macb_set_hwaddr() | *6025f641a0nfs4_setup_readdir(): insufficient locking for ->d_parent->d_inode dereferencing | *0123f9754bNFSv4.1: fix mount hang after CREATE_SESSION failure | *c627673e3dNFSv4: handle ERR_GRACE on delegation recalls | *b10afc5fb5remoteproc: qcom: q6v5: Avoid handling handover twice | *0c38d95aa2sparc/module: Add R_SPARC_UA64 relocation handling | *4dbc4e8cd5net: intel: fm10k: Fix parameter idx set but not used | *d6af7fce2ejfs: fix uninitialized waitqueue in transaction manager | *19cce65709jfs: Verify inode mode when loading from disk | *58894600b5ipv6: np->rxpmtu race annotation | *ac91ada020usb: xhci: plat: Facilitate using autosuspend for xhci plat devices | *e9d2ab8795usb: mon: Increase BUFF_MAX to 64 MiB to support multi-MB URBs | *7d18c7616eallow finish_no_open(file, ERR_PTR(-E...)) | *166972f62ascsi: lpfc: Define size of debugfs entry for xri rebalancing | *e50586bbdascsi: lpfc: Check return status of lpfc_reset_flush_io_context during TGT_RESET | *0dc59e2673selftests/Makefile: include $(INSTALL_DEP_TARGETS) in clean target to clean net/lib dependency | *b08669127enet/cls_cgroup: Fix task_get_classid() during qdisc run | *9cfaa6b715selftests: Replace sleep with slowwait | *731088e8cbselftests: Disable dad for ipv6 in fcnal-test.sh | *42207042a3media: redrat3: use int type to store negative error codes | *f18cc90244net: sh_eth: Disable WoL if system can not suspend | *f60168e62fphy: cadence: cdns-dphy: Enable lower resolutions in dphy | *3248107d00usb: gadget: f_hid: Fix zero length packet transfer | *0ee184e039net: call cond_resched() less often in __release_sock() | *efa440ab4fALSA: usb-audio: apply quirk for MOONDROP Quark2 | *579f823455net: nfc: nci: Increase NCI_DATA_TIMEOUT to 3000 ms | *b8461af1f2dmaengine: dw-edma: Set status for callback_result | *99eb4e5dcadmaengine: mv_xor: match alloc_wc and free_wc | *7e81e14edddmaengine: sh: setup_xref error handling | *ed72c6385dscsi: pm8001: Use int instead of u32 to store error codes | *30928ea5f7mips: lantiq: xway: sysctrl: rename stp clock | *9da5dddafcmips: lantiq: danube: add missing device_type in pci node | *c09c5057cdmips: lantiq: danube: add missing properties to cpu node | *8218f0a558media: fix uninitialized symbol warnings | *eb6e1fb9b9drm/amdkfd: Tie UNMAP_LATENCY to queue_preemption | *c756f712eaextcon: adc-jack: Fix wakeup source leaks on device unbind | *23eebe1c1crds: Fix endianness annotation for RDS_MPATH_HASH | *ce179e2434PCI/P2PDMA: Fix incorrect pointer usage in devm_kfree() call | *b872d6f0d5net: Call trace_sock_exceed_buf_limit() for memcg failure with SK_MEM_RECV. | *e3efebfee6net: When removing nexthops, don't call synchronize_net if it is not necessary | *87ac021c84char: misc: Does not request module for miscdevice with dynamic minor | *a3f918b791usb: gadget: f_ncm: Fix MAC assignment NCM ethernet | *206eed62a9iio: adc: spear_adc: mask SPEAR_ADC_STATUS channel and avg sample before setting register | *519737af11media: imon: make send_packet() more robust | *2da805a61enet: ipv6: fix field-spanning memcpy warning in AH output | *b4684a71d9bridge: Redirect to backup port when port is administratively down | *19d8ac1a11powerpc/eeh: Use result of error_detected() in uevent | *d6cbf916f2x86/vsyscall: Do not require X86_PF_INSTR to emulate vsyscall | *422970ca8dmedia: pci: ivtv: Don't create fake v4l2_fh | *3dca940d84drm/amdkfd: return -ENOTTY for unsupported IOCTLs | *0f2fce4b19selftests/net: Ensure assert() triggers in psock_tpacket.c | *00e6691f6cselftests/net: Replace non-standard __WORDSIZE with sizeof(long) * 8 | *72ee532421PCI: Disable MSI on RDC PCI to PCIe bridges | *dd7e0326b7drm/nouveau: replace snprintf() with scnprintf() in nvkm_snprintbf() | *e29ee40c2emfd: madera: Work around false-positive -Wininitialized warning | *1237d51acbmfd: stmpe-i2c: Add missing MODULE_LICENSE | *9ab5a73d9emfd: stmpe: Remove IRQ domain upon removal | *9f4bd38944tools/power x86_energy_perf_policy: Prefer driver HWP limits | *3c37caffe3tools/power x86_energy_perf_policy: Enhance HWP enable | *caf2c648edtools/cpupower: Fix incorrect size in cpuidle_state_disable() | *e424f1553dhwmon: (dell-smm) Add support for Dell OptiPlex 7040 | *98fd1968a3uprobe: Do not emulate/sstep original instruction when ip is changed | *503ea51be2clocksource/drivers/vf-pit: Replace raw_readl/writel to readl/writel | *0ccb6f690dvideo: backlight: lp855x_bl: Set correct EPROM start for LP8556 | *adf5bf9334tee: allow a driver to allocate a tee_device without a pool | *53b9a6fb21ACPICA: dispatcher: Use acpi_ds_clear_operands() in acpi_ds_call_control_method() | *363f28adc0mmc: sdhci-msm: Enable tuning for SDR50 mode for SD card | *3eeccdb6b0irqchip/gic-v2m: Handle Multiple MSI base IRQ Alignment | *5d4f0c29f3arc: Fix __fls() const-foldability via __builtin_clzl() | *b02352dd2ecpufreq/longhaul: handle NULL policy in longhaul_exit | *b5d562b4d4selftests/bpf: Fix bpf_prog_detach2 usage in test_lirc_mode2 | *f56a6751ceACPI: video: force native for Lenovo 82K8 | *0e2e0078damemstick: Add timeout to prevent indefinite waiting | *a83b52e693mmc: host: renesas_sdhi: Fix the actual clock | *43bfea81e6bpf: Don't use %pK through printk | *fef692cbcespi: loopback-test: Don't use %pK through printk | *9ff6994c80soc: qcom: smem: Fix endian-unaware access of num_entries | *b00d2572c1usb: gadget: f_fs: Fix epfile null pointer access after ep enable. | *e04a335404serial: 8250_dw: handle reset control deassert error | *71e98d9b72serial: 8250_dw: Use devm_add_action_or_reset() | *fabb861b50serial: 8250_dw: Use devm_clk_get_optional() to get the input clock | *12afe2c625can: gs_usb: increase max interface to U8_MAX | *c21831f36fdevcoredump: Fix circular locking dependency with devcd->mutex. | *d216cf7e24net: ravb: Enforce descriptor type ordering | *7c525ad174x86/resctrl: Fix miscount of bandwidth event when reactivating previously unavailable RMID | *c863b9c7b4wifi: brcmfmac: fix crash while sending Action Frames in standalone AP Mode | *53ff969f35net: phy: dp83867: Disable EEE support as not implemented | *c0f05129e5regmap: slimbus: fix bus_context pointer in regmap init calls | *38007a71aedrm/etnaviv: fix flush sequence logic | *285d4b953fusbnet: Prevents free active kevent | *d958d9a620wifi: ath10k: Fix memory leak on unsupported WMI command | *01800cee94ASoC: qdsp6: q6asm: do not sleep while atomic | *ab258b14dafbdev: valkyriefb: Fix reference count leak in valkyriefb_init | *a567ecce51fbdev: pvr2fb: Fix leftover reference to ONCHIP_NR_DMA_CHANNELS | *a10cede006fbdev: bitblit: bound-check glyph index in bit_putcs* | *3f803ccf5aACPI: video: Fix use-after-free in acpi_video_switch_brightness() | *6b3e0d5e44fbdev: atyfb: Check if pll_ops->init_pll failed | *ff4b007e55net: usb: asix_devices: Check return value of usbnet_get_endpoints | *7ad8aa6635btrfs: use smp_mb__after_atomic() when forcing COW in create_pending_snapshot() | *1657166c1fx86/bugs: Fix reporting of LFENCE retpoline | *71d84658a6net/sched: sch_qfq: Fix null-deref in agg_dequeue *7bf580b201Merge android11-5.4 into android11-5.4-lts Change-Id: If5d09649c228737a5d2dbe105c7f1874181f7d3b Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
91d385eb2a
200 changed files with 1294 additions and 813 deletions
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 301
|
||||
SUBLEVEL = 302
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
|
|||
|
|
@ -371,6 +371,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>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -101,6 +105,8 @@
|
|||
0x1000000 0 0x00000000 0xae00000 0 0x200000>; /* io space */
|
||||
reg = <0x7000000 0x8000 /* config space */
|
||||
0xe105400 0x400>; /* pci bridge */
|
||||
|
||||
device_type = "pci";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -459,7 +459,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);
|
||||
|
|
|
|||
|
|
@ -242,16 +242,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) ==
|
||||
|
|
|
|||
|
|
@ -351,7 +351,7 @@ static enum pci_ers_result eeh_report_error(struct eeh_dev *edev,
|
|||
rc = driver->err_handler->error_detected(pdev, pci_channel_io_frozen);
|
||||
|
||||
edev->in_error = true;
|
||||
pci_uevent_ers(pdev, PCI_ERS_RESULT_NONE);
|
||||
pci_uevent_ers(pdev, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -124,7 +124,12 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||
if ((error_code & (X86_PF_WRITE | X86_PF_USER)) != X86_PF_USER)
|
||||
return false;
|
||||
|
||||
if (!(error_code & X86_PF_INSTR)) {
|
||||
/*
|
||||
* Assume that faults at regs->ip are because of an
|
||||
* instruction fetch. Return early and avoid
|
||||
* emulation for faults during data accesses:
|
||||
*/
|
||||
if (address != regs->ip) {
|
||||
/* Failed vsyscall read */
|
||||
if (vsyscall_mode == EMULATE)
|
||||
return false;
|
||||
|
|
@ -136,13 +141,19 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* X86_PF_INSTR is only set when NX is supported. When
|
||||
* available, use it to double-check that the emulation code
|
||||
* is only being used for instruction fetches:
|
||||
*/
|
||||
if (cpu_feature_enabled(X86_FEATURE_NX))
|
||||
WARN_ON_ONCE(!(error_code & X86_PF_INSTR));
|
||||
|
||||
/*
|
||||
* No point in checking CS -- the only way to get here is a user mode
|
||||
* trap to a high address, which means that we're in 64-bit user code.
|
||||
*/
|
||||
|
||||
WARN_ON_ONCE(address != regs->ip);
|
||||
|
||||
if (vsyscall_mode == NONE) {
|
||||
warn_bad_vsyscall(KERN_INFO, regs,
|
||||
"vsyscall attempted with vsyscall=none");
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
@ -2280,9 +2280,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");
|
||||
|
||||
|
|
|
|||
|
|
@ -225,11 +225,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) {
|
||||
|
|
|
|||
|
|
@ -2024,8 +2024,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);
|
||||
|
||||
|
|
@ -546,14 +545,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",
|
||||
|
|
|
|||
|
|
@ -1114,6 +1114,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
|
||||
|
|
@ -1387,7 +1409,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 = \
|
||||
|
|
|
|||
|
|
@ -556,6 +556,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"),
|
||||
},
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1179,6 +1179,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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -357,7 +374,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);
|
||||
|
|
@ -366,8 +383,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;
|
||||
|
||||
|
|
@ -381,13 +404,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);
|
||||
|
||||
|
|
|
|||
|
|
@ -4004,6 +4004,11 @@ 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 (data->reset_gpio)
|
||||
gpiod_put(data->reset_gpio);
|
||||
|
||||
if (intf == data->intf) {
|
||||
if (data->isoc)
|
||||
usb_driver_release_interface(&btusb_driver, data->isoc);
|
||||
|
|
@ -4014,17 +4019,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);
|
||||
|
||||
if (data->reset_gpio)
|
||||
gpiod_put(data->reset_gpio);
|
||||
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -582,6 +582,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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -35,30 +35,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,
|
||||
|
|
@ -76,7 +76,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;
|
||||
|
|
@ -132,8 +132,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));
|
||||
|
||||
|
|
@ -189,7 +189,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;
|
||||
|
|
|
|||
|
|
@ -474,6 +474,25 @@ dw_edma_device_prep_dma_cyclic(struct dma_chan *dchan, dma_addr_t paddr,
|
|||
return dw_edma_device_transfer(&xfer);
|
||||
}
|
||||
|
||||
static void dw_hdma_set_callback_result(struct virt_dma_desc *vd,
|
||||
enum dmaengine_tx_result result)
|
||||
{
|
||||
u32 residue = 0;
|
||||
struct dw_edma_desc *desc;
|
||||
struct dmaengine_result *res;
|
||||
|
||||
if (!vd->tx.callback_result)
|
||||
return;
|
||||
|
||||
desc = vd2dw_edma_desc(vd);
|
||||
if (desc)
|
||||
residue = desc->alloc_sz - desc->xfer_sz;
|
||||
|
||||
res = &vd->tx_result;
|
||||
res->result = result;
|
||||
res->residue = residue;
|
||||
}
|
||||
|
||||
static void dw_edma_done_interrupt(struct dw_edma_chan *chan)
|
||||
{
|
||||
struct dw_edma_desc *desc;
|
||||
|
|
@ -489,6 +508,8 @@ static void dw_edma_done_interrupt(struct dw_edma_chan *chan)
|
|||
case EDMA_REQ_NONE:
|
||||
desc = vd2dw_edma_desc(vd);
|
||||
if (!desc->chunks_alloc) {
|
||||
dw_hdma_set_callback_result(vd,
|
||||
DMA_TRANS_NOERROR);
|
||||
list_del(&vd->node);
|
||||
vchan_cookie_complete(vd);
|
||||
}
|
||||
|
|
@ -527,6 +548,7 @@ static void dw_edma_abort_interrupt(struct dw_edma_chan *chan)
|
|||
spin_lock_irqsave(&chan->vc.lock, flags);
|
||||
vd = vchan_next_desc(&chan->vc);
|
||||
if (vd) {
|
||||
dw_hdma_set_callback_result(vd, DMA_TRANS_ABORTED);
|
||||
list_del(&vd->node);
|
||||
vchan_cookie_complete(vd);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1013,7 +1013,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);
|
||||
|
|
@ -1164,7 +1164,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,
|
||||
|
|
|
|||
|
|
@ -129,12 +129,25 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx)
|
|||
const struct shdma_ops *ops = sdev->ops;
|
||||
dev_dbg(schan->dev, "Bring up channel %d\n",
|
||||
schan->id);
|
||||
/*
|
||||
* TODO: .xfer_setup() might fail on some platforms.
|
||||
* Make it int then, on error remove chunks from the
|
||||
* queue again
|
||||
*/
|
||||
ops->setup_xfer(schan, schan->slave_id);
|
||||
|
||||
ret = ops->setup_xfer(schan, schan->slave_id);
|
||||
if (ret < 0) {
|
||||
dev_err(schan->dev, "setup_xfer failed: %d\n", ret);
|
||||
|
||||
/* Remove chunks from the queue and mark them as idle */
|
||||
list_for_each_entry_safe(chunk, c, &schan->ld_queue, node) {
|
||||
if (chunk->cookie == cookie) {
|
||||
chunk->mark = DESC_IDLE;
|
||||
list_move(&chunk->node, &schan->ld_free);
|
||||
}
|
||||
}
|
||||
|
||||
schan->pm_state = SHDMA_PM_ESTABLISHED;
|
||||
ret = pm_runtime_put(schan->dev);
|
||||
|
||||
spin_unlock_irq(&schan->chan_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (schan->pm_state == SHDMA_PM_PENDING)
|
||||
shdma_chan_xfer_ld_queue(schan);
|
||||
|
|
|
|||
|
|
@ -301,21 +301,30 @@ static bool sh_dmae_channel_busy(struct shdma_chan *schan)
|
|||
return dmae_is_busy(sh_chan);
|
||||
}
|
||||
|
||||
static void sh_dmae_setup_xfer(struct shdma_chan *schan,
|
||||
int slave_id)
|
||||
static int sh_dmae_setup_xfer(struct shdma_chan *schan, int slave_id)
|
||||
{
|
||||
struct sh_dmae_chan *sh_chan = container_of(schan, struct sh_dmae_chan,
|
||||
shdma_chan);
|
||||
|
||||
int ret = 0;
|
||||
if (slave_id >= 0) {
|
||||
const struct sh_dmae_slave_config *cfg =
|
||||
sh_chan->config;
|
||||
|
||||
dmae_set_dmars(sh_chan, cfg->mid_rid);
|
||||
dmae_set_chcr(sh_chan, cfg->chcr);
|
||||
ret = dmae_set_dmars(sh_chan, cfg->mid_rid);
|
||||
if (ret < 0)
|
||||
goto END;
|
||||
|
||||
ret = dmae_set_chcr(sh_chan, cfg->chcr);
|
||||
if (ret < 0)
|
||||
goto END;
|
||||
|
||||
} else {
|
||||
dmae_init(sh_chan);
|
||||
}
|
||||
|
||||
END:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1247,10 +1247,22 @@ altr_check_ocram_deps_init(struct altr_edac_device_dev *device)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Verify OCRAM has been initialized */
|
||||
/*
|
||||
* Verify that OCRAM has been initialized.
|
||||
* During a warm reset, OCRAM contents are retained, but the control
|
||||
* and status registers are reset to their default values. Therefore,
|
||||
* ECC must be explicitly re-enabled in the control register.
|
||||
* Error condition: if INITCOMPLETEA is clear and ECC_EN is already set.
|
||||
*/
|
||||
if (!ecc_test_bits(ALTR_A10_ECC_INITCOMPLETEA,
|
||||
(base + ALTR_A10_ECC_INITSTAT_OFST)))
|
||||
return -ENODEV;
|
||||
(base + ALTR_A10_ECC_INITSTAT_OFST))) {
|
||||
if (!ecc_test_bits(ALTR_A10_ECC_EN,
|
||||
(base + ALTR_A10_ECC_CTRL_OFST)))
|
||||
ecc_set_bits(ALTR_A10_ECC_EN,
|
||||
(base + ALTR_A10_ECC_CTRL_OFST));
|
||||
else
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Enable IRQ on Single Bit Error */
|
||||
writel(ALTR_A10_ECC_SERRINTEN, (base + ALTR_A10_ECC_ERRINTENS_OFST));
|
||||
|
|
@ -1420,7 +1432,7 @@ static const struct edac_device_prv_data a10_enetecc_data = {
|
|||
.ue_set_mask = ALTR_A10_ECC_TDERRA,
|
||||
.set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
|
||||
.ecc_irq_handler = altr_edac_a10_ecc_irq,
|
||||
.inject_fops = &altr_edac_a10_device_inject2_fops,
|
||||
.inject_fops = &altr_edac_a10_device_inject_fops,
|
||||
};
|
||||
|
||||
#endif /* CONFIG_EDAC_ALTERA_ETHERNET */
|
||||
|
|
@ -1510,7 +1522,7 @@ static const struct edac_device_prv_data a10_usbecc_data = {
|
|||
.ue_set_mask = ALTR_A10_ECC_TDERRA,
|
||||
.set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
|
||||
.ecc_irq_handler = altr_edac_a10_ecc_irq,
|
||||
.inject_fops = &altr_edac_a10_device_inject2_fops,
|
||||
.inject_fops = &altr_edac_a10_device_inject_fops,
|
||||
};
|
||||
|
||||
#endif /* CONFIG_EDAC_ALTERA_USB */
|
||||
|
|
|
|||
|
|
@ -162,6 +162,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)
|
||||
|
|
|
|||
|
|
@ -1796,8 +1796,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;
|
||||
|
|
@ -1810,8 +1812,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);
|
||||
|
||||
|
|
|
|||
|
|
@ -105,7 +105,14 @@
|
|||
|
||||
#define KFD_KERNEL_QUEUE_SIZE 2048
|
||||
|
||||
#define KFD_UNMAP_LATENCY_MS (4000)
|
||||
/* KFD_UNMAP_LATENCY_MS is the timeout CP waiting for SDMA preemption. One XCC
|
||||
* can be associated to 2 SDMA engines. queue_preemption_timeout_ms is the time
|
||||
* driver waiting for CP returning the UNMAP_QUEUE fence. Thus the math is
|
||||
* queue_preemption_timeout_ms = sdma_preemption_time * 2 + cp workload
|
||||
* The format here makes CP workload 10% of total timeout
|
||||
*/
|
||||
#define KFD_UNMAP_LATENCY_MS \
|
||||
((queue_preemption_timeout_ms - queue_preemption_timeout_ms / 10) >> 1)
|
||||
|
||||
/*
|
||||
* 512 = 0x200
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, u32 exec_state,
|
|||
u32 link_target, link_dwords;
|
||||
bool switch_context = gpu->exec_state != exec_state;
|
||||
bool switch_mmu_context = gpu->mmu_context != mmu_context;
|
||||
unsigned int new_flush_seq = READ_ONCE(gpu->mmu_context->flush_seq);
|
||||
unsigned int new_flush_seq = READ_ONCE(mmu_context->flush_seq);
|
||||
bool need_flush = switch_mmu_context || gpu->flush_seq != new_flush_seq;
|
||||
bool has_blt = !!(gpu->identity.minor_features5 &
|
||||
chipMinorFeatures5_BLT_ENGINE);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -3216,6 +3216,11 @@ static int vmw_cmd_check(struct vmw_private *dev_priv,
|
|||
|
||||
|
||||
cmd_id = header->id;
|
||||
if (header->size > SVGA_CMD_MAX_DATASIZE) {
|
||||
VMW_DEBUG_USER("SVGA3D command: %d is too big.\n",
|
||||
cmd_id + SVGA_3D_CMD_BASE);
|
||||
return -E2BIG;
|
||||
}
|
||||
*size = header->size + sizeof(SVGA3dCmdHeader);
|
||||
|
||||
cmd_id -= SVGA_3D_CMD_BASE;
|
||||
|
|
|
|||
|
|
@ -303,6 +303,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
|
||||
|
||||
|
|
@ -1356,7 +1359,7 @@
|
|||
#define USB_VENDOR_ID_SIGNOTEC 0x2133
|
||||
#define USB_DEVICE_ID_SIGNOTEC_VIEWSONIC_PD1011 0x0018
|
||||
|
||||
#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
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -57,6 +57,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 },
|
||||
|
|
@ -883,7 +884,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) },
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
@ -1032,6 +1032,18 @@ bool hid_ignore(struct hid_device *hdev)
|
|||
strlen(elan_acpi_id[i].id)))
|
||||
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 &&
|
||||
|
|
|
|||
|
|
@ -1016,6 +1016,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 = {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,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>
|
||||
|
|
@ -29,9 +30,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
|
||||
|
|
@ -148,8 +149,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)
|
||||
|
|
|
|||
|
|
@ -244,6 +244,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");
|
||||
|
|
|
|||
|
|
@ -639,7 +639,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,
|
||||
|
|
|
|||
|
|
@ -749,7 +749,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);
|
||||
|
|
|
|||
|
|
@ -374,7 +374,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",
|
||||
|
|
|
|||
|
|
@ -905,7 +905,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);
|
||||
|
|
|
|||
|
|
@ -130,7 +130,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();
|
||||
|
|
|
|||
|
|
@ -63,6 +63,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
|
||||
|
|
@ -296,7 +299,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);
|
||||
|
|
|
|||
|
|
@ -178,14 +178,19 @@ static int gicv2m_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
|
|||
{
|
||||
msi_alloc_info_t *info = 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1904,13 +1904,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;
|
||||
|
|
@ -2101,20 +2101,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 */
|
||||
|
|
|
|||
|
|
@ -284,9 +284,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__);
|
||||
|
|
|
|||
|
|
@ -150,14 +150,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
|
||||
|
|
@ -334,7 +335,7 @@ struct ivtv_stream {
|
|||
const char *name; /* name of the stream */
|
||||
int type; /* stream type */
|
||||
|
||||
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 */
|
||||
|
|
|
|||
|
|
@ -38,16 +38,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;
|
||||
}
|
||||
|
|
@ -55,7 +55,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);
|
||||
|
|
@ -93,7 +93,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 */
|
||||
|
|
@ -125,7 +125,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;
|
||||
}
|
||||
|
|
@ -349,7 +349,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;
|
||||
|
|
@ -819,7 +819,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);
|
||||
|
|
@ -903,7 +903,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 */
|
||||
|
|
|
|||
|
|
@ -305,7 +305,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;
|
||||
}
|
||||
|
|
@ -330,7 +330,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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -652,12 +652,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;
|
||||
|
|
@ -1759,14 +1762,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;
|
||||
|
|
@ -1775,16 +1770,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);
|
||||
}
|
||||
|
||||
|
|
@ -1800,14 +1808,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;
|
||||
|
|
@ -1816,16 +1816,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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -423,7 +423,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)
|
||||
|
|
|
|||
|
|
@ -1089,12 +1089,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;
|
||||
|
|
|
|||
|
|
@ -622,14 +622,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;
|
||||
|
|
|
|||
|
|
@ -369,7 +369,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;
|
||||
}
|
||||
|
|
@ -403,7 +405,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;
|
||||
|
|
|
|||
|
|
@ -431,7 +431,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;
|
||||
|
||||
|
|
@ -616,7 +616,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;
|
||||
|
|
|
|||
|
|
@ -139,3 +139,4 @@ module_exit(stmpe_exit);
|
|||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("STMPE MFD I2C Interface Driver");
|
||||
MODULE_AUTHOR("Rabin Vincent <rabin.vincent@stericsson.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
|||
|
|
@ -1494,6 +1494,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))
|
||||
|
|
|
|||
|
|
@ -185,7 +185,11 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
|
|||
clk &= ~0xff;
|
||||
}
|
||||
|
||||
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clk & CLK_CTL_DIV_MASK);
|
||||
clock = clk & CLK_CTL_DIV_MASK;
|
||||
if (clock != 0xff)
|
||||
host->mmc->actual_clock /= (1 << (ffs(clock) + 1));
|
||||
|
||||
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, clock);
|
||||
if (!(host->pdata->flags & TMIO_MMC_MIN_RCAR2))
|
||||
usleep_range(10000, 11000);
|
||||
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@
|
|||
#define CORE_IO_PAD_PWR_SWITCH_EN (1 << 15)
|
||||
#define CORE_IO_PAD_PWR_SWITCH (1 << 16)
|
||||
#define CORE_HC_SELECT_IN_EN BIT(18)
|
||||
#define CORE_HC_SELECT_IN_SDR50 (4 << 19)
|
||||
#define CORE_HC_SELECT_IN_HS400 (6 << 19)
|
||||
#define CORE_HC_SELECT_IN_MASK (7 << 19)
|
||||
|
||||
|
|
@ -1034,6 +1035,10 @@ static bool sdhci_msm_is_tuning_needed(struct sdhci_host *host)
|
|||
{
|
||||
struct mmc_ios *ios = &host->mmc->ios;
|
||||
|
||||
if (ios->timing == MMC_TIMING_UHS_SDR50 &&
|
||||
host->flags & SDHCI_SDR50_NEEDS_TUNING)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Tuning is required for SDR104, HS200 and HS400 cards and
|
||||
* if clock frequency is greater than 100MHz in these modes.
|
||||
|
|
@ -1102,6 +1107,8 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
|||
struct mmc_ios ios = host->mmc->ios;
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host);
|
||||
const struct sdhci_msm_offset *msm_offset = msm_host->offset;
|
||||
u32 config;
|
||||
|
||||
if (!sdhci_msm_is_tuning_needed(host)) {
|
||||
msm_host->use_cdr = false;
|
||||
|
|
@ -1118,6 +1125,14 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
|||
*/
|
||||
msm_host->tuning_done = 0;
|
||||
|
||||
if (ios.timing == MMC_TIMING_UHS_SDR50 &&
|
||||
host->flags & SDHCI_SDR50_NEEDS_TUNING) {
|
||||
config = readl_relaxed(host->ioaddr + msm_offset->core_vendor_spec);
|
||||
config &= ~CORE_HC_SELECT_IN_MASK;
|
||||
config |= CORE_HC_SELECT_IN_EN | CORE_HC_SELECT_IN_SDR50;
|
||||
writel_relaxed(config, host->ioaddr + msm_offset->core_vendor_spec);
|
||||
}
|
||||
|
||||
/*
|
||||
* For HS400 tuning in HS200 timing requires:
|
||||
* - select MCLK/2 in VENDOR_SPEC
|
||||
|
|
|
|||
|
|
@ -156,10 +156,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;
|
||||
|
|
@ -190,10 +186,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.
|
||||
|
|
@ -321,7 +318,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];
|
||||
|
|
@ -409,7 +406,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);
|
||||
}
|
||||
|
|
@ -991,20 +988,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);
|
||||
|
|
@ -1045,7 +1044,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]);
|
||||
|
||||
|
|
|
|||
|
|
@ -347,11 +347,11 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)
|
|||
* frames should be flooded or not.
|
||||
*/
|
||||
b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt);
|
||||
mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN;
|
||||
mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IP_MC;
|
||||
b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);
|
||||
} else {
|
||||
b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt);
|
||||
mgmt |= B53_IP_MCAST_25;
|
||||
mgmt |= B53_IP_MC;
|
||||
b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt);
|
||||
}
|
||||
}
|
||||
|
|
@ -1026,6 +1026,8 @@ static void b53_force_link(struct b53_device *dev, int port, int link)
|
|||
if (port == dev->cpu_port) {
|
||||
off = B53_PORT_OVERRIDE_CTRL;
|
||||
val = PORT_OVERRIDE_EN;
|
||||
} else if (is5325(dev)) {
|
||||
return;
|
||||
} else {
|
||||
off = B53_GMII_PORT_OVERRIDE_CTRL(port);
|
||||
val = GMII_PO_EN;
|
||||
|
|
@ -1041,7 +1043,8 @@ static void b53_force_link(struct b53_device *dev, int port, int link)
|
|||
}
|
||||
|
||||
static void b53_force_port_config(struct b53_device *dev, int port,
|
||||
int speed, int duplex, int pause)
|
||||
int speed, int duplex,
|
||||
bool tx_pause, bool rx_pause)
|
||||
{
|
||||
u8 reg, val, off;
|
||||
|
||||
|
|
@ -1049,6 +1052,8 @@ static void b53_force_port_config(struct b53_device *dev, int port,
|
|||
if (port == dev->cpu_port) {
|
||||
off = B53_PORT_OVERRIDE_CTRL;
|
||||
val = PORT_OVERRIDE_EN;
|
||||
} else if (is5325(dev)) {
|
||||
return;
|
||||
} else {
|
||||
off = B53_GMII_PORT_OVERRIDE_CTRL(port);
|
||||
val = GMII_PO_EN;
|
||||
|
|
@ -1061,6 +1066,10 @@ static void b53_force_port_config(struct b53_device *dev, int port,
|
|||
else
|
||||
reg &= ~PORT_OVERRIDE_FULL_DUPLEX;
|
||||
|
||||
reg &= ~(0x3 << GMII_PO_SPEED_S);
|
||||
if (is5301x(dev) || is58xx(dev))
|
||||
reg &= ~PORT_OVERRIDE_SPEED_2000M;
|
||||
|
||||
switch (speed) {
|
||||
case 2000:
|
||||
reg |= PORT_OVERRIDE_SPEED_2000M;
|
||||
|
|
@ -1079,10 +1088,24 @@ static void b53_force_port_config(struct b53_device *dev, int port,
|
|||
return;
|
||||
}
|
||||
|
||||
if (pause & MLO_PAUSE_RX)
|
||||
reg |= PORT_OVERRIDE_RX_FLOW;
|
||||
if (pause & MLO_PAUSE_TX)
|
||||
reg |= PORT_OVERRIDE_TX_FLOW;
|
||||
if (is5325(dev))
|
||||
reg &= ~PORT_OVERRIDE_LP_FLOW_25;
|
||||
else
|
||||
reg &= ~(PORT_OVERRIDE_RX_FLOW | PORT_OVERRIDE_TX_FLOW);
|
||||
|
||||
if (rx_pause) {
|
||||
if (is5325(dev))
|
||||
reg |= PORT_OVERRIDE_LP_FLOW_25;
|
||||
else
|
||||
reg |= PORT_OVERRIDE_RX_FLOW;
|
||||
}
|
||||
|
||||
if (tx_pause) {
|
||||
if (is5325(dev))
|
||||
reg |= PORT_OVERRIDE_LP_FLOW_25;
|
||||
else
|
||||
reg |= PORT_OVERRIDE_TX_FLOW;
|
||||
}
|
||||
|
||||
b53_write8(dev, B53_CTRL_PAGE, off, reg);
|
||||
}
|
||||
|
|
@ -1093,22 +1116,24 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,
|
|||
struct b53_device *dev = ds->priv;
|
||||
struct ethtool_eee *p = &dev->ports[port].eee;
|
||||
u8 rgmii_ctrl = 0, reg = 0, off;
|
||||
int pause = 0;
|
||||
bool tx_pause = false;
|
||||
bool rx_pause = false;
|
||||
|
||||
if (!phy_is_pseudo_fixed_link(phydev))
|
||||
return;
|
||||
|
||||
/* Enable flow control on BCM5301x's CPU port */
|
||||
if (is5301x(dev) && port == dev->cpu_port)
|
||||
pause = MLO_PAUSE_TXRX_MASK;
|
||||
tx_pause = rx_pause = true;
|
||||
|
||||
if (phydev->pause) {
|
||||
if (phydev->asym_pause)
|
||||
pause |= MLO_PAUSE_TX;
|
||||
pause |= MLO_PAUSE_RX;
|
||||
tx_pause = true;
|
||||
rx_pause = true;
|
||||
}
|
||||
|
||||
b53_force_port_config(dev, port, phydev->speed, phydev->duplex, pause);
|
||||
b53_force_port_config(dev, port, phydev->speed, phydev->duplex,
|
||||
tx_pause, rx_pause);
|
||||
b53_force_link(dev, port, phydev->link);
|
||||
|
||||
if (is531x5(dev) && phy_interface_is_rgmii(phydev)) {
|
||||
|
|
@ -1170,7 +1195,7 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,
|
|||
} else if (is5301x(dev)) {
|
||||
if (port != dev->cpu_port) {
|
||||
b53_force_port_config(dev, dev->cpu_port, 2000,
|
||||
DUPLEX_FULL, MLO_PAUSE_TXRX_MASK);
|
||||
DUPLEX_FULL, true, true);
|
||||
b53_force_link(dev, dev->cpu_port, 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -1260,7 +1285,9 @@ void b53_phylink_mac_config(struct dsa_switch *ds, int port,
|
|||
|
||||
if (mode == MLO_AN_FIXED) {
|
||||
b53_force_port_config(dev, port, state->speed,
|
||||
state->duplex, state->pause);
|
||||
state->duplex,
|
||||
!!(state->pause & MLO_PAUSE_TX),
|
||||
!!(state->pause & MLO_PAUSE_RX));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1616,7 +1643,7 @@ static int b53_arl_search_wait(struct b53_device *dev)
|
|||
do {
|
||||
b53_read8(dev, B53_ARLIO_PAGE, B53_ARL_SRCH_CTL, ®);
|
||||
if (!(reg & ARL_SRCH_STDN))
|
||||
return 0;
|
||||
return -ENOENT;
|
||||
|
||||
if (reg & ARL_SRCH_VLID)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@
|
|||
#define PORT_OVERRIDE_SPEED_10M (0 << PORT_OVERRIDE_SPEED_S)
|
||||
#define PORT_OVERRIDE_SPEED_100M (1 << PORT_OVERRIDE_SPEED_S)
|
||||
#define PORT_OVERRIDE_SPEED_1000M (2 << PORT_OVERRIDE_SPEED_S)
|
||||
#define PORT_OVERRIDE_LP_FLOW_25 BIT(3) /* BCM5325 only */
|
||||
#define PORT_OVERRIDE_RV_MII_25 BIT(4) /* BCM5325 only */
|
||||
#define PORT_OVERRIDE_RX_FLOW BIT(4)
|
||||
#define PORT_OVERRIDE_TX_FLOW BIT(5)
|
||||
|
|
@ -103,8 +104,7 @@
|
|||
|
||||
/* IP Multicast control (8 bit) */
|
||||
#define B53_IP_MULTICAST_CTRL 0x21
|
||||
#define B53_IP_MCAST_25 BIT(0)
|
||||
#define B53_IPMC_FWD_EN BIT(1)
|
||||
#define B53_IP_MC BIT(0)
|
||||
#define B53_UC_FWD_EN BIT(6)
|
||||
#define B53_MC_FWD_EN BIT(7)
|
||||
|
||||
|
|
|
|||
|
|
@ -277,9 +277,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 */
|
||||
|
|
|
|||
|
|
@ -1298,7 +1298,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;
|
||||
|
|
@ -1362,7 +1363,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;
|
||||
}
|
||||
|
|
@ -1389,7 +1390,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))
|
||||
|
|
|
|||
|
|
@ -1530,6 +1530,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_ */
|
||||
|
|
|
|||
|
|
@ -1509,7 +1509,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);
|
||||
|
|
|
|||
|
|
@ -465,7 +465,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,26 +579,35 @@ 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;
|
||||
__u64 upper_limit_gbps;
|
||||
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;
|
||||
upper_limit_gbps = 255 * MLX5E_1GB;
|
||||
|
||||
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;
|
||||
max_bw_unit[i] = MLX5_100_MBPS_UNIT;
|
||||
} else {
|
||||
} else if (max_bw_value[i] <= upper_limit_gbps) {
|
||||
max_bw_value[i] = div_u64(maxrate->tc_maxrate[i],
|
||||
MLX5E_1GB);
|
||||
max_bw_unit[i] = MLX5_GBPS_UNIT;
|
||||
} else {
|
||||
netdev_err(netdev,
|
||||
"tc_%d maxrate %llu Kbps exceeds limit %llu\n",
|
||||
i, maxrate->tc_maxrate[i],
|
||||
upper_limit_gbps);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -542,8 +542,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);
|
||||
|
|
|
|||
|
|
@ -216,7 +216,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
|
||||
|
|
|
|||
|
|
@ -1593,13 +1593,25 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|||
}
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
/* Descriptor type must be set after all the above writes */
|
||||
dma_wmb();
|
||||
|
||||
if (num_tx_desc > 1) {
|
||||
desc->die_dt = DT_FEND;
|
||||
desc--;
|
||||
/* When using multi-descriptors, DT_FEND needs to get written
|
||||
* before DT_FSTART, but the compiler may reorder the memory
|
||||
* writes in an attempt to optimize the code.
|
||||
* Use a dma_wmb() barrier to make sure DT_FEND and DT_FSTART
|
||||
* are written exactly in the order shown in the code.
|
||||
* This is particularly important for cases where the DMA engine
|
||||
* is already running when we are running this code. If the DMA
|
||||
* sees DT_FSTART without the corresponding DT_FEND it will enter
|
||||
* an error condition.
|
||||
*/
|
||||
dma_wmb();
|
||||
desc->die_dt = DT_FSTART;
|
||||
} else {
|
||||
/* Descriptor type must be set after all the above writes */
|
||||
dma_wmb();
|
||||
desc->die_dt = DT_FSINGLE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2397,6 +2397,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);
|
||||
|
|
@ -2423,6 +2424,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,
|
||||
|
|
@ -2438,8 +2440,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 */
|
||||
|
|
|
|||
|
|
@ -1339,10 +1339,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;
|
||||
}
|
||||
|
||||
|
|
@ -1360,7 +1360,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;
|
||||
|
|
@ -1679,10 +1679,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -337,6 +337,12 @@ static int dp83867_config_init(struct phy_device *phydev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
|
|
|
|||
|
|
@ -89,8 +89,11 @@ int mdiobus_register_device(struct mdio_device *mdiodev)
|
|||
return err;
|
||||
|
||||
err = mdiobus_register_reset(mdiodev);
|
||||
if (err)
|
||||
if (err) {
|
||||
gpiod_put(mdiodev->reset_gpio);
|
||||
mdiodev->reset_gpio = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Assert the reset signal */
|
||||
mdio_device_reset(mdiodev, 1);
|
||||
|
|
|
|||
|
|
@ -230,7 +230,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--) {
|
||||
|
|
@ -681,7 +683,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)) {
|
||||
|
|
@ -1063,7 +1067,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);
|
||||
|
|
|
|||
|
|
@ -229,6 +229,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);
|
||||
|
|
|
|||
|
|
@ -1622,6 +1622,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);
|
||||
|
|
|
|||
|
|
@ -1894,6 +1894,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4963,8 +4963,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);
|
||||
|
|
|
|||
|
|
@ -1477,6 +1477,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.
|
||||
*
|
||||
|
|
@ -1486,11 +1487,11 @@ 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_pub *drvr = p2p->cfg->pub;
|
||||
struct brcmf_cfg80211_vif *vif;
|
||||
s32 err = 0;
|
||||
s32 timeout = 0;
|
||||
|
||||
|
|
@ -1500,8 +1501,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) {
|
||||
bphy_err(drvr, " sending action frame has failed\n");
|
||||
|
|
@ -1643,16 +1643,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) {
|
||||
|
|
@ -2137,7 +2135,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);
|
||||
|
|
@ -2390,6 +2387,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)) {
|
||||
|
|
|
|||
|
|
@ -165,8 +165,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);
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size,
|
|||
pages_free:
|
||||
devm_memunmap_pages(&pdev->dev, pgmap);
|
||||
pgmap_free:
|
||||
devm_kfree(&pdev->dev, pgmap);
|
||||
devm_kfree(&pdev->dev, p2p_pgmap);
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_p2pdma_add_resource);
|
||||
|
|
|
|||
|
|
@ -2541,6 +2541,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
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ static int cdns_dsi_get_dphy_pll_cfg(struct cdns_dphy *dphy,
|
|||
|
||||
dlane_bps = opts->hs_clk_rate;
|
||||
|
||||
if (dlane_bps > 2500000000UL || dlane_bps < 160000000UL)
|
||||
if (dlane_bps > 2500000000UL || dlane_bps < 80000000UL)
|
||||
return -EINVAL;
|
||||
else if (dlane_bps >= 1250000000)
|
||||
cfg->pll_opdiv = 1;
|
||||
|
|
@ -125,6 +125,8 @@ static int cdns_dsi_get_dphy_pll_cfg(struct cdns_dphy *dphy,
|
|||
cfg->pll_opdiv = 4;
|
||||
else if (dlane_bps >= 160000000)
|
||||
cfg->pll_opdiv = 8;
|
||||
else if (dlane_bps >= 80000000)
|
||||
cfg->pll_opdiv = 16;
|
||||
|
||||
cfg->pll_fbdiv = DIV_ROUND_UP_ULL(dlane_bps * 2 * cfg->pll_opdiv *
|
||||
cfg->pll_ipdiv,
|
||||
|
|
|
|||
|
|
@ -244,8 +244,10 @@ 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));
|
||||
gpiod_put(cfg.ena_gpiod);
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -712,7 +712,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
|
||||
|
|
|
|||
|
|
@ -5153,7 +5153,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.
|
||||
*
|
||||
|
|
@ -5312,8 +5312,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;
|
||||
}
|
||||
|
||||
|
|
@ -5457,7 +5463,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);
|
||||
|
|
|
|||
|
|
@ -596,7 +596,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) {
|
||||
|
|
|
|||
|
|
@ -2214,9 +2214,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);
|
||||
|
||||
|
|
|
|||
|
|
@ -540,6 +540,8 @@ static int imx_gpc_remove(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
of_node_put(pgc_node);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -709,7 +709,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;
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue