mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 22:14:04 +02:00
Merge tag 'v5.12-rc7' into android-mainline
Linux 5.12-rc7 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Idbdb502acb1acbb5a6f076084f6a4782e300cc50
This commit is contained in:
commit
67a1678948
7
.mailmap
7
.mailmap
|
|
@ -168,6 +168,7 @@ Johan Hovold <johan@kernel.org> <jhovold@gmail.com>
|
|||
Johan Hovold <johan@kernel.org> <johan@hovoldconsulting.com>
|
||||
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
|
||||
John Stultz <johnstul@us.ibm.com>
|
||||
Jordan Crouse <jordan@cosmicpenguin.net> <jcrouse@codeaurora.org>
|
||||
<josh@joshtriplett.org> <josh@freedesktop.org>
|
||||
<josh@joshtriplett.org> <josh@kernel.org>
|
||||
<josh@joshtriplett.org> <josht@linux.vnet.ibm.com>
|
||||
|
|
@ -253,8 +254,14 @@ Morten Welinder <welinder@anemone.rentec.com>
|
|||
Morten Welinder <welinder@darter.rentec.com>
|
||||
Morten Welinder <welinder@troll.com>
|
||||
Mythri P K <mythripk@ti.com>
|
||||
Nadia Yvette Chambers <nyc@holomorphy.com> William Lee Irwin III <wli@holomorphy.com>
|
||||
Nathan Chancellor <nathan@kernel.org> <natechancellor@gmail.com>
|
||||
Nguyen Anh Quynh <aquynh@gmail.com>
|
||||
Nicholas Piggin <npiggin@gmail.com> <npiggen@suse.de>
|
||||
Nicholas Piggin <npiggin@gmail.com> <npiggin@kernel.dk>
|
||||
Nicholas Piggin <npiggin@gmail.com> <npiggin@suse.de>
|
||||
Nicholas Piggin <npiggin@gmail.com> <nickpiggin@yahoo.com.au>
|
||||
Nicholas Piggin <npiggin@gmail.com> <piggin@cyberone.com.au>
|
||||
Nicolas Ferre <nicolas.ferre@microchip.com> <nicolas.ferre@atmel.com>
|
||||
Nicolas Pitre <nico@fluxnic.net> <nicolas.pitre@linaro.org>
|
||||
Nicolas Pitre <nico@fluxnic.net> <nico@linaro.org>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
What: /sys/kernel/debug/moxtet/input
|
||||
Date: March 2019
|
||||
KernelVersion: 5.3
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) Read input from the shift registers, in hexadecimal.
|
||||
Returns N+1 bytes, where N is the number of Moxtet connected
|
||||
modules. The first byte is from the CPU board itself.
|
||||
|
|
@ -19,7 +19,7 @@ Description: (Read) Read input from the shift registers, in hexadecimal.
|
|||
What: /sys/kernel/debug/moxtet/output
|
||||
Date: March 2019
|
||||
KernelVersion: 5.3
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (RW) Read last written value to the shift registers, in
|
||||
hexadecimal, or write values to the shift registers, also
|
||||
in hexadecimal.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
What: /sys/kernel/debug/turris-mox-rwtm/do_sign
|
||||
Date: Jun 2020
|
||||
KernelVersion: 5.8
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description:
|
||||
|
||||
======= ===========================================================
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
What: /sys/bus/moxtet/devices/moxtet-<name>.<addr>/module_description
|
||||
Date: March 2019
|
||||
KernelVersion: 5.3
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) Moxtet module description. Format: string
|
||||
|
||||
What: /sys/bus/moxtet/devices/moxtet-<name>.<addr>/module_id
|
||||
Date: March 2019
|
||||
KernelVersion: 5.3
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) Moxtet module ID. Format: %x
|
||||
|
||||
What: /sys/bus/moxtet/devices/moxtet-<name>.<addr>/module_name
|
||||
Date: March 2019
|
||||
KernelVersion: 5.3
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) Moxtet module name. Format: string
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
What: /sys/class/leds/<led>/device/brightness
|
||||
Date: July 2020
|
||||
KernelVersion: 5.9
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (RW) On the front panel of the Turris Omnia router there is also
|
||||
a button which can be used to control the intensity of all the
|
||||
LEDs at once, so that if they are too bright, user can dim them.
|
||||
|
|
|
|||
|
|
@ -1,21 +1,21 @@
|
|||
What: /sys/firmware/turris-mox-rwtm/board_version
|
||||
Date: August 2019
|
||||
KernelVersion: 5.4
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) Board version burned into eFuses of this Turris Mox board.
|
||||
Format: %i
|
||||
|
||||
What: /sys/firmware/turris-mox-rwtm/mac_address*
|
||||
Date: August 2019
|
||||
KernelVersion: 5.4
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) MAC addresses burned into eFuses of this Turris Mox board.
|
||||
Format: %pM
|
||||
|
||||
What: /sys/firmware/turris-mox-rwtm/pubkey
|
||||
Date: August 2019
|
||||
KernelVersion: 5.4
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) ECDSA public key (in pubkey hex compressed form) computed
|
||||
as pair to the ECDSA private key burned into eFuses of this
|
||||
Turris Mox Board.
|
||||
|
|
@ -24,7 +24,7 @@ Description: (Read) ECDSA public key (in pubkey hex compressed form) computed
|
|||
What: /sys/firmware/turris-mox-rwtm/ram_size
|
||||
Date: August 2019
|
||||
KernelVersion: 5.4
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) RAM size in MiB of this Turris Mox board as was detected
|
||||
during manufacturing and burned into eFuses. Can be 512 or 1024.
|
||||
Format: %i
|
||||
|
|
@ -32,6 +32,6 @@ Description: (Read) RAM size in MiB of this Turris Mox board as was detected
|
|||
What: /sys/firmware/turris-mox-rwtm/serial_number
|
||||
Date: August 2019
|
||||
KernelVersion: 5.4
|
||||
Contact: Marek Behún <marek.behun@nic.cz>
|
||||
Contact: Marek Behún <kabel@kernel.org>
|
||||
Description: (Read) Serial number burned into eFuses of this Turris Mox device.
|
||||
Format: %016X
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||
title: Bindings for GPIO bitbanged I2C
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wolfram@the-dreams.de>
|
||||
- Wolfram Sang <wsa@kernel.org>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||
title: Freescale Inter IC (I2C) and High Speed Inter IC (HS-I2C) for i.MX
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wolfram@the-dreams.de>
|
||||
- Oleksij Rempel <o.rempel@pengutronix.de>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
|||
title: CZ.NIC's Turris Omnia LEDs driver
|
||||
|
||||
maintainers:
|
||||
- Marek Behún <marek.behun@nic.cz>
|
||||
- Marek Behún <kabel@kernel.org>
|
||||
|
||||
description:
|
||||
This module adds support for the RGB LEDs found on the front panel of the
|
||||
|
|
|
|||
|
|
@ -976,9 +976,9 @@ constraints on coalescing parameters and their values.
|
|||
|
||||
|
||||
PAUSE_GET
|
||||
============
|
||||
=========
|
||||
|
||||
Gets channel counts like ``ETHTOOL_GPAUSE`` ioctl request.
|
||||
Gets pause frame settings like ``ETHTOOL_GPAUSEPARAM`` ioctl request.
|
||||
|
||||
Request contents:
|
||||
|
||||
|
|
@ -1007,7 +1007,7 @@ the statistics in the following structure:
|
|||
Each member has a corresponding attribute defined.
|
||||
|
||||
PAUSE_SET
|
||||
============
|
||||
=========
|
||||
|
||||
Sets pause parameters like ``ETHTOOL_GPAUSEPARAM`` ioctl request.
|
||||
|
||||
|
|
@ -1024,7 +1024,7 @@ Request contents:
|
|||
EEE_GET
|
||||
=======
|
||||
|
||||
Gets channel counts like ``ETHTOOL_GEEE`` ioctl request.
|
||||
Gets Energy Efficient Ethernet settings like ``ETHTOOL_GEEE`` ioctl request.
|
||||
|
||||
Request contents:
|
||||
|
||||
|
|
@ -1054,7 +1054,7 @@ first 32 are provided by the ``ethtool_ops`` callback.
|
|||
EEE_SET
|
||||
=======
|
||||
|
||||
Sets pause parameters like ``ETHTOOL_GEEEPARAM`` ioctl request.
|
||||
Sets Energy Efficient Ethernet parameters like ``ETHTOOL_SEEE`` ioctl request.
|
||||
|
||||
Request contents:
|
||||
|
||||
|
|
|
|||
13
MAINTAINERS
13
MAINTAINERS
|
|
@ -1790,19 +1790,26 @@ F: drivers/net/ethernet/cortina/
|
|||
F: drivers/pinctrl/pinctrl-gemini.c
|
||||
F: drivers/rtc/rtc-ftrtc010.c
|
||||
|
||||
ARM/CZ.NIC TURRIS MOX SUPPORT
|
||||
M: Marek Behun <marek.behun@nic.cz>
|
||||
ARM/CZ.NIC TURRIS SUPPORT
|
||||
M: Marek Behun <kabel@kernel.org>
|
||||
S: Maintained
|
||||
W: http://mox.turris.cz
|
||||
W: https://www.turris.cz/
|
||||
F: Documentation/ABI/testing/debugfs-moxtet
|
||||
F: Documentation/ABI/testing/sysfs-bus-moxtet-devices
|
||||
F: Documentation/ABI/testing/sysfs-firmware-turris-mox-rwtm
|
||||
F: Documentation/devicetree/bindings/bus/moxtet.txt
|
||||
F: Documentation/devicetree/bindings/firmware/cznic,turris-mox-rwtm.txt
|
||||
F: Documentation/devicetree/bindings/gpio/gpio-moxtet.txt
|
||||
F: Documentation/devicetree/bindings/leds/cznic,turris-omnia-leds.yaml
|
||||
F: Documentation/devicetree/bindings/watchdog/armada-37xx-wdt.txt
|
||||
F: drivers/bus/moxtet.c
|
||||
F: drivers/firmware/turris-mox-rwtm.c
|
||||
F: drivers/leds/leds-turris-omnia.c
|
||||
F: drivers/mailbox/armada-37xx-rwtm-mailbox.c
|
||||
F: drivers/gpio/gpio-moxtet.c
|
||||
F: drivers/watchdog/armada_37xx_wdt.c
|
||||
F: include/dt-bindings/bus/moxtet.h
|
||||
F: include/linux/armada-37xx-rwtm-mailbox.h
|
||||
F: include/linux/moxtet.h
|
||||
|
||||
ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6)
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 5
|
||||
PATCHLEVEL = 12
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Frozen Wasteland
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
/*
|
||||
* Device Tree file for CZ.NIC Turris Mox Board
|
||||
* 2019 by Marek Behun <marek.behun@nic.cz>
|
||||
* 2019 by Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
|
|
|||
|
|
@ -54,8 +54,7 @@
|
|||
|
||||
static inline unsigned long user_stack_pointer(struct pt_regs *regs)
|
||||
{
|
||||
/* FIXME: should this be bspstore + nr_dirty regs? */
|
||||
return regs->ar_bspstore;
|
||||
return regs->r12;
|
||||
}
|
||||
|
||||
static inline int is_syscall_success(struct pt_regs *regs)
|
||||
|
|
@ -79,11 +78,6 @@ static inline long regs_return_value(struct pt_regs *regs)
|
|||
unsigned long __ip = instruction_pointer(regs); \
|
||||
(__ip & ~3UL) + ((__ip & 3UL) << 2); \
|
||||
})
|
||||
/*
|
||||
* Why not default? Because user_stack_pointer() on ia64 gives register
|
||||
* stack backing store instead...
|
||||
*/
|
||||
#define current_user_stack_pointer() (current_pt_regs()->r12)
|
||||
|
||||
/* given a pointer to a task_struct, return the user's pt_regs */
|
||||
# define task_pt_regs(t) (((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1)
|
||||
|
|
|
|||
|
|
@ -238,7 +238,7 @@ void flush_dcache_page(struct page *page)
|
|||
{
|
||||
struct address_space *mapping;
|
||||
|
||||
mapping = page_mapping(page);
|
||||
mapping = page_mapping_file(page);
|
||||
if (mapping && !mapping_mapped(mapping))
|
||||
set_bit(PG_dcache_dirty, &page->flags);
|
||||
else {
|
||||
|
|
|
|||
|
|
@ -191,3 +191,7 @@ $(obj)/prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o FORCE
|
|||
targets += prom_init_check
|
||||
|
||||
clean-files := vmlinux.lds
|
||||
|
||||
# Force dependency (incbin is bad)
|
||||
$(obj)/vdso32_wrapper.o : $(obj)/vdso32/vdso32.so.dbg
|
||||
$(obj)/vdso64_wrapper.o : $(obj)/vdso64/vdso64.so.dbg
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@
|
|||
CFLAGS_ptrace-view.o += -DUTS_MACHINE='"$(UTS_MACHINE)"'
|
||||
|
||||
obj-y += ptrace.o ptrace-view.o
|
||||
obj-$(CONFIG_PPC_FPU_REGS) += ptrace-fpu.o
|
||||
obj-y += ptrace-fpu.o
|
||||
obj-$(CONFIG_COMPAT) += ptrace32.o
|
||||
obj-$(CONFIG_VSX) += ptrace-vsx.o
|
||||
ifneq ($(CONFIG_VSX),y)
|
||||
obj-$(CONFIG_PPC_FPU_REGS) += ptrace-novsx.o
|
||||
obj-y += ptrace-novsx.o
|
||||
endif
|
||||
obj-$(CONFIG_ALTIVEC) += ptrace-altivec.o
|
||||
obj-$(CONFIG_SPE) += ptrace-spe.o
|
||||
|
|
|
|||
|
|
@ -165,22 +165,8 @@ int ptrace_put_reg(struct task_struct *task, int regno, unsigned long data);
|
|||
extern const struct user_regset_view user_ppc_native_view;
|
||||
|
||||
/* ptrace-fpu */
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
int ptrace_get_fpr(struct task_struct *child, int index, unsigned long *data);
|
||||
int ptrace_put_fpr(struct task_struct *child, int index, unsigned long data);
|
||||
#else
|
||||
static inline int
|
||||
ptrace_get_fpr(struct task_struct *child, int index, unsigned long *data)
|
||||
{
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static inline int
|
||||
ptrace_put_fpr(struct task_struct *child, int index, unsigned long data)
|
||||
{
|
||||
return -EIO;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ptrace-(no)adv */
|
||||
void ppc_gethwdinfo(struct ppc_debug_info *dbginfo);
|
||||
|
|
|
|||
|
|
@ -8,32 +8,42 @@
|
|||
|
||||
int ptrace_get_fpr(struct task_struct *child, int index, unsigned long *data)
|
||||
{
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
unsigned int fpidx = index - PT_FPR0;
|
||||
#endif
|
||||
|
||||
if (index > PT_FPSCR)
|
||||
return -EIO;
|
||||
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
flush_fp_to_thread(child);
|
||||
if (fpidx < (PT_FPSCR - PT_FPR0))
|
||||
memcpy(data, &child->thread.TS_FPR(fpidx), sizeof(long));
|
||||
else
|
||||
*data = child->thread.fp_state.fpscr;
|
||||
#else
|
||||
*data = 0;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ptrace_put_fpr(struct task_struct *child, int index, unsigned long data)
|
||||
{
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
unsigned int fpidx = index - PT_FPR0;
|
||||
#endif
|
||||
|
||||
if (index > PT_FPSCR)
|
||||
return -EIO;
|
||||
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
flush_fp_to_thread(child);
|
||||
if (fpidx < (PT_FPSCR - PT_FPR0))
|
||||
memcpy(&child->thread.TS_FPR(fpidx), &data, sizeof(long));
|
||||
else
|
||||
child->thread.fp_state.fpscr = data;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,12 +21,16 @@
|
|||
int fpr_get(struct task_struct *target, const struct user_regset *regset,
|
||||
struct membuf to)
|
||||
{
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
|
||||
offsetof(struct thread_fp_state, fpr[32]));
|
||||
|
||||
flush_fp_to_thread(target);
|
||||
|
||||
return membuf_write(&to, &target->thread.fp_state, 33 * sizeof(u64));
|
||||
#else
|
||||
return membuf_write(&to, &empty_zero_page, 33 * sizeof(u64));
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -46,6 +50,7 @@ int fpr_set(struct task_struct *target, const struct user_regset *regset,
|
|||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
|
||||
offsetof(struct thread_fp_state, fpr[32]));
|
||||
|
||||
|
|
@ -53,4 +58,7 @@ int fpr_set(struct task_struct *target, const struct user_regset *regset,
|
|||
|
||||
return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&target->thread.fp_state, 0, -1);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -522,13 +522,11 @@ static const struct user_regset native_regsets[] = {
|
|||
.size = sizeof(long), .align = sizeof(long),
|
||||
.regset_get = gpr_get, .set = gpr_set
|
||||
},
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
[REGSET_FPR] = {
|
||||
.core_note_type = NT_PRFPREG, .n = ELF_NFPREG,
|
||||
.size = sizeof(double), .align = sizeof(double),
|
||||
.regset_get = fpr_get, .set = fpr_set
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
[REGSET_VMX] = {
|
||||
.core_note_type = NT_PPC_VMX, .n = 34,
|
||||
|
|
|
|||
|
|
@ -775,7 +775,7 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|||
else
|
||||
prepare_save_user_regs(1);
|
||||
|
||||
if (!user_write_access_begin(frame, sizeof(*frame)))
|
||||
if (!user_access_begin(frame, sizeof(*frame)))
|
||||
goto badframe;
|
||||
|
||||
/* Put the siginfo & fill in most of the ucontext */
|
||||
|
|
@ -809,17 +809,15 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|||
unsafe_put_user(PPC_INST_ADDI + __NR_rt_sigreturn, &mctx->mc_pad[0],
|
||||
failed);
|
||||
unsafe_put_user(PPC_INST_SC, &mctx->mc_pad[1], failed);
|
||||
asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0]));
|
||||
}
|
||||
unsafe_put_sigset_t(&frame->uc.uc_sigmask, oldset, failed);
|
||||
|
||||
user_write_access_end();
|
||||
user_access_end();
|
||||
|
||||
if (copy_siginfo_to_user(&frame->info, &ksig->info))
|
||||
goto badframe;
|
||||
|
||||
if (tramp == (unsigned long)mctx->mc_pad)
|
||||
flush_icache_range(tramp, tramp + 2 * sizeof(unsigned long));
|
||||
|
||||
regs->link = tramp;
|
||||
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
|
|
@ -844,7 +842,7 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|||
return 0;
|
||||
|
||||
failed:
|
||||
user_write_access_end();
|
||||
user_access_end();
|
||||
|
||||
badframe:
|
||||
signal_fault(tsk, regs, "handle_rt_signal32", frame);
|
||||
|
|
@ -879,7 +877,7 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|||
else
|
||||
prepare_save_user_regs(1);
|
||||
|
||||
if (!user_write_access_begin(frame, sizeof(*frame)))
|
||||
if (!user_access_begin(frame, sizeof(*frame)))
|
||||
goto badframe;
|
||||
sc = (struct sigcontext __user *) &frame->sctx;
|
||||
|
||||
|
|
@ -908,11 +906,9 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|||
/* Set up the sigreturn trampoline: li r0,sigret; sc */
|
||||
unsafe_put_user(PPC_INST_ADDI + __NR_sigreturn, &mctx->mc_pad[0], failed);
|
||||
unsafe_put_user(PPC_INST_SC, &mctx->mc_pad[1], failed);
|
||||
asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0]));
|
||||
}
|
||||
user_write_access_end();
|
||||
|
||||
if (tramp == (unsigned long)mctx->mc_pad)
|
||||
flush_icache_range(tramp, tramp + 2 * sizeof(unsigned long));
|
||||
user_access_end();
|
||||
|
||||
regs->link = tramp;
|
||||
|
||||
|
|
@ -935,7 +931,7 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
|
|||
return 0;
|
||||
|
||||
failed:
|
||||
user_write_access_end();
|
||||
user_access_end();
|
||||
|
||||
badframe:
|
||||
signal_fault(tsk, regs, "handle_signal32", frame);
|
||||
|
|
|
|||
|
|
@ -56,8 +56,13 @@ static inline bool kfence_protect_page(unsigned long addr, bool protect)
|
|||
else
|
||||
set_pte(pte, __pte(pte_val(*pte) | _PAGE_PRESENT));
|
||||
|
||||
/* Flush this CPU's TLB. */
|
||||
/*
|
||||
* Flush this CPU's TLB, assuming whoever did the allocation/free is
|
||||
* likely to continue running on this CPU.
|
||||
*/
|
||||
preempt_disable();
|
||||
flush_tlb_one_kernel(addr);
|
||||
preempt_enable();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -556,7 +556,7 @@ DEFINE_IDTENTRY_ERRORCODE(exc_general_protection)
|
|||
tsk->thread.trap_nr = X86_TRAP_GP;
|
||||
|
||||
if (fixup_vdso_exception(regs, X86_TRAP_GP, error_code, 0))
|
||||
return;
|
||||
goto exit;
|
||||
|
||||
show_signal(tsk, SIGSEGV, "", desc, regs, error_code);
|
||||
force_sig(SIGSEGV);
|
||||
|
|
@ -1057,7 +1057,7 @@ static void math_error(struct pt_regs *regs, int trapnr)
|
|||
goto exit;
|
||||
|
||||
if (fixup_vdso_exception(regs, trapnr, 0, 0))
|
||||
return;
|
||||
goto exit;
|
||||
|
||||
force_sig_fault(SIGFPE, si_code,
|
||||
(void __user *)uprobe_get_trap_addr(regs));
|
||||
|
|
|
|||
|
|
@ -1689,7 +1689,16 @@ st: if (is_imm8(insn->off))
|
|||
}
|
||||
|
||||
if (image) {
|
||||
if (unlikely(proglen + ilen > oldproglen)) {
|
||||
/*
|
||||
* When populating the image, assert that:
|
||||
*
|
||||
* i) We do not write beyond the allocated space, and
|
||||
* ii) addrs[i] did not change from the prior run, in order
|
||||
* to validate assumptions made for computing branch
|
||||
* displacements.
|
||||
*/
|
||||
if (unlikely(proglen + ilen > oldproglen ||
|
||||
proglen + ilen != addrs[i])) {
|
||||
pr_err("bpf_jit: fatal error\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2276,7 +2276,16 @@ emit_cond_jmp: jmp_cond = get_cond_jmp_opcode(BPF_OP(code), false);
|
|||
}
|
||||
|
||||
if (image) {
|
||||
if (unlikely(proglen + ilen > oldproglen)) {
|
||||
/*
|
||||
* When populating the image, assert that:
|
||||
*
|
||||
* i) We do not write beyond the allocated space, and
|
||||
* ii) addrs[i] did not change from the prior run, in order
|
||||
* to validate assumptions made for computing branch
|
||||
* displacements.
|
||||
*/
|
||||
if (unlikely(proglen + ilen > oldproglen ||
|
||||
proglen + ilen != addrs[i])) {
|
||||
pr_err("bpf_jit: fatal error\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -292,14 +292,16 @@ int driver_deferred_probe_check_state(struct device *dev)
|
|||
|
||||
static void deferred_probe_timeout_work_func(struct work_struct *work)
|
||||
{
|
||||
struct device_private *private, *p;
|
||||
struct device_private *p;
|
||||
|
||||
driver_deferred_probe_timeout = 0;
|
||||
driver_deferred_probe_trigger();
|
||||
flush_work(&deferred_probe_work);
|
||||
|
||||
list_for_each_entry_safe(private, p, &deferred_probe_pending_list, deferred_probe)
|
||||
dev_info(private->device, "deferred probe pending\n");
|
||||
mutex_lock(&deferred_probe_mutex);
|
||||
list_for_each_entry(p, &deferred_probe_pending_list, deferred_probe)
|
||||
dev_info(p->device, "deferred probe pending\n");
|
||||
mutex_unlock(&deferred_probe_mutex);
|
||||
wake_up_all(&probe_timeout_waitqueue);
|
||||
}
|
||||
static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* Turris Mox module configuration bus driver
|
||||
*
|
||||
* Copyright (C) 2019 Marek Behun <marek.behun@nic.cz>
|
||||
* Copyright (C) 2019 Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/bus/moxtet.h>
|
||||
|
|
@ -879,6 +879,6 @@ static void __exit moxtet_exit(void)
|
|||
}
|
||||
module_exit(moxtet_exit);
|
||||
|
||||
MODULE_AUTHOR("Marek Behun <marek.behun@nic.cz>");
|
||||
MODULE_AUTHOR("Marek Behun <kabel@kernel.org>");
|
||||
MODULE_DESCRIPTION("CZ.NIC's Turris Mox module configuration bus");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -66,7 +66,14 @@ EXPORT_SYMBOL_GPL(clk_fixed_factor_ops);
|
|||
|
||||
static void devm_clk_hw_register_fixed_factor_release(struct device *dev, void *res)
|
||||
{
|
||||
clk_hw_unregister_fixed_factor(&((struct clk_fixed_factor *)res)->hw);
|
||||
struct clk_fixed_factor *fix = res;
|
||||
|
||||
/*
|
||||
* We can not use clk_hw_unregister_fixed_factor, since it will kfree()
|
||||
* the hw, resulting in double free. Just unregister the hw and let
|
||||
* devres code kfree() it.
|
||||
*/
|
||||
clk_hw_unregister(&fix->hw);
|
||||
}
|
||||
|
||||
static struct clk_hw *
|
||||
|
|
|
|||
|
|
@ -4440,20 +4440,19 @@ int clk_notifier_register(struct clk *clk, struct notifier_block *nb)
|
|||
/* search the list of notifiers for this clk */
|
||||
list_for_each_entry(cn, &clk_notifier_list, node)
|
||||
if (cn->clk == clk)
|
||||
break;
|
||||
goto found;
|
||||
|
||||
/* if clk wasn't in the notifier list, allocate new clk_notifier */
|
||||
if (cn->clk != clk) {
|
||||
cn = kzalloc(sizeof(*cn), GFP_KERNEL);
|
||||
if (!cn)
|
||||
goto out;
|
||||
cn = kzalloc(sizeof(*cn), GFP_KERNEL);
|
||||
if (!cn)
|
||||
goto out;
|
||||
|
||||
cn->clk = clk;
|
||||
srcu_init_notifier_head(&cn->notifier_head);
|
||||
cn->clk = clk;
|
||||
srcu_init_notifier_head(&cn->notifier_head);
|
||||
|
||||
list_add(&cn->node, &clk_notifier_list);
|
||||
}
|
||||
list_add(&cn->node, &clk_notifier_list);
|
||||
|
||||
found:
|
||||
ret = srcu_notifier_chain_register(&cn->notifier_head, nb);
|
||||
|
||||
clk->core->notifier_count++;
|
||||
|
|
@ -4478,32 +4477,28 @@ EXPORT_SYMBOL_GPL(clk_notifier_register);
|
|||
*/
|
||||
int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)
|
||||
{
|
||||
struct clk_notifier *cn = NULL;
|
||||
int ret = -EINVAL;
|
||||
struct clk_notifier *cn;
|
||||
int ret = -ENOENT;
|
||||
|
||||
if (!clk || !nb)
|
||||
return -EINVAL;
|
||||
|
||||
clk_prepare_lock();
|
||||
|
||||
list_for_each_entry(cn, &clk_notifier_list, node)
|
||||
if (cn->clk == clk)
|
||||
list_for_each_entry(cn, &clk_notifier_list, node) {
|
||||
if (cn->clk == clk) {
|
||||
ret = srcu_notifier_chain_unregister(&cn->notifier_head, nb);
|
||||
|
||||
clk->core->notifier_count--;
|
||||
|
||||
/* XXX the notifier code should handle this better */
|
||||
if (!cn->notifier_head.head) {
|
||||
srcu_cleanup_notifier_head(&cn->notifier_head);
|
||||
list_del(&cn->node);
|
||||
kfree(cn);
|
||||
}
|
||||
break;
|
||||
|
||||
if (cn->clk == clk) {
|
||||
ret = srcu_notifier_chain_unregister(&cn->notifier_head, nb);
|
||||
|
||||
clk->core->notifier_count--;
|
||||
|
||||
/* XXX the notifier code should handle this better */
|
||||
if (!cn->notifier_head.head) {
|
||||
srcu_cleanup_notifier_head(&cn->notifier_head);
|
||||
list_del(&cn->node);
|
||||
kfree(cn);
|
||||
}
|
||||
|
||||
} else {
|
||||
ret = -ENOENT;
|
||||
}
|
||||
|
||||
clk_prepare_unlock();
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ static struct clk_rcg2 cam_cc_bps_clk_src = {
|
|||
.name = "cam_cc_bps_clk_src",
|
||||
.parent_data = cam_cc_parent_data_2,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -325,7 +325,7 @@ static struct clk_rcg2 cam_cc_cci_0_clk_src = {
|
|||
.name = "cam_cc_cci_0_clk_src",
|
||||
.parent_data = cam_cc_parent_data_5,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -339,7 +339,7 @@ static struct clk_rcg2 cam_cc_cci_1_clk_src = {
|
|||
.name = "cam_cc_cci_1_clk_src",
|
||||
.parent_data = cam_cc_parent_data_5,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -360,7 +360,7 @@ static struct clk_rcg2 cam_cc_cphy_rx_clk_src = {
|
|||
.name = "cam_cc_cphy_rx_clk_src",
|
||||
.parent_data = cam_cc_parent_data_3,
|
||||
.num_parents = 6,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -379,7 +379,7 @@ static struct clk_rcg2 cam_cc_csi0phytimer_clk_src = {
|
|||
.name = "cam_cc_csi0phytimer_clk_src",
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -393,7 +393,7 @@ static struct clk_rcg2 cam_cc_csi1phytimer_clk_src = {
|
|||
.name = "cam_cc_csi1phytimer_clk_src",
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -407,7 +407,7 @@ static struct clk_rcg2 cam_cc_csi2phytimer_clk_src = {
|
|||
.name = "cam_cc_csi2phytimer_clk_src",
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -421,7 +421,7 @@ static struct clk_rcg2 cam_cc_csi3phytimer_clk_src = {
|
|||
.name = "cam_cc_csi3phytimer_clk_src",
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -443,7 +443,7 @@ static struct clk_rcg2 cam_cc_fast_ahb_clk_src = {
|
|||
.name = "cam_cc_fast_ahb_clk_src",
|
||||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -466,7 +466,7 @@ static struct clk_rcg2 cam_cc_icp_clk_src = {
|
|||
.name = "cam_cc_icp_clk_src",
|
||||
.parent_data = cam_cc_parent_data_2,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -488,7 +488,7 @@ static struct clk_rcg2 cam_cc_ife_0_clk_src = {
|
|||
.name = "cam_cc_ife_0_clk_src",
|
||||
.parent_data = cam_cc_parent_data_4,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -510,7 +510,7 @@ static struct clk_rcg2 cam_cc_ife_0_csid_clk_src = {
|
|||
.name = "cam_cc_ife_0_csid_clk_src",
|
||||
.parent_data = cam_cc_parent_data_3,
|
||||
.num_parents = 6,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -524,7 +524,7 @@ static struct clk_rcg2 cam_cc_ife_1_clk_src = {
|
|||
.name = "cam_cc_ife_1_clk_src",
|
||||
.parent_data = cam_cc_parent_data_4,
|
||||
.num_parents = 4,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -538,7 +538,7 @@ static struct clk_rcg2 cam_cc_ife_1_csid_clk_src = {
|
|||
.name = "cam_cc_ife_1_csid_clk_src",
|
||||
.parent_data = cam_cc_parent_data_3,
|
||||
.num_parents = 6,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -553,7 +553,7 @@ static struct clk_rcg2 cam_cc_ife_lite_clk_src = {
|
|||
.parent_data = cam_cc_parent_data_4,
|
||||
.num_parents = 4,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -567,7 +567,7 @@ static struct clk_rcg2 cam_cc_ife_lite_csid_clk_src = {
|
|||
.name = "cam_cc_ife_lite_csid_clk_src",
|
||||
.parent_data = cam_cc_parent_data_3,
|
||||
.num_parents = 6,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -590,7 +590,7 @@ static struct clk_rcg2 cam_cc_ipe_0_clk_src = {
|
|||
.name = "cam_cc_ipe_0_clk_src",
|
||||
.parent_data = cam_cc_parent_data_2,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -613,7 +613,7 @@ static struct clk_rcg2 cam_cc_jpeg_clk_src = {
|
|||
.name = "cam_cc_jpeg_clk_src",
|
||||
.parent_data = cam_cc_parent_data_2,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -635,7 +635,7 @@ static struct clk_rcg2 cam_cc_lrme_clk_src = {
|
|||
.name = "cam_cc_lrme_clk_src",
|
||||
.parent_data = cam_cc_parent_data_6,
|
||||
.num_parents = 5,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -656,7 +656,7 @@ static struct clk_rcg2 cam_cc_mclk0_clk_src = {
|
|||
.name = "cam_cc_mclk0_clk_src",
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -670,7 +670,7 @@ static struct clk_rcg2 cam_cc_mclk1_clk_src = {
|
|||
.name = "cam_cc_mclk1_clk_src",
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -684,7 +684,7 @@ static struct clk_rcg2 cam_cc_mclk2_clk_src = {
|
|||
.name = "cam_cc_mclk2_clk_src",
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -698,7 +698,7 @@ static struct clk_rcg2 cam_cc_mclk3_clk_src = {
|
|||
.name = "cam_cc_mclk3_clk_src",
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -712,7 +712,7 @@ static struct clk_rcg2 cam_cc_mclk4_clk_src = {
|
|||
.name = "cam_cc_mclk4_clk_src",
|
||||
.parent_data = cam_cc_parent_data_1,
|
||||
.num_parents = 3,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -732,7 +732,7 @@ static struct clk_rcg2 cam_cc_slow_ahb_clk_src = {
|
|||
.parent_data = cam_cc_parent_data_0,
|
||||
.num_parents = 4,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_rcg2_ops,
|
||||
.ops = &clk_rcg2_shared_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ static unsigned long socfpga_clk_recalc_rate(struct clk_hw *hwclk,
|
|||
val = readl(socfpgaclk->div_reg) >> socfpgaclk->shift;
|
||||
val &= GENMASK(socfpgaclk->width - 1, 0);
|
||||
/* Check for GPIO_DB_CLK by its offset */
|
||||
if ((int) socfpgaclk->div_reg & SOCFPGA_GPIO_DB_CLK_OFFSET)
|
||||
if ((uintptr_t) socfpgaclk->div_reg & SOCFPGA_GPIO_DB_CLK_OFFSET)
|
||||
div = val + 1;
|
||||
else
|
||||
div = (1 << val);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* Turris Mox rWTM firmware driver
|
||||
*
|
||||
* Copyright (C) 2019 Marek Behun <marek.behun@nic.cz>
|
||||
* Copyright (C) 2019 Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#include <linux/armada-37xx-rwtm-mailbox.h>
|
||||
|
|
@ -547,4 +547,4 @@ module_platform_driver(turris_mox_rwtm_driver);
|
|||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("Turris Mox rWTM firmware driver");
|
||||
MODULE_AUTHOR("Marek Behun <marek.behun@nic.cz>");
|
||||
MODULE_AUTHOR("Marek Behun <kabel@kernel.org>");
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* Turris Mox Moxtet GPIO expander
|
||||
*
|
||||
* Copyright (C) 2018 Marek Behun <marek.behun@nic.cz>
|
||||
* Copyright (C) 2018 Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
|
@ -174,6 +174,6 @@ static struct moxtet_driver moxtet_gpio_driver = {
|
|||
};
|
||||
module_moxtet_driver(moxtet_gpio_driver);
|
||||
|
||||
MODULE_AUTHOR("Marek Behun <marek.behun@nic.cz>");
|
||||
MODULE_AUTHOR("Marek Behun <kabel@kernel.org>");
|
||||
MODULE_DESCRIPTION("Turris Mox Moxtet GPIO expander");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
|
|||
if ((comp_param1 & DW_IC_COMP_PARAM_1_SPEED_MODE_MASK)
|
||||
!= DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH) {
|
||||
dev_err(dev->dev, "High Speed not supported!\n");
|
||||
t->bus_freq_hz = I2C_MAX_FAST_MODE_FREQ;
|
||||
dev->master_cfg &= ~DW_IC_CON_SPEED_MASK;
|
||||
dev->master_cfg |= DW_IC_CON_SPEED_FAST;
|
||||
dev->hs_hcnt = 0;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/**
|
||||
/*
|
||||
* i2c-exynos5.c - Samsung Exynos5 I2C Controller Driver
|
||||
*
|
||||
* Copyright (C) 2013 Samsung Electronics Co., Ltd.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Copyright (c) 2014 Linaro Ltd.
|
||||
* Copyright (c) 2014 Hisilicon Limited.
|
||||
* Copyright (c) 2014 HiSilicon Limited.
|
||||
*
|
||||
* Now only support 7 bit address.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -525,8 +525,8 @@ static irqreturn_t jz4780_i2c_irq(int irqno, void *dev_id)
|
|||
i2c_sta = jz4780_i2c_readw(i2c, JZ4780_I2C_STA);
|
||||
data = *i2c->wbuf;
|
||||
data &= ~JZ4780_I2C_DC_READ;
|
||||
if ((!i2c->stop_hold) && (i2c->cdata->version >=
|
||||
ID_X1000))
|
||||
if ((i2c->wt_len == 1) && (!i2c->stop_hold) &&
|
||||
(i2c->cdata->version >= ID_X1000))
|
||||
data |= X1000_I2C_DC_STOP;
|
||||
jz4780_i2c_writew(i2c, JZ4780_I2C_DC, data);
|
||||
i2c->wbuf++;
|
||||
|
|
|
|||
|
|
@ -534,7 +534,7 @@ static void stm32f4_i2c_handle_rx_addr(struct stm32f4_i2c_dev *i2c_dev)
|
|||
default:
|
||||
/*
|
||||
* N-byte reception:
|
||||
* Enable ACK, reset POS (ACK postion) and clear ADDR flag.
|
||||
* Enable ACK, reset POS (ACK position) and clear ADDR flag.
|
||||
* In that way, ACK will be sent as soon as the current byte
|
||||
* will be received in the shift register
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -378,7 +378,7 @@ static int i2c_gpio_init_recovery(struct i2c_adapter *adap)
|
|||
static int i2c_init_recovery(struct i2c_adapter *adap)
|
||||
{
|
||||
struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
|
||||
char *err_str;
|
||||
char *err_str, *err_level = KERN_ERR;
|
||||
|
||||
if (!bri)
|
||||
return 0;
|
||||
|
|
@ -387,7 +387,8 @@ static int i2c_init_recovery(struct i2c_adapter *adap)
|
|||
return -EPROBE_DEFER;
|
||||
|
||||
if (!bri->recover_bus) {
|
||||
err_str = "no recover_bus() found";
|
||||
err_str = "no suitable method provided";
|
||||
err_level = KERN_DEBUG;
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
|
@ -414,7 +415,7 @@ static int i2c_init_recovery(struct i2c_adapter *adap)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
dev_err(&adap->dev, "Not using recovery: %s\n", err_str);
|
||||
dev_printk(err_level, &adap->dev, "Not using recovery: %s\n", err_str);
|
||||
adap->bus_recovery_info = NULL;
|
||||
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* CZ.NIC's Turris Omnia LEDs driver
|
||||
*
|
||||
* 2020 by Marek Behun <marek.behun@nic.cz>
|
||||
* 2020 by Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
|
@ -287,6 +287,6 @@ static struct i2c_driver omnia_leds_driver = {
|
|||
|
||||
module_i2c_driver(omnia_leds_driver);
|
||||
|
||||
MODULE_AUTHOR("Marek Behun <marek.behun@nic.cz>");
|
||||
MODULE_AUTHOR("Marek Behun <kabel@kernel.org>");
|
||||
MODULE_DESCRIPTION("CZ.NIC's Turris Omnia LEDs");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* rWTM BIU Mailbox driver for Armada 37xx
|
||||
*
|
||||
* Author: Marek Behun <marek.behun@nic.cz>
|
||||
* Author: Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
|
|
@ -203,4 +203,4 @@ module_platform_driver(armada_37xx_mbox_driver);
|
|||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("rWTM BIU Mailbox driver for Armada 37xx");
|
||||
MODULE_AUTHOR("Marek Behun <marek.behun@nic.cz>");
|
||||
MODULE_AUTHOR("Marek Behun <kabel@kernel.org>");
|
||||
|
|
|
|||
|
|
@ -314,6 +314,18 @@ static int mcp251x_spi_trans(struct spi_device *spi, int len)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int mcp251x_spi_write(struct spi_device *spi, int len)
|
||||
{
|
||||
struct mcp251x_priv *priv = spi_get_drvdata(spi);
|
||||
int ret;
|
||||
|
||||
ret = spi_write(spi, priv->spi_tx_buf, len);
|
||||
if (ret)
|
||||
dev_err(&spi->dev, "spi write failed: ret = %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u8 mcp251x_read_reg(struct spi_device *spi, u8 reg)
|
||||
{
|
||||
struct mcp251x_priv *priv = spi_get_drvdata(spi);
|
||||
|
|
@ -361,7 +373,7 @@ static void mcp251x_write_reg(struct spi_device *spi, u8 reg, u8 val)
|
|||
priv->spi_tx_buf[1] = reg;
|
||||
priv->spi_tx_buf[2] = val;
|
||||
|
||||
mcp251x_spi_trans(spi, 3);
|
||||
mcp251x_spi_write(spi, 3);
|
||||
}
|
||||
|
||||
static void mcp251x_write_2regs(struct spi_device *spi, u8 reg, u8 v1, u8 v2)
|
||||
|
|
@ -373,7 +385,7 @@ static void mcp251x_write_2regs(struct spi_device *spi, u8 reg, u8 v1, u8 v2)
|
|||
priv->spi_tx_buf[2] = v1;
|
||||
priv->spi_tx_buf[3] = v2;
|
||||
|
||||
mcp251x_spi_trans(spi, 4);
|
||||
mcp251x_spi_write(spi, 4);
|
||||
}
|
||||
|
||||
static void mcp251x_write_bits(struct spi_device *spi, u8 reg,
|
||||
|
|
@ -386,7 +398,7 @@ static void mcp251x_write_bits(struct spi_device *spi, u8 reg,
|
|||
priv->spi_tx_buf[2] = mask;
|
||||
priv->spi_tx_buf[3] = val;
|
||||
|
||||
mcp251x_spi_trans(spi, 4);
|
||||
mcp251x_spi_write(spi, 4);
|
||||
}
|
||||
|
||||
static u8 mcp251x_read_stat(struct spi_device *spi)
|
||||
|
|
@ -618,7 +630,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf,
|
|||
buf[i]);
|
||||
} else {
|
||||
memcpy(priv->spi_tx_buf, buf, TXBDAT_OFF + len);
|
||||
mcp251x_spi_trans(spi, TXBDAT_OFF + len);
|
||||
mcp251x_spi_write(spi, TXBDAT_OFF + len);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -650,7 +662,7 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
|
|||
|
||||
/* use INSTRUCTION_RTS, to avoid "repeated frame problem" */
|
||||
priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx);
|
||||
mcp251x_spi_trans(priv->spi, 1);
|
||||
mcp251x_spi_write(priv->spi, 1);
|
||||
}
|
||||
|
||||
static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf,
|
||||
|
|
@ -888,7 +900,7 @@ static int mcp251x_hw_reset(struct spi_device *spi)
|
|||
mdelay(MCP251X_OST_DELAY_MS);
|
||||
|
||||
priv->spi_tx_buf[0] = INSTRUCTION_RESET;
|
||||
ret = mcp251x_spi_trans(spi, 1);
|
||||
ret = mcp251x_spi_write(spi, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -857,7 +857,7 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter,
|
|||
if (dev->adapter->dev_set_bus) {
|
||||
err = dev->adapter->dev_set_bus(dev, 0);
|
||||
if (err)
|
||||
goto lbl_unregister_candev;
|
||||
goto adap_dev_free;
|
||||
}
|
||||
|
||||
/* get device number early */
|
||||
|
|
@ -869,6 +869,10 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter,
|
|||
|
||||
return 0;
|
||||
|
||||
adap_dev_free:
|
||||
if (dev->adapter->dev_free)
|
||||
dev->adapter->dev_free(dev);
|
||||
|
||||
lbl_unregister_candev:
|
||||
unregister_candev(netdev);
|
||||
|
||||
|
|
|
|||
|
|
@ -93,8 +93,12 @@
|
|||
|
||||
/* GSWIP MII Registers */
|
||||
#define GSWIP_MII_CFGp(p) (0x2 * (p))
|
||||
#define GSWIP_MII_CFG_RESET BIT(15)
|
||||
#define GSWIP_MII_CFG_EN BIT(14)
|
||||
#define GSWIP_MII_CFG_ISOLATE BIT(13)
|
||||
#define GSWIP_MII_CFG_LDCLKDIS BIT(12)
|
||||
#define GSWIP_MII_CFG_RGMII_IBS BIT(8)
|
||||
#define GSWIP_MII_CFG_RMII_CLK BIT(7)
|
||||
#define GSWIP_MII_CFG_MODE_MIIP 0x0
|
||||
#define GSWIP_MII_CFG_MODE_MIIM 0x1
|
||||
#define GSWIP_MII_CFG_MODE_RMIIP 0x2
|
||||
|
|
@ -190,6 +194,23 @@
|
|||
#define GSWIP_PCE_DEFPVID(p) (0x486 + ((p) * 0xA))
|
||||
|
||||
#define GSWIP_MAC_FLEN 0x8C5
|
||||
#define GSWIP_MAC_CTRL_0p(p) (0x903 + ((p) * 0xC))
|
||||
#define GSWIP_MAC_CTRL_0_PADEN BIT(8)
|
||||
#define GSWIP_MAC_CTRL_0_FCS_EN BIT(7)
|
||||
#define GSWIP_MAC_CTRL_0_FCON_MASK 0x0070
|
||||
#define GSWIP_MAC_CTRL_0_FCON_AUTO 0x0000
|
||||
#define GSWIP_MAC_CTRL_0_FCON_RX 0x0010
|
||||
#define GSWIP_MAC_CTRL_0_FCON_TX 0x0020
|
||||
#define GSWIP_MAC_CTRL_0_FCON_RXTX 0x0030
|
||||
#define GSWIP_MAC_CTRL_0_FCON_NONE 0x0040
|
||||
#define GSWIP_MAC_CTRL_0_FDUP_MASK 0x000C
|
||||
#define GSWIP_MAC_CTRL_0_FDUP_AUTO 0x0000
|
||||
#define GSWIP_MAC_CTRL_0_FDUP_EN 0x0004
|
||||
#define GSWIP_MAC_CTRL_0_FDUP_DIS 0x000C
|
||||
#define GSWIP_MAC_CTRL_0_GMII_MASK 0x0003
|
||||
#define GSWIP_MAC_CTRL_0_GMII_AUTO 0x0000
|
||||
#define GSWIP_MAC_CTRL_0_GMII_MII 0x0001
|
||||
#define GSWIP_MAC_CTRL_0_GMII_RGMII 0x0002
|
||||
#define GSWIP_MAC_CTRL_2p(p) (0x905 + ((p) * 0xC))
|
||||
#define GSWIP_MAC_CTRL_2_MLEN BIT(3) /* Maximum Untagged Frame Lnegth */
|
||||
|
||||
|
|
@ -653,16 +674,13 @@ static int gswip_port_enable(struct dsa_switch *ds, int port,
|
|||
GSWIP_SDMA_PCTRLp(port));
|
||||
|
||||
if (!dsa_is_cpu_port(ds, port)) {
|
||||
u32 macconf = GSWIP_MDIO_PHY_LINK_AUTO |
|
||||
GSWIP_MDIO_PHY_SPEED_AUTO |
|
||||
GSWIP_MDIO_PHY_FDUP_AUTO |
|
||||
GSWIP_MDIO_PHY_FCONTX_AUTO |
|
||||
GSWIP_MDIO_PHY_FCONRX_AUTO |
|
||||
(phydev->mdio.addr & GSWIP_MDIO_PHY_ADDR_MASK);
|
||||
u32 mdio_phy = 0;
|
||||
|
||||
gswip_mdio_w(priv, macconf, GSWIP_MDIO_PHYp(port));
|
||||
/* Activate MDIO auto polling */
|
||||
gswip_mdio_mask(priv, 0, BIT(port), GSWIP_MDIO_MDC_CFG0);
|
||||
if (phydev)
|
||||
mdio_phy = phydev->mdio.addr & GSWIP_MDIO_PHY_ADDR_MASK;
|
||||
|
||||
gswip_mdio_mask(priv, GSWIP_MDIO_PHY_ADDR_MASK, mdio_phy,
|
||||
GSWIP_MDIO_PHYp(port));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -675,14 +693,6 @@ static void gswip_port_disable(struct dsa_switch *ds, int port)
|
|||
if (!dsa_is_user_port(ds, port))
|
||||
return;
|
||||
|
||||
if (!dsa_is_cpu_port(ds, port)) {
|
||||
gswip_mdio_mask(priv, GSWIP_MDIO_PHY_LINK_DOWN,
|
||||
GSWIP_MDIO_PHY_LINK_MASK,
|
||||
GSWIP_MDIO_PHYp(port));
|
||||
/* Deactivate MDIO auto polling */
|
||||
gswip_mdio_mask(priv, BIT(port), 0, GSWIP_MDIO_MDC_CFG0);
|
||||
}
|
||||
|
||||
gswip_switch_mask(priv, GSWIP_FDMA_PCTRL_EN, 0,
|
||||
GSWIP_FDMA_PCTRLp(port));
|
||||
gswip_switch_mask(priv, GSWIP_SDMA_PCTRL_EN, 0,
|
||||
|
|
@ -794,19 +804,32 @@ static int gswip_setup(struct dsa_switch *ds)
|
|||
gswip_switch_w(priv, BIT(cpu_port), GSWIP_PCE_PMAP2);
|
||||
gswip_switch_w(priv, BIT(cpu_port), GSWIP_PCE_PMAP3);
|
||||
|
||||
/* disable PHY auto polling */
|
||||
/* Deactivate MDIO PHY auto polling. Some PHYs as the AR8030 have an
|
||||
* interoperability problem with this auto polling mechanism because
|
||||
* their status registers think that the link is in a different state
|
||||
* than it actually is. For the AR8030 it has the BMSR_ESTATEN bit set
|
||||
* as well as ESTATUS_1000_TFULL and ESTATUS_1000_XFULL. This makes the
|
||||
* auto polling state machine consider the link being negotiated with
|
||||
* 1Gbit/s. Since the PHY itself is a Fast Ethernet RMII PHY this leads
|
||||
* to the switch port being completely dead (RX and TX are both not
|
||||
* working).
|
||||
* Also with various other PHY / port combinations (PHY11G GPHY, PHY22F
|
||||
* GPHY, external RGMII PEF7071/7072) any traffic would stop. Sometimes
|
||||
* it would work fine for a few minutes to hours and then stop, on
|
||||
* other device it would no traffic could be sent or received at all.
|
||||
* Testing shows that when PHY auto polling is disabled these problems
|
||||
* go away.
|
||||
*/
|
||||
gswip_mdio_w(priv, 0x0, GSWIP_MDIO_MDC_CFG0);
|
||||
|
||||
/* Configure the MDIO Clock 2.5 MHz */
|
||||
gswip_mdio_mask(priv, 0xff, 0x09, GSWIP_MDIO_MDC_CFG1);
|
||||
|
||||
for (i = 0; i < priv->hw_info->max_ports; i++) {
|
||||
/* Disable the xMII link */
|
||||
gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_EN, 0, i);
|
||||
|
||||
/* Automatically select the xMII interface clock */
|
||||
gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_RATE_MASK,
|
||||
GSWIP_MII_CFG_RATE_AUTO, i);
|
||||
}
|
||||
/* Disable the xMII interface and clear it's isolation bit */
|
||||
for (i = 0; i < priv->hw_info->max_ports; i++)
|
||||
gswip_mii_mask_cfg(priv,
|
||||
GSWIP_MII_CFG_EN | GSWIP_MII_CFG_ISOLATE,
|
||||
0, i);
|
||||
|
||||
/* enable special tag insertion on cpu port */
|
||||
gswip_switch_mask(priv, 0, GSWIP_FDMA_PCTRL_STEN,
|
||||
|
|
@ -1455,6 +1478,112 @@ static void gswip_phylink_validate(struct dsa_switch *ds, int port,
|
|||
return;
|
||||
}
|
||||
|
||||
static void gswip_port_set_link(struct gswip_priv *priv, int port, bool link)
|
||||
{
|
||||
u32 mdio_phy;
|
||||
|
||||
if (link)
|
||||
mdio_phy = GSWIP_MDIO_PHY_LINK_UP;
|
||||
else
|
||||
mdio_phy = GSWIP_MDIO_PHY_LINK_DOWN;
|
||||
|
||||
gswip_mdio_mask(priv, GSWIP_MDIO_PHY_LINK_MASK, mdio_phy,
|
||||
GSWIP_MDIO_PHYp(port));
|
||||
}
|
||||
|
||||
static void gswip_port_set_speed(struct gswip_priv *priv, int port, int speed,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
u32 mdio_phy = 0, mii_cfg = 0, mac_ctrl_0 = 0;
|
||||
|
||||
switch (speed) {
|
||||
case SPEED_10:
|
||||
mdio_phy = GSWIP_MDIO_PHY_SPEED_M10;
|
||||
|
||||
if (interface == PHY_INTERFACE_MODE_RMII)
|
||||
mii_cfg = GSWIP_MII_CFG_RATE_M50;
|
||||
else
|
||||
mii_cfg = GSWIP_MII_CFG_RATE_M2P5;
|
||||
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_GMII_MII;
|
||||
break;
|
||||
|
||||
case SPEED_100:
|
||||
mdio_phy = GSWIP_MDIO_PHY_SPEED_M100;
|
||||
|
||||
if (interface == PHY_INTERFACE_MODE_RMII)
|
||||
mii_cfg = GSWIP_MII_CFG_RATE_M50;
|
||||
else
|
||||
mii_cfg = GSWIP_MII_CFG_RATE_M25;
|
||||
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_GMII_MII;
|
||||
break;
|
||||
|
||||
case SPEED_1000:
|
||||
mdio_phy = GSWIP_MDIO_PHY_SPEED_G1;
|
||||
|
||||
mii_cfg = GSWIP_MII_CFG_RATE_M125;
|
||||
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_GMII_RGMII;
|
||||
break;
|
||||
}
|
||||
|
||||
gswip_mdio_mask(priv, GSWIP_MDIO_PHY_SPEED_MASK, mdio_phy,
|
||||
GSWIP_MDIO_PHYp(port));
|
||||
gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_RATE_MASK, mii_cfg, port);
|
||||
gswip_switch_mask(priv, GSWIP_MAC_CTRL_0_GMII_MASK, mac_ctrl_0,
|
||||
GSWIP_MAC_CTRL_0p(port));
|
||||
}
|
||||
|
||||
static void gswip_port_set_duplex(struct gswip_priv *priv, int port, int duplex)
|
||||
{
|
||||
u32 mac_ctrl_0, mdio_phy;
|
||||
|
||||
if (duplex == DUPLEX_FULL) {
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_FDUP_EN;
|
||||
mdio_phy = GSWIP_MDIO_PHY_FDUP_EN;
|
||||
} else {
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_FDUP_DIS;
|
||||
mdio_phy = GSWIP_MDIO_PHY_FDUP_DIS;
|
||||
}
|
||||
|
||||
gswip_switch_mask(priv, GSWIP_MAC_CTRL_0_FDUP_MASK, mac_ctrl_0,
|
||||
GSWIP_MAC_CTRL_0p(port));
|
||||
gswip_mdio_mask(priv, GSWIP_MDIO_PHY_FDUP_MASK, mdio_phy,
|
||||
GSWIP_MDIO_PHYp(port));
|
||||
}
|
||||
|
||||
static void gswip_port_set_pause(struct gswip_priv *priv, int port,
|
||||
bool tx_pause, bool rx_pause)
|
||||
{
|
||||
u32 mac_ctrl_0, mdio_phy;
|
||||
|
||||
if (tx_pause && rx_pause) {
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_FCON_RXTX;
|
||||
mdio_phy = GSWIP_MDIO_PHY_FCONTX_EN |
|
||||
GSWIP_MDIO_PHY_FCONRX_EN;
|
||||
} else if (tx_pause) {
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_FCON_TX;
|
||||
mdio_phy = GSWIP_MDIO_PHY_FCONTX_EN |
|
||||
GSWIP_MDIO_PHY_FCONRX_DIS;
|
||||
} else if (rx_pause) {
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_FCON_RX;
|
||||
mdio_phy = GSWIP_MDIO_PHY_FCONTX_DIS |
|
||||
GSWIP_MDIO_PHY_FCONRX_EN;
|
||||
} else {
|
||||
mac_ctrl_0 = GSWIP_MAC_CTRL_0_FCON_NONE;
|
||||
mdio_phy = GSWIP_MDIO_PHY_FCONTX_DIS |
|
||||
GSWIP_MDIO_PHY_FCONRX_DIS;
|
||||
}
|
||||
|
||||
gswip_switch_mask(priv, GSWIP_MAC_CTRL_0_FCON_MASK,
|
||||
mac_ctrl_0, GSWIP_MAC_CTRL_0p(port));
|
||||
gswip_mdio_mask(priv,
|
||||
GSWIP_MDIO_PHY_FCONTX_MASK |
|
||||
GSWIP_MDIO_PHY_FCONRX_MASK,
|
||||
mdio_phy, GSWIP_MDIO_PHYp(port));
|
||||
}
|
||||
|
||||
static void gswip_phylink_mac_config(struct dsa_switch *ds, int port,
|
||||
unsigned int mode,
|
||||
const struct phylink_link_state *state)
|
||||
|
|
@ -1474,6 +1603,9 @@ static void gswip_phylink_mac_config(struct dsa_switch *ds, int port,
|
|||
break;
|
||||
case PHY_INTERFACE_MODE_RMII:
|
||||
miicfg |= GSWIP_MII_CFG_MODE_RMIIM;
|
||||
|
||||
/* Configure the RMII clock as output: */
|
||||
miicfg |= GSWIP_MII_CFG_RMII_CLK;
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
|
|
@ -1486,7 +1618,11 @@ static void gswip_phylink_mac_config(struct dsa_switch *ds, int port,
|
|||
"Unsupported interface: %d\n", state->interface);
|
||||
return;
|
||||
}
|
||||
gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_MODE_MASK, miicfg, port);
|
||||
|
||||
gswip_mii_mask_cfg(priv,
|
||||
GSWIP_MII_CFG_MODE_MASK | GSWIP_MII_CFG_RMII_CLK |
|
||||
GSWIP_MII_CFG_RGMII_IBS | GSWIP_MII_CFG_LDCLKDIS,
|
||||
miicfg, port);
|
||||
|
||||
switch (state->interface) {
|
||||
case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
|
|
@ -1511,6 +1647,9 @@ static void gswip_phylink_mac_link_down(struct dsa_switch *ds, int port,
|
|||
struct gswip_priv *priv = ds->priv;
|
||||
|
||||
gswip_mii_mask_cfg(priv, GSWIP_MII_CFG_EN, 0, port);
|
||||
|
||||
if (!dsa_is_cpu_port(ds, port))
|
||||
gswip_port_set_link(priv, port, false);
|
||||
}
|
||||
|
||||
static void gswip_phylink_mac_link_up(struct dsa_switch *ds, int port,
|
||||
|
|
@ -1522,6 +1661,13 @@ static void gswip_phylink_mac_link_up(struct dsa_switch *ds, int port,
|
|||
{
|
||||
struct gswip_priv *priv = ds->priv;
|
||||
|
||||
if (!dsa_is_cpu_port(ds, port)) {
|
||||
gswip_port_set_link(priv, port, true);
|
||||
gswip_port_set_speed(priv, port, speed, interface);
|
||||
gswip_port_set_duplex(priv, port, duplex);
|
||||
gswip_port_set_pause(priv, port, tx_pause, rx_pause);
|
||||
}
|
||||
|
||||
gswip_mii_mask_cfg(priv, 0, GSWIP_MII_CFG_EN, port);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1534,8 +1534,7 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
}
|
||||
pci_set_master(pdev);
|
||||
|
||||
ioaddr = pci_resource_start(pdev, 0);
|
||||
if (!ioaddr) {
|
||||
if (!pci_resource_len(pdev, 0)) {
|
||||
if (pcnet32_debug & NETIF_MSG_PROBE)
|
||||
pr_err("card has no PCI IO resources, aborting\n");
|
||||
err = -ENODEV;
|
||||
|
|
@ -1548,6 +1547,8 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
pr_err("architecture does not support 32bit PCI busmaster DMA\n");
|
||||
goto err_disable_dev;
|
||||
}
|
||||
|
||||
ioaddr = pci_resource_start(pdev, 0);
|
||||
if (!request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci")) {
|
||||
if (pcnet32_debug & NETIF_MSG_PROBE)
|
||||
pr_err("io address range already allocated\n");
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ static int bcm4908_dma_alloc_buf_descs(struct bcm4908_enet *enet,
|
|||
|
||||
err_free_buf_descs:
|
||||
dma_free_coherent(dev, size, ring->cpu_addr, ring->dma_addr);
|
||||
ring->cpu_addr = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3239,6 +3239,9 @@ static void gem_prog_cmp_regs(struct macb *bp, struct ethtool_rx_flow_spec *fs)
|
|||
bool cmp_b = false;
|
||||
bool cmp_c = false;
|
||||
|
||||
if (!macb_is_gem(bp))
|
||||
return;
|
||||
|
||||
tp4sp_v = &(fs->h_u.tcp_ip4_spec);
|
||||
tp4sp_m = &(fs->m_u.tcp_ip4_spec);
|
||||
|
||||
|
|
@ -3607,6 +3610,7 @@ static void macb_restore_features(struct macb *bp)
|
|||
{
|
||||
struct net_device *netdev = bp->dev;
|
||||
netdev_features_t features = netdev->features;
|
||||
struct ethtool_rx_fs_item *item;
|
||||
|
||||
/* TX checksum offload */
|
||||
macb_set_txcsum_feature(bp, features);
|
||||
|
|
@ -3615,6 +3619,9 @@ static void macb_restore_features(struct macb *bp)
|
|||
macb_set_rxcsum_feature(bp, features);
|
||||
|
||||
/* RX Flow Filters */
|
||||
list_for_each_entry(item, &bp->rx_fs_list.list, list)
|
||||
gem_prog_cmp_regs(bp, &item->fs);
|
||||
|
||||
macb_set_rxflow_feature(bp, features);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3966,7 +3966,6 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
|
|||
* normalcy is to reset.
|
||||
* 2. A new reset request from the stack due to timeout
|
||||
*
|
||||
* For the first case,error event might not have ae handle available.
|
||||
* check if this is a new reset request and we are not here just because
|
||||
* last reset attempt did not succeed and watchdog hit us again. We will
|
||||
* know this if last reset request did not occur very recently (watchdog
|
||||
|
|
@ -3976,14 +3975,14 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
|
|||
* want to make sure we throttle the reset request. Therefore, we will
|
||||
* not allow it again before 3*HZ times.
|
||||
*/
|
||||
if (!handle)
|
||||
handle = &hdev->vport[0].nic;
|
||||
|
||||
if (time_before(jiffies, (hdev->last_reset_time +
|
||||
HCLGE_RESET_INTERVAL))) {
|
||||
mod_timer(&hdev->reset_timer, jiffies + HCLGE_RESET_INTERVAL);
|
||||
return;
|
||||
} else if (hdev->default_reset_request) {
|
||||
}
|
||||
|
||||
if (hdev->default_reset_request) {
|
||||
hdev->reset_level =
|
||||
hclge_get_reset_level(ae_dev,
|
||||
&hdev->default_reset_request);
|
||||
|
|
@ -11211,7 +11210,7 @@ static int hclge_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* RSS indirection table has been configuared by user */
|
||||
/* RSS indirection table has been configured by user */
|
||||
if (rxfh_configured)
|
||||
goto out;
|
||||
|
||||
|
|
|
|||
|
|
@ -2193,7 +2193,7 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
|
|||
|
||||
if (test_and_clear_bit(HCLGEVF_RESET_PENDING,
|
||||
&hdev->reset_state)) {
|
||||
/* PF has initmated that it is about to reset the hardware.
|
||||
/* PF has intimated that it is about to reset the hardware.
|
||||
* We now have to poll & check if hardware has actually
|
||||
* completed the reset sequence. On hardware reset completion,
|
||||
* VF needs to reset the client and ae device.
|
||||
|
|
@ -2624,14 +2624,14 @@ static int hclgevf_ae_start(struct hnae3_handle *handle)
|
|||
{
|
||||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
|
||||
clear_bit(HCLGEVF_STATE_DOWN, &hdev->state);
|
||||
|
||||
hclgevf_reset_tqp_stats(handle);
|
||||
|
||||
hclgevf_request_link_info(hdev);
|
||||
|
||||
hclgevf_update_link_mode(hdev);
|
||||
|
||||
clear_bit(HCLGEVF_STATE_DOWN, &hdev->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3497,7 +3497,7 @@ static int hclgevf_set_channels(struct hnae3_handle *handle, u32 new_tqps_num,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* RSS indirection table has been configuared by user */
|
||||
/* RSS indirection table has been configured by user */
|
||||
if (rxfh_configured)
|
||||
goto out;
|
||||
|
||||
|
|
|
|||
|
|
@ -578,6 +578,9 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
|
|||
case RING_TYPE_XDP:
|
||||
ring = kmemdup(vsi->xdp_rings[ring_id], sizeof(*ring), GFP_KERNEL);
|
||||
break;
|
||||
default:
|
||||
ring = NULL;
|
||||
break;
|
||||
}
|
||||
if (!ring)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -5480,7 +5480,7 @@ static int i40e_get_module_eeprom(struct net_device *netdev,
|
|||
|
||||
status = i40e_aq_get_phy_register(hw,
|
||||
I40E_AQ_PHY_REG_ACCESS_EXTERNAL_MODULE,
|
||||
true, addr, offset, &value, NULL);
|
||||
addr, true, offset, &value, NULL);
|
||||
if (status)
|
||||
return -EIO;
|
||||
data[i] = value;
|
||||
|
|
|
|||
|
|
@ -2560,8 +2560,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
|
|||
i40e_stat_str(hw, aq_ret),
|
||||
i40e_aq_str(hw, hw->aq.asq_last_status));
|
||||
} else {
|
||||
dev_info(&pf->pdev->dev, "%s is %s allmulti mode.\n",
|
||||
vsi->netdev->name,
|
||||
dev_info(&pf->pdev->dev, "%s allmulti mode.\n",
|
||||
cur_multipromisc ? "entering" : "leaving");
|
||||
}
|
||||
}
|
||||
|
|
@ -15139,12 +15138,16 @@ static int i40e_init_recovery_mode(struct i40e_pf *pf, struct i40e_hw *hw)
|
|||
* in order to register the netdev
|
||||
*/
|
||||
v_idx = i40e_vsi_mem_alloc(pf, I40E_VSI_MAIN);
|
||||
if (v_idx < 0)
|
||||
if (v_idx < 0) {
|
||||
err = v_idx;
|
||||
goto err_switch_setup;
|
||||
}
|
||||
pf->lan_vsi = v_idx;
|
||||
vsi = pf->vsi[v_idx];
|
||||
if (!vsi)
|
||||
if (!vsi) {
|
||||
err = -EFAULT;
|
||||
goto err_switch_setup;
|
||||
}
|
||||
vsi->alloc_queue_pairs = 1;
|
||||
err = i40e_config_netdev(vsi);
|
||||
if (err)
|
||||
|
|
|
|||
|
|
@ -2295,8 +2295,7 @@ int i40e_xmit_xdp_tx_ring(struct xdp_buff *xdp, struct i40e_ring *xdp_ring)
|
|||
* @rx_ring: Rx ring being processed
|
||||
* @xdp: XDP buffer containing the frame
|
||||
**/
|
||||
static struct sk_buff *i40e_run_xdp(struct i40e_ring *rx_ring,
|
||||
struct xdp_buff *xdp)
|
||||
static int i40e_run_xdp(struct i40e_ring *rx_ring, struct xdp_buff *xdp)
|
||||
{
|
||||
int err, result = I40E_XDP_PASS;
|
||||
struct i40e_ring *xdp_ring;
|
||||
|
|
@ -2335,7 +2334,7 @@ static struct sk_buff *i40e_run_xdp(struct i40e_ring *rx_ring,
|
|||
}
|
||||
xdp_out:
|
||||
rcu_read_unlock();
|
||||
return ERR_PTR(-result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2448,6 +2447,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
|
|||
unsigned int xdp_xmit = 0;
|
||||
bool failure = false;
|
||||
struct xdp_buff xdp;
|
||||
int xdp_res = 0;
|
||||
|
||||
#if (PAGE_SIZE < 8192)
|
||||
frame_sz = i40e_rx_frame_truesize(rx_ring, 0);
|
||||
|
|
@ -2513,12 +2513,10 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
|
|||
/* At larger PAGE_SIZE, frame_sz depend on len size */
|
||||
xdp.frame_sz = i40e_rx_frame_truesize(rx_ring, size);
|
||||
#endif
|
||||
skb = i40e_run_xdp(rx_ring, &xdp);
|
||||
xdp_res = i40e_run_xdp(rx_ring, &xdp);
|
||||
}
|
||||
|
||||
if (IS_ERR(skb)) {
|
||||
unsigned int xdp_res = -PTR_ERR(skb);
|
||||
|
||||
if (xdp_res) {
|
||||
if (xdp_res & (I40E_XDP_TX | I40E_XDP_REDIR)) {
|
||||
xdp_xmit |= xdp_res;
|
||||
i40e_rx_buffer_flip(rx_ring, rx_buffer, size);
|
||||
|
|
|
|||
|
|
@ -4564,6 +4564,7 @@ static int __maybe_unused ice_suspend(struct device *dev)
|
|||
continue;
|
||||
ice_vsi_free_q_vectors(pf->vsi[v]);
|
||||
}
|
||||
ice_free_cpu_rx_rmap(ice_get_main_vsi(pf));
|
||||
ice_clear_interrupt_scheme(pf);
|
||||
|
||||
pci_save_state(pdev);
|
||||
|
|
|
|||
|
|
@ -1107,8 +1107,9 @@ static void mlx5e_uplink_rep_enable(struct mlx5e_priv *priv)
|
|||
|
||||
mlx5e_rep_tc_enable(priv);
|
||||
|
||||
mlx5_modify_vport_admin_state(mdev, MLX5_VPORT_STATE_OP_MOD_UPLINK,
|
||||
0, 0, MLX5_VPORT_ADMIN_STATE_AUTO);
|
||||
if (MLX5_CAP_GEN(mdev, uplink_follow))
|
||||
mlx5_modify_vport_admin_state(mdev, MLX5_VPORT_STATE_OP_MOD_UPLINK,
|
||||
0, 0, MLX5_VPORT_ADMIN_STATE_AUTO);
|
||||
mlx5_lag_add(mdev, netdev);
|
||||
priv->events_nb.notifier_call = uplink_rep_async_event;
|
||||
mlx5_notifier_register(mdev, &priv->events_nb);
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ static int mlx5_esw_indir_table_rule_get(struct mlx5_eswitch *esw,
|
|||
err_ethertype:
|
||||
kfree(rule);
|
||||
out:
|
||||
kfree(rule_spec);
|
||||
kvfree(rule_spec);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -328,7 +328,7 @@ static int mlx5_create_indir_recirc_group(struct mlx5_eswitch *esw,
|
|||
e->recirc_cnt = 0;
|
||||
|
||||
out:
|
||||
kfree(in);
|
||||
kvfree(in);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -347,7 +347,7 @@ static int mlx5_create_indir_fwd_group(struct mlx5_eswitch *esw,
|
|||
|
||||
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
|
||||
if (!spec) {
|
||||
kfree(in);
|
||||
kvfree(in);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
@ -371,8 +371,8 @@ static int mlx5_create_indir_fwd_group(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
err_out:
|
||||
kfree(spec);
|
||||
kfree(in);
|
||||
kvfree(spec);
|
||||
kvfree(in);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1230,16 +1230,22 @@ mlxsw_sp1_from_ptys_link_mode(struct mlxsw_sp *mlxsw_sp, bool carrier_ok,
|
|||
u32 ptys_eth_proto,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
struct mlxsw_sp1_port_link_mode link;
|
||||
int i;
|
||||
|
||||
cmd->link_mode = -1;
|
||||
cmd->base.speed = SPEED_UNKNOWN;
|
||||
cmd->base.duplex = DUPLEX_UNKNOWN;
|
||||
cmd->lanes = 0;
|
||||
|
||||
if (!carrier_ok)
|
||||
return;
|
||||
|
||||
for (i = 0; i < MLXSW_SP1_PORT_LINK_MODE_LEN; i++) {
|
||||
if (ptys_eth_proto & mlxsw_sp1_port_link_mode[i].mask)
|
||||
cmd->link_mode = mlxsw_sp1_port_link_mode[i].mask_ethtool;
|
||||
if (ptys_eth_proto & mlxsw_sp1_port_link_mode[i].mask) {
|
||||
link = mlxsw_sp1_port_link_mode[i];
|
||||
ethtool_params_from_link_mode(cmd,
|
||||
link.mask_ethtool);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1672,7 +1678,9 @@ mlxsw_sp2_from_ptys_link_mode(struct mlxsw_sp *mlxsw_sp, bool carrier_ok,
|
|||
struct mlxsw_sp2_port_link_mode link;
|
||||
int i;
|
||||
|
||||
cmd->link_mode = -1;
|
||||
cmd->base.speed = SPEED_UNKNOWN;
|
||||
cmd->base.duplex = DUPLEX_UNKNOWN;
|
||||
cmd->lanes = 0;
|
||||
|
||||
if (!carrier_ok)
|
||||
return;
|
||||
|
|
@ -1680,7 +1688,8 @@ mlxsw_sp2_from_ptys_link_mode(struct mlxsw_sp *mlxsw_sp, bool carrier_ok,
|
|||
for (i = 0; i < MLXSW_SP2_PORT_LINK_MODE_LEN; i++) {
|
||||
if (ptys_eth_proto & mlxsw_sp2_port_link_mode[i].mask) {
|
||||
link = mlxsw_sp2_port_link_mode[i];
|
||||
cmd->link_mode = link.mask_ethtool[1];
|
||||
ethtool_params_from_link_mode(cmd,
|
||||
link.mask_ethtool[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -885,8 +885,8 @@ static int lan743x_mac_set_mtu(struct lan743x_adapter *adapter, int new_mtu)
|
|||
}
|
||||
|
||||
mac_rx &= ~(MAC_RX_MAX_SIZE_MASK_);
|
||||
mac_rx |= (((new_mtu + ETH_HLEN + 4) << MAC_RX_MAX_SIZE_SHIFT_) &
|
||||
MAC_RX_MAX_SIZE_MASK_);
|
||||
mac_rx |= (((new_mtu + ETH_HLEN + ETH_FCS_LEN)
|
||||
<< MAC_RX_MAX_SIZE_SHIFT_) & MAC_RX_MAX_SIZE_MASK_);
|
||||
lan743x_csr_write(adapter, MAC_RX, mac_rx);
|
||||
|
||||
if (enabled) {
|
||||
|
|
@ -1944,7 +1944,7 @@ static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index)
|
|||
struct sk_buff *skb;
|
||||
dma_addr_t dma_ptr;
|
||||
|
||||
buffer_length = netdev->mtu + ETH_HLEN + 4 + RX_HEAD_PADDING;
|
||||
buffer_length = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + RX_HEAD_PADDING;
|
||||
|
||||
descriptor = &rx->ring_cpu_ptr[index];
|
||||
buffer_info = &rx->buffer_info[index];
|
||||
|
|
@ -2040,7 +2040,7 @@ lan743x_rx_trim_skb(struct sk_buff *skb, int frame_length)
|
|||
dev_kfree_skb_irq(skb);
|
||||
return NULL;
|
||||
}
|
||||
frame_length = max_t(int, 0, frame_length - RX_HEAD_PADDING - 4);
|
||||
frame_length = max_t(int, 0, frame_length - ETH_FCS_LEN);
|
||||
if (skb->len > frame_length) {
|
||||
skb->tail -= skb->len - frame_length;
|
||||
skb->len = frame_length;
|
||||
|
|
|
|||
|
|
@ -365,6 +365,7 @@ static int atusb_alloc_urbs(struct atusb *atusb, int n)
|
|||
return -ENOMEM;
|
||||
}
|
||||
usb_anchor_urb(urb, &atusb->idle_urbs);
|
||||
usb_free_urb(urb);
|
||||
n--;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,14 @@
|
|||
#include <linux/bpf.h>
|
||||
#include <linux/bpf_trace.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/ieee802154.h>
|
||||
#include <linux/if_ltalk.h>
|
||||
#include <uapi/linux/if_fddi.h>
|
||||
#include <uapi/linux/if_hippi.h>
|
||||
#include <uapi/linux/if_fc.h>
|
||||
#include <net/ax25.h>
|
||||
#include <net/rose.h>
|
||||
#include <net/6lowpan.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/proc_fs.h>
|
||||
|
|
@ -2919,6 +2927,45 @@ static int tun_set_ebpf(struct tun_struct *tun, struct tun_prog __rcu **prog_p,
|
|||
return __tun_set_ebpf(tun, prog_p, prog);
|
||||
}
|
||||
|
||||
/* Return correct value for tun->dev->addr_len based on tun->dev->type. */
|
||||
static unsigned char tun_get_addr_len(unsigned short type)
|
||||
{
|
||||
switch (type) {
|
||||
case ARPHRD_IP6GRE:
|
||||
case ARPHRD_TUNNEL6:
|
||||
return sizeof(struct in6_addr);
|
||||
case ARPHRD_IPGRE:
|
||||
case ARPHRD_TUNNEL:
|
||||
case ARPHRD_SIT:
|
||||
return 4;
|
||||
case ARPHRD_ETHER:
|
||||
return ETH_ALEN;
|
||||
case ARPHRD_IEEE802154:
|
||||
case ARPHRD_IEEE802154_MONITOR:
|
||||
return IEEE802154_EXTENDED_ADDR_LEN;
|
||||
case ARPHRD_PHONET_PIPE:
|
||||
case ARPHRD_PPP:
|
||||
case ARPHRD_NONE:
|
||||
return 0;
|
||||
case ARPHRD_6LOWPAN:
|
||||
return EUI64_ADDR_LEN;
|
||||
case ARPHRD_FDDI:
|
||||
return FDDI_K_ALEN;
|
||||
case ARPHRD_HIPPI:
|
||||
return HIPPI_ALEN;
|
||||
case ARPHRD_IEEE802:
|
||||
return FC_ALEN;
|
||||
case ARPHRD_ROSE:
|
||||
return ROSE_ADDR_LEN;
|
||||
case ARPHRD_NETROM:
|
||||
return AX25_ADDR_LEN;
|
||||
case ARPHRD_LOCALTLK:
|
||||
return LTALK_ALEN;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg, int ifreq_len)
|
||||
{
|
||||
|
|
@ -3082,6 +3129,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|||
break;
|
||||
}
|
||||
tun->dev->type = (int) arg;
|
||||
tun->dev->addr_len = tun_get_addr_len(tun->dev->type);
|
||||
netif_info(tun, drv, tun->dev, "linktype set to %d\n",
|
||||
tun->dev->type);
|
||||
call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE,
|
||||
|
|
|
|||
|
|
@ -611,7 +611,7 @@ static struct hso_serial *get_serial_by_index(unsigned index)
|
|||
return serial;
|
||||
}
|
||||
|
||||
static int get_free_serial_index(void)
|
||||
static int obtain_minor(struct hso_serial *serial)
|
||||
{
|
||||
int index;
|
||||
unsigned long flags;
|
||||
|
|
@ -619,8 +619,10 @@ static int get_free_serial_index(void)
|
|||
spin_lock_irqsave(&serial_table_lock, flags);
|
||||
for (index = 0; index < HSO_SERIAL_TTY_MINORS; index++) {
|
||||
if (serial_table[index] == NULL) {
|
||||
serial_table[index] = serial->parent;
|
||||
serial->minor = index;
|
||||
spin_unlock_irqrestore(&serial_table_lock, flags);
|
||||
return index;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&serial_table_lock, flags);
|
||||
|
|
@ -629,15 +631,12 @@ static int get_free_serial_index(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static void set_serial_by_index(unsigned index, struct hso_serial *serial)
|
||||
static void release_minor(struct hso_serial *serial)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&serial_table_lock, flags);
|
||||
if (serial)
|
||||
serial_table[index] = serial->parent;
|
||||
else
|
||||
serial_table[index] = NULL;
|
||||
serial_table[serial->minor] = NULL;
|
||||
spin_unlock_irqrestore(&serial_table_lock, flags);
|
||||
}
|
||||
|
||||
|
|
@ -2230,6 +2229,7 @@ static int hso_stop_serial_device(struct hso_device *hso_dev)
|
|||
static void hso_serial_tty_unregister(struct hso_serial *serial)
|
||||
{
|
||||
tty_unregister_device(tty_drv, serial->minor);
|
||||
release_minor(serial);
|
||||
}
|
||||
|
||||
static void hso_serial_common_free(struct hso_serial *serial)
|
||||
|
|
@ -2253,24 +2253,22 @@ static void hso_serial_common_free(struct hso_serial *serial)
|
|||
static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
|
||||
int rx_size, int tx_size)
|
||||
{
|
||||
int minor;
|
||||
int i;
|
||||
|
||||
tty_port_init(&serial->port);
|
||||
|
||||
minor = get_free_serial_index();
|
||||
if (minor < 0)
|
||||
if (obtain_minor(serial))
|
||||
goto exit2;
|
||||
|
||||
/* register our minor number */
|
||||
serial->parent->dev = tty_port_register_device_attr(&serial->port,
|
||||
tty_drv, minor, &serial->parent->interface->dev,
|
||||
tty_drv, serial->minor, &serial->parent->interface->dev,
|
||||
serial->parent, hso_serial_dev_groups);
|
||||
if (IS_ERR(serial->parent->dev))
|
||||
if (IS_ERR(serial->parent->dev)) {
|
||||
release_minor(serial);
|
||||
goto exit2;
|
||||
}
|
||||
|
||||
/* fill in specific data for later use */
|
||||
serial->minor = minor;
|
||||
serial->magic = HSO_SERIAL_MAGIC;
|
||||
spin_lock_init(&serial->serial_lock);
|
||||
serial->num_rx_urbs = num_urbs;
|
||||
|
|
@ -2667,9 +2665,6 @@ static struct hso_device *hso_create_bulk_serial_device(
|
|||
|
||||
serial->write_data = hso_std_serial_write_data;
|
||||
|
||||
/* and record this serial */
|
||||
set_serial_by_index(serial->minor, serial);
|
||||
|
||||
/* setup the proc dirs and files if needed */
|
||||
hso_log_port(hso_dev);
|
||||
|
||||
|
|
@ -2726,9 +2721,6 @@ struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,
|
|||
serial->shared_int->ref_count++;
|
||||
mutex_unlock(&serial->shared_int->shared_int_lock);
|
||||
|
||||
/* and record this serial */
|
||||
set_serial_by_index(serial->minor, serial);
|
||||
|
||||
/* setup the proc dirs and files if needed */
|
||||
hso_log_port(hso_dev);
|
||||
|
||||
|
|
@ -3113,7 +3105,6 @@ static void hso_free_interface(struct usb_interface *interface)
|
|||
cancel_work_sync(&serial_table[i]->async_get_intf);
|
||||
hso_serial_tty_unregister(serial);
|
||||
kref_put(&serial_table[i]->ref, hso_serial_ref_free);
|
||||
set_serial_by_index(i, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -406,9 +406,13 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
|
|||
offset += hdr_padded_len;
|
||||
p += hdr_padded_len;
|
||||
|
||||
copy = len;
|
||||
if (copy > skb_tailroom(skb))
|
||||
copy = skb_tailroom(skb);
|
||||
/* Copy all frame if it fits skb->head, otherwise
|
||||
* we let virtio_net_hdr_to_skb() and GRO pull headers as needed.
|
||||
*/
|
||||
if (len <= skb_tailroom(skb))
|
||||
copy = len;
|
||||
else
|
||||
copy = ETH_HLEN + metasize;
|
||||
skb_put_data(skb, p, copy);
|
||||
|
||||
if (metasize) {
|
||||
|
|
|
|||
|
|
@ -2439,7 +2439,7 @@ void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool locked)
|
|||
vif = ifp->vif;
|
||||
cfg = wdev_to_cfg(&vif->wdev);
|
||||
cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
|
||||
if (locked) {
|
||||
if (!locked) {
|
||||
rtnl_lock();
|
||||
wiphy_lock(cfg->wiphy);
|
||||
cfg80211_unregister_wdev(&vif->wdev);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2005-2014 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2021 Intel Corporation
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
#include <linux/sched.h>
|
||||
|
|
@ -26,7 +26,7 @@ bool iwl_notification_wait(struct iwl_notif_wait_data *notif_wait,
|
|||
if (!list_empty(¬if_wait->notif_waits)) {
|
||||
struct iwl_notification_wait *w;
|
||||
|
||||
spin_lock(¬if_wait->notif_wait_lock);
|
||||
spin_lock_bh(¬if_wait->notif_wait_lock);
|
||||
list_for_each_entry(w, ¬if_wait->notif_waits, list) {
|
||||
int i;
|
||||
bool found = false;
|
||||
|
|
@ -59,7 +59,7 @@ bool iwl_notification_wait(struct iwl_notif_wait_data *notif_wait,
|
|||
triggered = true;
|
||||
}
|
||||
}
|
||||
spin_unlock(¬if_wait->notif_wait_lock);
|
||||
spin_unlock_bh(¬if_wait->notif_wait_lock);
|
||||
}
|
||||
|
||||
return triggered;
|
||||
|
|
@ -70,10 +70,10 @@ void iwl_abort_notification_waits(struct iwl_notif_wait_data *notif_wait)
|
|||
{
|
||||
struct iwl_notification_wait *wait_entry;
|
||||
|
||||
spin_lock(¬if_wait->notif_wait_lock);
|
||||
spin_lock_bh(¬if_wait->notif_wait_lock);
|
||||
list_for_each_entry(wait_entry, ¬if_wait->notif_waits, list)
|
||||
wait_entry->aborted = true;
|
||||
spin_unlock(¬if_wait->notif_wait_lock);
|
||||
spin_unlock_bh(¬if_wait->notif_wait_lock);
|
||||
|
||||
wake_up_all(¬if_wait->notif_waitq);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -414,6 +414,7 @@ struct iwl_cfg {
|
|||
#define IWL_CFG_MAC_TYPE_QNJ 0x36
|
||||
#define IWL_CFG_MAC_TYPE_SO 0x37
|
||||
#define IWL_CFG_MAC_TYPE_SNJ 0x42
|
||||
#define IWL_CFG_MAC_TYPE_SOF 0x43
|
||||
#define IWL_CFG_MAC_TYPE_MA 0x44
|
||||
|
||||
#define IWL_CFG_RF_TYPE_TH 0x105
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ enum iwl_reg_capa_flags_v2 {
|
|||
REG_CAPA_V2_MCS_9_ALLOWED = BIT(6),
|
||||
REG_CAPA_V2_WEATHER_DISABLED = BIT(7),
|
||||
REG_CAPA_V2_40MHZ_ALLOWED = BIT(8),
|
||||
REG_CAPA_V2_11AX_DISABLED = BIT(13),
|
||||
REG_CAPA_V2_11AX_DISABLED = BIT(10),
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1786,10 +1786,13 @@ static ssize_t iwl_dbgfs_rfi_freq_table_write(struct iwl_mvm *mvm, char *buf,
|
|||
return -EINVAL;
|
||||
|
||||
/* value zero triggers re-sending the default table to the device */
|
||||
if (!op_id)
|
||||
if (!op_id) {
|
||||
mutex_lock(&mvm->mutex);
|
||||
ret = iwl_rfi_send_config_cmd(mvm, NULL);
|
||||
else
|
||||
mutex_unlock(&mvm->mutex);
|
||||
} else {
|
||||
ret = -EOPNOTSUPP; /* in the future a new table will be added */
|
||||
}
|
||||
|
||||
return ret ?: count;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2020 Intel Corporation
|
||||
* Copyright (C) 2020 - 2021 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "mvm.h"
|
||||
|
|
@ -66,6 +66,8 @@ int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm, struct iwl_rfi_lut_entry *rfi_t
|
|||
if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_RFIM_SUPPORT))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
/* in case no table is passed, use the default one */
|
||||
if (!rfi_table) {
|
||||
memcpy(cmd.table, iwl_rfi_table, sizeof(cmd.table));
|
||||
|
|
@ -75,9 +77,7 @@ int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm, struct iwl_rfi_lut_entry *rfi_t
|
|||
cmd.oem = 1;
|
||||
}
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
ret = iwl_mvm_send_cmd(mvm, &hcmd);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "Failed to send RFI config cmd %d\n", ret);
|
||||
|
|
|
|||
|
|
@ -272,10 +272,10 @@ static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
|
|||
rx_status->chain_signal[2] = S8_MIN;
|
||||
}
|
||||
|
||||
static int iwl_mvm_rx_mgmt_crypto(struct ieee80211_sta *sta,
|
||||
struct ieee80211_hdr *hdr,
|
||||
struct iwl_rx_mpdu_desc *desc,
|
||||
u32 status)
|
||||
static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
||||
struct ieee80211_hdr *hdr,
|
||||
struct iwl_rx_mpdu_desc *desc,
|
||||
u32 status)
|
||||
{
|
||||
struct iwl_mvm_sta *mvmsta;
|
||||
struct iwl_mvm_vif *mvmvif;
|
||||
|
|
@ -285,6 +285,9 @@ static int iwl_mvm_rx_mgmt_crypto(struct ieee80211_sta *sta,
|
|||
u32 len = le16_to_cpu(desc->mpdu_len);
|
||||
const u8 *frame = (void *)hdr;
|
||||
|
||||
if ((status & IWL_RX_MPDU_STATUS_SEC_MASK) == IWL_RX_MPDU_STATUS_SEC_NONE)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* For non-beacon, we don't really care. But beacons may
|
||||
* be filtered out, and we thus need the firmware's replay
|
||||
|
|
@ -356,6 +359,10 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||
IWL_RX_MPDU_STATUS_SEC_UNKNOWN && !mvm->monitor_on)
|
||||
return -1;
|
||||
|
||||
if (unlikely(ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
!ieee80211_has_protected(hdr->frame_control)))
|
||||
return iwl_mvm_rx_mgmt_prot(sta, hdr, desc, status);
|
||||
|
||||
if (!ieee80211_has_protected(hdr->frame_control) ||
|
||||
(status & IWL_RX_MPDU_STATUS_SEC_MASK) ==
|
||||
IWL_RX_MPDU_STATUS_SEC_NONE)
|
||||
|
|
@ -411,7 +418,7 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||
stats->flag |= RX_FLAG_DECRYPTED;
|
||||
return 0;
|
||||
case RX_MPDU_RES_STATUS_SEC_CMAC_GMAC_ENC:
|
||||
return iwl_mvm_rx_mgmt_crypto(sta, hdr, desc, status);
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* Sometimes we can get frames that were not decrypted
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2018-2020 Intel Corporation
|
||||
* Copyright (C) 2018-2021 Intel Corporation
|
||||
*/
|
||||
#include "iwl-trans.h"
|
||||
#include "iwl-fh.h"
|
||||
|
|
@ -75,15 +75,6 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
|
|||
const struct fw_img *fw)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
u32 ltr_val = CSR_LTR_LONG_VAL_AD_NO_SNOOP_REQ |
|
||||
u32_encode_bits(CSR_LTR_LONG_VAL_AD_SCALE_USEC,
|
||||
CSR_LTR_LONG_VAL_AD_NO_SNOOP_SCALE) |
|
||||
u32_encode_bits(250,
|
||||
CSR_LTR_LONG_VAL_AD_NO_SNOOP_VAL) |
|
||||
CSR_LTR_LONG_VAL_AD_SNOOP_REQ |
|
||||
u32_encode_bits(CSR_LTR_LONG_VAL_AD_SCALE_USEC,
|
||||
CSR_LTR_LONG_VAL_AD_SNOOP_SCALE) |
|
||||
u32_encode_bits(250, CSR_LTR_LONG_VAL_AD_SNOOP_VAL);
|
||||
struct iwl_context_info_gen3 *ctxt_info_gen3;
|
||||
struct iwl_prph_scratch *prph_scratch;
|
||||
struct iwl_prph_scratch_ctrl_cfg *prph_sc_ctrl;
|
||||
|
|
@ -217,26 +208,6 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans,
|
|||
iwl_set_bit(trans, CSR_CTXT_INFO_BOOT_CTRL,
|
||||
CSR_AUTO_FUNC_BOOT_ENA);
|
||||
|
||||
/*
|
||||
* To workaround hardware latency issues during the boot process,
|
||||
* initialize the LTR to ~250 usec (see ltr_val above).
|
||||
* The firmware initializes this again later (to a smaller value).
|
||||
*/
|
||||
if ((trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_AX210 ||
|
||||
trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000) &&
|
||||
!trans->trans_cfg->integrated) {
|
||||
iwl_write32(trans, CSR_LTR_LONG_VAL_AD, ltr_val);
|
||||
} else if (trans->trans_cfg->integrated &&
|
||||
trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000) {
|
||||
iwl_write_prph(trans, HPM_MAC_LTR_CSR, HPM_MAC_LRT_ENABLE_ALL);
|
||||
iwl_write_prph(trans, HPM_UMAC_LTR, ltr_val);
|
||||
}
|
||||
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
|
||||
iwl_write_umac_prph(trans, UREG_CPU_INIT_RUN, 1);
|
||||
else
|
||||
iwl_set_bit(trans, CSR_GP_CNTRL, CSR_AUTO_FUNC_INIT);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_ctxt_info:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2020 Intel Corporation
|
||||
* Copyright (C) 2018-2021 Intel Corporation
|
||||
*/
|
||||
#include "iwl-trans.h"
|
||||
#include "iwl-fh.h"
|
||||
|
|
@ -240,7 +240,6 @@ int iwl_pcie_ctxt_info_init(struct iwl_trans *trans,
|
|||
|
||||
/* kick FW self load */
|
||||
iwl_write64(trans, CSR_CTXT_INFO_BA, trans_pcie->ctxt_info_dma_addr);
|
||||
iwl_write_prph(trans, UREG_CPU_INIT_RUN, 1);
|
||||
|
||||
/* Context info will be released upon alive or failure to get one */
|
||||
|
||||
|
|
|
|||
|
|
@ -592,6 +592,7 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
|||
IWL_DEV_INFO(0x4DF0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x6074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
|
||||
/* So with HR */
|
||||
IWL_DEV_INFO(0x2725, 0x0090, iwlax211_2ax_cfg_so_gf_a0, NULL),
|
||||
|
|
@ -1040,7 +1041,31 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
|||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_HR2, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwl_cfg_so_a0_hr_a0, iwl_ax201_name)
|
||||
iwl_cfg_so_a0_hr_a0, iwl_ax201_name),
|
||||
|
||||
/* So-F with Hr */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_HR2, IWL_CFG_ANY,
|
||||
IWL_CFG_NO_160, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwl_cfg_so_a0_hr_a0, iwl_ax203_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_HR1, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwl_cfg_so_a0_hr_a0, iwl_ax101_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_HR2, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwl_cfg_so_a0_hr_a0, iwl_ax201_name),
|
||||
|
||||
/* So-F with Gf */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_GF, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwlax211_2ax_cfg_so_gf_a0, iwl_ax211_name),
|
||||
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -266,6 +266,34 @@ void iwl_trans_pcie_gen2_fw_alive(struct iwl_trans *trans, u32 scd_addr)
|
|||
mutex_unlock(&trans_pcie->mutex);
|
||||
}
|
||||
|
||||
static void iwl_pcie_set_ltr(struct iwl_trans *trans)
|
||||
{
|
||||
u32 ltr_val = CSR_LTR_LONG_VAL_AD_NO_SNOOP_REQ |
|
||||
u32_encode_bits(CSR_LTR_LONG_VAL_AD_SCALE_USEC,
|
||||
CSR_LTR_LONG_VAL_AD_NO_SNOOP_SCALE) |
|
||||
u32_encode_bits(250,
|
||||
CSR_LTR_LONG_VAL_AD_NO_SNOOP_VAL) |
|
||||
CSR_LTR_LONG_VAL_AD_SNOOP_REQ |
|
||||
u32_encode_bits(CSR_LTR_LONG_VAL_AD_SCALE_USEC,
|
||||
CSR_LTR_LONG_VAL_AD_SNOOP_SCALE) |
|
||||
u32_encode_bits(250, CSR_LTR_LONG_VAL_AD_SNOOP_VAL);
|
||||
|
||||
/*
|
||||
* To workaround hardware latency issues during the boot process,
|
||||
* initialize the LTR to ~250 usec (see ltr_val above).
|
||||
* The firmware initializes this again later (to a smaller value).
|
||||
*/
|
||||
if ((trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_AX210 ||
|
||||
trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000) &&
|
||||
!trans->trans_cfg->integrated) {
|
||||
iwl_write32(trans, CSR_LTR_LONG_VAL_AD, ltr_val);
|
||||
} else if (trans->trans_cfg->integrated &&
|
||||
trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000) {
|
||||
iwl_write_prph(trans, HPM_MAC_LTR_CSR, HPM_MAC_LRT_ENABLE_ALL);
|
||||
iwl_write_prph(trans, HPM_UMAC_LTR, ltr_val);
|
||||
}
|
||||
}
|
||||
|
||||
int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans,
|
||||
const struct fw_img *fw, bool run_in_rfkill)
|
||||
{
|
||||
|
|
@ -332,6 +360,13 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans,
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
iwl_pcie_set_ltr(trans);
|
||||
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)
|
||||
iwl_write_umac_prph(trans, UREG_CPU_INIT_RUN, 1);
|
||||
else
|
||||
iwl_write_prph(trans, UREG_CPU_INIT_RUN, 1);
|
||||
|
||||
/* re-check RF-Kill state since we may have missed the interrupt */
|
||||
hw_rfkill = iwl_pcie_check_hw_rf_kill(trans);
|
||||
if (hw_rfkill && !run_in_rfkill)
|
||||
|
|
|
|||
|
|
@ -928,6 +928,7 @@ int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
|
|||
u32 cmd_pos;
|
||||
const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
|
||||
u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
|
||||
unsigned long flags;
|
||||
|
||||
if (WARN(!trans->wide_cmd_header &&
|
||||
group_id > IWL_ALWAYS_LONG_GROUP,
|
||||
|
|
@ -1011,10 +1012,10 @@ int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
|
|||
goto free_dup_buf;
|
||||
}
|
||||
|
||||
spin_lock_bh(&txq->lock);
|
||||
spin_lock_irqsave(&txq->lock, flags);
|
||||
|
||||
if (iwl_txq_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
|
||||
spin_unlock_bh(&txq->lock);
|
||||
spin_unlock_irqrestore(&txq->lock, flags);
|
||||
|
||||
IWL_ERR(trans, "No space in command queue\n");
|
||||
iwl_op_mode_cmd_queue_full(trans->op_mode);
|
||||
|
|
@ -1174,7 +1175,7 @@ int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
|
|||
unlock_reg:
|
||||
spin_unlock(&trans_pcie->reg_lock);
|
||||
out:
|
||||
spin_unlock_bh(&txq->lock);
|
||||
spin_unlock_irqrestore(&txq->lock, flags);
|
||||
free_dup_buf:
|
||||
if (idx < 0)
|
||||
kfree(dup_buf);
|
||||
|
|
|
|||
|
|
@ -135,10 +135,10 @@
|
|||
|
||||
#define MT_WTBLON_TOP_BASE 0x34000
|
||||
#define MT_WTBLON_TOP(ofs) (MT_WTBLON_TOP_BASE + (ofs))
|
||||
#define MT_WTBLON_TOP_WDUCR MT_WTBLON_TOP(0x0)
|
||||
#define MT_WTBLON_TOP_WDUCR MT_WTBLON_TOP(0x200)
|
||||
#define MT_WTBLON_TOP_WDUCR_GROUP GENMASK(2, 0)
|
||||
|
||||
#define MT_WTBL_UPDATE MT_WTBLON_TOP(0x030)
|
||||
#define MT_WTBL_UPDATE MT_WTBLON_TOP(0x230)
|
||||
#define MT_WTBL_UPDATE_WLAN_IDX GENMASK(9, 0)
|
||||
#define MT_WTBL_UPDATE_ADM_COUNT_CLEAR BIT(12)
|
||||
#define MT_WTBL_UPDATE_BUSY BIT(31)
|
||||
|
|
|
|||
|
|
@ -309,11 +309,20 @@ static bool sanity_check(struct ce_array *ca)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* cec_add_elem - Add an element to the CEC array.
|
||||
* @pfn: page frame number to insert
|
||||
*
|
||||
* Return values:
|
||||
* - <0: on error
|
||||
* - 0: on success
|
||||
* - >0: when the inserted pfn was offlined
|
||||
*/
|
||||
static int cec_add_elem(u64 pfn)
|
||||
{
|
||||
struct ce_array *ca = &ce_arr;
|
||||
int count, err, ret = 0;
|
||||
unsigned int to = 0;
|
||||
int count, ret = 0;
|
||||
|
||||
/*
|
||||
* We can be called very early on the identify_cpu() path where we are
|
||||
|
|
@ -330,8 +339,8 @@ static int cec_add_elem(u64 pfn)
|
|||
if (ca->n == MAX_ELEMS)
|
||||
WARN_ON(!del_lru_elem_unlocked(ca));
|
||||
|
||||
ret = find_elem(ca, pfn, &to);
|
||||
if (ret < 0) {
|
||||
err = find_elem(ca, pfn, &to);
|
||||
if (err < 0) {
|
||||
/*
|
||||
* Shift range [to-end] to make room for one more element.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -20,6 +20,11 @@
|
|||
#ifndef HPSA_CMD_H
|
||||
#define HPSA_CMD_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#include <linux/build_bug.h> /* static_assert */
|
||||
#include <linux/stddef.h> /* offsetof */
|
||||
|
||||
/* general boundary defintions */
|
||||
#define SENSEINFOBYTES 32 /* may vary between hbas */
|
||||
#define SG_ENTRIES_IN_CMD 32 /* Max SG entries excluding chain blocks */
|
||||
|
|
@ -200,12 +205,10 @@ union u64bit {
|
|||
MAX_EXT_TARGETS + 1) /* + 1 is for the controller itself */
|
||||
|
||||
/* SCSI-3 Commands */
|
||||
#pragma pack(1)
|
||||
|
||||
#define HPSA_INQUIRY 0x12
|
||||
struct InquiryData {
|
||||
u8 data_byte[36];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#define HPSA_REPORT_LOG 0xc2 /* Report Logical LUNs */
|
||||
#define HPSA_REPORT_PHYS 0xc3 /* Report Physical LUNs */
|
||||
|
|
@ -221,7 +224,7 @@ struct raid_map_disk_data {
|
|||
u8 xor_mult[2]; /**< XOR multipliers for this position,
|
||||
* valid for data disks only */
|
||||
u8 reserved[2];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct raid_map_data {
|
||||
__le32 structure_size; /* Size of entire structure in bytes */
|
||||
|
|
@ -247,14 +250,14 @@ struct raid_map_data {
|
|||
__le16 dekindex; /* Data encryption key index. */
|
||||
u8 reserved[16];
|
||||
struct raid_map_disk_data data[RAID_MAP_MAX_ENTRIES];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct ReportLUNdata {
|
||||
u8 LUNListLength[4];
|
||||
u8 extended_response_flag;
|
||||
u8 reserved[3];
|
||||
u8 LUN[HPSA_MAX_LUN][8];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct ext_report_lun_entry {
|
||||
u8 lunid[8];
|
||||
|
|
@ -269,20 +272,20 @@ struct ext_report_lun_entry {
|
|||
u8 lun_count; /* multi-lun device, how many luns */
|
||||
u8 redundant_paths;
|
||||
u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct ReportExtendedLUNdata {
|
||||
u8 LUNListLength[4];
|
||||
u8 extended_response_flag;
|
||||
u8 reserved[3];
|
||||
struct ext_report_lun_entry LUN[HPSA_MAX_PHYS_LUN];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct SenseSubsystem_info {
|
||||
u8 reserved[36];
|
||||
u8 portname[8];
|
||||
u8 reserved1[1108];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
/* BMIC commands */
|
||||
#define BMIC_READ 0x26
|
||||
|
|
@ -317,7 +320,7 @@ union SCSI3Addr {
|
|||
u8 Targ:6;
|
||||
u8 Mode:2; /* b10 */
|
||||
} LogUnit;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct PhysDevAddr {
|
||||
u32 TargetId:24;
|
||||
|
|
@ -325,20 +328,20 @@ struct PhysDevAddr {
|
|||
u32 Mode:2;
|
||||
/* 2 level target device addr */
|
||||
union SCSI3Addr Target[2];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct LogDevAddr {
|
||||
u32 VolId:30;
|
||||
u32 Mode:2;
|
||||
u8 reserved[4];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
union LUNAddr {
|
||||
u8 LunAddrBytes[8];
|
||||
union SCSI3Addr SCSI3Lun[4];
|
||||
struct PhysDevAddr PhysDev;
|
||||
struct LogDevAddr LogDev;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct CommandListHeader {
|
||||
u8 ReplyQueue;
|
||||
|
|
@ -346,7 +349,7 @@ struct CommandListHeader {
|
|||
__le16 SGTotal;
|
||||
__le64 tag;
|
||||
union LUNAddr LUN;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct RequestBlock {
|
||||
u8 CDBLen;
|
||||
|
|
@ -365,18 +368,18 @@ struct RequestBlock {
|
|||
#define GET_DIR(tad) (((tad) >> 6) & 0x03)
|
||||
u16 Timeout;
|
||||
u8 CDB[16];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct ErrDescriptor {
|
||||
__le64 Addr;
|
||||
__le32 Len;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct SGDescriptor {
|
||||
__le64 Addr;
|
||||
__le32 Len;
|
||||
__le32 Ext;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
union MoreErrInfo {
|
||||
struct {
|
||||
|
|
@ -390,7 +393,8 @@ union MoreErrInfo {
|
|||
u8 offense_num; /* byte # of offense 0-base */
|
||||
u32 offense_value;
|
||||
} Invalid_Cmd;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct ErrorInfo {
|
||||
u8 ScsiStatus;
|
||||
u8 SenseLen;
|
||||
|
|
@ -398,7 +402,7 @@ struct ErrorInfo {
|
|||
u32 ResidualCnt;
|
||||
union MoreErrInfo MoreErrInfo;
|
||||
u8 SenseInfo[SENSEINFOBYTES];
|
||||
};
|
||||
} __packed;
|
||||
/* Command types */
|
||||
#define CMD_IOCTL_PEND 0x01
|
||||
#define CMD_SCSI 0x03
|
||||
|
|
@ -453,6 +457,15 @@ struct CommandList {
|
|||
atomic_t refcount; /* Must be last to avoid memset in hpsa_cmd_init() */
|
||||
} __aligned(COMMANDLIST_ALIGNMENT);
|
||||
|
||||
/*
|
||||
* Make sure our embedded atomic variable is aligned. Otherwise we break atomic
|
||||
* operations on architectures that don't support unaligned atomics like IA64.
|
||||
*
|
||||
* The assert guards against reintroductin against unwanted __packed to
|
||||
* the struct CommandList.
|
||||
*/
|
||||
static_assert(offsetof(struct CommandList, refcount) % __alignof__(atomic_t) == 0);
|
||||
|
||||
/* Max S/G elements in I/O accelerator command */
|
||||
#define IOACCEL1_MAXSGENTRIES 24
|
||||
#define IOACCEL2_MAXSGENTRIES 28
|
||||
|
|
@ -489,7 +502,7 @@ struct io_accel1_cmd {
|
|||
__le64 host_addr; /* 0x70 - 0x77 */
|
||||
u8 CISS_LUN[8]; /* 0x78 - 0x7F */
|
||||
struct SGDescriptor SG[IOACCEL1_MAXSGENTRIES];
|
||||
} __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT);
|
||||
} __packed __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT);
|
||||
|
||||
#define IOACCEL1_FUNCTION_SCSIIO 0x00
|
||||
#define IOACCEL1_SGLOFFSET 32
|
||||
|
|
@ -519,7 +532,7 @@ struct ioaccel2_sg_element {
|
|||
u8 chain_indicator;
|
||||
#define IOACCEL2_CHAIN 0x80
|
||||
#define IOACCEL2_LAST_SG 0x40
|
||||
};
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* SCSI Response Format structure for IO Accelerator Mode 2
|
||||
|
|
@ -559,7 +572,7 @@ struct io_accel2_scsi_response {
|
|||
u8 sense_data_len; /* sense/response data length */
|
||||
u8 resid_cnt[4]; /* residual count */
|
||||
u8 sense_data_buff[32]; /* sense/response data buffer */
|
||||
};
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Structure for I/O accelerator (mode 2 or m2) commands.
|
||||
|
|
@ -592,7 +605,7 @@ struct io_accel2_cmd {
|
|||
__le32 tweak_upper; /* Encryption tweak, upper 4 bytes */
|
||||
struct ioaccel2_sg_element sg[IOACCEL2_MAXSGENTRIES];
|
||||
struct io_accel2_scsi_response error_data;
|
||||
} __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);
|
||||
} __packed __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);
|
||||
|
||||
/*
|
||||
* defines for Mode 2 command struct
|
||||
|
|
@ -618,7 +631,7 @@ struct hpsa_tmf_struct {
|
|||
__le64 abort_tag; /* cciss tag of SCSI cmd or TMF to abort */
|
||||
__le64 error_ptr; /* Error Pointer */
|
||||
__le32 error_len; /* Error Length */
|
||||
} __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);
|
||||
} __packed __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);
|
||||
|
||||
/* Configuration Table Structure */
|
||||
struct HostWrite {
|
||||
|
|
@ -626,7 +639,7 @@ struct HostWrite {
|
|||
__le32 command_pool_addr_hi;
|
||||
__le32 CoalIntDelay;
|
||||
__le32 CoalIntCount;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#define SIMPLE_MODE 0x02
|
||||
#define PERFORMANT_MODE 0x04
|
||||
|
|
@ -675,7 +688,7 @@ struct CfgTable {
|
|||
#define HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_STATE_CHANGE (1 << 30)
|
||||
#define HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_CONFIG_CHANGE (1 << 31)
|
||||
__le32 clear_event_notify;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#define NUM_BLOCKFETCH_ENTRIES 8
|
||||
struct TransTable_struct {
|
||||
|
|
@ -686,14 +699,14 @@ struct TransTable_struct {
|
|||
__le32 RepQCtrAddrHigh32;
|
||||
#define MAX_REPLY_QUEUES 64
|
||||
struct vals32 RepQAddr[MAX_REPLY_QUEUES];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct hpsa_pci_info {
|
||||
unsigned char bus;
|
||||
unsigned char dev_fn;
|
||||
unsigned short domain;
|
||||
u32 board_id;
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct bmic_identify_controller {
|
||||
u8 configured_logical_drive_count; /* offset 0 */
|
||||
|
|
@ -702,7 +715,7 @@ struct bmic_identify_controller {
|
|||
u8 pad2[136];
|
||||
u8 controller_mode; /* offset 292 */
|
||||
u8 pad3[32];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
|
||||
struct bmic_identify_physical_device {
|
||||
|
|
@ -845,7 +858,7 @@ struct bmic_identify_physical_device {
|
|||
u8 max_link_rate[256];
|
||||
u8 neg_phys_link_rate[256];
|
||||
u8 box_conn_name[8];
|
||||
} __attribute((aligned(512)));
|
||||
} __packed __attribute((aligned(512)));
|
||||
|
||||
struct bmic_sense_subsystem_info {
|
||||
u8 primary_slot_number;
|
||||
|
|
@ -858,7 +871,7 @@ struct bmic_sense_subsystem_info {
|
|||
u8 secondary_array_serial_number[32];
|
||||
u8 secondary_cache_serial_number[32];
|
||||
u8 pad[332];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
struct bmic_sense_storage_box_params {
|
||||
u8 reserved[36];
|
||||
|
|
@ -870,7 +883,6 @@ struct bmic_sense_storage_box_params {
|
|||
u8 reserver_3[84];
|
||||
u8 phys_connector[2];
|
||||
u8 reserved_4[296];
|
||||
};
|
||||
} __packed;
|
||||
|
||||
#pragma pack()
|
||||
#endif /* HPSA_CMD_H */
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
|
|||
PM8001_EVENT_LOG_SIZE;
|
||||
pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_option = 0x01;
|
||||
pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_interrupt = 0x01;
|
||||
for (i = 0; i < PM8001_MAX_INB_NUM; i++) {
|
||||
for (i = 0; i < pm8001_ha->max_q_num; i++) {
|
||||
pm8001_ha->inbnd_q_tbl[i].element_pri_size_cnt =
|
||||
PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x00<<30);
|
||||
pm8001_ha->inbnd_q_tbl[i].upper_base_addr =
|
||||
|
|
@ -249,7 +249,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
|
|||
pm8001_ha->inbnd_q_tbl[i].producer_idx = 0;
|
||||
pm8001_ha->inbnd_q_tbl[i].consumer_index = 0;
|
||||
}
|
||||
for (i = 0; i < PM8001_MAX_OUTB_NUM; i++) {
|
||||
for (i = 0; i < pm8001_ha->max_q_num; i++) {
|
||||
pm8001_ha->outbnd_q_tbl[i].element_size_cnt =
|
||||
PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x01<<30);
|
||||
pm8001_ha->outbnd_q_tbl[i].upper_base_addr =
|
||||
|
|
@ -671,9 +671,9 @@ static int pm8001_chip_init(struct pm8001_hba_info *pm8001_ha)
|
|||
read_outbnd_queue_table(pm8001_ha);
|
||||
/* update main config table ,inbound table and outbound table */
|
||||
update_main_config_table(pm8001_ha);
|
||||
for (i = 0; i < PM8001_MAX_INB_NUM; i++)
|
||||
for (i = 0; i < pm8001_ha->max_q_num; i++)
|
||||
update_inbnd_queue_table(pm8001_ha, i);
|
||||
for (i = 0; i < PM8001_MAX_OUTB_NUM; i++)
|
||||
for (i = 0; i < pm8001_ha->max_q_num; i++)
|
||||
update_outbnd_queue_table(pm8001_ha, i);
|
||||
/* 8081 controller donot require these operations */
|
||||
if (deviceid != 0x8081 && deviceid != 0x0042) {
|
||||
|
|
|
|||
|
|
@ -541,7 +541,7 @@ int srp_reconnect_rport(struct srp_rport *rport)
|
|||
res = mutex_lock_interruptible(&rport->mutex);
|
||||
if (res)
|
||||
goto out;
|
||||
if (rport->state != SRP_RPORT_FAIL_FAST)
|
||||
if (rport->state != SRP_RPORT_FAIL_FAST && rport->state != SRP_RPORT_LOST)
|
||||
/*
|
||||
* sdev state must be SDEV_TRANSPORT_OFFLINE, transition
|
||||
* to SDEV_BLOCK is illegal. Calling scsi_target_unblock()
|
||||
|
|
|
|||
|
|
@ -6417,37 +6417,34 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
|
|||
DECLARE_COMPLETION_ONSTACK(wait);
|
||||
struct request *req;
|
||||
unsigned long flags;
|
||||
int free_slot, task_tag, err;
|
||||
int task_tag, err;
|
||||
|
||||
/*
|
||||
* Get free slot, sleep if slots are unavailable.
|
||||
* Even though we use wait_event() which sleeps indefinitely,
|
||||
* the maximum wait time is bounded by %TM_CMD_TIMEOUT.
|
||||
* blk_get_request() is used here only to get a free tag.
|
||||
*/
|
||||
req = blk_get_request(q, REQ_OP_DRV_OUT, 0);
|
||||
if (IS_ERR(req))
|
||||
return PTR_ERR(req);
|
||||
|
||||
req->end_io_data = &wait;
|
||||
free_slot = req->tag;
|
||||
WARN_ON_ONCE(free_slot < 0 || free_slot >= hba->nutmrs);
|
||||
ufshcd_hold(hba, false);
|
||||
|
||||
spin_lock_irqsave(host->host_lock, flags);
|
||||
task_tag = hba->nutrs + free_slot;
|
||||
blk_mq_start_request(req);
|
||||
|
||||
task_tag = req->tag;
|
||||
treq->req_header.dword_0 |= cpu_to_be32(task_tag);
|
||||
|
||||
memcpy(hba->utmrdl_base_addr + free_slot, treq, sizeof(*treq));
|
||||
ufshcd_vops_setup_task_mgmt(hba, free_slot, tm_function);
|
||||
memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq));
|
||||
ufshcd_vops_setup_task_mgmt(hba, task_tag, tm_function);
|
||||
|
||||
/* send command to the controller */
|
||||
__set_bit(free_slot, &hba->outstanding_tasks);
|
||||
__set_bit(task_tag, &hba->outstanding_tasks);
|
||||
|
||||
/* Make sure descriptors are ready before ringing the task doorbell */
|
||||
wmb();
|
||||
|
||||
ufshcd_writel(hba, 1 << free_slot, REG_UTP_TASK_REQ_DOOR_BELL);
|
||||
ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
|
||||
/* Make sure that doorbell is committed immediately */
|
||||
wmb();
|
||||
|
||||
|
|
@ -6467,24 +6464,24 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
|
|||
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_ERR);
|
||||
dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
|
||||
__func__, tm_function);
|
||||
if (ufshcd_clear_tm_cmd(hba, free_slot))
|
||||
dev_WARN(hba->dev, "%s: unable clear tm cmd (slot %d) after timeout\n",
|
||||
__func__, free_slot);
|
||||
if (ufshcd_clear_tm_cmd(hba, task_tag))
|
||||
dev_WARN(hba->dev, "%s: unable to clear tm cmd (slot %d) after timeout\n",
|
||||
__func__, task_tag);
|
||||
err = -ETIMEDOUT;
|
||||
} else {
|
||||
err = 0;
|
||||
memcpy(treq, hba->utmrdl_base_addr + free_slot, sizeof(*treq));
|
||||
memcpy(treq, hba->utmrdl_base_addr + task_tag, sizeof(*treq));
|
||||
|
||||
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_COMP);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
__clear_bit(free_slot, &hba->outstanding_tasks);
|
||||
__clear_bit(task_tag, &hba->outstanding_tasks);
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
|
||||
ufshcd_release(hba);
|
||||
blk_put_request(req);
|
||||
|
||||
ufshcd_release(hba);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1166,6 +1166,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|||
|
||||
target_get_sess_cmd(&cmd->se_cmd, true);
|
||||
|
||||
cmd->se_cmd.tag = (__force u32)cmd->init_task_tag;
|
||||
cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb);
|
||||
if (cmd->sense_reason) {
|
||||
if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
|
||||
|
|
@ -1180,8 +1181,6 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
|||
if (cmd->sense_reason)
|
||||
goto attach_cmd;
|
||||
|
||||
/* only used for printks or comparing with ->ref_task_tag */
|
||||
cmd->se_cmd.tag = (__force u32)cmd->init_task_tag;
|
||||
cmd->sense_reason = target_cmd_parse_cdb(&cmd->se_cmd);
|
||||
if (cmd->sense_reason)
|
||||
goto attach_cmd;
|
||||
|
|
|
|||
|
|
@ -347,7 +347,7 @@ static int tb_retimer_add(struct tb_port *port, u8 index, u32 auth_status)
|
|||
ret = tb_retimer_nvm_add(rt);
|
||||
if (ret) {
|
||||
dev_err(&rt->dev, "failed to add NVM devices: %d\n", ret);
|
||||
device_del(&rt->dev);
|
||||
device_unregister(&rt->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -406,7 +406,7 @@ static struct tb_retimer *tb_port_find_retimer(struct tb_port *port, u8 index)
|
|||
*/
|
||||
int tb_retimer_scan(struct tb_port *port)
|
||||
{
|
||||
u32 status[TB_MAX_RETIMER_INDEX] = {};
|
||||
u32 status[TB_MAX_RETIMER_INDEX + 1] = {};
|
||||
int ret, i, last_idx = 0;
|
||||
|
||||
if (!port->cap_usb4)
|
||||
|
|
|
|||
|
|
@ -1128,6 +1128,10 @@ static int cdnsp_gadget_ep_dequeue(struct usb_ep *ep,
|
|||
return -ESHUTDOWN;
|
||||
}
|
||||
|
||||
/* Requests has been dequeued during disabling endpoint. */
|
||||
if (!(pep->ep_state & EP_ENABLED))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&pdev->lock, flags);
|
||||
ret = cdnsp_ep_dequeue(pep, to_cdnsp_request(request));
|
||||
spin_unlock_irqrestore(&pdev->lock, flags);
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
|
|||
|
||||
dev_info(dev, "stub up\n");
|
||||
|
||||
mutex_lock(&sdev->ud.sysfs_lock);
|
||||
spin_lock_irq(&sdev->ud.lock);
|
||||
|
||||
if (sdev->ud.status != SDEV_ST_AVAILABLE) {
|
||||
|
|
@ -87,13 +88,13 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
|
|||
tcp_rx = kthread_create(stub_rx_loop, &sdev->ud, "stub_rx");
|
||||
if (IS_ERR(tcp_rx)) {
|
||||
sockfd_put(socket);
|
||||
return -EINVAL;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
tcp_tx = kthread_create(stub_tx_loop, &sdev->ud, "stub_tx");
|
||||
if (IS_ERR(tcp_tx)) {
|
||||
kthread_stop(tcp_rx);
|
||||
sockfd_put(socket);
|
||||
return -EINVAL;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
|
||||
/* get task structs now */
|
||||
|
|
@ -112,6 +113,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
|
|||
wake_up_process(sdev->ud.tcp_rx);
|
||||
wake_up_process(sdev->ud.tcp_tx);
|
||||
|
||||
mutex_unlock(&sdev->ud.sysfs_lock);
|
||||
|
||||
} else {
|
||||
dev_info(dev, "stub down\n");
|
||||
|
||||
|
|
@ -122,6 +125,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
|
|||
spin_unlock_irq(&sdev->ud.lock);
|
||||
|
||||
usbip_event_add(&sdev->ud, SDEV_EVENT_DOWN);
|
||||
mutex_unlock(&sdev->ud.sysfs_lock);
|
||||
}
|
||||
|
||||
return count;
|
||||
|
|
@ -130,6 +134,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
|
|||
sockfd_put(socket);
|
||||
err:
|
||||
spin_unlock_irq(&sdev->ud.lock);
|
||||
unlock_mutex:
|
||||
mutex_unlock(&sdev->ud.sysfs_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
static DEVICE_ATTR_WO(usbip_sockfd);
|
||||
|
|
@ -270,6 +276,7 @@ static struct stub_device *stub_device_alloc(struct usb_device *udev)
|
|||
sdev->ud.side = USBIP_STUB;
|
||||
sdev->ud.status = SDEV_ST_AVAILABLE;
|
||||
spin_lock_init(&sdev->ud.lock);
|
||||
mutex_init(&sdev->ud.sysfs_lock);
|
||||
sdev->ud.tcp_socket = NULL;
|
||||
sdev->ud.sockfd = -1;
|
||||
|
||||
|
|
|
|||
|
|
@ -263,6 +263,9 @@ struct usbip_device {
|
|||
/* lock for status */
|
||||
spinlock_t lock;
|
||||
|
||||
/* mutex for synchronizing sysfs store paths */
|
||||
struct mutex sysfs_lock;
|
||||
|
||||
int sockfd;
|
||||
struct socket *tcp_socket;
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ static void event_handler(struct work_struct *work)
|
|||
while ((ud = get_event()) != NULL) {
|
||||
usbip_dbg_eh("pending event %lx\n", ud->event);
|
||||
|
||||
mutex_lock(&ud->sysfs_lock);
|
||||
/*
|
||||
* NOTE: shutdown must come first.
|
||||
* Shutdown the device.
|
||||
|
|
@ -90,6 +91,7 @@ static void event_handler(struct work_struct *work)
|
|||
ud->eh_ops.unusable(ud);
|
||||
unset_event(ud, USBIP_EH_UNUSABLE);
|
||||
}
|
||||
mutex_unlock(&ud->sysfs_lock);
|
||||
|
||||
wake_up(&ud->eh_waitq);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1101,6 +1101,7 @@ static void vhci_device_init(struct vhci_device *vdev)
|
|||
vdev->ud.side = USBIP_VHCI;
|
||||
vdev->ud.status = VDEV_ST_NULL;
|
||||
spin_lock_init(&vdev->ud.lock);
|
||||
mutex_init(&vdev->ud.sysfs_lock);
|
||||
|
||||
INIT_LIST_HEAD(&vdev->priv_rx);
|
||||
INIT_LIST_HEAD(&vdev->priv_tx);
|
||||
|
|
|
|||
|
|
@ -185,6 +185,8 @@ static int vhci_port_disconnect(struct vhci_hcd *vhci_hcd, __u32 rhport)
|
|||
|
||||
usbip_dbg_vhci_sysfs("enter\n");
|
||||
|
||||
mutex_lock(&vdev->ud.sysfs_lock);
|
||||
|
||||
/* lock */
|
||||
spin_lock_irqsave(&vhci->lock, flags);
|
||||
spin_lock(&vdev->ud.lock);
|
||||
|
|
@ -195,6 +197,7 @@ static int vhci_port_disconnect(struct vhci_hcd *vhci_hcd, __u32 rhport)
|
|||
/* unlock */
|
||||
spin_unlock(&vdev->ud.lock);
|
||||
spin_unlock_irqrestore(&vhci->lock, flags);
|
||||
mutex_unlock(&vdev->ud.sysfs_lock);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -205,6 +208,8 @@ static int vhci_port_disconnect(struct vhci_hcd *vhci_hcd, __u32 rhport)
|
|||
|
||||
usbip_event_add(&vdev->ud, VDEV_EVENT_DOWN);
|
||||
|
||||
mutex_unlock(&vdev->ud.sysfs_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -349,30 +354,36 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr,
|
|||
else
|
||||
vdev = &vhci->vhci_hcd_hs->vdev[rhport];
|
||||
|
||||
mutex_lock(&vdev->ud.sysfs_lock);
|
||||
|
||||
/* Extract socket from fd. */
|
||||
socket = sockfd_lookup(sockfd, &err);
|
||||
if (!socket) {
|
||||
dev_err(dev, "failed to lookup sock");
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
if (socket->type != SOCK_STREAM) {
|
||||
dev_err(dev, "Expecting SOCK_STREAM - found %d",
|
||||
socket->type);
|
||||
sockfd_put(socket);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
|
||||
/* create threads before locking */
|
||||
tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx");
|
||||
if (IS_ERR(tcp_rx)) {
|
||||
sockfd_put(socket);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx");
|
||||
if (IS_ERR(tcp_tx)) {
|
||||
kthread_stop(tcp_rx);
|
||||
sockfd_put(socket);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
|
||||
/* get task structs now */
|
||||
|
|
@ -397,7 +408,8 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr,
|
|||
* Will be retried from userspace
|
||||
* if there's another free port.
|
||||
*/
|
||||
return -EBUSY;
|
||||
err = -EBUSY;
|
||||
goto unlock_mutex;
|
||||
}
|
||||
|
||||
dev_info(dev, "pdev(%u) rhport(%u) sockfd(%d)\n",
|
||||
|
|
@ -423,7 +435,15 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
rh_port_connect(vdev, speed);
|
||||
|
||||
dev_info(dev, "Device attached\n");
|
||||
|
||||
mutex_unlock(&vdev->ud.sysfs_lock);
|
||||
|
||||
return count;
|
||||
|
||||
unlock_mutex:
|
||||
mutex_unlock(&vdev->ud.sysfs_lock);
|
||||
return err;
|
||||
}
|
||||
static DEVICE_ATTR_WO(attach);
|
||||
|
||||
|
|
|
|||
|
|
@ -572,6 +572,7 @@ static int init_vudc_hw(struct vudc *udc)
|
|||
init_waitqueue_head(&udc->tx_waitq);
|
||||
|
||||
spin_lock_init(&ud->lock);
|
||||
mutex_init(&ud->sysfs_lock);
|
||||
ud->status = SDEV_ST_AVAILABLE;
|
||||
ud->side = USBIP_VUDC;
|
||||
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ static ssize_t usbip_sockfd_store(struct device *dev,
|
|||
dev_err(dev, "no device");
|
||||
return -ENODEV;
|
||||
}
|
||||
mutex_lock(&udc->ud.sysfs_lock);
|
||||
spin_lock_irqsave(&udc->lock, flags);
|
||||
/* Don't export what we don't have */
|
||||
if (!udc->driver || !udc->pullup) {
|
||||
|
|
@ -187,6 +188,8 @@ static ssize_t usbip_sockfd_store(struct device *dev,
|
|||
|
||||
wake_up_process(udc->ud.tcp_rx);
|
||||
wake_up_process(udc->ud.tcp_tx);
|
||||
|
||||
mutex_unlock(&udc->ud.sysfs_lock);
|
||||
return count;
|
||||
|
||||
} else {
|
||||
|
|
@ -207,6 +210,7 @@ static ssize_t usbip_sockfd_store(struct device *dev,
|
|||
}
|
||||
|
||||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
mutex_unlock(&udc->ud.sysfs_lock);
|
||||
|
||||
return count;
|
||||
|
||||
|
|
@ -216,6 +220,7 @@ static ssize_t usbip_sockfd_store(struct device *dev,
|
|||
spin_unlock_irq(&udc->ud.lock);
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&udc->lock, flags);
|
||||
mutex_unlock(&udc->ud.sysfs_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* Watchdog driver for Marvell Armada 37xx SoCs
|
||||
*
|
||||
* Author: Marek Behun <marek.behun@nic.cz>
|
||||
* Author: Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
|
@ -366,7 +366,7 @@ static struct platform_driver armada_37xx_wdt_driver = {
|
|||
|
||||
module_platform_driver(armada_37xx_wdt_driver);
|
||||
|
||||
MODULE_AUTHOR("Marek Behun <marek.behun@nic.cz>");
|
||||
MODULE_AUTHOR("Marek Behun <kabel@kernel.org>");
|
||||
MODULE_DESCRIPTION("Armada 37xx CPU Watchdog");
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
|
|
@ -21,9 +21,30 @@
|
|||
/* Pseudo write pointer value for conventional zone */
|
||||
#define WP_CONVENTIONAL ((u64)-2)
|
||||
|
||||
/*
|
||||
* Location of the first zone of superblock logging zone pairs.
|
||||
*
|
||||
* - primary superblock: 0B (zone 0)
|
||||
* - first copy: 512G (zone starting at that offset)
|
||||
* - second copy: 4T (zone starting at that offset)
|
||||
*/
|
||||
#define BTRFS_SB_LOG_PRIMARY_OFFSET (0ULL)
|
||||
#define BTRFS_SB_LOG_FIRST_OFFSET (512ULL * SZ_1G)
|
||||
#define BTRFS_SB_LOG_SECOND_OFFSET (4096ULL * SZ_1G)
|
||||
|
||||
#define BTRFS_SB_LOG_FIRST_SHIFT const_ilog2(BTRFS_SB_LOG_FIRST_OFFSET)
|
||||
#define BTRFS_SB_LOG_SECOND_SHIFT const_ilog2(BTRFS_SB_LOG_SECOND_OFFSET)
|
||||
|
||||
/* Number of superblock log zones */
|
||||
#define BTRFS_NR_SB_LOG_ZONES 2
|
||||
|
||||
/*
|
||||
* Maximum supported zone size. Currently, SMR disks have a zone size of
|
||||
* 256MiB, and we are expecting ZNS drives to be in the 1-4GiB range. We do not
|
||||
* expect the zone size to become larger than 8GiB in the near future.
|
||||
*/
|
||||
#define BTRFS_MAX_ZONE_SIZE SZ_8G
|
||||
|
||||
static int copy_zone_info_cb(struct blk_zone *zone, unsigned int idx, void *data)
|
||||
{
|
||||
struct blk_zone *zones = data;
|
||||
|
|
@ -111,23 +132,22 @@ static int sb_write_pointer(struct block_device *bdev, struct blk_zone *zones,
|
|||
}
|
||||
|
||||
/*
|
||||
* The following zones are reserved as the circular buffer on ZONED btrfs.
|
||||
* - The primary superblock: zones 0 and 1
|
||||
* - The first copy: zones 16 and 17
|
||||
* - The second copy: zones 1024 or zone at 256GB which is minimum, and
|
||||
* the following one
|
||||
* Get the first zone number of the superblock mirror
|
||||
*/
|
||||
static inline u32 sb_zone_number(int shift, int mirror)
|
||||
{
|
||||
ASSERT(mirror < BTRFS_SUPER_MIRROR_MAX);
|
||||
u64 zone;
|
||||
|
||||
ASSERT(mirror < BTRFS_SUPER_MIRROR_MAX);
|
||||
switch (mirror) {
|
||||
case 0: return 0;
|
||||
case 1: return 16;
|
||||
case 2: return min_t(u64, btrfs_sb_offset(mirror) >> shift, 1024);
|
||||
case 0: zone = 0; break;
|
||||
case 1: zone = 1ULL << (BTRFS_SB_LOG_FIRST_SHIFT - shift); break;
|
||||
case 2: zone = 1ULL << (BTRFS_SB_LOG_SECOND_SHIFT - shift); break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
ASSERT(zone <= U32_MAX);
|
||||
|
||||
return (u32)zone;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -300,10 +320,21 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device)
|
|||
zone_sectors = bdev_zone_sectors(bdev);
|
||||
}
|
||||
|
||||
nr_sectors = bdev_nr_sectors(bdev);
|
||||
/* Check if it's power of 2 (see is_power_of_2) */
|
||||
ASSERT(zone_sectors != 0 && (zone_sectors & (zone_sectors - 1)) == 0);
|
||||
zone_info->zone_size = zone_sectors << SECTOR_SHIFT;
|
||||
|
||||
/* We reject devices with a zone size larger than 8GB */
|
||||
if (zone_info->zone_size > BTRFS_MAX_ZONE_SIZE) {
|
||||
btrfs_err_in_rcu(fs_info,
|
||||
"zoned: %s: zone size %llu larger than supported maximum %llu",
|
||||
rcu_str_deref(device->name),
|
||||
zone_info->zone_size, BTRFS_MAX_ZONE_SIZE);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
nr_sectors = bdev_nr_sectors(bdev);
|
||||
zone_info->zone_size_shift = ilog2(zone_info->zone_size);
|
||||
zone_info->max_zone_append_size =
|
||||
(u64)queue_max_zone_append_sectors(queue) << SECTOR_SHIFT;
|
||||
|
|
|
|||
|
|
@ -825,6 +825,7 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page,
|
|||
struct buffer_head *map_bh)
|
||||
{
|
||||
int ret = 0;
|
||||
int boundary = sdio->boundary; /* dio_send_cur_page may clear it */
|
||||
|
||||
if (dio->op == REQ_OP_WRITE) {
|
||||
/*
|
||||
|
|
@ -863,10 +864,10 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page,
|
|||
sdio->cur_page_fs_offset = sdio->block_in_file << sdio->blkbits;
|
||||
out:
|
||||
/*
|
||||
* If sdio->boundary then we want to schedule the IO now to
|
||||
* If boundary then we want to schedule the IO now to
|
||||
* avoid metadata seeks.
|
||||
*/
|
||||
if (sdio->boundary) {
|
||||
if (boundary) {
|
||||
ret = dio_send_cur_page(dio, sdio, map_bh);
|
||||
if (sdio->bio)
|
||||
dio_bio_submit(dio, sdio);
|
||||
|
|
|
|||
|
|
@ -2295,7 +2295,7 @@ static int ocfs2_dio_end_io_write(struct inode *inode,
|
|||
struct ocfs2_alloc_context *meta_ac = NULL;
|
||||
handle_t *handle = NULL;
|
||||
loff_t end = offset + bytes;
|
||||
int ret = 0, credits = 0, locked = 0;
|
||||
int ret = 0, credits = 0;
|
||||
|
||||
ocfs2_init_dealloc_ctxt(&dealloc);
|
||||
|
||||
|
|
@ -2306,13 +2306,6 @@ static int ocfs2_dio_end_io_write(struct inode *inode,
|
|||
!dwc->dw_orphaned)
|
||||
goto out;
|
||||
|
||||
/* ocfs2_file_write_iter will get i_mutex, so we need not lock if we
|
||||
* are in that context. */
|
||||
if (dwc->dw_writer_pid != task_pid_nr(current)) {
|
||||
inode_lock(inode);
|
||||
locked = 1;
|
||||
}
|
||||
|
||||
ret = ocfs2_inode_lock(inode, &di_bh, 1);
|
||||
if (ret < 0) {
|
||||
mlog_errno(ret);
|
||||
|
|
@ -2393,8 +2386,6 @@ static int ocfs2_dio_end_io_write(struct inode *inode,
|
|||
if (meta_ac)
|
||||
ocfs2_free_alloc_context(meta_ac);
|
||||
ocfs2_run_deallocs(osb, &dealloc);
|
||||
if (locked)
|
||||
inode_unlock(inode);
|
||||
ocfs2_dio_free_write_ctx(inode, dwc);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -1245,22 +1245,24 @@ int ocfs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
|
|||
goto bail_unlock;
|
||||
}
|
||||
}
|
||||
down_write(&OCFS2_I(inode)->ip_alloc_sem);
|
||||
handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS +
|
||||
2 * ocfs2_quota_trans_credits(sb));
|
||||
if (IS_ERR(handle)) {
|
||||
status = PTR_ERR(handle);
|
||||
mlog_errno(status);
|
||||
goto bail_unlock;
|
||||
goto bail_unlock_alloc;
|
||||
}
|
||||
status = __dquot_transfer(inode, transfer_to);
|
||||
if (status < 0)
|
||||
goto bail_commit;
|
||||
} else {
|
||||
down_write(&OCFS2_I(inode)->ip_alloc_sem);
|
||||
handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
|
||||
if (IS_ERR(handle)) {
|
||||
status = PTR_ERR(handle);
|
||||
mlog_errno(status);
|
||||
goto bail_unlock;
|
||||
goto bail_unlock_alloc;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1273,6 +1275,8 @@ int ocfs2_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
|
|||
|
||||
bail_commit:
|
||||
ocfs2_commit_trans(osb, handle);
|
||||
bail_unlock_alloc:
|
||||
up_write(&OCFS2_I(inode)->ip_alloc_sem);
|
||||
bail_unlock:
|
||||
if (status && inode_locked) {
|
||||
ocfs2_inode_unlock_tracker(inode, 1, &oh, had_lock);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* Constant for device tree bindings for Turris Mox module configuration bus
|
||||
*
|
||||
* Copyright (C) 2019 Marek Behun <marek.behun@nic.cz>
|
||||
* Copyright (C) 2019 Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#ifndef _DT_BINDINGS_BUS_MOXTET_H
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* rWTM BIU Mailbox driver for Armada 37xx
|
||||
*
|
||||
* Author: Marek Behun <marek.behun@nic.cz>
|
||||
* Author: Marek Behún <kabel@kernel.org>
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_ARMADA_37XX_RWTM_MAILBOX_H_
|
||||
|
|
|
|||
|
|
@ -87,9 +87,7 @@ u32 ethtool_op_get_link(struct net_device *dev);
|
|||
int ethtool_op_get_ts_info(struct net_device *dev, struct ethtool_ts_info *eti);
|
||||
|
||||
|
||||
/**
|
||||
* struct ethtool_link_ext_state_info - link extended state and substate.
|
||||
*/
|
||||
/* Link extended state and substate. */
|
||||
struct ethtool_link_ext_state_info {
|
||||
enum ethtool_link_ext_state link_ext_state;
|
||||
union {
|
||||
|
|
@ -129,7 +127,6 @@ struct ethtool_link_ksettings {
|
|||
__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);
|
||||
} link_modes;
|
||||
u32 lanes;
|
||||
enum ethtool_link_mode_bit_indices link_mode;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -292,6 +289,9 @@ struct ethtool_pause_stats {
|
|||
* do not attach ext_substate attribute to netlink message). If link_ext_state
|
||||
* and link_ext_substate are unknown, return -ENODATA. If not implemented,
|
||||
* link_ext_state and link_ext_substate will not be sent to userspace.
|
||||
* @get_eeprom_len: Read range of EEPROM addresses for validation of
|
||||
* @get_eeprom and @set_eeprom requests.
|
||||
* Returns 0 if device does not support EEPROM access.
|
||||
* @get_eeprom: Read data from the device EEPROM.
|
||||
* Should fill in the magic field. Don't need to check len for zero
|
||||
* or wraparound. Fill in the data argument with the eeprom values
|
||||
|
|
@ -384,6 +384,8 @@ struct ethtool_pause_stats {
|
|||
* @get_module_eeprom: Get the eeprom information from the plug-in module
|
||||
* @get_eee: Get Energy-Efficient (EEE) supported and status.
|
||||
* @set_eee: Set EEE status (enable/disable) as well as LPI timers.
|
||||
* @get_tunable: Read the value of a driver / device tunable.
|
||||
* @set_tunable: Set the value of a driver / device tunable.
|
||||
* @get_per_queue_coalesce: Get interrupt coalescing parameters per queue.
|
||||
* It must check that the given queue number is valid. If neither a RX nor
|
||||
* a TX queue has this number, return -EINVAL. If only a RX queue or a TX
|
||||
|
|
@ -547,8 +549,8 @@ struct phy_tdr_config;
|
|||
* @get_sset_count: Get number of strings that @get_strings will write.
|
||||
* @get_strings: Return a set of strings that describe the requested objects
|
||||
* @get_stats: Return extended statistics about the PHY device.
|
||||
* @start_cable_test - Start a cable test
|
||||
* @start_cable_test_tdr - Start a Time Domain Reflectometry cable test
|
||||
* @start_cable_test: Start a cable test
|
||||
* @start_cable_test_tdr: Start a Time Domain Reflectometry cable test
|
||||
*
|
||||
* All operations are optional (i.e. the function pointer may be set to %NULL)
|
||||
* and callers must take this into account. Callers must hold the RTNL lock.
|
||||
|
|
@ -571,4 +573,12 @@ struct ethtool_phy_ops {
|
|||
*/
|
||||
void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops);
|
||||
|
||||
/*
|
||||
* ethtool_params_from_link_mode - Derive link parameters from a given link mode
|
||||
* @link_ksettings: Link parameters to be derived from the link mode
|
||||
* @link_mode: Link mode
|
||||
*/
|
||||
void
|
||||
ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
|
||||
enum ethtool_link_mode_bit_indices link_mode);
|
||||
#endif /* _LINUX_ETHTOOL_H */
|
||||
|
|
|
|||
|
|
@ -437,11 +437,11 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
|
|||
u8 reserved_at_60[0x18];
|
||||
u8 log_max_ft_num[0x8];
|
||||
|
||||
u8 reserved_at_80[0x18];
|
||||
u8 reserved_at_80[0x10];
|
||||
u8 log_max_flow_counter[0x8];
|
||||
u8 log_max_destination[0x8];
|
||||
|
||||
u8 log_max_flow_counter[0x8];
|
||||
u8 reserved_at_a8[0x10];
|
||||
u8 reserved_at_a0[0x18];
|
||||
u8 log_max_flow[0x8];
|
||||
|
||||
u8 reserved_at_c0[0x40];
|
||||
|
|
@ -8835,6 +8835,8 @@ struct mlx5_ifc_pplm_reg_bits {
|
|||
|
||||
u8 fec_override_admin_100g_2x[0x10];
|
||||
u8 fec_override_admin_50g_1x[0x10];
|
||||
|
||||
u8 reserved_at_140[0x140];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_ppcnt_reg_bits {
|
||||
|
|
@ -10198,7 +10200,7 @@ struct mlx5_ifc_pbmc_reg_bits {
|
|||
|
||||
struct mlx5_ifc_bufferx_reg_bits buffer[10];
|
||||
|
||||
u8 reserved_at_2e0[0x40];
|
||||
u8 reserved_at_2e0[0x80];
|
||||
};
|
||||
|
||||
struct mlx5_ifc_qtct_reg_bits {
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user