mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
This is the 4.14.79 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlve+b8ACgkQONu9yGCS aT5cXA//Q9gvEZaPH/q5+QMH1imNbOaIFxkL9VDechj9VIiEzJaZQ48OOHO8y4hv AFl9LL7uRkYb77NWwPaQ6Izy2lLV/EuINYUnCIdF/1U0oAuz+1ZkzyweHe5qTub/ j2X39wRnvc1ZW7ZqjYsj2VnDe+78+MhuU0DmcvdBuiRpxpbinFNTnol6uMQasvdF E6zjAPrjRqEn9RNo1W3zibGIWbJnweIsY3aqI6ugGuChamR8zDng1EV6PWUMRdWB jSKZUxaoR1Y+zMm9g/Uvp96LlFa5DLy6qLayE9o9ahLHbvf56xTLkFUJKbz8QhiJ Cjq0Cplmg1gPK+sFM+YQBFw3kMvxkZtDYcsTeNUqwTLiz0GLV26JpSQJCTWl3bXY 3vdZaybdZ9axlo8+e7dpHvr74Wr0eT4l3DJSmHUcZA6vk94f+b6DR1Sx0Q/gd8Op loNIsMaOtccZRKfc0Xfi/8sQfYFtnflhb4TEmaiTZkRhhbO5ZxaWZqlZVn3+wQqw k18EODPdsHLFh8PVYaUbzIpjRDveigyvi0wWQXXPOoudQM7QjkVwM5uei766AGe1 0swOb3fIagt5Zkha3GvlvI2wN1AcQcqbcAijKCYZj7OZ9fvBWErt2Nt2sEW9Op1/ fuEf6iCZN+yoKc7v+5nI33PvpNVr1ntE1kR36F1HKinHEXxh5Rk= =tSWE -----END PGP SIGNATURE----- Merge 4.14.79 into android-4.14 Changes in 4.14.79 xfrm: Validate address prefix lengths in the xfrm selector. xfrm6: call kfree_skb when skb is toobig xfrm: reset transport header back to network header after all input transforms ahave been applied xfrm: reset crypto_done when iterating over multiple input xfrms mac80211: Always report TX status cfg80211: reg: Init wiphy_idx in regulatory_hint_core() mac80211: fix pending queue hang due to TX_DROP cfg80211: Address some corner cases in scan result channel updating mac80211: TDLS: fix skb queue/priority assignment mac80211: fix TX status reporting for ieee80211s xfrm: Fix NULL pointer dereference when skb_dst_force clears the dst_entry. ARM: 8799/1: mm: fix pci_ioremap_io() offset check xfrm: validate template mode netfilter: bridge: Don't sabotage nf_hook calls from an l3mdev arm64: hugetlb: Fix handling of young ptes ARM: dts: BCM63xx: Fix incorrect interrupt specifiers net: macb: Clean 64b dma addresses if they are not detected soc: fsl: qbman: qman: avoid allocating from non existing gen_pool soc: fsl: qe: Fix copy/paste bug in ucc_get_tdm_sync_shift() nl80211: Fix possible Spectre-v1 for NL80211_TXRATE_HT mac80211_hwsim: do not omit multicast announce of first added radio Bluetooth: SMP: fix crash in unpairing pxa168fb: prepare the clock qed: Avoid implicit enum conversion in qed_set_tunn_cls_info qed: Fix mask parameter in qed_vf_prep_tunn_req_tlv qed: Avoid implicit enum conversion in qed_roce_mode_to_flavor qed: Avoid constant logical operation warning in qed_vf_pf_acquire qed: Avoid implicit enum conversion in qed_iwarp_parse_rx_pkt nl80211: Fix possible Spectre-v1 for CQM RSSI thresholds asix: Check for supported Wake-on-LAN modes ax88179_178a: Check for supported Wake-on-LAN modes lan78xx: Check for supported Wake-on-LAN modes sr9800: Check for supported Wake-on-LAN modes r8152: Check for supported Wake-on-LAN Modes smsc75xx: Check for Wake-on-LAN modes smsc95xx: Check for Wake-on-LAN modes cfg80211: fix use-after-free in reg_process_hint() perf/core: Fix perf_pmu_unregister() locking perf/ring_buffer: Prevent concurent ring buffer access perf/x86/intel/uncore: Fix PCI BDF address of M3UPI on SKX perf/x86/amd/uncore: Set ThreadMask and SliceMask for L3 Cache perf events net: fec: fix rare tx timeout declance: Fix continuation with the adapter identification message net: qualcomm: rmnet: Skip processing loopback packets locking/ww_mutex: Fix runtime warning in the WW mutex selftest be2net: don't flip hw_features when VXLANs are added/deleted net: cxgb3_main: fix a missing-check bug yam: fix a missing-check bug ocfs2: fix crash in ocfs2_duplicate_clusters_by_page() iwlwifi: mvm: check for short GI only for OFDM iwlwifi: dbg: allow wrt collection before ALIVE iwlwifi: fix the ALIVE notification layout tools/testing/nvdimm: unit test clear-error commands usbip: vhci_hcd: update 'status' file header and format scsi: aacraid: address UBSAN warning regression IB/ipoib: Fix lockdep issue found on ipoib_ib_dev_heavy_flush IB/rxe: put the pool on allocation failure s390/qeth: fix error handling in adapter command callbacks net/mlx5: Fix mlx5_get_vector_affinity function powerpc/pseries: Add empty update_numa_cpu_lookup_table() for NUMA=n dm integrity: fail early if required HMAC key is not available net: phy: realtek: Use the dummy stubs for MMD register access for rtl8211b net: phy: Add general dummy stubs for MMD register access net/mlx5e: Refine ets validation function scsi: qla2xxx: Avoid double completion of abort command kbuild: set no-integrated-as before incl. arch Makefile IB/mlx5: Avoid passing an invalid QP type to firmware ARM: tegra: Fix ULPI regression on Tegra20 l2tp: remove configurable payload offset cifs: Use ULL suffix for 64-bit constant test_bpf: Fix testing with CONFIG_BPF_JIT_ALWAYS_ON=y on other arches KVM: x86: Update the exit_qualification access bits while walking an address sparc64: Fix regression in pmdp_invalidate(). tpm: move the delay_msec increment after sleep in tpm_transmit() bpf: sockmap, map_release does not hold refcnt for pinned maps tpm: tpm_crb: relinquish locality on error path. xen-netfront: Update features after registering netdev xen-netfront: Fix mismatched rtnl_unlock IB/usnic: Update with bug fixes from core code mmc: dw_mmc-rockchip: correct property names in debug MIPS: Workaround GCC __builtin_unreachable reordering bug lan78xx: Don't reset the interface on open enic: do not overwrite error code iio: buffer: fix the function signature to match implementation selftests/powerpc: Add ptrace hw breakpoint test scsi: ibmvfc: Avoid unnecessary port relogin scsi: sd: Remember that READ CAPACITY(16) succeeded btrfs: quota: Set rescan progress to (u64)-1 if we hit last leaf net: phy: phylink: Don't release NULL GPIO x86/paravirt: Fix some warning messages net: stmmac: mark PM functions as __maybe_unused kconfig: fix the rule of mainmenu_stmt symbol libertas: call into generic suspend code before turning off power perf tests: Fix indexing when invoking subtests compiler.h: Allow arch-specific asm/compiler.h ARM: dts: imx53-qsb: disable 1.2GHz OPP perf python: Use -Wno-redundant-decls to build with PYTHON=python3 rxrpc: Don't check RXRPC_CALL_TX_LAST after calling rxrpc_rotate_tx_window() rxrpc: Only take the rwind and mtu values from latest ACK rxrpc: Fix connection-level abort handling net: ena: fix warning in rmmod caused by double iounmap net: ena: fix NULL dereference due to untimely napi initialization selftests: rtnetlink.sh explicitly requires bash. fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters() sch_netem: restore skb->dev after dequeuing from the rbtree mtd: spi-nor: Add support for is25wp series chips kvm: x86: fix WARN due to uninitialized guest FPU state ARM: dts: r8a7790: Correct critical CPU temperature media: uvcvideo: Fix driver reference counting ALSA: usx2y: Fix invalid stream URBs Revert "netfilter: ipv6: nf_defrag: drop skb dst before queueing" perf tools: Disable parallelism for 'make clean' drm/i915/gvt: fix memory leak of a cmd_entry struct on error exit path bridge: do not add port to router list when receives query with source 0.0.0.0 net: bridge: remove ipv6 zero address check in mcast queries ipv6: mcast: fix a use-after-free in inet6_mc_check ipv6/ndisc: Preserve IPv6 control buffer if protocol error handlers are called llc: set SOCK_RCU_FREE in llc_sap_add_socket() net: fec: don't dump RX FIFO register when not available net/ipv6: Fix index counter for unicast addresses in in6_dump_addrs net: sched: gred: pass the right attribute to gred_change_table_def() net: socket: fix a missing-check bug net: stmmac: Fix stmmac_mdio_reset() when building stmmac as modules net: udp: fix handling of CHECKSUM_COMPLETE packets r8169: fix NAPI handling under high load sctp: fix race on sctp_id2asoc udp6: fix encap return code for resubmitting vhost: Fix Spectre V1 vulnerability virtio_net: avoid using netif_tx_disable() for serializing tx routine ethtool: fix a privilege escalation bug bonding: fix length of actor system ip6_tunnel: Fix encapsulation layout openvswitch: Fix push/pop ethernet validation net/mlx5: Take only bit 24-26 of wqe.pftype_wq for page fault type net: sched: Fix for duplicate class dump net: drop skb on failure in ip_check_defrag() net: fix pskb_trim_rcsum_slow() with odd trim offset net/mlx5e: fix csum adjustments caused by RXFCS rtnetlink: Disallow FDB configuration for non-Ethernet device net: ipmr: fix unresolved entry dumps net: bcmgenet: Poll internal PHY for GENETv5 net/sched: cls_api: add missing validation of netlink attributes net/mlx5: Fix build break when CONFIG_SMP=n Linux 4.14.79 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
6c95b90db5
6
Makefile
6
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 78
|
||||
SUBLEVEL = 79
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
@ -489,6 +489,8 @@ CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||
endif
|
||||
KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC)
|
||||
KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC)
|
||||
KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
|
||||
KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
||||
endif
|
||||
|
||||
RETPOLINE_CFLAGS_GCC := -mindirect-branch=thunk-extern -mindirect-branch-register
|
||||
@ -738,8 +740,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
|
||||
# See modpost pattern 2
|
||||
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
|
||||
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
|
||||
KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
|
||||
KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
||||
else
|
||||
|
||||
# These warnings generated too much noise in a regular build.
|
||||
|
@ -1034,4 +1034,12 @@ config REFCOUNT_FULL
|
||||
against various use-after-free conditions that can be used in
|
||||
security flaw exploits.
|
||||
|
||||
config HAVE_ARCH_COMPILER_H
|
||||
bool
|
||||
help
|
||||
An architecture can select this if it provides an
|
||||
asm/compiler.h header that should be included after
|
||||
linux/compiler-*.h in order to override macro definitions that those
|
||||
headers generally provide.
|
||||
|
||||
source "kernel/gcov/Kconfig"
|
||||
|
@ -106,21 +106,23 @@
|
||||
global_timer: timer@1e200 {
|
||||
compatible = "arm,cortex-a9-global-timer";
|
||||
reg = <0x1e200 0x20>;
|
||||
interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_PPI 11 IRQ_TYPE_EDGE_RISING>;
|
||||
clocks = <&axi_clk>;
|
||||
};
|
||||
|
||||
local_timer: local-timer@1e600 {
|
||||
compatible = "arm,cortex-a9-twd-timer";
|
||||
reg = <0x1e600 0x20>;
|
||||
interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) |
|
||||
IRQ_TYPE_EDGE_RISING)>;
|
||||
clocks = <&axi_clk>;
|
||||
};
|
||||
|
||||
twd_watchdog: watchdog@1e620 {
|
||||
compatible = "arm,cortex-a9-twd-wdt";
|
||||
reg = <0x1e620 0x20>;
|
||||
interrupts = <GIC_PPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) |
|
||||
IRQ_TYPE_LEVEL_HIGH)>;
|
||||
};
|
||||
|
||||
armpll: armpll {
|
||||
@ -158,7 +160,7 @@
|
||||
serial0: serial@600 {
|
||||
compatible = "brcm,bcm6345-uart";
|
||||
reg = <0x600 0x1b>;
|
||||
interrupts = <GIC_SPI 32 0>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&periph_clk>;
|
||||
clock-names = "periph";
|
||||
status = "disabled";
|
||||
@ -167,7 +169,7 @@
|
||||
serial1: serial@620 {
|
||||
compatible = "brcm,bcm6345-uart";
|
||||
reg = <0x620 0x1b>;
|
||||
interrupts = <GIC_SPI 33 0>;
|
||||
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&periph_clk>;
|
||||
clock-names = "periph";
|
||||
status = "disabled";
|
||||
@ -180,7 +182,7 @@
|
||||
reg = <0x2000 0x600>, <0xf0 0x10>;
|
||||
reg-names = "nand", "nand-int-base";
|
||||
status = "disabled";
|
||||
interrupts = <GIC_SPI 38 0>;
|
||||
interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "nand";
|
||||
};
|
||||
|
||||
|
@ -130,6 +130,17 @@
|
||||
};
|
||||
};
|
||||
|
||||
&cpu0 {
|
||||
/* CPU rated to 1GHz, not 1.2GHz as per the default settings */
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
166666 850000
|
||||
400000 900000
|
||||
800000 1050000
|
||||
1000000 1200000
|
||||
>;
|
||||
};
|
||||
|
||||
&esdhc1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_esdhc1>;
|
||||
|
@ -153,7 +153,7 @@
|
||||
|
||||
trips {
|
||||
cpu-crit {
|
||||
temperature = <115000>;
|
||||
temperature = <95000>;
|
||||
hysteresis = <0>;
|
||||
type = "critical";
|
||||
};
|
||||
|
@ -706,7 +706,7 @@
|
||||
phy_type = "ulpi";
|
||||
clocks = <&tegra_car TEGRA20_CLK_USB2>,
|
||||
<&tegra_car TEGRA20_CLK_PLL_U>,
|
||||
<&tegra_car TEGRA20_CLK_CDEV2>;
|
||||
<&tegra_car TEGRA20_CLK_PLL_P_OUT4>;
|
||||
clock-names = "reg", "pll_u", "ulpi-link";
|
||||
resets = <&tegra_car 58>, <&tegra_car 22>;
|
||||
reset-names = "usb", "utmi-pads";
|
||||
|
@ -473,7 +473,7 @@ void pci_ioremap_set_mem_type(int mem_type)
|
||||
|
||||
int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr)
|
||||
{
|
||||
BUG_ON(offset + SZ_64K > IO_SPACE_LIMIT);
|
||||
BUG_ON(offset + SZ_64K - 1 > IO_SPACE_LIMIT);
|
||||
|
||||
return ioremap_page_range(PCI_IO_VIRT_BASE + offset,
|
||||
PCI_IO_VIRT_BASE + offset + SZ_64K,
|
||||
|
@ -118,11 +118,14 @@ static pte_t get_clear_flush(struct mm_struct *mm,
|
||||
|
||||
/*
|
||||
* If HW_AFDBM is enabled, then the HW could turn on
|
||||
* the dirty bit for any page in the set, so check
|
||||
* them all. All hugetlb entries are already young.
|
||||
* the dirty or accessed bit for any page in the set,
|
||||
* so check them all.
|
||||
*/
|
||||
if (pte_dirty(pte))
|
||||
orig_pte = pte_mkdirty(orig_pte);
|
||||
|
||||
if (pte_young(pte))
|
||||
orig_pte = pte_mkyoung(orig_pte);
|
||||
}
|
||||
|
||||
if (valid)
|
||||
@ -347,10 +350,13 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
if (!pte_same(orig_pte, pte))
|
||||
changed = 1;
|
||||
|
||||
/* Make sure we don't lose the dirty state */
|
||||
/* Make sure we don't lose the dirty or young state */
|
||||
if (pte_dirty(orig_pte))
|
||||
pte = pte_mkdirty(pte);
|
||||
|
||||
if (pte_young(orig_pte))
|
||||
pte = pte_mkyoung(pte);
|
||||
|
||||
hugeprot = pte_pgprot(pte);
|
||||
for (i = 0; i < ncontig; i++, ptep++, addr += pgsize, pfn += dpfn)
|
||||
set_pte_at(vma->vm_mm, addr, ptep, pfn_pte(pfn, hugeprot));
|
||||
|
@ -29,6 +29,7 @@ config MIPS
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select HANDLE_DOMAIN_IRQ
|
||||
select HAVE_ARCH_COMPILER_H
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_MMAP_RND_BITS if MMU
|
||||
|
@ -8,6 +8,41 @@
|
||||
#ifndef _ASM_COMPILER_H
|
||||
#define _ASM_COMPILER_H
|
||||
|
||||
/*
|
||||
* With GCC 4.5 onwards we can use __builtin_unreachable to indicate to the
|
||||
* compiler that a particular code path will never be hit. This allows it to be
|
||||
* optimised out of the generated binary.
|
||||
*
|
||||
* Unfortunately at least GCC 4.6.3 through 7.3.0 inclusive suffer from a bug
|
||||
* that can lead to instructions from beyond an unreachable statement being
|
||||
* incorrectly reordered into earlier delay slots if the unreachable statement
|
||||
* is the only content of a case in a switch statement. This can lead to
|
||||
* seemingly random behaviour, such as invalid memory accesses from incorrectly
|
||||
* reordered loads or stores. See this potential GCC fix for details:
|
||||
*
|
||||
* https://gcc.gnu.org/ml/gcc-patches/2015-09/msg00360.html
|
||||
*
|
||||
* It is unclear whether GCC 8 onwards suffer from the same issue - nothing
|
||||
* relevant is mentioned in GCC 8 release notes and nothing obviously relevant
|
||||
* stands out in GCC commit logs, but these newer GCC versions generate very
|
||||
* different code for the testcase which doesn't exhibit the bug.
|
||||
*
|
||||
* GCC also handles stack allocation suboptimally when calling noreturn
|
||||
* functions or calling __builtin_unreachable():
|
||||
*
|
||||
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365
|
||||
*
|
||||
* We work around both of these issues by placing a volatile asm statement,
|
||||
* which GCC is prevented from reordering past, prior to __builtin_unreachable
|
||||
* calls.
|
||||
*
|
||||
* The .insn statement is required to ensure that any branches to the
|
||||
* statement, which sadly must be kept due to the asm statement, are known to
|
||||
* be branches to code and satisfy linker requirements for microMIPS kernels.
|
||||
*/
|
||||
#undef barrier_before_unreachable
|
||||
#define barrier_before_unreachable() asm volatile(".insn")
|
||||
|
||||
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
#define GCC_IMM_ASM() "n"
|
||||
#define GCC_REG_ACCUM "$0"
|
||||
|
@ -81,6 +81,9 @@ static inline int numa_update_cpu_topology(bool cpus_locked)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void update_numa_cpu_lookup_table(unsigned int cpu, int node) {}
|
||||
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#if defined(CONFIG_NUMA) && defined(CONFIG_PPC_SPLPAR)
|
||||
|
@ -163,13 +163,10 @@ static void tlb_batch_pmd_scan(struct mm_struct *mm, unsigned long vaddr,
|
||||
pte_unmap(pte);
|
||||
}
|
||||
|
||||
void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
||||
pmd_t *pmdp, pmd_t pmd)
|
||||
|
||||
static void __set_pmd_acct(struct mm_struct *mm, unsigned long addr,
|
||||
pmd_t orig, pmd_t pmd)
|
||||
{
|
||||
pmd_t orig = *pmdp;
|
||||
|
||||
*pmdp = pmd;
|
||||
|
||||
if (mm == &init_mm)
|
||||
return;
|
||||
|
||||
@ -219,6 +216,15 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
||||
}
|
||||
}
|
||||
|
||||
void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
||||
pmd_t *pmdp, pmd_t pmd)
|
||||
{
|
||||
pmd_t orig = *pmdp;
|
||||
|
||||
*pmdp = pmd;
|
||||
__set_pmd_acct(mm, addr, orig, pmd);
|
||||
}
|
||||
|
||||
static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
||||
unsigned long address, pmd_t *pmdp, pmd_t pmd)
|
||||
{
|
||||
@ -227,6 +233,7 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
||||
do {
|
||||
old = *pmdp;
|
||||
} while (cmpxchg64(&pmdp->pmd, old.pmd, pmd.pmd) != old.pmd);
|
||||
__set_pmd_acct(vma->vm_mm, address, old, pmd);
|
||||
|
||||
return old;
|
||||
}
|
||||
|
@ -35,6 +35,7 @@
|
||||
|
||||
static int num_counters_llc;
|
||||
static int num_counters_nb;
|
||||
static bool l3_mask;
|
||||
|
||||
static HLIST_HEAD(uncore_unused_list);
|
||||
|
||||
@ -208,6 +209,13 @@ static int amd_uncore_event_init(struct perf_event *event)
|
||||
hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB;
|
||||
hwc->idx = -1;
|
||||
|
||||
/*
|
||||
* SliceMask and ThreadMask need to be set for certain L3 events in
|
||||
* Family 17h. For other events, the two fields do not affect the count.
|
||||
*/
|
||||
if (l3_mask)
|
||||
hwc->config |= (AMD64_L3_SLICE_MASK | AMD64_L3_THREAD_MASK);
|
||||
|
||||
if (event->cpu < 0)
|
||||
return -EINVAL;
|
||||
|
||||
@ -542,6 +550,7 @@ static int __init amd_uncore_init(void)
|
||||
amd_llc_pmu.name = "amd_l3";
|
||||
format_attr_event_df.show = &event_show_df;
|
||||
format_attr_event_l3.show = &event_show_l3;
|
||||
l3_mask = true;
|
||||
} else {
|
||||
num_counters_nb = NUM_COUNTERS_NB;
|
||||
num_counters_llc = NUM_COUNTERS_L2;
|
||||
@ -549,6 +558,7 @@ static int __init amd_uncore_init(void)
|
||||
amd_llc_pmu.name = "amd_l2";
|
||||
format_attr_event_df = format_attr_event;
|
||||
format_attr_event_l3 = format_attr_event;
|
||||
l3_mask = false;
|
||||
}
|
||||
|
||||
amd_nb_pmu.attr_groups = amd_uncore_attr_groups_df;
|
||||
|
@ -3807,16 +3807,16 @@ static const struct pci_device_id skx_uncore_pci_ids[] = {
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(21, 5, SKX_PCI_UNCORE_M2PCIE, 3),
|
||||
},
|
||||
{ /* M3UPI0 Link 0 */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204C),
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 0, SKX_PCI_UNCORE_M3UPI, 0),
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 0),
|
||||
},
|
||||
{ /* M3UPI0 Link 1 */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 1, SKX_PCI_UNCORE_M3UPI, 1),
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204E),
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 2, SKX_PCI_UNCORE_M3UPI, 1),
|
||||
},
|
||||
{ /* M3UPI1 Link 2 */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204C),
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 4, SKX_PCI_UNCORE_M3UPI, 2),
|
||||
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x204D),
|
||||
.driver_data = UNCORE_PCI_DEV_FULL_DATA(18, 5, SKX_PCI_UNCORE_M3UPI, 2),
|
||||
},
|
||||
{ /* end: all zeroes */ }
|
||||
};
|
||||
|
@ -46,6 +46,14 @@
|
||||
#define INTEL_ARCH_EVENT_MASK \
|
||||
(ARCH_PERFMON_EVENTSEL_UMASK | ARCH_PERFMON_EVENTSEL_EVENT)
|
||||
|
||||
#define AMD64_L3_SLICE_SHIFT 48
|
||||
#define AMD64_L3_SLICE_MASK \
|
||||
((0xFULL) << AMD64_L3_SLICE_SHIFT)
|
||||
|
||||
#define AMD64_L3_THREAD_SHIFT 56
|
||||
#define AMD64_L3_THREAD_MASK \
|
||||
((0xFFULL) << AMD64_L3_THREAD_SHIFT)
|
||||
|
||||
#define X86_RAW_EVENT_MASK \
|
||||
(ARCH_PERFMON_EVENTSEL_EVENT | \
|
||||
ARCH_PERFMON_EVENTSEL_UMASK | \
|
||||
|
@ -90,7 +90,7 @@ unsigned paravirt_patch_call(void *insnbuf,
|
||||
|
||||
if (len < 5) {
|
||||
#ifdef CONFIG_RETPOLINE
|
||||
WARN_ONCE("Failing to patch indirect CALL in %ps\n", (void *)addr);
|
||||
WARN_ONCE(1, "Failing to patch indirect CALL in %ps\n", (void *)addr);
|
||||
#endif
|
||||
return len; /* call too long for patch site */
|
||||
}
|
||||
@ -110,7 +110,7 @@ unsigned paravirt_patch_jmp(void *insnbuf, const void *target,
|
||||
|
||||
if (len < 5) {
|
||||
#ifdef CONFIG_RETPOLINE
|
||||
WARN_ONCE("Failing to patch indirect JMP in %ps\n", (void *)addr);
|
||||
WARN_ONCE(1, "Failing to patch indirect JMP in %ps\n", (void *)addr);
|
||||
#endif
|
||||
return len; /* call too long for patch site */
|
||||
}
|
||||
|
@ -452,14 +452,21 @@ error:
|
||||
* done by is_rsvd_bits_set() above.
|
||||
*
|
||||
* We set up the value of exit_qualification to inject:
|
||||
* [2:0] - Derive from [2:0] of real exit_qualification at EPT violation
|
||||
* [2:0] - Derive from the access bits. The exit_qualification might be
|
||||
* out of date if it is serving an EPT misconfiguration.
|
||||
* [5:3] - Calculated by the page walk of the guest EPT page tables
|
||||
* [7:8] - Derived from [7:8] of real exit_qualification
|
||||
*
|
||||
* The other bits are set to 0.
|
||||
*/
|
||||
if (!(errcode & PFERR_RSVD_MASK)) {
|
||||
vcpu->arch.exit_qualification &= 0x187;
|
||||
vcpu->arch.exit_qualification &= 0x180;
|
||||
if (write_fault)
|
||||
vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_WRITE;
|
||||
if (user_fault)
|
||||
vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_READ;
|
||||
if (fetch_fault)
|
||||
vcpu->arch.exit_qualification |= EPT_VIOLATION_ACC_INSTR;
|
||||
vcpu->arch.exit_qualification |= (pte_access & 0x7) << 3;
|
||||
}
|
||||
#endif
|
||||
|
@ -7393,13 +7393,12 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu)
|
||||
|
||||
int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||
{
|
||||
struct fpu *fpu = ¤t->thread.fpu;
|
||||
int r;
|
||||
|
||||
fpu__initialize(fpu);
|
||||
|
||||
kvm_sigset_activate(vcpu);
|
||||
|
||||
kvm_load_guest_fpu(vcpu);
|
||||
|
||||
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
||||
if (kvm_run->immediate_exit) {
|
||||
r = -EINTR;
|
||||
@ -7440,6 +7439,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||
r = vcpu_run(vcpu);
|
||||
|
||||
out:
|
||||
kvm_put_guest_fpu(vcpu);
|
||||
post_kvm_run_save(vcpu);
|
||||
kvm_sigset_deactivate(vcpu);
|
||||
|
||||
|
@ -611,12 +611,13 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space,
|
||||
rc = be32_to_cpu(header->return_code);
|
||||
if (rc != TPM2_RC_RETRY)
|
||||
break;
|
||||
delay_msec *= 2;
|
||||
|
||||
if (delay_msec > TPM2_DURATION_LONG) {
|
||||
dev_err(&chip->dev, "TPM is in retry loop\n");
|
||||
break;
|
||||
}
|
||||
tpm_msleep(delay_msec);
|
||||
delay_msec *= 2;
|
||||
memcpy(buf, save, save_size);
|
||||
}
|
||||
return ret;
|
||||
|
@ -520,8 +520,10 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||
|
||||
priv->regs_t = crb_map_res(dev, priv, &io_res, buf->control_address,
|
||||
sizeof(struct crb_regs_tail));
|
||||
if (IS_ERR(priv->regs_t))
|
||||
return PTR_ERR(priv->regs_t);
|
||||
if (IS_ERR(priv->regs_t)) {
|
||||
ret = PTR_ERR(priv->regs_t);
|
||||
goto out_relinquish_locality;
|
||||
}
|
||||
|
||||
/*
|
||||
* PTT HW bug w/a: wake up the device to access
|
||||
@ -529,7 +531,7 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
|
||||
*/
|
||||
ret = __crb_cmd_ready(dev, priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out_relinquish_locality;
|
||||
|
||||
pa_high = ioread32(&priv->regs_t->ctrl_cmd_pa_high);
|
||||
pa_low = ioread32(&priv->regs_t->ctrl_cmd_pa_low);
|
||||
@ -574,6 +576,8 @@ out:
|
||||
|
||||
__crb_go_idle(dev, priv);
|
||||
|
||||
out_relinquish_locality:
|
||||
|
||||
__crb_relinquish_locality(dev, priv, 0);
|
||||
|
||||
return ret;
|
||||
|
@ -2802,6 +2802,7 @@ static int init_cmd_table(struct intel_gvt *gvt)
|
||||
if (info) {
|
||||
gvt_err("%s %s duplicated\n", e->info->name,
|
||||
info->name);
|
||||
kfree(e);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
|
@ -3911,7 +3911,7 @@ mlx5_ib_get_vector_affinity(struct ib_device *ibdev, int comp_vector)
|
||||
{
|
||||
struct mlx5_ib_dev *dev = to_mdev(ibdev);
|
||||
|
||||
return mlx5_get_vector_affinity(dev->mdev, comp_vector);
|
||||
return mlx5_get_vector_affinity_hint(dev->mdev, comp_vector);
|
||||
}
|
||||
|
||||
static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
|
||||
|
@ -1527,6 +1527,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
u32 uidx = MLX5_IB_DEFAULT_UIDX;
|
||||
struct mlx5_ib_create_qp ucmd;
|
||||
struct mlx5_ib_qp_base *base;
|
||||
int mlx5_st;
|
||||
void *qpc;
|
||||
u32 *in;
|
||||
int err;
|
||||
@ -1535,6 +1536,10 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
spin_lock_init(&qp->sq.lock);
|
||||
spin_lock_init(&qp->rq.lock);
|
||||
|
||||
mlx5_st = to_mlx5_st(init_attr->qp_type);
|
||||
if (mlx5_st < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (init_attr->rwq_ind_tbl) {
|
||||
if (!udata)
|
||||
return -ENOSYS;
|
||||
@ -1688,7 +1693,7 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
|
||||
|
||||
qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
|
||||
|
||||
MLX5_SET(qpc, qpc, st, to_mlx5_st(init_attr->qp_type));
|
||||
MLX5_SET(qpc, qpc, st, mlx5_st);
|
||||
MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
|
||||
|
||||
if (init_attr->qp_type != MLX5_IB_QPT_REG_UMR)
|
||||
|
@ -642,7 +642,7 @@ int usnic_ib_dereg_mr(struct ib_mr *ibmr)
|
||||
|
||||
usnic_dbg("va 0x%lx length 0x%zx\n", mr->umem->va, mr->umem->length);
|
||||
|
||||
usnic_uiom_reg_release(mr->umem, ibmr->pd->uobject->context->closing);
|
||||
usnic_uiom_reg_release(mr->umem, ibmr->uobject->context);
|
||||
kfree(mr);
|
||||
return 0;
|
||||
}
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/pci.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
|
||||
#include "usnic_log.h"
|
||||
#include "usnic_uiom.h"
|
||||
@ -88,7 +89,7 @@ static void usnic_uiom_put_pages(struct list_head *chunk_list, int dirty)
|
||||
for_each_sg(chunk->page_list, sg, chunk->nents, i) {
|
||||
page = sg_page(sg);
|
||||
pa = sg_phys(sg);
|
||||
if (dirty)
|
||||
if (!PageDirty(page) && dirty)
|
||||
set_page_dirty_lock(page);
|
||||
put_page(page);
|
||||
usnic_dbg("pa: %pa\n", &pa);
|
||||
@ -114,6 +115,16 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable,
|
||||
dma_addr_t pa;
|
||||
unsigned int gup_flags;
|
||||
|
||||
/*
|
||||
* If the combination of the addr and size requested for this memory
|
||||
* region causes an integer overflow, return error.
|
||||
*/
|
||||
if (((addr + size) < addr) || PAGE_ALIGN(addr + size) < (addr + size))
|
||||
return -EINVAL;
|
||||
|
||||
if (!size)
|
||||
return -EINVAL;
|
||||
|
||||
if (!can_do_mlock())
|
||||
return -EPERM;
|
||||
|
||||
@ -127,7 +138,7 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable,
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
|
||||
locked = npages + current->mm->locked_vm;
|
||||
locked = npages + current->mm->pinned_vm;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
|
||||
|
||||
if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
|
||||
@ -143,7 +154,7 @@ static int usnic_uiom_get_pages(unsigned long addr, size_t size, int writable,
|
||||
ret = 0;
|
||||
|
||||
while (npages) {
|
||||
ret = get_user_pages(cur_base,
|
||||
ret = get_user_pages_longterm(cur_base,
|
||||
min_t(unsigned long, npages,
|
||||
PAGE_SIZE / sizeof(struct page *)),
|
||||
gup_flags, page_list, NULL);
|
||||
@ -186,7 +197,7 @@ out:
|
||||
if (ret < 0)
|
||||
usnic_uiom_put_pages(chunk_list, 0);
|
||||
else
|
||||
current->mm->locked_vm = locked;
|
||||
current->mm->pinned_vm = locked;
|
||||
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
free_page((unsigned long) page_list);
|
||||
@ -420,18 +431,22 @@ out_free_uiomr:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, int closing)
|
||||
void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr,
|
||||
struct ib_ucontext *ucontext)
|
||||
{
|
||||
struct task_struct *task;
|
||||
struct mm_struct *mm;
|
||||
unsigned long diff;
|
||||
|
||||
__usnic_uiom_reg_release(uiomr->pd, uiomr, 1);
|
||||
|
||||
mm = get_task_mm(current);
|
||||
if (!mm) {
|
||||
kfree(uiomr);
|
||||
return;
|
||||
}
|
||||
task = get_pid_task(ucontext->tgid, PIDTYPE_PID);
|
||||
if (!task)
|
||||
goto out;
|
||||
mm = get_task_mm(task);
|
||||
put_task_struct(task);
|
||||
if (!mm)
|
||||
goto out;
|
||||
|
||||
diff = PAGE_ALIGN(uiomr->length + uiomr->offset) >> PAGE_SHIFT;
|
||||
|
||||
@ -443,7 +458,7 @@ void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, int closing)
|
||||
* up here and not be able to take the mmap_sem. In that case
|
||||
* we defer the vm_locked accounting to the system workqueue.
|
||||
*/
|
||||
if (closing) {
|
||||
if (ucontext->closing) {
|
||||
if (!down_write_trylock(&mm->mmap_sem)) {
|
||||
INIT_WORK(&uiomr->work, usnic_uiom_reg_account);
|
||||
uiomr->mm = mm;
|
||||
@ -455,9 +470,10 @@ void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, int closing)
|
||||
} else
|
||||
down_write(&mm->mmap_sem);
|
||||
|
||||
current->mm->locked_vm -= diff;
|
||||
mm->pinned_vm -= diff;
|
||||
up_write(&mm->mmap_sem);
|
||||
mmput(mm);
|
||||
out:
|
||||
kfree(uiomr);
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,8 @@
|
||||
|
||||
#include "usnic_uiom_interval_tree.h"
|
||||
|
||||
struct ib_ucontext;
|
||||
|
||||
#define USNIC_UIOM_READ (1)
|
||||
#define USNIC_UIOM_WRITE (2)
|
||||
|
||||
@ -89,7 +91,8 @@ void usnic_uiom_free_dev_list(struct device **devs);
|
||||
struct usnic_uiom_reg *usnic_uiom_reg_get(struct usnic_uiom_pd *pd,
|
||||
unsigned long addr, size_t size,
|
||||
int access, int dmasync);
|
||||
void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr, int closing);
|
||||
void usnic_uiom_reg_release(struct usnic_uiom_reg *uiomr,
|
||||
struct ib_ucontext *ucontext);
|
||||
int usnic_uiom_init(char *drv_name);
|
||||
void usnic_uiom_fini(void);
|
||||
#endif /* USNIC_UIOM_H_ */
|
||||
|
@ -394,23 +394,25 @@ void *rxe_alloc(struct rxe_pool *pool)
|
||||
|
||||
kref_get(&pool->rxe->ref_cnt);
|
||||
|
||||
if (atomic_inc_return(&pool->num_elem) > pool->max_elem) {
|
||||
atomic_dec(&pool->num_elem);
|
||||
rxe_dev_put(pool->rxe);
|
||||
rxe_pool_put(pool);
|
||||
return NULL;
|
||||
}
|
||||
if (atomic_inc_return(&pool->num_elem) > pool->max_elem)
|
||||
goto out_put_pool;
|
||||
|
||||
elem = kmem_cache_zalloc(pool_cache(pool),
|
||||
(pool->flags & RXE_POOL_ATOMIC) ?
|
||||
GFP_ATOMIC : GFP_KERNEL);
|
||||
if (!elem)
|
||||
return NULL;
|
||||
goto out_put_pool;
|
||||
|
||||
elem->pool = pool;
|
||||
kref_init(&elem->ref_cnt);
|
||||
|
||||
return elem;
|
||||
|
||||
out_put_pool:
|
||||
atomic_dec(&pool->num_elem);
|
||||
rxe_dev_put(pool->rxe);
|
||||
rxe_pool_put(pool);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void rxe_elem_release(struct kref *kref)
|
||||
|
@ -1203,13 +1203,10 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv,
|
||||
ipoib_ib_dev_down(dev);
|
||||
|
||||
if (level == IPOIB_FLUSH_HEAVY) {
|
||||
rtnl_lock();
|
||||
if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
|
||||
ipoib_ib_dev_stop(dev);
|
||||
|
||||
result = ipoib_ib_dev_open(dev);
|
||||
rtnl_unlock();
|
||||
if (result)
|
||||
if (ipoib_ib_dev_open(dev))
|
||||
return;
|
||||
|
||||
if (netif_queue_stopped(dev))
|
||||
@ -1249,7 +1246,9 @@ void ipoib_ib_dev_flush_heavy(struct work_struct *work)
|
||||
struct ipoib_dev_priv *priv =
|
||||
container_of(work, struct ipoib_dev_priv, flush_heavy);
|
||||
|
||||
rtnl_lock();
|
||||
__ipoib_ib_dev_flush(priv, IPOIB_FLUSH_HEAVY, 0);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
void ipoib_ib_dev_cleanup(struct net_device *dev)
|
||||
|
@ -2547,6 +2547,9 @@ static int get_mac(struct crypto_shash **hash, struct alg_spec *a, char **error,
|
||||
*error = error_key;
|
||||
return r;
|
||||
}
|
||||
} else if (crypto_shash_get_flags(*hash) & CRYPTO_TFM_NEED_KEY) {
|
||||
*error = error_key;
|
||||
return -ENOKEY;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1865,13 +1865,6 @@ static void uvc_unregister_video(struct uvc_device *dev)
|
||||
{
|
||||
struct uvc_streaming *stream;
|
||||
|
||||
/* Unregistering all video devices might result in uvc_delete() being
|
||||
* called from inside the loop if there's no open file handle. To avoid
|
||||
* that, increment the refcount before iterating over the streams and
|
||||
* decrement it when done.
|
||||
*/
|
||||
kref_get(&dev->ref);
|
||||
|
||||
list_for_each_entry(stream, &dev->streams, list) {
|
||||
if (!video_is_registered(&stream->vdev))
|
||||
continue;
|
||||
@ -1880,8 +1873,6 @@ static void uvc_unregister_video(struct uvc_device *dev)
|
||||
|
||||
uvc_debugfs_cleanup_stream(stream);
|
||||
}
|
||||
|
||||
kref_put(&dev->ref, uvc_delete);
|
||||
}
|
||||
|
||||
static int uvc_register_video(struct uvc_device *dev,
|
||||
@ -2129,6 +2120,7 @@ static int uvc_probe(struct usb_interface *intf,
|
||||
|
||||
error:
|
||||
uvc_unregister_video(dev);
|
||||
kref_put(&dev->ref, uvc_delete);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -2146,6 +2138,7 @@ static void uvc_disconnect(struct usb_interface *intf)
|
||||
return;
|
||||
|
||||
uvc_unregister_video(dev);
|
||||
kref_put(&dev->ref, uvc_delete);
|
||||
}
|
||||
|
||||
static int uvc_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
|
@ -282,11 +282,11 @@ static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
|
||||
|
||||
priv->drv_clk = devm_clk_get(host->dev, "ciu-drive");
|
||||
if (IS_ERR(priv->drv_clk))
|
||||
dev_dbg(host->dev, "ciu_drv not available\n");
|
||||
dev_dbg(host->dev, "ciu-drive not available\n");
|
||||
|
||||
priv->sample_clk = devm_clk_get(host->dev, "ciu-sample");
|
||||
if (IS_ERR(priv->sample_clk))
|
||||
dev_dbg(host->dev, "ciu_sample not available\n");
|
||||
dev_dbg(host->dev, "ciu-sample not available\n");
|
||||
|
||||
host->priv = priv;
|
||||
|
||||
|
@ -1005,6 +1005,12 @@ static const struct flash_info spi_nor_ids[] = {
|
||||
|
||||
/* ISSI */
|
||||
{ "is25cd512", INFO(0x7f9d20, 0, 32 * 1024, 2, SECT_4K) },
|
||||
{ "is25wp032", INFO(0x9d7016, 0, 64 * 1024, 64,
|
||||
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
{ "is25wp064", INFO(0x9d7017, 0, 64 * 1024, 128,
|
||||
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
{ "is25wp128", INFO(0x9d7018, 0, 64 * 1024, 256,
|
||||
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
|
||||
/* Macronix */
|
||||
{ "mx25l512e", INFO(0xc22010, 0, 64 * 1024, 1, SECT_4K) },
|
||||
|
@ -638,8 +638,7 @@ static int bond_fill_info(struct sk_buff *skb,
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM,
|
||||
sizeof(bond->params.ad_actor_system),
|
||||
&bond->params.ad_actor_system))
|
||||
ETH_ALEN, &bond->params.ad_actor_system))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
if (!bond_3ad_get_active_agg_info(bond, &info)) {
|
||||
|
@ -1571,8 +1571,6 @@ static int ena_up_complete(struct ena_adapter *adapter)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
ena_init_napi(adapter);
|
||||
|
||||
ena_change_mtu(adapter->netdev, adapter->netdev->mtu);
|
||||
|
||||
ena_refill_all_rx_bufs(adapter);
|
||||
@ -1726,6 +1724,13 @@ static int ena_up(struct ena_adapter *adapter)
|
||||
|
||||
ena_setup_io_intr(adapter);
|
||||
|
||||
/* napi poll functions should be initialized before running
|
||||
* request_irq(), to handle a rare condition where there is a pending
|
||||
* interrupt, causing the ISR to fire immediately while the poll
|
||||
* function wasn't set yet, causing a null dereference
|
||||
*/
|
||||
ena_init_napi(adapter);
|
||||
|
||||
rc = ena_request_io_irq(adapter);
|
||||
if (rc)
|
||||
goto err_req_irq;
|
||||
@ -3059,15 +3064,8 @@ err_rss_init:
|
||||
|
||||
static void ena_release_bars(struct ena_com_dev *ena_dev, struct pci_dev *pdev)
|
||||
{
|
||||
int release_bars;
|
||||
int release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
|
||||
|
||||
if (ena_dev->mem_bar)
|
||||
devm_iounmap(&pdev->dev, ena_dev->mem_bar);
|
||||
|
||||
if (ena_dev->reg_bar)
|
||||
devm_iounmap(&pdev->dev, ena_dev->reg_bar);
|
||||
|
||||
release_bars = pci_select_bars(pdev, IORESOURCE_MEM) & ENA_BAR_MASK;
|
||||
pci_release_selected_regions(pdev, release_bars);
|
||||
}
|
||||
|
||||
|
@ -1029,6 +1029,7 @@ static int dec_lance_probe(struct device *bdev, const int type)
|
||||
int i, ret;
|
||||
unsigned long esar_base;
|
||||
unsigned char *esar;
|
||||
const char *desc;
|
||||
|
||||
if (dec_lance_debug && version_printed++ == 0)
|
||||
printk(version);
|
||||
@ -1214,19 +1215,20 @@ static int dec_lance_probe(struct device *bdev, const int type)
|
||||
*/
|
||||
switch (type) {
|
||||
case ASIC_LANCE:
|
||||
printk("%s: IOASIC onboard LANCE", name);
|
||||
desc = "IOASIC onboard LANCE";
|
||||
break;
|
||||
case PMAD_LANCE:
|
||||
printk("%s: PMAD-AA", name);
|
||||
desc = "PMAD-AA";
|
||||
break;
|
||||
case PMAX_LANCE:
|
||||
printk("%s: PMAX onboard LANCE", name);
|
||||
desc = "PMAX onboard LANCE";
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < 6; i++)
|
||||
dev->dev_addr[i] = esar[i * 4];
|
||||
|
||||
printk(", addr = %pM, irq = %d\n", dev->dev_addr, dev->irq);
|
||||
printk("%s: %s, addr = %pM, irq = %d\n",
|
||||
name, desc, dev->dev_addr, dev->irq);
|
||||
|
||||
dev->netdev_ops = &lance_netdev_ops;
|
||||
dev->watchdog_timeo = 5*HZ;
|
||||
|
@ -339,9 +339,12 @@ int bcmgenet_mii_probe(struct net_device *dev)
|
||||
phydev->advertising = phydev->supported;
|
||||
|
||||
/* The internal PHY has its link interrupts routed to the
|
||||
* Ethernet MAC ISRs
|
||||
*/
|
||||
if (priv->internal_phy)
|
||||
* Ethernet MAC ISRs. On GENETv5 there is a hardware issue
|
||||
* that prevents the signaling of link UP interrupts when
|
||||
* the link operates at 10Mbps, so fallback to polling for
|
||||
* those versions of GENET.
|
||||
*/
|
||||
if (priv->internal_phy && !GENET_IS_V5(priv))
|
||||
priv->phydev->irq = PHY_IGNORE_INTERRUPT;
|
||||
|
||||
return 0;
|
||||
|
@ -2000,6 +2000,7 @@ static void macb_configure_dma(struct macb *bp)
|
||||
else
|
||||
dmacfg &= ~GEM_BIT(TXCOEN);
|
||||
|
||||
dmacfg &= ~GEM_BIT(ADDR64);
|
||||
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
||||
if (bp->hw_dma_cap & HW_DMA_CAP_64B)
|
||||
dmacfg |= GEM_BIT(ADDR64);
|
||||
|
@ -2159,6 +2159,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EPERM;
|
||||
if (copy_from_user(&t, useraddr, sizeof(t)))
|
||||
return -EFAULT;
|
||||
if (t.cmd != CHELSIO_SET_QSET_PARAMS)
|
||||
return -EINVAL;
|
||||
if (t.qset_idx >= SGE_QSETS)
|
||||
return -EINVAL;
|
||||
if (!in_range(t.intr_lat, 0, M_NEWTIMER) ||
|
||||
@ -2258,6 +2260,9 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
if (copy_from_user(&t, useraddr, sizeof(t)))
|
||||
return -EFAULT;
|
||||
|
||||
if (t.cmd != CHELSIO_GET_QSET_PARAMS)
|
||||
return -EINVAL;
|
||||
|
||||
/* Display qsets for all ports when offload enabled */
|
||||
if (test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) {
|
||||
q1 = 0;
|
||||
@ -2303,6 +2308,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EBUSY;
|
||||
if (copy_from_user(&edata, useraddr, sizeof(edata)))
|
||||
return -EFAULT;
|
||||
if (edata.cmd != CHELSIO_SET_QSET_NUM)
|
||||
return -EINVAL;
|
||||
if (edata.val < 1 ||
|
||||
(edata.val > 1 && !(adapter->flags & USING_MSIX)))
|
||||
return -EINVAL;
|
||||
@ -2343,6 +2350,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EPERM;
|
||||
if (copy_from_user(&t, useraddr, sizeof(t)))
|
||||
return -EFAULT;
|
||||
if (t.cmd != CHELSIO_LOAD_FW)
|
||||
return -EINVAL;
|
||||
/* Check t.len sanity ? */
|
||||
fw_data = memdup_user(useraddr + sizeof(t), t.len);
|
||||
if (IS_ERR(fw_data))
|
||||
@ -2366,6 +2375,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EBUSY;
|
||||
if (copy_from_user(&m, useraddr, sizeof(m)))
|
||||
return -EFAULT;
|
||||
if (m.cmd != CHELSIO_SETMTUTAB)
|
||||
return -EINVAL;
|
||||
if (m.nmtus != NMTUS)
|
||||
return -EINVAL;
|
||||
if (m.mtus[0] < 81) /* accommodate SACK */
|
||||
@ -2407,6 +2418,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EBUSY;
|
||||
if (copy_from_user(&m, useraddr, sizeof(m)))
|
||||
return -EFAULT;
|
||||
if (m.cmd != CHELSIO_SET_PM)
|
||||
return -EINVAL;
|
||||
if (!is_power_of_2(m.rx_pg_sz) ||
|
||||
!is_power_of_2(m.tx_pg_sz))
|
||||
return -EINVAL; /* not power of 2 */
|
||||
@ -2440,6 +2453,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EIO; /* need the memory controllers */
|
||||
if (copy_from_user(&t, useraddr, sizeof(t)))
|
||||
return -EFAULT;
|
||||
if (t.cmd != CHELSIO_GET_MEM)
|
||||
return -EINVAL;
|
||||
if ((t.addr & 7) || (t.len & 7))
|
||||
return -EINVAL;
|
||||
if (t.mem_id == MEM_CM)
|
||||
@ -2492,6 +2507,8 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr)
|
||||
return -EAGAIN;
|
||||
if (copy_from_user(&t, useraddr, sizeof(t)))
|
||||
return -EFAULT;
|
||||
if (t.cmd != CHELSIO_SET_TRACE_FILTER)
|
||||
return -EINVAL;
|
||||
|
||||
tp = (const struct trace_params *)&t.sip;
|
||||
if (t.config_tx)
|
||||
|
@ -1879,7 +1879,7 @@ static int enic_open(struct net_device *netdev)
|
||||
{
|
||||
struct enic *enic = netdev_priv(netdev);
|
||||
unsigned int i;
|
||||
int err;
|
||||
int err, ret;
|
||||
|
||||
err = enic_request_intr(enic);
|
||||
if (err) {
|
||||
@ -1936,10 +1936,9 @@ static int enic_open(struct net_device *netdev)
|
||||
|
||||
err_out_free_rq:
|
||||
for (i = 0; i < enic->rq_count; i++) {
|
||||
err = vnic_rq_disable(&enic->rq[i]);
|
||||
if (err)
|
||||
return err;
|
||||
vnic_rq_clean(&enic->rq[i], enic_free_rq_buf);
|
||||
ret = vnic_rq_disable(&enic->rq[i]);
|
||||
if (!ret)
|
||||
vnic_rq_clean(&enic->rq[i], enic_free_rq_buf);
|
||||
}
|
||||
enic_dev_notify_unset(enic);
|
||||
err_out_free_intr:
|
||||
|
@ -3900,8 +3900,6 @@ static int be_enable_vxlan_offloads(struct be_adapter *adapter)
|
||||
netdev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||
NETIF_F_TSO | NETIF_F_TSO6 |
|
||||
NETIF_F_GSO_UDP_TUNNEL;
|
||||
netdev->hw_features |= NETIF_F_GSO_UDP_TUNNEL;
|
||||
netdev->features |= NETIF_F_GSO_UDP_TUNNEL;
|
||||
|
||||
dev_info(dev, "Enabled VxLAN offloads for UDP port %d\n",
|
||||
be16_to_cpu(port));
|
||||
@ -3923,8 +3921,6 @@ static void be_disable_vxlan_offloads(struct be_adapter *adapter)
|
||||
adapter->vxlan_port = 0;
|
||||
|
||||
netdev->hw_enc_features = 0;
|
||||
netdev->hw_features &= ~(NETIF_F_GSO_UDP_TUNNEL);
|
||||
netdev->features &= ~(NETIF_F_GSO_UDP_TUNNEL);
|
||||
}
|
||||
|
||||
static void be_calculate_vf_res(struct be_adapter *adapter, u16 num_vfs,
|
||||
@ -5215,6 +5211,7 @@ static void be_netdev_init(struct net_device *netdev)
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
netdev->hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
|
||||
NETIF_F_GSO_UDP_TUNNEL |
|
||||
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
|
||||
NETIF_F_HW_VLAN_CTAG_TX;
|
||||
if ((be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
|
||||
|
@ -451,6 +451,10 @@ struct bufdesc_ex {
|
||||
* initialisation.
|
||||
*/
|
||||
#define FEC_QUIRK_MIB_CLEAR (1 << 15)
|
||||
/* Only i.MX25/i.MX27/i.MX28 controller supports FRBR,FRSR registers,
|
||||
* those FIFO receive registers are resolved in other platforms.
|
||||
*/
|
||||
#define FEC_QUIRK_HAS_FRREG (1 << 16)
|
||||
|
||||
struct bufdesc_prop {
|
||||
int qid;
|
||||
|
@ -89,14 +89,16 @@ static struct platform_device_id fec_devtype[] = {
|
||||
.driver_data = 0,
|
||||
}, {
|
||||
.name = "imx25-fec",
|
||||
.driver_data = FEC_QUIRK_USE_GASKET | FEC_QUIRK_MIB_CLEAR,
|
||||
.driver_data = FEC_QUIRK_USE_GASKET | FEC_QUIRK_MIB_CLEAR |
|
||||
FEC_QUIRK_HAS_FRREG,
|
||||
}, {
|
||||
.name = "imx27-fec",
|
||||
.driver_data = FEC_QUIRK_MIB_CLEAR,
|
||||
.driver_data = FEC_QUIRK_MIB_CLEAR | FEC_QUIRK_HAS_FRREG,
|
||||
}, {
|
||||
.name = "imx28-fec",
|
||||
.driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME |
|
||||
FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC,
|
||||
FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC |
|
||||
FEC_QUIRK_HAS_FRREG,
|
||||
}, {
|
||||
.name = "imx6q-fec",
|
||||
.driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
|
||||
@ -1155,7 +1157,7 @@ static void fec_enet_timeout_work(struct work_struct *work)
|
||||
napi_disable(&fep->napi);
|
||||
netif_tx_lock_bh(ndev);
|
||||
fec_restart(ndev);
|
||||
netif_wake_queue(ndev);
|
||||
netif_tx_wake_all_queues(ndev);
|
||||
netif_tx_unlock_bh(ndev);
|
||||
napi_enable(&fep->napi);
|
||||
}
|
||||
@ -1270,7 +1272,7 @@ skb_done:
|
||||
|
||||
/* Since we have freed up a buffer, the ring is no longer full
|
||||
*/
|
||||
if (netif_queue_stopped(ndev)) {
|
||||
if (netif_tx_queue_stopped(nq)) {
|
||||
entries_free = fec_enet_get_free_txdesc_num(txq);
|
||||
if (entries_free >= txq->tx_wake_threshold)
|
||||
netif_tx_wake_queue(nq);
|
||||
@ -1747,7 +1749,7 @@ static void fec_enet_adjust_link(struct net_device *ndev)
|
||||
napi_disable(&fep->napi);
|
||||
netif_tx_lock_bh(ndev);
|
||||
fec_restart(ndev);
|
||||
netif_wake_queue(ndev);
|
||||
netif_tx_wake_all_queues(ndev);
|
||||
netif_tx_unlock_bh(ndev);
|
||||
napi_enable(&fep->napi);
|
||||
}
|
||||
@ -2166,7 +2168,13 @@ static void fec_enet_get_regs(struct net_device *ndev,
|
||||
memset(buf, 0, regs->len);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(fec_enet_register_offset); i++) {
|
||||
off = fec_enet_register_offset[i] / 4;
|
||||
off = fec_enet_register_offset[i];
|
||||
|
||||
if ((off == FEC_R_BOUND || off == FEC_R_FSTART) &&
|
||||
!(fep->quirks & FEC_QUIRK_HAS_FRREG))
|
||||
continue;
|
||||
|
||||
off >>= 2;
|
||||
buf[off] = readl(&theregs[off]);
|
||||
}
|
||||
}
|
||||
@ -2249,7 +2257,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
|
||||
napi_disable(&fep->napi);
|
||||
netif_tx_lock_bh(ndev);
|
||||
fec_restart(ndev);
|
||||
netif_wake_queue(ndev);
|
||||
netif_tx_wake_all_queues(ndev);
|
||||
netif_tx_unlock_bh(ndev);
|
||||
napi_enable(&fep->napi);
|
||||
}
|
||||
|
@ -257,7 +257,8 @@ int mlx5e_dcbnl_ieee_setets_core(struct mlx5e_priv *priv, struct ieee_ets *ets)
|
||||
}
|
||||
|
||||
static int mlx5e_dbcnl_validate_ets(struct net_device *netdev,
|
||||
struct ieee_ets *ets)
|
||||
struct ieee_ets *ets,
|
||||
bool zero_sum_allowed)
|
||||
{
|
||||
bool have_ets_tc = false;
|
||||
int bw_sum = 0;
|
||||
@ -282,8 +283,9 @@ static int mlx5e_dbcnl_validate_ets(struct net_device *netdev,
|
||||
}
|
||||
|
||||
if (have_ets_tc && bw_sum != 100) {
|
||||
netdev_err(netdev,
|
||||
"Failed to validate ETS: BW sum is illegal\n");
|
||||
if (bw_sum || (!bw_sum && !zero_sum_allowed))
|
||||
netdev_err(netdev,
|
||||
"Failed to validate ETS: BW sum is illegal\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
@ -298,7 +300,7 @@ static int mlx5e_dcbnl_ieee_setets(struct net_device *netdev,
|
||||
if (!MLX5_CAP_GEN(priv->mdev, ets))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = mlx5e_dbcnl_validate_ets(netdev, ets);
|
||||
err = mlx5e_dbcnl_validate_ets(netdev, ets, false);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -477,12 +479,9 @@ static u8 mlx5e_dcbnl_setall(struct net_device *netdev)
|
||||
ets.prio_tc[i] = cee_cfg->prio_to_pg_map[i];
|
||||
}
|
||||
|
||||
err = mlx5e_dbcnl_validate_ets(netdev, &ets);
|
||||
if (err) {
|
||||
netdev_err(netdev,
|
||||
"%s, Failed to validate ETS: %d\n", __func__, err);
|
||||
err = mlx5e_dbcnl_validate_ets(netdev, &ets, true);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = mlx5e_dcbnl_ieee_setets_core(priv, &ets);
|
||||
if (err) {
|
||||
|
@ -635,43 +635,15 @@ static inline bool is_first_ethertype_ip(struct sk_buff *skb)
|
||||
return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6));
|
||||
}
|
||||
|
||||
static __be32 mlx5e_get_fcs(struct sk_buff *skb)
|
||||
static u32 mlx5e_get_fcs(const struct sk_buff *skb)
|
||||
{
|
||||
int last_frag_sz, bytes_in_prev, nr_frags;
|
||||
u8 *fcs_p1, *fcs_p2;
|
||||
skb_frag_t *last_frag;
|
||||
__be32 fcs_bytes;
|
||||
const void *fcs_bytes;
|
||||
u32 _fcs_bytes;
|
||||
|
||||
if (!skb_is_nonlinear(skb))
|
||||
return *(__be32 *)(skb->data + skb->len - ETH_FCS_LEN);
|
||||
fcs_bytes = skb_header_pointer(skb, skb->len - ETH_FCS_LEN,
|
||||
ETH_FCS_LEN, &_fcs_bytes);
|
||||
|
||||
nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
last_frag = &skb_shinfo(skb)->frags[nr_frags - 1];
|
||||
last_frag_sz = skb_frag_size(last_frag);
|
||||
|
||||
/* If all FCS data is in last frag */
|
||||
if (last_frag_sz >= ETH_FCS_LEN)
|
||||
return *(__be32 *)(skb_frag_address(last_frag) +
|
||||
last_frag_sz - ETH_FCS_LEN);
|
||||
|
||||
fcs_p2 = (u8 *)skb_frag_address(last_frag);
|
||||
bytes_in_prev = ETH_FCS_LEN - last_frag_sz;
|
||||
|
||||
/* Find where the other part of the FCS is - Linear or another frag */
|
||||
if (nr_frags == 1) {
|
||||
fcs_p1 = skb_tail_pointer(skb);
|
||||
} else {
|
||||
skb_frag_t *prev_frag = &skb_shinfo(skb)->frags[nr_frags - 2];
|
||||
|
||||
fcs_p1 = skb_frag_address(prev_frag) +
|
||||
skb_frag_size(prev_frag);
|
||||
}
|
||||
fcs_p1 -= bytes_in_prev;
|
||||
|
||||
memcpy(&fcs_bytes, fcs_p1, bytes_in_prev);
|
||||
memcpy(((u8 *)&fcs_bytes) + bytes_in_prev, fcs_p2, last_frag_sz);
|
||||
|
||||
return fcs_bytes;
|
||||
return __get_unaligned_cpu32(fcs_bytes);
|
||||
}
|
||||
|
||||
static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
@ -693,8 +665,9 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
|
||||
if (unlikely(netdev->features & NETIF_F_RXFCS))
|
||||
skb->csum = csum_add(skb->csum,
|
||||
(__force __wsum)mlx5e_get_fcs(skb));
|
||||
skb->csum = csum_block_add(skb->csum,
|
||||
(__force __wsum)mlx5e_get_fcs(skb),
|
||||
skb->len - ETH_FCS_LEN);
|
||||
rq->stats.csum_complete++;
|
||||
return;
|
||||
}
|
||||
|
@ -262,7 +262,7 @@ static void eq_pf_process(struct mlx5_eq *eq)
|
||||
case MLX5_PFAULT_SUBTYPE_WQE:
|
||||
/* WQE based event */
|
||||
pfault->type =
|
||||
be32_to_cpu(pf_eqe->wqe.pftype_wq) >> 24;
|
||||
(be32_to_cpu(pf_eqe->wqe.pftype_wq) >> 24) & 0x7;
|
||||
pfault->token =
|
||||
be32_to_cpu(pf_eqe->wqe.token);
|
||||
pfault->wqe.wq_num =
|
||||
|
@ -1672,7 +1672,7 @@ qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn,
|
||||
|
||||
cm_info->local_ip[0] = ntohl(iph->daddr);
|
||||
cm_info->remote_ip[0] = ntohl(iph->saddr);
|
||||
cm_info->ip_version = TCP_IPV4;
|
||||
cm_info->ip_version = QED_TCP_IPV4;
|
||||
|
||||
ip_hlen = (iph->ihl) * sizeof(u32);
|
||||
*payload_len = ntohs(iph->tot_len) - ip_hlen;
|
||||
@ -1692,7 +1692,7 @@ qed_iwarp_parse_rx_pkt(struct qed_hwfn *p_hwfn,
|
||||
cm_info->remote_ip[i] =
|
||||
ntohl(ip6h->saddr.in6_u.u6_addr32[i]);
|
||||
}
|
||||
cm_info->ip_version = TCP_IPV6;
|
||||
cm_info->ip_version = QED_TCP_IPV6;
|
||||
|
||||
ip_hlen = sizeof(*ip6h);
|
||||
*payload_len = ntohs(ip6h->payload_len);
|
||||
|
@ -129,23 +129,16 @@ static void qed_rdma_copy_gids(struct qed_rdma_qp *qp, __le32 *src_gid,
|
||||
|
||||
static enum roce_flavor qed_roce_mode_to_flavor(enum roce_mode roce_mode)
|
||||
{
|
||||
enum roce_flavor flavor;
|
||||
|
||||
switch (roce_mode) {
|
||||
case ROCE_V1:
|
||||
flavor = PLAIN_ROCE;
|
||||
break;
|
||||
return PLAIN_ROCE;
|
||||
case ROCE_V2_IPV4:
|
||||
flavor = RROCE_IPV4;
|
||||
break;
|
||||
return RROCE_IPV4;
|
||||
case ROCE_V2_IPV6:
|
||||
flavor = ROCE_V2_IPV6;
|
||||
break;
|
||||
return RROCE_IPV6;
|
||||
default:
|
||||
flavor = MAX_ROCE_MODE;
|
||||
break;
|
||||
return MAX_ROCE_FLAVOR;
|
||||
}
|
||||
return flavor;
|
||||
}
|
||||
|
||||
void qed_roce_free_cid_pair(struct qed_hwfn *p_hwfn, u16 cid)
|
||||
|
@ -154,7 +154,7 @@ qed_set_pf_update_tunn_mode(struct qed_tunnel_info *p_tun,
|
||||
static void qed_set_tunn_cls_info(struct qed_tunnel_info *p_tun,
|
||||
struct qed_tunnel_info *p_src)
|
||||
{
|
||||
enum tunnel_clss type;
|
||||
int type;
|
||||
|
||||
p_tun->b_update_rx_cls = p_src->b_update_rx_cls;
|
||||
p_tun->b_update_tx_cls = p_src->b_update_tx_cls;
|
||||
|
@ -413,7 +413,6 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
|
||||
}
|
||||
|
||||
if (!p_iov->b_pre_fp_hsi &&
|
||||
ETH_HSI_VER_MINOR &&
|
||||
(resp->pfdev_info.minor_fp_hsi < ETH_HSI_VER_MINOR)) {
|
||||
DP_INFO(p_hwfn,
|
||||
"PF is using older fastpath HSI; %02x.%02x is configured\n",
|
||||
@ -572,7 +571,7 @@ free_p_iov:
|
||||
static void
|
||||
__qed_vf_prep_tunn_req_tlv(struct vfpf_update_tunn_param_tlv *p_req,
|
||||
struct qed_tunn_update_type *p_src,
|
||||
enum qed_tunn_clss mask, u8 *p_cls)
|
||||
enum qed_tunn_mode mask, u8 *p_cls)
|
||||
{
|
||||
if (p_src->b_update_mode) {
|
||||
p_req->tun_mode_update_mask |= BIT(mask);
|
||||
@ -587,7 +586,7 @@ __qed_vf_prep_tunn_req_tlv(struct vfpf_update_tunn_param_tlv *p_req,
|
||||
static void
|
||||
qed_vf_prep_tunn_req_tlv(struct vfpf_update_tunn_param_tlv *p_req,
|
||||
struct qed_tunn_update_type *p_src,
|
||||
enum qed_tunn_clss mask,
|
||||
enum qed_tunn_mode mask,
|
||||
u8 *p_cls, struct qed_tunn_update_udp_port *p_port,
|
||||
u8 *p_update_port, u16 *p_udp_port)
|
||||
{
|
||||
|
@ -205,6 +205,9 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)
|
||||
if (!skb)
|
||||
return RX_HANDLER_CONSUMED;
|
||||
|
||||
if (skb->pkt_type == PACKET_LOOPBACK)
|
||||
return RX_HANDLER_PASS;
|
||||
|
||||
dev = skb->dev;
|
||||
port = rmnet_get_port(dev);
|
||||
|
||||
|
@ -7579,17 +7579,15 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
|
||||
struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
|
||||
struct net_device *dev = tp->dev;
|
||||
u16 enable_mask = RTL_EVENT_NAPI | tp->event_slow;
|
||||
int work_done= 0;
|
||||
int work_done;
|
||||
u16 status;
|
||||
|
||||
status = rtl_get_events(tp);
|
||||
rtl_ack_events(tp, status & ~tp->event_slow);
|
||||
|
||||
if (status & RTL_EVENT_NAPI_RX)
|
||||
work_done = rtl_rx(dev, tp, (u32) budget);
|
||||
work_done = rtl_rx(dev, tp, (u32) budget);
|
||||
|
||||
if (status & RTL_EVENT_NAPI_TX)
|
||||
rtl_tx(dev, tp);
|
||||
rtl_tx(dev, tp);
|
||||
|
||||
if (status & tp->event_slow) {
|
||||
enable_mask &= ~tp->event_slow;
|
||||
|
@ -133,7 +133,7 @@ static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
|
||||
*/
|
||||
int stmmac_mdio_reset(struct mii_bus *bus)
|
||||
{
|
||||
#if defined(CONFIG_STMMAC_PLATFORM)
|
||||
#if IS_ENABLED(CONFIG_STMMAC_PLATFORM)
|
||||
struct net_device *ndev = bus->priv;
|
||||
struct stmmac_priv *priv = netdev_priv(ndev);
|
||||
unsigned int mii_address = priv->hw->mii.addr;
|
||||
|
@ -303,7 +303,7 @@ static void stmmac_pci_remove(struct pci_dev *pdev)
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
static int stmmac_pci_suspend(struct device *dev)
|
||||
static int __maybe_unused stmmac_pci_suspend(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
@ -321,7 +321,7 @@ static int stmmac_pci_suspend(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stmmac_pci_resume(struct device *dev)
|
||||
static int __maybe_unused stmmac_pci_resume(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
int ret;
|
||||
|
@ -980,6 +980,8 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
sizeof(struct yamdrv_ioctl_mcs));
|
||||
if (IS_ERR(ym))
|
||||
return PTR_ERR(ym);
|
||||
if (ym->cmd != SIOCYAMSMCS)
|
||||
return -EINVAL;
|
||||
if (ym->bitrate > YAM_MAXBITRATE) {
|
||||
kfree(ym);
|
||||
return -EINVAL;
|
||||
@ -995,6 +997,8 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
|
||||
return -EFAULT;
|
||||
|
||||
if (yi.cmd != SIOCYAMSCFG)
|
||||
return -EINVAL;
|
||||
if ((yi.cfg.mask & YAM_IOBASE) && netif_running(dev))
|
||||
return -EINVAL; /* Cannot change this parameter when up */
|
||||
if ((yi.cfg.mask & YAM_IRQ) && netif_running(dev))
|
||||
|
@ -1641,6 +1641,23 @@ int genphy_config_init(struct phy_device *phydev)
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_config_init);
|
||||
|
||||
/* This is used for the phy device which doesn't support the MMD extended
|
||||
* register access, but it does have side effect when we are trying to access
|
||||
* the MMD register via indirect method.
|
||||
*/
|
||||
int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad, u16 regnum)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_read_mmd_unsupported);
|
||||
|
||||
int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
|
||||
u16 regnum, u16 val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL(genphy_write_mmd_unsupported);
|
||||
|
||||
int genphy_suspend(struct phy_device *phydev)
|
||||
{
|
||||
int value;
|
||||
|
@ -561,7 +561,7 @@ void phylink_destroy(struct phylink *pl)
|
||||
{
|
||||
if (pl->sfp_bus)
|
||||
sfp_unregister_upstream(pl->sfp_bus);
|
||||
if (!IS_ERR(pl->link_gpio))
|
||||
if (!IS_ERR_OR_NULL(pl->link_gpio))
|
||||
gpiod_put(pl->link_gpio);
|
||||
|
||||
cancel_work_sync(&pl->resolve);
|
||||
|
@ -138,6 +138,8 @@ static struct phy_driver realtek_drvs[] = {
|
||||
.read_status = &genphy_read_status,
|
||||
.ack_interrupt = &rtl821x_ack_interrupt,
|
||||
.config_intr = &rtl8211b_config_intr,
|
||||
.read_mmd = &genphy_read_mmd_unsupported,
|
||||
.write_mmd = &genphy_write_mmd_unsupported,
|
||||
}, {
|
||||
.phy_id = 0x001cc914,
|
||||
.name = "RTL8211DN Gigabit Ethernet",
|
||||
|
@ -607,6 +607,9 @@ int asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
|
||||
struct usbnet *dev = netdev_priv(net);
|
||||
u8 opt = 0;
|
||||
|
||||
if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
|
||||
return -EINVAL;
|
||||
|
||||
if (wolinfo->wolopts & WAKE_PHY)
|
||||
opt |= AX_MONITOR_LINK;
|
||||
if (wolinfo->wolopts & WAKE_MAGIC)
|
||||
|
@ -566,6 +566,9 @@ ax88179_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
|
||||
struct usbnet *dev = netdev_priv(net);
|
||||
u8 opt = 0;
|
||||
|
||||
if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
|
||||
return -EINVAL;
|
||||
|
||||
if (wolinfo->wolopts & WAKE_PHY)
|
||||
opt |= AX_MONITOR_MODE_RWLC;
|
||||
if (wolinfo->wolopts & WAKE_MAGIC)
|
||||
|
@ -1375,19 +1375,10 @@ static int lan78xx_set_wol(struct net_device *netdev,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
pdata->wol = 0;
|
||||
if (wol->wolopts & WAKE_UCAST)
|
||||
pdata->wol |= WAKE_UCAST;
|
||||
if (wol->wolopts & WAKE_MCAST)
|
||||
pdata->wol |= WAKE_MCAST;
|
||||
if (wol->wolopts & WAKE_BCAST)
|
||||
pdata->wol |= WAKE_BCAST;
|
||||
if (wol->wolopts & WAKE_MAGIC)
|
||||
pdata->wol |= WAKE_MAGIC;
|
||||
if (wol->wolopts & WAKE_PHY)
|
||||
pdata->wol |= WAKE_PHY;
|
||||
if (wol->wolopts & WAKE_ARP)
|
||||
pdata->wol |= WAKE_ARP;
|
||||
if (wol->wolopts & ~WAKE_ALL)
|
||||
return -EINVAL;
|
||||
|
||||
pdata->wol = wol->wolopts;
|
||||
|
||||
device_set_wakeup_enable(&dev->udev->dev, (bool)wol->wolopts);
|
||||
|
||||
@ -2517,10 +2508,6 @@ static int lan78xx_open(struct net_device *net)
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = lan78xx_reset(dev);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
phy_start(net->phydev);
|
||||
|
||||
netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
|
||||
|
@ -4497,6 +4497,9 @@ static int rtl8152_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||
if (!rtl_can_wakeup(tp))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (wol->wolopts & ~WAKE_ANY)
|
||||
return -EINVAL;
|
||||
|
||||
ret = usb_autopm_get_interface(tp->intf);
|
||||
if (ret < 0)
|
||||
goto out_set_wol;
|
||||
|
@ -731,6 +731,9 @@ static int smsc75xx_ethtool_set_wol(struct net_device *net,
|
||||
struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
|
||||
int ret;
|
||||
|
||||
if (wolinfo->wolopts & ~SUPPORTED_WAKE)
|
||||
return -EINVAL;
|
||||
|
||||
pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE;
|
||||
|
||||
ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts);
|
||||
|
@ -774,6 +774,9 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net,
|
||||
struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
|
||||
int ret;
|
||||
|
||||
if (wolinfo->wolopts & ~SUPPORTED_WAKE)
|
||||
return -EINVAL;
|
||||
|
||||
pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE;
|
||||
|
||||
ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts);
|
||||
|
@ -421,6 +421,9 @@ sr_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
|
||||
struct usbnet *dev = netdev_priv(net);
|
||||
u8 opt = 0;
|
||||
|
||||
if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
|
||||
return -EINVAL;
|
||||
|
||||
if (wolinfo->wolopts & WAKE_PHY)
|
||||
opt |= SR_MONITOR_LINK;
|
||||
if (wolinfo->wolopts & WAKE_MAGIC)
|
||||
|
@ -1872,8 +1872,9 @@ static void virtnet_freeze_down(struct virtio_device *vdev)
|
||||
/* Make sure no work handler is accessing the device */
|
||||
flush_work(&vi->config_work);
|
||||
|
||||
netif_tx_lock_bh(vi->dev);
|
||||
netif_device_detach(vi->dev);
|
||||
netif_tx_disable(vi->dev);
|
||||
netif_tx_unlock_bh(vi->dev);
|
||||
cancel_delayed_work_sync(&vi->refill);
|
||||
|
||||
if (netif_running(vi->dev)) {
|
||||
@ -1909,7 +1910,9 @@ static int virtnet_restore_up(struct virtio_device *vdev)
|
||||
}
|
||||
}
|
||||
|
||||
netif_tx_lock_bh(vi->dev);
|
||||
netif_device_attach(vi->dev);
|
||||
netif_tx_unlock_bh(vi->dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -95,8 +95,8 @@ enum {
|
||||
#define IWL_ALIVE_FLG_RFKILL BIT(0)
|
||||
|
||||
struct iwl_lmac_alive {
|
||||
__le32 ucode_minor;
|
||||
__le32 ucode_major;
|
||||
__le32 ucode_minor;
|
||||
u8 ver_subtype;
|
||||
u8 ver_type;
|
||||
u8 mac;
|
||||
@ -113,8 +113,8 @@ struct iwl_lmac_alive {
|
||||
} __packed; /* UCODE_ALIVE_NTFY_API_S_VER_3 */
|
||||
|
||||
struct iwl_umac_alive {
|
||||
__le32 umac_minor; /* UMAC version: minor */
|
||||
__le32 umac_major; /* UMAC version: major */
|
||||
__le32 umac_minor; /* UMAC version: minor */
|
||||
__le32 error_info_addr; /* SRAM address for UMAC error log */
|
||||
__le32 dbg_print_buff_addr;
|
||||
} __packed; /* UMAC_ALIVE_DATA_API_S_VER_2 */
|
||||
|
@ -950,7 +950,20 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt,
|
||||
if (trigger)
|
||||
delay = msecs_to_jiffies(le32_to_cpu(trigger->stop_delay));
|
||||
|
||||
if (WARN(fwrt->trans->state == IWL_TRANS_NO_FW,
|
||||
/*
|
||||
* If the loading of the FW completed successfully, the next step is to
|
||||
* get the SMEM config data. Thus, if fwrt->smem_cfg.num_lmacs is non
|
||||
* zero, the FW was already loaded successully. If the state is "NO_FW"
|
||||
* in such a case - WARN and exit, since FW may be dead. Otherwise, we
|
||||
* can try to collect the data, since FW might just not be fully
|
||||
* loaded (no "ALIVE" yet), and the debug data is accessible.
|
||||
*
|
||||
* Corner case: got the FW alive but crashed before getting the SMEM
|
||||
* config. In such a case, due to HW access problems, we might
|
||||
* collect garbage.
|
||||
*/
|
||||
if (WARN((fwrt->trans->state == IWL_TRANS_NO_FW) &&
|
||||
fwrt->smem_cfg.num_lmacs,
|
||||
"Can't collect dbg data when FW isn't alive\n"))
|
||||
return -EIO;
|
||||
|
||||
|
@ -439,7 +439,8 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
rx_status->bw = RATE_INFO_BW_160;
|
||||
break;
|
||||
}
|
||||
if (rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
if (!(rate_n_flags & RATE_MCS_CCK_MSK) &&
|
||||
rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
|
||||
if (rate_n_flags & RATE_HT_MCS_GF_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_HT_GF;
|
||||
|
@ -981,7 +981,9 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
rx_status->bw = RATE_INFO_BW_160;
|
||||
break;
|
||||
}
|
||||
if (rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
|
||||
if (!(rate_n_flags & RATE_MCS_CCK_MSK) &&
|
||||
rate_n_flags & RATE_MCS_SGI_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_SHORT_GI;
|
||||
if (rate_n_flags & RATE_HT_MCS_GF_MSK)
|
||||
rx_status->enc_flags |= RX_ENC_FLAG_HT_GF;
|
||||
|
@ -2730,8 +2730,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
list_add_tail(&data->list, &hwsim_radios);
|
||||
spin_unlock_bh(&hwsim_radio_lock);
|
||||
|
||||
if (idx > 0)
|
||||
hwsim_mcast_new_radio(idx, info, param);
|
||||
hwsim_mcast_new_radio(idx, info, param);
|
||||
|
||||
return idx;
|
||||
|
||||
|
@ -1317,6 +1317,10 @@ static int if_sdio_suspend(struct device *dev)
|
||||
if (priv->wol_criteria == EHS_REMOVE_WAKEUP) {
|
||||
dev_info(dev, "Suspend without wake params -- powering down card\n");
|
||||
if (priv->fw_ready) {
|
||||
ret = lbs_suspend(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->power_up_on_resume = true;
|
||||
if_sdio_power_off(card);
|
||||
}
|
||||
|
@ -1824,7 +1824,7 @@ static int talk_to_netback(struct xenbus_device *dev,
|
||||
err = xen_net_read_mac(dev, info->netdev->dev_addr);
|
||||
if (err) {
|
||||
xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);
|
||||
goto out;
|
||||
goto out_unlocked;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
@ -1939,6 +1939,7 @@ abort_transaction_no_dev_fatal:
|
||||
xennet_destroy_queues(info);
|
||||
out:
|
||||
rtnl_unlock();
|
||||
out_unlocked:
|
||||
device_unregister(&dev->dev);
|
||||
return err;
|
||||
}
|
||||
@ -1964,10 +1965,6 @@ static int xennet_connect(struct net_device *dev)
|
||||
/* talk_to_netback() sets the correct number of queues */
|
||||
num_queues = dev->real_num_tx_queues;
|
||||
|
||||
rtnl_lock();
|
||||
netdev_update_features(dev);
|
||||
rtnl_unlock();
|
||||
|
||||
if (dev->reg_state == NETREG_UNINITIALIZED) {
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
@ -1977,6 +1974,10 @@ static int xennet_connect(struct net_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
netdev_update_features(dev);
|
||||
rtnl_unlock();
|
||||
|
||||
/*
|
||||
* All public and private state should now be sane. Get
|
||||
* ready to start sending and receiving packets and give the driver
|
||||
|
@ -3001,28 +3001,23 @@ static int qeth_send_startlan(struct qeth_card *card)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_default_setadapterparms_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
static int qeth_setadpparms_inspect_rc(struct qeth_ipa_cmd *cmd)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "defadpcb");
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->hdr.return_code == 0)
|
||||
if (!cmd->hdr.return_code)
|
||||
cmd->hdr.return_code =
|
||||
cmd->data.setadapterparms.hdr.return_code;
|
||||
return 0;
|
||||
return cmd->hdr.return_code;
|
||||
}
|
||||
|
||||
static int qeth_query_setadapterparms_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
|
||||
QETH_CARD_TEXT(card, 3, "quyadpcb");
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) {
|
||||
card->info.link_type =
|
||||
cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
|
||||
@ -3030,7 +3025,7 @@ static int qeth_query_setadapterparms_cb(struct qeth_card *card,
|
||||
}
|
||||
card->options.adp.supported_funcs =
|
||||
cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
|
||||
return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
|
||||
@ -3122,22 +3117,20 @@ EXPORT_SYMBOL_GPL(qeth_query_ipassists);
|
||||
static int qeth_query_switch_attributes_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_switch_info *sw_info;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
struct qeth_query_switch_attributes *attrs;
|
||||
struct qeth_switch_info *sw_info;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "qswiatcb");
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
sw_info = (struct qeth_switch_info *)reply->param;
|
||||
if (cmd->data.setadapterparms.hdr.return_code == 0) {
|
||||
attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
|
||||
sw_info->capabilities = attrs->capabilities;
|
||||
sw_info->settings = attrs->settings;
|
||||
QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
|
||||
sw_info->settings);
|
||||
}
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
sw_info = (struct qeth_switch_info *)reply->param;
|
||||
attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
|
||||
sw_info->capabilities = attrs->capabilities;
|
||||
sw_info->settings = attrs->settings;
|
||||
QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
|
||||
sw_info->settings);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4188,16 +4181,13 @@ EXPORT_SYMBOL_GPL(qeth_do_send_packet);
|
||||
static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
struct qeth_ipacmd_setadpparms *setparms;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "prmadpcb");
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
setparms = &(cmd->data.setadapterparms);
|
||||
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
|
||||
if (cmd->hdr.return_code) {
|
||||
if (qeth_setadpparms_inspect_rc(cmd)) {
|
||||
QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code);
|
||||
setparms->data.mode = SET_PROMISC_MODE_OFF;
|
||||
}
|
||||
@ -4267,11 +4257,12 @@ EXPORT_SYMBOL_GPL(qeth_get_stats);
|
||||
static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "chgmaccb");
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (!card->options.layer2 ||
|
||||
!(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
|
||||
memcpy(card->dev->dev_addr,
|
||||
@ -4279,7 +4270,6 @@ static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
|
||||
OSA_ADDR_LEN);
|
||||
card->info.mac_bits |= QETH_LAYER2_MAC_READ;
|
||||
}
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4310,13 +4300,15 @@ EXPORT_SYMBOL_GPL(qeth_setadpparms_change_macaddr);
|
||||
static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
struct qeth_set_access_ctrl *access_ctrl_req;
|
||||
int fallback = *(int *)reply->param;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "setaccb");
|
||||
if (cmd->hdr.return_code)
|
||||
return 0;
|
||||
qeth_setadpparms_inspect_rc(cmd);
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
|
||||
QETH_DBF_TEXT_(SETUP, 2, "setaccb");
|
||||
QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
|
||||
@ -4389,7 +4381,6 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
|
||||
card->options.isolation = card->options.prev_isolation;
|
||||
break;
|
||||
}
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -4677,14 +4668,15 @@ out:
|
||||
static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
|
||||
struct qeth_qoat_priv *priv;
|
||||
char *resdata;
|
||||
int resdatalen;
|
||||
|
||||
QETH_CARD_TEXT(card, 3, "qoatcb");
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *)data;
|
||||
priv = (struct qeth_qoat_priv *)reply->param;
|
||||
resdatalen = cmd->data.setadapterparms.hdr.cmdlength;
|
||||
resdata = (char *)data + 28;
|
||||
@ -4778,21 +4770,18 @@ out:
|
||||
static int qeth_query_card_info_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct carrier_info *carrier_info = (struct carrier_info *)reply->param;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
|
||||
struct qeth_query_card_info *card_info;
|
||||
struct carrier_info *carrier_info;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "qcrdincb");
|
||||
carrier_info = (struct carrier_info *)reply->param;
|
||||
cmd = (struct qeth_ipa_cmd *)data;
|
||||
card_info = &cmd->data.setadapterparms.data.card_info;
|
||||
if (cmd->data.setadapterparms.hdr.return_code == 0) {
|
||||
carrier_info->card_type = card_info->card_type;
|
||||
carrier_info->port_mode = card_info->port_mode;
|
||||
carrier_info->port_speed = card_info->port_speed;
|
||||
}
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
card_info = &cmd->data.setadapterparms.data.card_info;
|
||||
carrier_info->card_type = card_info->card_type;
|
||||
carrier_info->port_mode = card_info->port_mode;
|
||||
carrier_info->port_speed = card_info->port_speed;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2506,8 +2506,8 @@ int aac_command_thread(void *data)
|
||||
/* Synchronize our watches */
|
||||
if (((NSEC_PER_SEC - (NSEC_PER_SEC / HZ)) > now.tv_nsec)
|
||||
&& (now.tv_nsec > (NSEC_PER_SEC / HZ)))
|
||||
difference = (((NSEC_PER_SEC - now.tv_nsec) * HZ)
|
||||
+ NSEC_PER_SEC / 2) / NSEC_PER_SEC;
|
||||
difference = HZ + HZ / 2 -
|
||||
now.tv_nsec / (NSEC_PER_SEC / HZ);
|
||||
else {
|
||||
if (now.tv_nsec > NSEC_PER_SEC / 2)
|
||||
++now.tv_sec;
|
||||
@ -2531,6 +2531,10 @@ int aac_command_thread(void *data)
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
|
||||
/*
|
||||
* we probably want usleep_range() here instead of the
|
||||
* jiffies computation
|
||||
*/
|
||||
schedule_timeout(difference);
|
||||
|
||||
if (kthread_should_stop())
|
||||
|
@ -3580,11 +3580,9 @@ static void ibmvfc_tgt_implicit_logout(struct ibmvfc_target *tgt)
|
||||
static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad,
|
||||
struct ibmvfc_target *tgt)
|
||||
{
|
||||
if (memcmp(&mad->fc_iu.response[2], &tgt->ids.port_name,
|
||||
sizeof(tgt->ids.port_name)))
|
||||
if (wwn_to_u64((u8 *)&mad->fc_iu.response[2]) != tgt->ids.port_name)
|
||||
return 1;
|
||||
if (memcmp(&mad->fc_iu.response[4], &tgt->ids.node_name,
|
||||
sizeof(tgt->ids.node_name)))
|
||||
if (wwn_to_u64((u8 *)&mad->fc_iu.response[4]) != tgt->ids.node_name)
|
||||
return 1;
|
||||
if (be32_to_cpu(mad->fc_iu.response[6]) != tgt->scsi_id)
|
||||
return 1;
|
||||
|
@ -1365,8 +1365,8 @@ qla24xx_abort_sp_done(void *ptr, int res)
|
||||
srb_t *sp = ptr;
|
||||
struct srb_iocb *abt = &sp->u.iocb_cmd;
|
||||
|
||||
del_timer(&sp->u.iocb_cmd.timer);
|
||||
complete(&abt->u.abt.comp);
|
||||
if (del_timer(&sp->u.iocb_cmd.timer))
|
||||
complete(&abt->u.abt.comp);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -2498,6 +2498,8 @@ sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer)
|
||||
sector_size = old_sector_size;
|
||||
goto got_data;
|
||||
}
|
||||
/* Remember that READ CAPACITY(16) succeeded */
|
||||
sdp->try_rc_10_first = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2699,6 +2699,9 @@ static int qman_alloc_range(struct gen_pool *p, u32 *result, u32 cnt)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
if (!p)
|
||||
return -ENODEV;
|
||||
|
||||
addr = gen_pool_alloc(p, cnt);
|
||||
if (!addr)
|
||||
return -ENOMEM;
|
||||
|
@ -626,7 +626,7 @@ static u32 ucc_get_tdm_sync_shift(enum comm_dir mode, u32 tdm_num)
|
||||
{
|
||||
u32 shift;
|
||||
|
||||
shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : RX_SYNC_SHIFT_BASE;
|
||||
shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : TX_SYNC_SHIFT_BASE;
|
||||
shift -= tdm_num * 2;
|
||||
|
||||
return shift;
|
||||
|
@ -34,10 +34,10 @@
|
||||
|
||||
/*
|
||||
* output example:
|
||||
* hub port sta spd dev sockfd local_busid
|
||||
* hs 0000 004 000 00000000 3 1-2.3
|
||||
* hub port sta spd dev sockfd local_busid
|
||||
* hs 0000 004 000 00000000 000003 1-2.3
|
||||
* ................................................
|
||||
* ss 0008 004 000 00000000 4 2-3.4
|
||||
* ss 0008 004 000 00000000 000004 2-3.4
|
||||
* ................................................
|
||||
*
|
||||
* Output includes socket fd instead of socket pointer address to avoid
|
||||
@ -61,13 +61,13 @@ static void port_show_vhci(char **out, int hub, int port, struct vhci_device *vd
|
||||
if (vdev->ud.status == VDEV_ST_USED) {
|
||||
*out += sprintf(*out, "%03u %08x ",
|
||||
vdev->speed, vdev->devid);
|
||||
*out += sprintf(*out, "%u %s",
|
||||
*out += sprintf(*out, "%06u %s",
|
||||
vdev->ud.sockfd,
|
||||
dev_name(&vdev->udev->dev));
|
||||
|
||||
} else {
|
||||
*out += sprintf(*out, "000 00000000 ");
|
||||
*out += sprintf(*out, "0000000000000000 0-0");
|
||||
*out += sprintf(*out, "000000 0-0");
|
||||
}
|
||||
|
||||
*out += sprintf(*out, "\n");
|
||||
@ -165,7 +165,7 @@ static ssize_t status_show(struct device *dev,
|
||||
int pdev_nr;
|
||||
|
||||
out += sprintf(out,
|
||||
"hub port sta spd dev socket local_busid\n");
|
||||
"hub port sta spd dev sockfd local_busid\n");
|
||||
|
||||
pdev_nr = status_name_to_id(attr->attr.name);
|
||||
if (pdev_nr < 0)
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/interval_tree_generic.h>
|
||||
#include <linux/nospec.h>
|
||||
|
||||
#include "vhost.h"
|
||||
|
||||
@ -1366,6 +1367,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, int ioctl, void __user *argp)
|
||||
if (idx >= d->nvqs)
|
||||
return -ENOBUFS;
|
||||
|
||||
idx = array_index_nospec(idx, d->nvqs);
|
||||
vq = d->vqs[idx];
|
||||
|
||||
mutex_lock(&vq->mutex);
|
||||
|
@ -712,7 +712,7 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
||||
/*
|
||||
* enable controller clock
|
||||
*/
|
||||
clk_enable(fbi->clk);
|
||||
clk_prepare_enable(fbi->clk);
|
||||
|
||||
pxa168fb_set_par(info);
|
||||
|
||||
@ -767,7 +767,7 @@ static int pxa168fb_probe(struct platform_device *pdev)
|
||||
failed_free_cmap:
|
||||
fb_dealloc_cmap(&info->cmap);
|
||||
failed_free_clk:
|
||||
clk_disable(fbi->clk);
|
||||
clk_disable_unprepare(fbi->clk);
|
||||
failed_free_fbmem:
|
||||
dma_free_coherent(fbi->dev, info->fix.smem_len,
|
||||
info->screen_base, fbi->fb_start_dma);
|
||||
@ -807,7 +807,7 @@ static int pxa168fb_remove(struct platform_device *pdev)
|
||||
dma_free_wc(fbi->dev, PAGE_ALIGN(info->fix.smem_len),
|
||||
info->screen_base, info->fix.smem_start);
|
||||
|
||||
clk_disable(fbi->clk);
|
||||
clk_disable_unprepare(fbi->clk);
|
||||
|
||||
framebuffer_release(info);
|
||||
|
||||
|
@ -2603,8 +2603,10 @@ out:
|
||||
}
|
||||
btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem);
|
||||
|
||||
if (done && !ret)
|
||||
if (done && !ret) {
|
||||
ret = 1;
|
||||
fs_info->qgroup_rescan_progress.objectid = (u64)-1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -712,7 +712,7 @@ cgfi_exit:
|
||||
/* Simple function to return a 64 bit hash of string. Rarely called */
|
||||
static __u64 simple_hashstr(const char *str)
|
||||
{
|
||||
const __u64 hash_mult = 1125899906842597L; /* a big enough prime */
|
||||
const __u64 hash_mult = 1125899906842597ULL; /* a big enough prime */
|
||||
__u64 hash = 0;
|
||||
|
||||
while (*str)
|
||||
|
@ -681,6 +681,7 @@ int fat_count_free_clusters(struct super_block *sb)
|
||||
if (ops->ent_get(&fatent) == FAT_ENT_FREE)
|
||||
free++;
|
||||
} while (fat_ent_next(sbi, &fatent));
|
||||
cond_resched();
|
||||
}
|
||||
sbi->free_clusters = free;
|
||||
sbi->free_clus_valid = 1;
|
||||
|
@ -2946,6 +2946,7 @@ int ocfs2_duplicate_clusters_by_page(handle_t *handle,
|
||||
if (map_end & (PAGE_SIZE - 1))
|
||||
to = map_end & (PAGE_SIZE - 1);
|
||||
|
||||
retry:
|
||||
page = find_or_create_page(mapping, page_index, GFP_NOFS);
|
||||
if (!page) {
|
||||
ret = -ENOMEM;
|
||||
@ -2954,11 +2955,18 @@ int ocfs2_duplicate_clusters_by_page(handle_t *handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* In case PAGE_SIZE <= CLUSTER_SIZE, This page
|
||||
* can't be dirtied before we CoW it out.
|
||||
* In case PAGE_SIZE <= CLUSTER_SIZE, we do not expect a dirty
|
||||
* page, so write it back.
|
||||
*/
|
||||
if (PAGE_SIZE <= OCFS2_SB(sb)->s_clustersize)
|
||||
BUG_ON(PageDirty(page));
|
||||
if (PAGE_SIZE <= OCFS2_SB(sb)->s_clustersize) {
|
||||
if (PageDirty(page)) {
|
||||
/*
|
||||
* write_on_page will unlock the page on return
|
||||
*/
|
||||
ret = write_one_page(page);
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
ret = block_read_full_page(page, ocfs2_get_block);
|
||||
|
@ -27,6 +27,7 @@ struct bpf_map_ops {
|
||||
void (*map_release)(struct bpf_map *map, struct file *map_file);
|
||||
void (*map_free)(struct bpf_map *map);
|
||||
int (*map_get_next_key)(struct bpf_map *map, void *key, void *next_key);
|
||||
void (*map_release_uref)(struct bpf_map *map);
|
||||
|
||||
/* funcs callable from userspace and from eBPF programs */
|
||||
void *(*map_lookup_elem)(struct bpf_map *map, void *key);
|
||||
@ -306,7 +307,6 @@ int bpf_stackmap_copy(struct bpf_map *map, void *key, void *value);
|
||||
int bpf_fd_array_map_update_elem(struct bpf_map *map, struct file *map_file,
|
||||
void *key, void *value, u64 map_flags);
|
||||
int bpf_fd_array_map_lookup_elem(struct bpf_map *map, void *key, u32 *value);
|
||||
void bpf_fd_array_map_clear(struct bpf_map *map);
|
||||
int bpf_fd_htab_map_update_elem(struct bpf_map *map, struct file *map_file,
|
||||
void *key, void *value, u64 map_flags);
|
||||
int bpf_fd_htab_map_lookup_elem(struct bpf_map *map, void *key, u32 *value);
|
||||
|
@ -78,6 +78,18 @@ extern void __chk_io_ptr(const volatile void __iomem *);
|
||||
#include <linux/compiler-clang.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Some architectures need to provide custom definitions of macros provided
|
||||
* by linux/compiler-*.h, and can do so using asm/compiler.h. We include that
|
||||
* conditionally rather than using an asm-generic wrapper in order to avoid
|
||||
* build failures if any C compilation, which will include this file via an
|
||||
* -include argument in c_flags, occurs prior to the asm-generic wrappers being
|
||||
* generated.
|
||||
*/
|
||||
#ifdef CONFIG_HAVE_ARCH_COMPILER_H
|
||||
#include <asm/compiler.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Generic compiler-dependent macros required for kernel
|
||||
* build go below this comment. Actual compiler/compiler version
|
||||
|
@ -141,7 +141,7 @@ int iio_dma_buffer_read(struct iio_buffer *buffer, size_t n,
|
||||
char __user *user_buffer);
|
||||
size_t iio_dma_buffer_data_available(struct iio_buffer *buffer);
|
||||
int iio_dma_buffer_set_bytes_per_datum(struct iio_buffer *buffer, size_t bpd);
|
||||
int iio_dma_buffer_set_length(struct iio_buffer *buffer, int length);
|
||||
int iio_dma_buffer_set_length(struct iio_buffer *buffer, unsigned int length);
|
||||
int iio_dma_buffer_request_update(struct iio_buffer *buffer);
|
||||
|
||||
int iio_dma_buffer_init(struct iio_dma_buffer_queue *queue,
|
||||
|
@ -1193,25 +1193,9 @@ enum {
|
||||
};
|
||||
|
||||
static inline const struct cpumask *
|
||||
mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector)
|
||||
mlx5_get_vector_affinity_hint(struct mlx5_core_dev *dev, int vector)
|
||||
{
|
||||
const struct cpumask *mask;
|
||||
struct irq_desc *desc;
|
||||
unsigned int irq;
|
||||
int eqn;
|
||||
int err;
|
||||
|
||||
err = mlx5_vector2eqn(dev, MLX5_EQ_VEC_COMP_BASE + vector, &eqn, &irq);
|
||||
if (err)
|
||||
return NULL;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
|
||||
mask = irq_data_get_effective_affinity_mask(&desc->irq_data);
|
||||
#else
|
||||
mask = desc->irq_common_data.affinity;
|
||||
#endif
|
||||
return mask;
|
||||
return dev->priv.irq_info[vector].mask;
|
||||
}
|
||||
|
||||
#endif /* MLX5_DRIVER_H */
|
||||
|
@ -879,6 +879,10 @@ static inline int genphy_no_soft_reset(struct phy_device *phydev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int genphy_read_mmd_unsupported(struct phy_device *phdev, int devad,
|
||||
u16 regnum);
|
||||
int genphy_write_mmd_unsupported(struct phy_device *phdev, int devnum,
|
||||
u16 regnum, u16 val);
|
||||
|
||||
/* Clause 45 PHY */
|
||||
int genphy_c45_restart_aneg(struct phy_device *phydev);
|
||||
|
@ -471,7 +471,7 @@ static u32 prog_fd_array_sys_lookup_elem(void *ptr)
|
||||
}
|
||||
|
||||
/* decrement refcnt of all bpf_progs that are stored in this map */
|
||||
void bpf_fd_array_map_clear(struct bpf_map *map)
|
||||
static void bpf_fd_array_map_clear(struct bpf_map *map)
|
||||
{
|
||||
struct bpf_array *array = container_of(map, struct bpf_array, map);
|
||||
int i;
|
||||
@ -489,6 +489,7 @@ const struct bpf_map_ops prog_array_map_ops = {
|
||||
.map_fd_get_ptr = prog_fd_array_get_ptr,
|
||||
.map_fd_put_ptr = prog_fd_array_put_ptr,
|
||||
.map_fd_sys_lookup_elem = prog_fd_array_sys_lookup_elem,
|
||||
.map_release_uref = bpf_fd_array_map_clear,
|
||||
};
|
||||
|
||||
static struct bpf_event_entry *bpf_event_entry_gen(struct file *perf_file,
|
||||
|
@ -878,7 +878,7 @@ static int sock_map_update_elem(struct bpf_map *map,
|
||||
return err;
|
||||
}
|
||||
|
||||
static void sock_map_release(struct bpf_map *map, struct file *map_file)
|
||||
static void sock_map_release(struct bpf_map *map)
|
||||
{
|
||||
struct bpf_stab *stab = container_of(map, struct bpf_stab, map);
|
||||
struct bpf_prog *orig;
|
||||
@ -898,7 +898,7 @@ const struct bpf_map_ops sock_map_ops = {
|
||||
.map_get_next_key = sock_map_get_next_key,
|
||||
.map_update_elem = sock_map_update_elem,
|
||||
.map_delete_elem = sock_map_delete_elem,
|
||||
.map_release = sock_map_release,
|
||||
.map_release_uref = sock_map_release,
|
||||
};
|
||||
|
||||
BPF_CALL_4(bpf_sock_map_update, struct bpf_sock_ops_kern *, bpf_sock,
|
||||
|
@ -217,8 +217,8 @@ static void bpf_map_free_deferred(struct work_struct *work)
|
||||
static void bpf_map_put_uref(struct bpf_map *map)
|
||||
{
|
||||
if (atomic_dec_and_test(&map->usercnt)) {
|
||||
if (map->map_type == BPF_MAP_TYPE_PROG_ARRAY)
|
||||
bpf_fd_array_map_clear(map);
|
||||
if (map->ops->map_release_uref)
|
||||
map->ops->map_release_uref(map);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8063,6 +8063,8 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
|
||||
goto unlock;
|
||||
|
||||
list_for_each_entry_rcu(event, &ctx->event_list, event_entry) {
|
||||
if (event->cpu != smp_processor_id())
|
||||
continue;
|
||||
if (event->attr.type != PERF_TYPE_TRACEPOINT)
|
||||
continue;
|
||||
if (event->attr.config != entry->type)
|
||||
@ -9025,9 +9027,7 @@ static void free_pmu_context(struct pmu *pmu)
|
||||
if (pmu->task_ctx_nr > perf_invalid_context)
|
||||
return;
|
||||
|
||||
mutex_lock(&pmus_lock);
|
||||
free_percpu(pmu->pmu_cpu_context);
|
||||
mutex_unlock(&pmus_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -9283,12 +9283,8 @@ EXPORT_SYMBOL_GPL(perf_pmu_register);
|
||||
|
||||
void perf_pmu_unregister(struct pmu *pmu)
|
||||
{
|
||||
int remove_device;
|
||||
|
||||
mutex_lock(&pmus_lock);
|
||||
remove_device = pmu_bus_running;
|
||||
list_del_rcu(&pmu->entry);
|
||||
mutex_unlock(&pmus_lock);
|
||||
|
||||
/*
|
||||
* We dereference the pmu list under both SRCU and regular RCU, so
|
||||
@ -9300,13 +9296,14 @@ void perf_pmu_unregister(struct pmu *pmu)
|
||||
free_percpu(pmu->pmu_disable_count);
|
||||
if (pmu->type >= PERF_TYPE_MAX)
|
||||
idr_remove(&pmu_idr, pmu->type);
|
||||
if (remove_device) {
|
||||
if (pmu_bus_running) {
|
||||
if (pmu->nr_addr_filters)
|
||||
device_remove_file(pmu->dev, &dev_attr_nr_addr_filters);
|
||||
device_del(pmu->dev);
|
||||
put_device(pmu->dev);
|
||||
}
|
||||
free_pmu_context(pmu);
|
||||
mutex_unlock(&pmus_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(perf_pmu_unregister);
|
||||
|
||||
|
@ -260,7 +260,7 @@ static void test_cycle_work(struct work_struct *work)
|
||||
{
|
||||
struct test_cycle *cycle = container_of(work, typeof(*cycle), work);
|
||||
struct ww_acquire_ctx ctx;
|
||||
int err;
|
||||
int err, erra = 0;
|
||||
|
||||
ww_acquire_init(&ctx, &ww_class);
|
||||
ww_mutex_lock(&cycle->a_mutex, &ctx);
|
||||
@ -270,17 +270,19 @@ static void test_cycle_work(struct work_struct *work)
|
||||
|
||||
err = ww_mutex_lock(cycle->b_mutex, &ctx);
|
||||
if (err == -EDEADLK) {
|
||||
err = 0;
|
||||
ww_mutex_unlock(&cycle->a_mutex);
|
||||
ww_mutex_lock_slow(cycle->b_mutex, &ctx);
|
||||
err = ww_mutex_lock(&cycle->a_mutex, &ctx);
|
||||
erra = ww_mutex_lock(&cycle->a_mutex, &ctx);
|
||||
}
|
||||
|
||||
if (!err)
|
||||
ww_mutex_unlock(cycle->b_mutex);
|
||||
ww_mutex_unlock(&cycle->a_mutex);
|
||||
if (!erra)
|
||||
ww_mutex_unlock(&cycle->a_mutex);
|
||||
ww_acquire_fini(&ctx);
|
||||
|
||||
cycle->result = err;
|
||||
cycle->result = err ?: erra;
|
||||
}
|
||||
|
||||
static int __test_cycle(unsigned int nthreads)
|
||||
|
@ -5427,7 +5427,7 @@ static struct bpf_test tests[] = {
|
||||
{
|
||||
"BPF_MAXINSNS: Jump, gap, jump, ...",
|
||||
{ },
|
||||
#ifdef CONFIG_BPF_JIT_ALWAYS_ON
|
||||
#if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_X86)
|
||||
CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
|
||||
#else
|
||||
CLASSIC | FLAG_NO_DATA,
|
||||
|
@ -2298,9 +2298,8 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
/* LE address type */
|
||||
addr_type = le_addr_type(cp->addr.type);
|
||||
|
||||
hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);
|
||||
|
||||
err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
|
||||
/* Abort any ongoing SMP pairing. Removes ltk and irk if they exist. */
|
||||
err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type);
|
||||
if (err < 0) {
|
||||
err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
|
||||
MGMT_STATUS_NOT_PAIRED, &rp,
|
||||
@ -2314,8 +2313,6 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Abort any ongoing SMP pairing */
|
||||
smp_cancel_pairing(conn);
|
||||
|
||||
/* Defer clearing up the connection parameters until closing to
|
||||
* give a chance of keeping them if a repairing happens.
|
||||
|
@ -2410,30 +2410,51 @@ unlock:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void smp_cancel_pairing(struct hci_conn *hcon)
|
||||
int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 addr_type)
|
||||
{
|
||||
struct l2cap_conn *conn = hcon->l2cap_data;
|
||||
struct hci_conn *hcon;
|
||||
struct l2cap_conn *conn;
|
||||
struct l2cap_chan *chan;
|
||||
struct smp_chan *smp;
|
||||
int err;
|
||||
|
||||
err = hci_remove_ltk(hdev, bdaddr, addr_type);
|
||||
hci_remove_irk(hdev, bdaddr, addr_type);
|
||||
|
||||
hcon = hci_conn_hash_lookup_le(hdev, bdaddr, addr_type);
|
||||
if (!hcon)
|
||||
goto done;
|
||||
|
||||
conn = hcon->l2cap_data;
|
||||
if (!conn)
|
||||
return;
|
||||
goto done;
|
||||
|
||||
chan = conn->smp;
|
||||
if (!chan)
|
||||
return;
|
||||
goto done;
|
||||
|
||||
l2cap_chan_lock(chan);
|
||||
|
||||
smp = chan->data;
|
||||
if (smp) {
|
||||
/* Set keys to NULL to make sure smp_failure() does not try to
|
||||
* remove and free already invalidated rcu list entries. */
|
||||
smp->ltk = NULL;
|
||||
smp->slave_ltk = NULL;
|
||||
smp->remote_irk = NULL;
|
||||
|
||||
if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
|
||||
smp_failure(conn, 0);
|
||||
else
|
||||
smp_failure(conn, SMP_UNSPECIFIED);
|
||||
err = 0;
|
||||
}
|
||||
|
||||
l2cap_chan_unlock(chan);
|
||||
|
||||
done:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
|
||||
|
@ -181,7 +181,8 @@ enum smp_key_pref {
|
||||
};
|
||||
|
||||
/* SMP Commands */
|
||||
void smp_cancel_pairing(struct hci_conn *hcon);
|
||||
int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 addr_type);
|
||||
bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
|
||||
enum smp_key_pref key_pref);
|
||||
int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user