mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
Merge tag 'v4.9.6' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidxu3-4.9.y
This is the 4.9.6 stable release
This commit is contained in:
@@ -77,7 +77,7 @@ Examples:
|
||||
clks: ccm@53f80000{
|
||||
compatible = "fsl,imx31-ccm";
|
||||
reg = <0x53f80000 0x4000>;
|
||||
interrupts = <0 31 0x04 0 53 0x04>;
|
||||
interrupts = <31>, <53>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
|
||||
@@ -3998,10 +3998,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
it if 0 is given (See Documentation/cgroup-v1/memory.txt)
|
||||
|
||||
swiotlb= [ARM,IA-64,PPC,MIPS,X86]
|
||||
Format: { <int> | force }
|
||||
Format: { <int> | force | noforce }
|
||||
<int> -- Number of I/O TLB slabs
|
||||
force -- force using of bounce buffers even if they
|
||||
wouldn't be automatically used by the kernel
|
||||
noforce -- Never use bounce buffers (for debugging)
|
||||
|
||||
switches= [HW,M68k]
|
||||
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 5
|
||||
SUBLEVEL = 6
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ config ARC
|
||||
select HAVE_KPROBES
|
||||
select HAVE_KRETPROBES
|
||||
select HAVE_MEMBLOCK
|
||||
select HAVE_MOD_ARCH_SPECIFIC if ARC_DW2_UNWIND
|
||||
select HAVE_MOD_ARCH_SPECIFIC
|
||||
select HAVE_OPROFILE
|
||||
select HAVE_PERF_EVENTS
|
||||
select HANDLE_DOMAIN_IRQ
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
|
||||
#include <asm-generic/module.h>
|
||||
|
||||
#ifdef CONFIG_ARC_DW2_UNWIND
|
||||
struct mod_arch_specific {
|
||||
#ifdef CONFIG_ARC_DW2_UNWIND
|
||||
void *unw_info;
|
||||
int unw_sec_idx;
|
||||
#endif
|
||||
const char *secstr;
|
||||
};
|
||||
#endif
|
||||
|
||||
#define MODULE_PROC_FAMILY "ARC700"
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
|
||||
#ifdef CONFIG_ARC_DW2_UNWIND
|
||||
mod->arch.unw_sec_idx = 0;
|
||||
mod->arch.unw_info = NULL;
|
||||
mod->arch.secstr = secstr;
|
||||
#endif
|
||||
mod->arch.secstr = secstr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -113,8 +113,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
||||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARC_DW2_UNWIND
|
||||
if (strcmp(module->arch.secstr+sechdrs[tgtsec].sh_name, ".eh_frame") == 0)
|
||||
module->arch.unw_sec_idx = tgtsec;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -485,6 +485,7 @@ dtb-$(CONFIG_ARCH_OMAP3) += \
|
||||
am3517-evm.dtb \
|
||||
am3517_mt_ventoux.dtb \
|
||||
logicpd-torpedo-37xx-devkit.dtb \
|
||||
logicpd-som-lv-37xx-devkit.dtb \
|
||||
omap3430-sdp.dtb \
|
||||
omap3-beagle.dtb \
|
||||
omap3-beagle-xm.dtb \
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
interrupt-parent = <&intc>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c0;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
interrupt-parent = <&wakeupgen>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
reg = <0x7e104000 0x10>;
|
||||
};
|
||||
|
||||
mailbox: mailbox@7e00b800 {
|
||||
mailbox: mailbox@7e00b880 {
|
||||
compatible = "brcm,bcm2835-mbox";
|
||||
reg = <0x7e00b880 0x40>;
|
||||
interrupts = <0 1>;
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
#size-cells = <1>;
|
||||
compatible = "m25p64";
|
||||
spi-max-frequency = <30000000>;
|
||||
m25p,fast-read;
|
||||
reg = <0>;
|
||||
partition@0 {
|
||||
label = "U-Boot-SPL";
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
interrupt-parent = <&intc>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c1;
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
interrupt-parent = <&intc>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c1;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
compatible = "ti,dra7xx";
|
||||
interrupt-parent = <&crossbar_mpu>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c1;
|
||||
@@ -1376,6 +1377,7 @@
|
||||
phy-names = "sata-phy";
|
||||
clocks = <&sata_ref_clk>;
|
||||
ti,hwmods = "sata";
|
||||
ports-implemented = <0x1>;
|
||||
};
|
||||
|
||||
rtc: rtc@48838000 {
|
||||
|
||||
@@ -30,11 +30,11 @@
|
||||
};
|
||||
};
|
||||
|
||||
avic: avic-interrupt-controller@60000000 {
|
||||
avic: interrupt-controller@68000000 {
|
||||
compatible = "fsl,imx31-avic", "fsl,avic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x60000000 0x100000>;
|
||||
reg = <0x68000000 0x100000>;
|
||||
};
|
||||
|
||||
soc {
|
||||
@@ -118,13 +118,6 @@
|
||||
interrupts = <19>;
|
||||
clocks = <&clks 25>;
|
||||
};
|
||||
|
||||
clks: ccm@53f80000{
|
||||
compatible = "fsl,imx31-ccm";
|
||||
reg = <0x53f80000 0x4000>;
|
||||
interrupts = <0 31 0x04 0 53 0x04>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
aips@53f00000 { /* AIPS2 */
|
||||
@@ -134,6 +127,13 @@
|
||||
reg = <0x53f00000 0x100000>;
|
||||
ranges;
|
||||
|
||||
clks: ccm@53f80000{
|
||||
compatible = "fsl,imx31-ccm";
|
||||
reg = <0x53f80000 0x4000>;
|
||||
interrupts = <31>, <53>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
gpt: timer@53f90000 {
|
||||
compatible = "fsl,imx31-gpt";
|
||||
reg = <0x53f90000 0x4000>;
|
||||
|
||||
@@ -183,7 +183,6 @@
|
||||
MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
|
||||
MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
|
||||
MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
|
||||
MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0x4001b0a8
|
||||
>;
|
||||
};
|
||||
|
||||
|
||||
@@ -319,8 +319,6 @@
|
||||
compatible = "fsl,imx6q-nitrogen6_max-sgtl5000",
|
||||
"fsl,imx-audio-sgtl5000";
|
||||
model = "imx6q-nitrogen6_max-sgtl5000";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sgtl5000>;
|
||||
ssi-controller = <&ssi1>;
|
||||
audio-codec = <&codec>;
|
||||
audio-routing =
|
||||
@@ -402,6 +400,8 @@
|
||||
|
||||
codec: sgtl5000@0a {
|
||||
compatible = "fsl,sgtl5000";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sgtl5000>;
|
||||
reg = <0x0a>;
|
||||
clocks = <&clks IMX6QDL_CLK_CKO>;
|
||||
VDDA-supply = <®_2p5v>;
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
&mmc1 {
|
||||
interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc1_pins &mmc1_cd>;
|
||||
pinctrl-0 = <&mmc1_pins>;
|
||||
wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */
|
||||
cd-gpios = <&gpio4 14 IRQ_TYPE_LEVEL_LOW>; /* gpio_110 */
|
||||
vmmc-supply = <&vmmc1>;
|
||||
@@ -193,7 +193,8 @@
|
||||
OMAP3_CORE1_IOPAD(0x214a, PIN_INPUT | MUX_MODE0) /* sdmmc1_dat1.sdmmc1_dat1 */
|
||||
OMAP3_CORE1_IOPAD(0x214c, PIN_INPUT | MUX_MODE0) /* sdmmc1_dat2.sdmmc1_dat2 */
|
||||
OMAP3_CORE1_IOPAD(0x214e, PIN_INPUT | MUX_MODE0) /* sdmmc1_dat3.sdmmc1_dat3 */
|
||||
OMAP3_CORE1_IOPAD(0x2132, PIN_INPUT_PULLUP | MUX_MODE4) /* cam_strobe.gpio_126 sdmmc1_wp*/
|
||||
OMAP3_CORE1_IOPAD(0x2132, PIN_INPUT_PULLUP | MUX_MODE4) /* cam_strobe.gpio_126 */
|
||||
OMAP3_CORE1_IOPAD(0x212c, PIN_INPUT_PULLUP | MUX_MODE4) /* cam_d11.gpio_110 */
|
||||
>;
|
||||
};
|
||||
|
||||
@@ -242,12 +243,6 @@
|
||||
OMAP3_WKUP_IOPAD(0x2a16, PIN_OUTPUT | PIN_OFF_OUTPUT_LOW | MUX_MODE4) /* sys_boot6.gpio_8 */
|
||||
>;
|
||||
};
|
||||
|
||||
mmc1_cd: pinmux_mmc1_cd {
|
||||
pinctrl-single,pins = <
|
||||
OMAP3_WKUP_IOPAD(0x212c, PIN_INPUT_PULLUP | MUX_MODE4) /* cam_d11.gpio_110 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
interrupt-parent = <&intc>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
serial0 = &uart1;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
interrupt-parent = <&intc>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c1;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
interrupt-parent = <&wakeupgen>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c1;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
compatible = "ti,omap5";
|
||||
interrupt-parent = <&wakeupgen>;
|
||||
chosen { };
|
||||
|
||||
aliases {
|
||||
i2c0 = &i2c1;
|
||||
@@ -985,6 +986,7 @@
|
||||
phy-names = "sata-phy";
|
||||
clocks = <&sata_ref_clk>;
|
||||
ti,hwmods = "sata";
|
||||
ports-implemented = <0x1>;
|
||||
};
|
||||
|
||||
dss: dss@58000000 {
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
"ch12";
|
||||
clocks = <&mstp5_clks R8A7794_CLK_AUDIO_DMAC0>;
|
||||
clock-names = "fck";
|
||||
power-domains = <&cpg_clocks>;
|
||||
power-domains = <&sysc R8A7794_PD_ALWAYS_ON>;
|
||||
#dma-cells = <1>;
|
||||
dma-channels = <13>;
|
||||
};
|
||||
@@ -1025,8 +1025,7 @@
|
||||
clocks = <&extal_clk &usb_extal_clk>;
|
||||
#clock-cells = <1>;
|
||||
clock-output-names = "main", "pll0", "pll1", "pll3",
|
||||
"lb", "qspi", "sdh", "sd0", "z",
|
||||
"rcan";
|
||||
"lb", "qspi", "sdh", "sd0", "rcan";
|
||||
#power-domain-cells = <0>;
|
||||
};
|
||||
/* Variable factor clocks */
|
||||
@@ -1483,7 +1482,7 @@
|
||||
"mix.0", "mix.1",
|
||||
"dvc.0", "dvc.1",
|
||||
"clk_a", "clk_b", "clk_c", "clk_i";
|
||||
power-domains = <&cpg_clocks>;
|
||||
power-domains = <&sysc R8A7794_PD_ALWAYS_ON>;
|
||||
|
||||
status = "disabled";
|
||||
|
||||
|
||||
@@ -94,6 +94,9 @@
|
||||
#define ARM_CPU_XSCALE_ARCH_V2 0x4000
|
||||
#define ARM_CPU_XSCALE_ARCH_V3 0x6000
|
||||
|
||||
/* Qualcomm implemented cores */
|
||||
#define ARM_CPU_PART_SCORPION 0x510002d0
|
||||
|
||||
extern unsigned int processor_id;
|
||||
|
||||
#ifdef CONFIG_CPU_CP15
|
||||
|
||||
@@ -1066,6 +1066,22 @@ static int __init arch_hw_breakpoint_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scorpion CPUs (at least those in APQ8060) seem to set DBGPRSR.SPD
|
||||
* whenever a WFI is issued, even if the core is not powered down, in
|
||||
* violation of the architecture. When DBGPRSR.SPD is set, accesses to
|
||||
* breakpoint and watchpoint registers are treated as undefined, so
|
||||
* this results in boot time and runtime failures when these are
|
||||
* accessed and we unexpectedly take a trap.
|
||||
*
|
||||
* It's not clear if/how this can be worked around, so we blacklist
|
||||
* Scorpion CPUs to avoid these issues.
|
||||
*/
|
||||
if (read_cpuid_part() == ARM_CPU_PART_SCORPION) {
|
||||
pr_info("Scorpion CPU detected. Hardware breakpoints and watchpoints disabled\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
has_ossr = core_has_os_save_restore();
|
||||
|
||||
/* Determine how many BRPs/WRPs are available. */
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*/
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/tlbflush.h>
|
||||
@@ -40,8 +41,11 @@ static inline void ipi_flush_tlb_mm(void *arg)
|
||||
static inline void ipi_flush_tlb_page(void *arg)
|
||||
{
|
||||
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
|
||||
local_flush_tlb_page(ta->ta_vma, ta->ta_start);
|
||||
|
||||
uaccess_restore(__ua_flags);
|
||||
}
|
||||
|
||||
static inline void ipi_flush_tlb_kernel_page(void *arg)
|
||||
@@ -54,8 +58,11 @@ static inline void ipi_flush_tlb_kernel_page(void *arg)
|
||||
static inline void ipi_flush_tlb_range(void *arg)
|
||||
{
|
||||
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||
unsigned int __ua_flags = uaccess_save_and_enable();
|
||||
|
||||
local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end);
|
||||
|
||||
uaccess_restore(__ua_flags);
|
||||
}
|
||||
|
||||
static inline void ipi_flush_tlb_kernel_range(void *arg)
|
||||
|
||||
@@ -134,8 +134,8 @@ bool prcmu_pending_irq(void)
|
||||
*/
|
||||
bool prcmu_is_cpu_in_wfi(int cpu)
|
||||
{
|
||||
return readl(PRCM_ARM_WFI_STANDBY) & cpu ? PRCM_ARM_WFI_STANDBY_WFI1 :
|
||||
PRCM_ARM_WFI_STANDBY_WFI0;
|
||||
return readl(PRCM_ARM_WFI_STANDBY) &
|
||||
(cpu ? PRCM_ARM_WFI_STANDBY_WFI1 : PRCM_ARM_WFI_STANDBY_WFI0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -217,7 +217,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
||||
#define _virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||
#else
|
||||
#define __virt_to_pgoff(kaddr) (((u64)(kaddr) & ~PAGE_OFFSET) / PAGE_SIZE * sizeof(struct page))
|
||||
#define __page_to_voff(page) (((u64)(page) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
|
||||
#define __page_to_voff(kaddr) (((u64)(kaddr) & ~VMEMMAP_START) * PAGE_SIZE / sizeof(struct page))
|
||||
|
||||
#define page_to_virt(page) ((void *)((__page_to_voff(page)) | PAGE_OFFSET))
|
||||
#define virt_to_page(vaddr) ((struct page *)((__virt_to_pgoff(vaddr)) | VMEMMAP_START))
|
||||
|
||||
@@ -77,6 +77,7 @@ struct user_fpsimd_state {
|
||||
__uint128_t vregs[32];
|
||||
__u32 fpsr;
|
||||
__u32 fpcr;
|
||||
__u32 __reserved[2];
|
||||
};
|
||||
|
||||
struct user_hwdebug_state {
|
||||
|
||||
@@ -624,7 +624,7 @@ el0_inv:
|
||||
mov x0, sp
|
||||
mov x1, #BAD_SYNC
|
||||
mov x2, x25
|
||||
bl bad_mode
|
||||
bl bad_el0_sync
|
||||
b ret_to_user
|
||||
ENDPROC(el0_sync)
|
||||
|
||||
|
||||
@@ -550,6 +550,8 @@ static int hw_break_set(struct task_struct *target,
|
||||
/* (address, ctrl) registers */
|
||||
limit = regset->n * regset->size;
|
||||
while (count && offset < limit) {
|
||||
if (count < PTRACE_HBP_ADDR_SZ)
|
||||
return -EINVAL;
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &addr,
|
||||
offset, offset + PTRACE_HBP_ADDR_SZ);
|
||||
if (ret)
|
||||
@@ -559,6 +561,8 @@ static int hw_break_set(struct task_struct *target,
|
||||
return ret;
|
||||
offset += PTRACE_HBP_ADDR_SZ;
|
||||
|
||||
if (!count)
|
||||
break;
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl,
|
||||
offset, offset + PTRACE_HBP_CTRL_SZ);
|
||||
if (ret)
|
||||
@@ -595,7 +599,7 @@ static int gpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
struct user_pt_regs newregs;
|
||||
struct user_pt_regs newregs = task_pt_regs(target)->user_regs;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &newregs, 0, -1);
|
||||
if (ret)
|
||||
@@ -625,7 +629,8 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
struct user_fpsimd_state newstate;
|
||||
struct user_fpsimd_state newstate =
|
||||
target->thread.fpsimd_state.user_fpsimd;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &newstate, 0, -1);
|
||||
if (ret)
|
||||
@@ -649,7 +654,7 @@ static int tls_set(struct task_struct *target, const struct user_regset *regset,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
unsigned long tls;
|
||||
unsigned long tls = target->thread.tp_value;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &tls, 0, -1);
|
||||
if (ret)
|
||||
@@ -675,7 +680,8 @@ static int system_call_set(struct task_struct *target,
|
||||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
int syscallno, ret;
|
||||
int syscallno = task_pt_regs(target)->syscallno;
|
||||
int ret;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &syscallno, 0, -1);
|
||||
if (ret)
|
||||
@@ -947,7 +953,7 @@ static int compat_tls_set(struct task_struct *target,
|
||||
const void __user *ubuf)
|
||||
{
|
||||
int ret;
|
||||
compat_ulong_t tls;
|
||||
compat_ulong_t tls = target->thread.tp_value;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &tls, 0, -1);
|
||||
if (ret)
|
||||
|
||||
@@ -596,17 +596,34 @@ const char *esr_get_class_string(u32 esr)
|
||||
}
|
||||
|
||||
/*
|
||||
* bad_mode handles the impossible case in the exception vector.
|
||||
* bad_mode handles the impossible case in the exception vector. This is always
|
||||
* fatal.
|
||||
*/
|
||||
asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr)
|
||||
{
|
||||
siginfo_t info;
|
||||
void __user *pc = (void __user *)instruction_pointer(regs);
|
||||
console_verbose();
|
||||
|
||||
pr_crit("Bad mode in %s handler detected on CPU%d, code 0x%08x -- %s\n",
|
||||
handler[reason], smp_processor_id(), esr,
|
||||
esr_get_class_string(esr));
|
||||
|
||||
die("Oops - bad mode", regs, 0);
|
||||
local_irq_disable();
|
||||
panic("bad mode");
|
||||
}
|
||||
|
||||
/*
|
||||
* bad_el0_sync handles unexpected, but potentially recoverable synchronous
|
||||
* exceptions taken from EL0. Unlike bad_mode, this returns.
|
||||
*/
|
||||
asmlinkage void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr)
|
||||
{
|
||||
siginfo_t info;
|
||||
void __user *pc = (void __user *)instruction_pointer(regs);
|
||||
console_verbose();
|
||||
|
||||
pr_crit("Bad EL0 synchronous exception detected on CPU%d, code 0x%08x -- %s\n",
|
||||
smp_processor_id(), esr, esr_get_class_string(esr));
|
||||
__show_regs(regs);
|
||||
|
||||
info.si_signo = SIGILL;
|
||||
@@ -614,7 +631,10 @@ asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr)
|
||||
info.si_code = ILL_ILLOPC;
|
||||
info.si_addr = pc;
|
||||
|
||||
arm64_notify_die("Oops - bad mode", regs, &info, 0);
|
||||
current->thread.fault_address = 0;
|
||||
current->thread.fault_code = 0;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
}
|
||||
|
||||
void __pte_error(const char *file, int line, unsigned long val)
|
||||
|
||||
@@ -524,7 +524,8 @@ EXPORT_SYMBOL(dummy_dma_ops);
|
||||
|
||||
static int __init arm64_dma_init(void)
|
||||
{
|
||||
if (swiotlb_force || max_pfn > (arm64_dma_phys_limit >> PAGE_SHIFT))
|
||||
if (swiotlb_force == SWIOTLB_FORCE ||
|
||||
max_pfn > (arm64_dma_phys_limit >> PAGE_SHIFT))
|
||||
swiotlb = 1;
|
||||
|
||||
return atomic_pool_init();
|
||||
|
||||
@@ -401,8 +401,11 @@ static void __init free_unused_memmap(void)
|
||||
*/
|
||||
void __init mem_init(void)
|
||||
{
|
||||
if (swiotlb_force || max_pfn > (arm64_dma_phys_limit >> PAGE_SHIFT))
|
||||
if (swiotlb_force == SWIOTLB_FORCE ||
|
||||
max_pfn > (arm64_dma_phys_limit >> PAGE_SHIFT))
|
||||
swiotlb_init(1);
|
||||
else
|
||||
swiotlb_force = SWIOTLB_NO_FORCE;
|
||||
|
||||
set_max_mapnr(pfn_to_page(max_pfn) - mem_map);
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
#define PPC_INST_MCRXR 0x7c000400
|
||||
#define PPC_INST_MCRXR_MASK 0xfc0007fe
|
||||
#define PPC_INST_MFSPR_PVR 0x7c1f42a6
|
||||
#define PPC_INST_MFSPR_PVR_MASK 0xfc1fffff
|
||||
#define PPC_INST_MFSPR_PVR_MASK 0xfc1ffffe
|
||||
#define PPC_INST_MFTMR 0x7c0002dc
|
||||
#define PPC_INST_MSGSND 0x7c00019c
|
||||
#define PPC_INST_MSGCLR 0x7c0001dc
|
||||
@@ -174,13 +174,13 @@
|
||||
#define PPC_INST_RFDI 0x4c00004e
|
||||
#define PPC_INST_RFMCI 0x4c00004c
|
||||
#define PPC_INST_MFSPR_DSCR 0x7c1102a6
|
||||
#define PPC_INST_MFSPR_DSCR_MASK 0xfc1fffff
|
||||
#define PPC_INST_MFSPR_DSCR_MASK 0xfc1ffffe
|
||||
#define PPC_INST_MTSPR_DSCR 0x7c1103a6
|
||||
#define PPC_INST_MTSPR_DSCR_MASK 0xfc1fffff
|
||||
#define PPC_INST_MTSPR_DSCR_MASK 0xfc1ffffe
|
||||
#define PPC_INST_MFSPR_DSCR_USER 0x7c0302a6
|
||||
#define PPC_INST_MFSPR_DSCR_USER_MASK 0xfc1fffff
|
||||
#define PPC_INST_MFSPR_DSCR_USER_MASK 0xfc1ffffe
|
||||
#define PPC_INST_MTSPR_DSCR_USER 0x7c0303a6
|
||||
#define PPC_INST_MTSPR_DSCR_USER_MASK 0xfc1fffff
|
||||
#define PPC_INST_MTSPR_DSCR_USER_MASK 0xfc1ffffe
|
||||
#define PPC_INST_MFVSRD 0x7c000066
|
||||
#define PPC_INST_MTVSRD 0x7c000166
|
||||
#define PPC_INST_SLBFEE 0x7c0007a7
|
||||
|
||||
@@ -463,6 +463,10 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
|
||||
flush_fp_to_thread(target);
|
||||
|
||||
for (i = 0; i < 32 ; i++)
|
||||
buf[i] = target->thread.TS_FPR(i);
|
||||
buf[32] = target->thread.fp_state.fpscr;
|
||||
|
||||
/* copy to local buffer then write that out */
|
||||
i = user_regset_copyin(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
|
||||
if (i)
|
||||
@@ -672,6 +676,9 @@ static int vsr_set(struct task_struct *target, const struct user_regset *regset,
|
||||
flush_altivec_to_thread(target);
|
||||
flush_vsx_to_thread(target);
|
||||
|
||||
for (i = 0; i < 32 ; i++)
|
||||
buf[i] = target->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
buf, 0, 32 * sizeof(double));
|
||||
if (!ret)
|
||||
@@ -1019,6 +1026,10 @@ static int tm_cfpr_set(struct task_struct *target,
|
||||
flush_fp_to_thread(target);
|
||||
flush_altivec_to_thread(target);
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
buf[i] = target->thread.TS_CKFPR(i);
|
||||
buf[32] = target->thread.ckfp_state.fpscr;
|
||||
|
||||
/* copy to local buffer then write that out */
|
||||
i = user_regset_copyin(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
|
||||
if (i)
|
||||
@@ -1283,6 +1294,9 @@ static int tm_cvsx_set(struct task_struct *target,
|
||||
flush_altivec_to_thread(target);
|
||||
flush_vsx_to_thread(target);
|
||||
|
||||
for (i = 0; i < 32 ; i++)
|
||||
buf[i] = target->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
buf, 0, 32 * sizeof(double));
|
||||
if (!ret)
|
||||
|
||||
@@ -16,7 +16,7 @@ EVENT(PM_CYC, 0x0001e)
|
||||
EVENT(PM_ICT_NOSLOT_CYC, 0x100f8)
|
||||
EVENT(PM_CMPLU_STALL, 0x1e054)
|
||||
EVENT(PM_INST_CMPL, 0x00002)
|
||||
EVENT(PM_BRU_CMPL, 0x40060)
|
||||
EVENT(PM_BRU_CMPL, 0x10012)
|
||||
EVENT(PM_BR_MPRED_CMPL, 0x400f6)
|
||||
|
||||
/* All L1 D cache load references counted at finish, gated by reject */
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <asm/xics.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/opal.h>
|
||||
#include <asm/kvm_ppc.h>
|
||||
|
||||
static void icp_opal_teardown_cpu(void)
|
||||
{
|
||||
@@ -39,7 +40,26 @@ static void icp_opal_flush_ipi(void)
|
||||
* Should we be flagging idle loop instead?
|
||||
* Or creating some task to be scheduled?
|
||||
*/
|
||||
opal_int_eoi((0x00 << 24) | XICS_IPI);
|
||||
if (opal_int_eoi((0x00 << 24) | XICS_IPI) > 0)
|
||||
force_external_irq_replay();
|
||||
}
|
||||
|
||||
static unsigned int icp_opal_get_xirr(void)
|
||||
{
|
||||
unsigned int kvm_xirr;
|
||||
__be32 hw_xirr;
|
||||
int64_t rc;
|
||||
|
||||
/* Handle an interrupt latched by KVM first */
|
||||
kvm_xirr = kvmppc_get_xics_latch();
|
||||
if (kvm_xirr)
|
||||
return kvm_xirr;
|
||||
|
||||
/* Then ask OPAL */
|
||||
rc = opal_int_get_xirr(&hw_xirr, false);
|
||||
if (rc < 0)
|
||||
return 0;
|
||||
return be32_to_cpu(hw_xirr);
|
||||
}
|
||||
|
||||
static unsigned int icp_opal_get_irq(void)
|
||||
@@ -47,12 +67,8 @@ static unsigned int icp_opal_get_irq(void)
|
||||
unsigned int xirr;
|
||||
unsigned int vec;
|
||||
unsigned int irq;
|
||||
int64_t rc;
|
||||
|
||||
rc = opal_int_get_xirr(&xirr, false);
|
||||
if (rc < 0)
|
||||
return 0;
|
||||
xirr = be32_to_cpu(xirr);
|
||||
xirr = icp_opal_get_xirr();
|
||||
vec = xirr & 0x00ffffff;
|
||||
if (vec == XICS_IRQ_SPURIOUS)
|
||||
return 0;
|
||||
@@ -67,7 +83,8 @@ static unsigned int icp_opal_get_irq(void)
|
||||
xics_mask_unknown_vec(vec);
|
||||
|
||||
/* We might learn about it later, so EOI it */
|
||||
opal_int_eoi(xirr);
|
||||
if (opal_int_eoi(xirr) > 0)
|
||||
force_external_irq_replay();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -916,7 +916,7 @@ static int kvm_s390_get_machine(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||
memcpy(&mach->fac_mask, kvm->arch.model.fac_mask,
|
||||
S390_ARCH_FAC_LIST_SIZE_BYTE);
|
||||
memcpy((unsigned long *)&mach->fac_list, S390_lowcore.stfle_fac_list,
|
||||
S390_ARCH_FAC_LIST_SIZE_BYTE);
|
||||
sizeof(S390_lowcore.stfle_fac_list));
|
||||
if (copy_to_user((void __user *)attr->addr, mach, sizeof(*mach)))
|
||||
ret = -EFAULT;
|
||||
kfree(mach);
|
||||
@@ -1437,7 +1437,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||
|
||||
/* Populate the facility mask initially. */
|
||||
memcpy(kvm->arch.model.fac_mask, S390_lowcore.stfle_fac_list,
|
||||
S390_ARCH_FAC_LIST_SIZE_BYTE);
|
||||
sizeof(S390_lowcore.stfle_fac_list));
|
||||
for (i = 0; i < S390_ARCH_FAC_LIST_SIZE_U64; i++) {
|
||||
if (i < kvm_s390_fac_list_mask_size())
|
||||
kvm->arch.model.fac_mask[i] &= kvm_s390_fac_list_mask[i];
|
||||
|
||||
@@ -1876,6 +1876,7 @@ static struct irq_chip ioapic_chip __read_mostly = {
|
||||
.irq_ack = irq_chip_ack_parent,
|
||||
.irq_eoi = ioapic_ack_level,
|
||||
.irq_set_affinity = ioapic_set_affinity,
|
||||
.irq_retrigger = irq_chip_retrigger_hierarchy,
|
||||
.flags = IRQCHIP_SKIP_SET_WAKE,
|
||||
};
|
||||
|
||||
@@ -1887,6 +1888,7 @@ static struct irq_chip ioapic_ir_chip __read_mostly = {
|
||||
.irq_ack = irq_chip_ack_parent,
|
||||
.irq_eoi = ioapic_ir_ack_level,
|
||||
.irq_set_affinity = ioapic_set_affinity,
|
||||
.irq_retrigger = irq_chip_retrigger_hierarchy,
|
||||
.flags = IRQCHIP_SKIP_SET_WAKE,
|
||||
};
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ int __init pci_swiotlb_detect_override(void)
|
||||
{
|
||||
int use_swiotlb = swiotlb | swiotlb_force;
|
||||
|
||||
if (swiotlb_force)
|
||||
if (swiotlb_force == SWIOTLB_FORCE)
|
||||
swiotlb = 1;
|
||||
|
||||
return use_swiotlb;
|
||||
|
||||
@@ -114,6 +114,16 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "6JET85WW (1.43 )"),
|
||||
},
|
||||
},
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=42606 */
|
||||
{
|
||||
.callback = set_nouse_crs,
|
||||
.ident = "Supermicro X8DTH",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "X8DTH-i/6/iF/6F"),
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "2.0a"),
|
||||
},
|
||||
},
|
||||
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=15362 */
|
||||
{
|
||||
|
||||
@@ -49,7 +49,7 @@ int __init pci_xen_swiotlb_detect(void)
|
||||
* activate this IOMMU. If running as PV privileged, activate it
|
||||
* irregardless.
|
||||
*/
|
||||
if ((xen_initial_domain() || swiotlb || swiotlb_force))
|
||||
if (xen_initial_domain() || swiotlb || swiotlb_force == SWIOTLB_FORCE)
|
||||
xen_swiotlb = 1;
|
||||
|
||||
/* If we are running under Xen, we MUST disable the native SWIOTLB.
|
||||
|
||||
@@ -495,6 +495,7 @@ static int exynos4_mct_dying_cpu(unsigned int cpu)
|
||||
if (mct_int_type == MCT_INT_SPI) {
|
||||
if (evt->irq != -1)
|
||||
disable_irq_nosync(evt->irq);
|
||||
exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET);
|
||||
} else {
|
||||
disable_percpu_irq(mct_irqs[MCT_L0_IRQ]);
|
||||
}
|
||||
|
||||
@@ -593,11 +593,16 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||
list_add(&devfreq->node, &devfreq_list);
|
||||
|
||||
governor = find_devfreq_governor(devfreq->governor_name);
|
||||
if (!IS_ERR(governor))
|
||||
devfreq->governor = governor;
|
||||
if (devfreq->governor)
|
||||
err = devfreq->governor->event_handler(devfreq,
|
||||
DEVFREQ_GOV_START, NULL);
|
||||
if (IS_ERR(governor)) {
|
||||
dev_err(dev, "%s: Unable to find governor for the device\n",
|
||||
__func__);
|
||||
err = PTR_ERR(governor);
|
||||
goto err_init;
|
||||
}
|
||||
|
||||
devfreq->governor = governor;
|
||||
err = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_START,
|
||||
NULL);
|
||||
if (err) {
|
||||
dev_err(dev, "%s: Unable to start governor for the device\n",
|
||||
__func__);
|
||||
|
||||
@@ -498,7 +498,7 @@ passive:
|
||||
if (IS_ERR(bus->devfreq)) {
|
||||
dev_err(dev,
|
||||
"failed to add devfreq dev with passive governor\n");
|
||||
ret = -EPROBE_DEFER;
|
||||
ret = PTR_ERR(bus->devfreq);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
@@ -448,6 +448,9 @@ struct dma_pl330_chan {
|
||||
|
||||
/* for cyclic capability */
|
||||
bool cyclic;
|
||||
|
||||
/* for runtime pm tracking */
|
||||
bool active;
|
||||
};
|
||||
|
||||
struct pl330_dmac {
|
||||
@@ -2031,6 +2034,7 @@ static void pl330_tasklet(unsigned long data)
|
||||
_stop(pch->thread);
|
||||
spin_unlock(&pch->thread->dmac->lock);
|
||||
power_down = true;
|
||||
pch->active = false;
|
||||
} else {
|
||||
/* Make sure the PL330 Channel thread is active */
|
||||
spin_lock(&pch->thread->dmac->lock);
|
||||
@@ -2050,6 +2054,7 @@ static void pl330_tasklet(unsigned long data)
|
||||
desc->status = PREP;
|
||||
list_move_tail(&desc->node, &pch->work_list);
|
||||
if (power_down) {
|
||||
pch->active = true;
|
||||
spin_lock(&pch->thread->dmac->lock);
|
||||
_start(pch->thread);
|
||||
spin_unlock(&pch->thread->dmac->lock);
|
||||
@@ -2164,6 +2169,7 @@ static int pl330_terminate_all(struct dma_chan *chan)
|
||||
unsigned long flags;
|
||||
struct pl330_dmac *pl330 = pch->dmac;
|
||||
LIST_HEAD(list);
|
||||
bool power_down = false;
|
||||
|
||||
pm_runtime_get_sync(pl330->ddma.dev);
|
||||
spin_lock_irqsave(&pch->lock, flags);
|
||||
@@ -2174,6 +2180,8 @@ static int pl330_terminate_all(struct dma_chan *chan)
|
||||
pch->thread->req[0].desc = NULL;
|
||||
pch->thread->req[1].desc = NULL;
|
||||
pch->thread->req_running = -1;
|
||||
power_down = pch->active;
|
||||
pch->active = false;
|
||||
|
||||
/* Mark all desc done */
|
||||
list_for_each_entry(desc, &pch->submitted_list, node) {
|
||||
@@ -2191,6 +2199,8 @@ static int pl330_terminate_all(struct dma_chan *chan)
|
||||
list_splice_tail_init(&pch->completed_list, &pl330->desc_pool);
|
||||
spin_unlock_irqrestore(&pch->lock, flags);
|
||||
pm_runtime_mark_last_busy(pl330->ddma.dev);
|
||||
if (power_down)
|
||||
pm_runtime_put_autosuspend(pl330->ddma.dev);
|
||||
pm_runtime_put_autosuspend(pl330->ddma.dev);
|
||||
|
||||
return 0;
|
||||
@@ -2350,6 +2360,7 @@ static void pl330_issue_pending(struct dma_chan *chan)
|
||||
* updated on work_list emptiness status.
|
||||
*/
|
||||
WARN_ON(list_empty(&pch->submitted_list));
|
||||
pch->active = true;
|
||||
pm_runtime_get_sync(pch->dmac->ddma.dev);
|
||||
}
|
||||
list_splice_tail_init(&pch->submitted_list, &pch->work_list);
|
||||
|
||||
@@ -986,6 +986,7 @@ static void rcar_dmac_free_chan_resources(struct dma_chan *chan)
|
||||
{
|
||||
struct rcar_dmac_chan *rchan = to_rcar_dmac_chan(chan);
|
||||
struct rcar_dmac *dmac = to_rcar_dmac(chan->device);
|
||||
struct rcar_dmac_chan_map *map = &rchan->map;
|
||||
struct rcar_dmac_desc_page *page, *_page;
|
||||
struct rcar_dmac_desc *desc;
|
||||
LIST_HEAD(list);
|
||||
@@ -1019,6 +1020,13 @@ static void rcar_dmac_free_chan_resources(struct dma_chan *chan)
|
||||
free_page((unsigned long)page);
|
||||
}
|
||||
|
||||
/* Remove slave mapping if present. */
|
||||
if (map->slave.xfer_size) {
|
||||
dma_unmap_resource(chan->device->dev, map->addr,
|
||||
map->slave.xfer_size, map->dir, 0);
|
||||
map->slave.xfer_size = 0;
|
||||
}
|
||||
|
||||
pm_runtime_put(chan->device->dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -148,26 +148,36 @@ static enum led_brightness k90_backlight_get(struct led_classdev *led_cdev)
|
||||
struct usb_interface *usbif = to_usb_interface(dev->parent);
|
||||
struct usb_device *usbdev = interface_to_usbdev(usbif);
|
||||
int brightness;
|
||||
char data[8];
|
||||
char *data;
|
||||
|
||||
data = kmalloc(8, GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
|
||||
K90_REQUEST_STATUS,
|
||||
USB_DIR_IN | USB_TYPE_VENDOR |
|
||||
USB_RECIP_DEVICE, 0, 0, data, 8,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (ret < 0) {
|
||||
if (ret < 5) {
|
||||
dev_warn(dev, "Failed to get K90 initial state (error %d).\n",
|
||||
ret);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
brightness = data[4];
|
||||
if (brightness < 0 || brightness > 3) {
|
||||
dev_warn(dev,
|
||||
"Read invalid backlight brightness: %02hhx.\n",
|
||||
data[4]);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
return brightness;
|
||||
ret = brightness;
|
||||
out:
|
||||
kfree(data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum led_brightness k90_record_led_get(struct led_classdev *led_cdev)
|
||||
@@ -253,17 +263,22 @@ static ssize_t k90_show_macro_mode(struct device *dev,
|
||||
struct usb_interface *usbif = to_usb_interface(dev->parent);
|
||||
struct usb_device *usbdev = interface_to_usbdev(usbif);
|
||||
const char *macro_mode;
|
||||
char data[8];
|
||||
char *data;
|
||||
|
||||
data = kmalloc(2, GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
|
||||
K90_REQUEST_GET_MODE,
|
||||
USB_DIR_IN | USB_TYPE_VENDOR |
|
||||
USB_RECIP_DEVICE, 0, 0, data, 2,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (ret < 0) {
|
||||
if (ret < 1) {
|
||||
dev_warn(dev, "Failed to get K90 initial mode (error %d).\n",
|
||||
ret);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (data[0]) {
|
||||
@@ -277,10 +292,15 @@ static ssize_t k90_show_macro_mode(struct device *dev,
|
||||
default:
|
||||
dev_warn(dev, "K90 in unknown mode: %02hhx.\n",
|
||||
data[0]);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", macro_mode);
|
||||
ret = snprintf(buf, PAGE_SIZE, "%s\n", macro_mode);
|
||||
out:
|
||||
kfree(data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t k90_store_macro_mode(struct device *dev,
|
||||
@@ -320,26 +340,36 @@ static ssize_t k90_show_current_profile(struct device *dev,
|
||||
struct usb_interface *usbif = to_usb_interface(dev->parent);
|
||||
struct usb_device *usbdev = interface_to_usbdev(usbif);
|
||||
int current_profile;
|
||||
char data[8];
|
||||
char *data;
|
||||
|
||||
data = kmalloc(8, GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
|
||||
K90_REQUEST_STATUS,
|
||||
USB_DIR_IN | USB_TYPE_VENDOR |
|
||||
USB_RECIP_DEVICE, 0, 0, data, 8,
|
||||
USB_CTRL_SET_TIMEOUT);
|
||||
if (ret < 0) {
|
||||
if (ret < 8) {
|
||||
dev_warn(dev, "Failed to get K90 initial state (error %d).\n",
|
||||
ret);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
current_profile = data[7];
|
||||
if (current_profile < 1 || current_profile > 3) {
|
||||
dev_warn(dev, "Read invalid current profile: %02hhx.\n",
|
||||
data[7]);
|
||||
return -EIO;
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", current_profile);
|
||||
ret = snprintf(buf, PAGE_SIZE, "%d\n", current_profile);
|
||||
out:
|
||||
kfree(data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t k90_store_current_profile(struct device *dev,
|
||||
|
||||
@@ -770,12 +770,8 @@ static int _gid_table_setup_one(struct ib_device *ib_dev)
|
||||
int err = 0;
|
||||
|
||||
table = kcalloc(ib_dev->phys_port_cnt, sizeof(*table), GFP_KERNEL);
|
||||
|
||||
if (!table) {
|
||||
pr_warn("failed to allocate ib gid cache for %s\n",
|
||||
ib_dev->name);
|
||||
if (!table)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (port = 0; port < ib_dev->phys_port_cnt; port++) {
|
||||
u8 rdma_port = port + rdma_start_port(ib_dev);
|
||||
@@ -1170,14 +1166,13 @@ int ib_cache_setup_one(struct ib_device *device)
|
||||
GFP_KERNEL);
|
||||
if (!device->cache.pkey_cache ||
|
||||
!device->cache.lmc_cache) {
|
||||
pr_warn("Couldn't allocate cache for %s\n", device->name);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto free;
|
||||
}
|
||||
|
||||
err = gid_table_setup_one(device);
|
||||
if (err)
|
||||
/* Allocated memory will be cleaned in the release function */
|
||||
return err;
|
||||
goto free;
|
||||
|
||||
for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p)
|
||||
ib_cache_update(device, p + rdma_start_port(device));
|
||||
@@ -1192,6 +1187,9 @@ int ib_cache_setup_one(struct ib_device *device)
|
||||
|
||||
err:
|
||||
gid_table_cleanup_one(device);
|
||||
free:
|
||||
kfree(device->cache.pkey_cache);
|
||||
kfree(device->cache.lmc_cache);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +114,9 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr
|
||||
!(1 << ah->av.eth.stat_rate & dev->caps.stat_rate_support))
|
||||
--ah->av.eth.stat_rate;
|
||||
}
|
||||
|
||||
ah->av.eth.sl_tclass_flowlabel |=
|
||||
cpu_to_be32((ah_attr->grh.traffic_class << 20) |
|
||||
ah_attr->grh.flow_label);
|
||||
/*
|
||||
* HW requires multicast LID so we just choose one.
|
||||
*/
|
||||
@@ -122,7 +124,7 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr
|
||||
ah->av.ib.dlid = cpu_to_be16(0xc000);
|
||||
|
||||
memcpy(ah->av.eth.dgid, ah_attr->grh.dgid.raw, 16);
|
||||
ah->av.eth.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 29);
|
||||
ah->av.eth.sl_tclass_flowlabel |= cpu_to_be32(ah_attr->sl << 29);
|
||||
|
||||
return &ah->ibah;
|
||||
}
|
||||
|
||||
@@ -702,10 +702,18 @@ static int mlx4_ib_demux_mad(struct ib_device *ibdev, u8 port,
|
||||
|
||||
/* If a grh is present, we demux according to it */
|
||||
if (wc->wc_flags & IB_WC_GRH) {
|
||||
slave = mlx4_ib_find_real_gid(ibdev, port, grh->dgid.global.interface_id);
|
||||
if (slave < 0) {
|
||||
mlx4_ib_warn(ibdev, "failed matching grh\n");
|
||||
return -ENOENT;
|
||||
if (grh->dgid.global.interface_id ==
|
||||
cpu_to_be64(IB_SA_WELL_KNOWN_GUID) &&
|
||||
grh->dgid.global.subnet_prefix == cpu_to_be64(
|
||||
atomic64_read(&dev->sriov.demux[port - 1].subnet_prefix))) {
|
||||
slave = 0;
|
||||
} else {
|
||||
slave = mlx4_ib_find_real_gid(ibdev, port,
|
||||
grh->dgid.global.interface_id);
|
||||
if (slave < 0) {
|
||||
mlx4_ib_warn(ibdev, "failed matching grh\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Class-specific handling */
|
||||
|
||||
@@ -697,9 +697,11 @@ static int eth_link_query_port(struct ib_device *ibdev, u8 port,
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
props->active_width = (((u8 *)mailbox->buf)[5] == 0x40) ?
|
||||
IB_WIDTH_4X : IB_WIDTH_1X;
|
||||
props->active_speed = IB_SPEED_QDR;
|
||||
props->active_width = (((u8 *)mailbox->buf)[5] == 0x40) ||
|
||||
(((u8 *)mailbox->buf)[5] == 0x20 /*56Gb*/) ?
|
||||
IB_WIDTH_4X : IB_WIDTH_1X;
|
||||
props->active_speed = (((u8 *)mailbox->buf)[5] == 0x20 /*56Gb*/) ?
|
||||
IB_SPEED_FDR : IB_SPEED_QDR;
|
||||
props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_IP_BASED_GIDS;
|
||||
props->gid_tbl_len = mdev->dev->caps.gid_table_len[port];
|
||||
props->max_msg_sz = mdev->dev->caps.max_msg_sz;
|
||||
@@ -2820,14 +2822,19 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
|
||||
goto err_steer_qp_release;
|
||||
}
|
||||
|
||||
bitmap_zero(ibdev->ib_uc_qpns_bitmap, ibdev->steer_qpn_count);
|
||||
|
||||
err = mlx4_FLOW_STEERING_IB_UC_QP_RANGE(
|
||||
dev, ibdev->steer_qpn_base,
|
||||
ibdev->steer_qpn_base +
|
||||
ibdev->steer_qpn_count - 1);
|
||||
if (err)
|
||||
goto err_steer_free_bitmap;
|
||||
if (dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_DMFS_IPOIB) {
|
||||
bitmap_zero(ibdev->ib_uc_qpns_bitmap,
|
||||
ibdev->steer_qpn_count);
|
||||
err = mlx4_FLOW_STEERING_IB_UC_QP_RANGE(
|
||||
dev, ibdev->steer_qpn_base,
|
||||
ibdev->steer_qpn_base +
|
||||
ibdev->steer_qpn_count - 1);
|
||||
if (err)
|
||||
goto err_steer_free_bitmap;
|
||||
} else {
|
||||
bitmap_fill(ibdev->ib_uc_qpns_bitmap,
|
||||
ibdev->steer_qpn_count);
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 1; j <= ibdev->dev->caps.num_ports; j++)
|
||||
|
||||
@@ -1280,7 +1280,8 @@ static int _mlx4_ib_destroy_qp(struct ib_qp *qp)
|
||||
if (is_qp0(dev, mqp))
|
||||
mlx4_CLOSE_PORT(dev->dev, mqp->port);
|
||||
|
||||
if (dev->qp1_proxy[mqp->port - 1] == mqp) {
|
||||
if (mqp->mlx4_ib_qp_type == MLX4_IB_QPT_PROXY_GSI &&
|
||||
dev->qp1_proxy[mqp->port - 1] == mqp) {
|
||||
mutex_lock(&dev->qp1_proxy_lock[mqp->port - 1]);
|
||||
dev->qp1_proxy[mqp->port - 1] = NULL;
|
||||
mutex_unlock(&dev->qp1_proxy_lock[mqp->port - 1]);
|
||||
@@ -1764,14 +1765,14 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
||||
u8 port_num = mlx4_is_bonded(to_mdev(ibqp->device)->dev) ? 1 :
|
||||
attr_mask & IB_QP_PORT ? attr->port_num : qp->port;
|
||||
union ib_gid gid;
|
||||
struct ib_gid_attr gid_attr;
|
||||
struct ib_gid_attr gid_attr = {.gid_type = IB_GID_TYPE_IB};
|
||||
u16 vlan = 0xffff;
|
||||
u8 smac[ETH_ALEN];
|
||||
int status = 0;
|
||||
int is_eth = rdma_cap_eth_ah(&dev->ib_dev, port_num) &&
|
||||
attr->ah_attr.ah_flags & IB_AH_GRH;
|
||||
|
||||
if (is_eth) {
|
||||
if (is_eth && attr->ah_attr.ah_flags & IB_AH_GRH) {
|
||||
int index = attr->ah_attr.grh.sgid_index;
|
||||
|
||||
status = ib_get_cached_gid(ibqp->device, port_num,
|
||||
|
||||
@@ -496,6 +496,7 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
|
||||
struct mlx5_ib_dev *dev = to_mdev(ibdev);
|
||||
struct mlx5_core_dev *mdev = dev->mdev;
|
||||
int err = -ENOMEM;
|
||||
int max_sq_desc;
|
||||
int max_rq_sg;
|
||||
int max_sq_sg;
|
||||
u64 min_page_size = 1ull << MLX5_CAP_GEN(mdev, log_pg_sz);
|
||||
@@ -618,9 +619,10 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
|
||||
props->max_qp_wr = 1 << MLX5_CAP_GEN(mdev, log_max_qp_sz);
|
||||
max_rq_sg = MLX5_CAP_GEN(mdev, max_wqe_sz_rq) /
|
||||
sizeof(struct mlx5_wqe_data_seg);
|
||||
max_sq_sg = (MLX5_CAP_GEN(mdev, max_wqe_sz_sq) -
|
||||
sizeof(struct mlx5_wqe_ctrl_seg)) /
|
||||
sizeof(struct mlx5_wqe_data_seg);
|
||||
max_sq_desc = min_t(int, MLX5_CAP_GEN(mdev, max_wqe_sz_sq), 512);
|
||||
max_sq_sg = (max_sq_desc - sizeof(struct mlx5_wqe_ctrl_seg) -
|
||||
sizeof(struct mlx5_wqe_raddr_seg)) /
|
||||
sizeof(struct mlx5_wqe_data_seg);
|
||||
props->max_sge = min(max_rq_sg, max_sq_sg);
|
||||
props->max_sge_rd = MLX5_MAX_SGE_RD;
|
||||
props->max_cq = 1 << MLX5_CAP_GEN(mdev, log_max_cq);
|
||||
|
||||
@@ -628,7 +628,8 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)
|
||||
ent->order = i + 2;
|
||||
ent->dev = dev;
|
||||
|
||||
if (dev->mdev->profile->mask & MLX5_PROF_MASK_MR_CACHE)
|
||||
if ((dev->mdev->profile->mask & MLX5_PROF_MASK_MR_CACHE) &&
|
||||
(mlx5_core_is_pf(dev->mdev)))
|
||||
limit = dev->mdev->profile->mr_cache[i].limit;
|
||||
else
|
||||
limit = 0;
|
||||
@@ -646,6 +647,33 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void wait_for_async_commands(struct mlx5_ib_dev *dev)
|
||||
{
|
||||
struct mlx5_mr_cache *cache = &dev->cache;
|
||||
struct mlx5_cache_ent *ent;
|
||||
int total = 0;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
|
||||
ent = &cache->ent[i];
|
||||
for (j = 0 ; j < 1000; j++) {
|
||||
if (!ent->pending)
|
||||
break;
|
||||
msleep(50);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
|
||||
ent = &cache->ent[i];
|
||||
total += ent->pending;
|
||||
}
|
||||
|
||||
if (total)
|
||||
mlx5_ib_warn(dev, "aborted while there are %d pending mr requests\n", total);
|
||||
else
|
||||
mlx5_ib_warn(dev, "done with all pending requests\n");
|
||||
}
|
||||
|
||||
int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
|
||||
{
|
||||
int i;
|
||||
@@ -659,6 +687,7 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
|
||||
clean_keys(dev, i);
|
||||
|
||||
destroy_workqueue(dev->cache.wq);
|
||||
wait_for_async_commands(dev);
|
||||
del_timer_sync(&dev->delay_timer);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -351,6 +351,29 @@ static int calc_send_wqe(struct ib_qp_init_attr *attr)
|
||||
return ALIGN(max_t(int, inl_size, size), MLX5_SEND_WQE_BB);
|
||||
}
|
||||
|
||||
static int get_send_sge(struct ib_qp_init_attr *attr, int wqe_size)
|
||||
{
|
||||
int max_sge;
|
||||
|
||||
if (attr->qp_type == IB_QPT_RC)
|
||||
max_sge = (min_t(int, wqe_size, 512) -
|
||||
sizeof(struct mlx5_wqe_ctrl_seg) -
|
||||
sizeof(struct mlx5_wqe_raddr_seg)) /
|
||||
sizeof(struct mlx5_wqe_data_seg);
|
||||
else if (attr->qp_type == IB_QPT_XRC_INI)
|
||||
max_sge = (min_t(int, wqe_size, 512) -
|
||||
sizeof(struct mlx5_wqe_ctrl_seg) -
|
||||
sizeof(struct mlx5_wqe_xrc_seg) -
|
||||
sizeof(struct mlx5_wqe_raddr_seg)) /
|
||||
sizeof(struct mlx5_wqe_data_seg);
|
||||
else
|
||||
max_sge = (wqe_size - sq_overhead(attr)) /
|
||||
sizeof(struct mlx5_wqe_data_seg);
|
||||
|
||||
return min_t(int, max_sge, wqe_size - sq_overhead(attr) /
|
||||
sizeof(struct mlx5_wqe_data_seg));
|
||||
}
|
||||
|
||||
static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr,
|
||||
struct mlx5_ib_qp *qp)
|
||||
{
|
||||
@@ -387,7 +410,11 @@ static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr,
|
||||
return -ENOMEM;
|
||||
}
|
||||
qp->sq.wqe_shift = ilog2(MLX5_SEND_WQE_BB);
|
||||
qp->sq.max_gs = attr->cap.max_send_sge;
|
||||
qp->sq.max_gs = get_send_sge(attr, wqe_size);
|
||||
if (qp->sq.max_gs < attr->cap.max_send_sge)
|
||||
return -ENOMEM;
|
||||
|
||||
attr->cap.max_send_sge = qp->sq.max_gs;
|
||||
qp->sq.max_post = wq_size / wqe_size;
|
||||
attr->cap.max_send_wr = qp->sq.max_post;
|
||||
|
||||
|
||||
@@ -282,6 +282,7 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
|
||||
mlx5_ib_dbg(dev, "desc_size 0x%x, req wr 0x%x, srq size 0x%x, max_gs 0x%x, max_avail_gather 0x%x\n",
|
||||
desc_size, init_attr->attr.max_wr, srq->msrq.max, srq->msrq.max_gs,
|
||||
srq->msrq.max_avail_gather);
|
||||
in.type = init_attr->srq_type;
|
||||
|
||||
if (pd->uobject)
|
||||
err = create_srq_user(pd, srq, &in, udata, buf_size);
|
||||
@@ -294,7 +295,6 @@ struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
|
||||
goto err_srq;
|
||||
}
|
||||
|
||||
in.type = init_attr->srq_type;
|
||||
in.log_size = ilog2(srq->msrq.max);
|
||||
in.wqe_shift = srq->msrq.wqe_shift - 4;
|
||||
if (srq->wq_sig)
|
||||
|
||||
@@ -82,7 +82,7 @@ enum rxe_device_param {
|
||||
RXE_MAX_SGE = 32,
|
||||
RXE_MAX_SGE_RD = 32,
|
||||
RXE_MAX_CQ = 16384,
|
||||
RXE_MAX_LOG_CQE = 13,
|
||||
RXE_MAX_LOG_CQE = 15,
|
||||
RXE_MAX_MR = 2 * 1024,
|
||||
RXE_MAX_PD = 0x7ffc,
|
||||
RXE_MAX_QP_RD_ATOM = 128,
|
||||
|
||||
@@ -548,23 +548,23 @@ static void update_wqe_psn(struct rxe_qp *qp,
|
||||
static void save_state(struct rxe_send_wqe *wqe,
|
||||
struct rxe_qp *qp,
|
||||
struct rxe_send_wqe *rollback_wqe,
|
||||
struct rxe_qp *rollback_qp)
|
||||
u32 *rollback_psn)
|
||||
{
|
||||
rollback_wqe->state = wqe->state;
|
||||
rollback_wqe->first_psn = wqe->first_psn;
|
||||
rollback_wqe->last_psn = wqe->last_psn;
|
||||
rollback_qp->req.psn = qp->req.psn;
|
||||
*rollback_psn = qp->req.psn;
|
||||
}
|
||||
|
||||
static void rollback_state(struct rxe_send_wqe *wqe,
|
||||
struct rxe_qp *qp,
|
||||
struct rxe_send_wqe *rollback_wqe,
|
||||
struct rxe_qp *rollback_qp)
|
||||
u32 rollback_psn)
|
||||
{
|
||||
wqe->state = rollback_wqe->state;
|
||||
wqe->first_psn = rollback_wqe->first_psn;
|
||||
wqe->last_psn = rollback_wqe->last_psn;
|
||||
qp->req.psn = rollback_qp->req.psn;
|
||||
qp->req.psn = rollback_psn;
|
||||
}
|
||||
|
||||
static void update_state(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
|
||||
@@ -593,8 +593,8 @@ int rxe_requester(void *arg)
|
||||
int mtu;
|
||||
int opcode;
|
||||
int ret;
|
||||
struct rxe_qp rollback_qp;
|
||||
struct rxe_send_wqe rollback_wqe;
|
||||
u32 rollback_psn;
|
||||
|
||||
next_wqe:
|
||||
if (unlikely(!qp->valid || qp->req.state == QP_STATE_ERROR))
|
||||
@@ -719,7 +719,7 @@ next_wqe:
|
||||
* rxe_xmit_packet().
|
||||
* Otherwise, completer might initiate an unjustified retry flow.
|
||||
*/
|
||||
save_state(wqe, qp, &rollback_wqe, &rollback_qp);
|
||||
save_state(wqe, qp, &rollback_wqe, &rollback_psn);
|
||||
update_wqe_state(qp, wqe, &pkt);
|
||||
update_wqe_psn(qp, wqe, &pkt, payload);
|
||||
ret = rxe_xmit_packet(to_rdev(qp->ibqp.device), qp, &pkt, skb);
|
||||
@@ -727,7 +727,7 @@ next_wqe:
|
||||
qp->need_req_skb = 1;
|
||||
kfree_skb(skb);
|
||||
|
||||
rollback_state(wqe, qp, &rollback_wqe, &rollback_qp);
|
||||
rollback_state(wqe, qp, &rollback_wqe, rollback_psn);
|
||||
|
||||
if (ret == -EAGAIN) {
|
||||
rxe_run_task(&qp->req.task, 1);
|
||||
|
||||
@@ -1054,8 +1054,6 @@ static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ipoib_
|
||||
|
||||
tx_qp = ib_create_qp(priv->pd, &attr);
|
||||
if (PTR_ERR(tx_qp) == -EINVAL) {
|
||||
ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n",
|
||||
priv->ca->name);
|
||||
attr.create_flags &= ~IB_QP_CREATE_USE_GFP_NOIO;
|
||||
tx_qp = ib_create_qp(priv->pd, &attr);
|
||||
}
|
||||
|
||||
@@ -1346,6 +1346,18 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
|
||||
|
||||
priv->multi_packet = 0;
|
||||
|
||||
/* Report trackstick */
|
||||
if (alps_get_pkt_id_ss4_v2(packet) == SS4_PACKET_ID_STICK) {
|
||||
if (priv->flags & ALPS_DUALPOINT) {
|
||||
input_report_key(dev2, BTN_LEFT, f->ts_left);
|
||||
input_report_key(dev2, BTN_RIGHT, f->ts_right);
|
||||
input_report_key(dev2, BTN_MIDDLE, f->ts_middle);
|
||||
input_sync(dev2);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Report touchpad */
|
||||
alps_report_mt_data(psmouse, (f->fingers <= 4) ? f->fingers : 4);
|
||||
|
||||
input_mt_report_finger_count(dev, f->fingers);
|
||||
@@ -1356,13 +1368,6 @@ static void alps_process_packet_ss4_v2(struct psmouse *psmouse)
|
||||
|
||||
input_report_abs(dev, ABS_PRESSURE, f->pressure);
|
||||
input_sync(dev);
|
||||
|
||||
if (priv->flags & ALPS_DUALPOINT) {
|
||||
input_report_key(dev2, BTN_LEFT, f->ts_left);
|
||||
input_report_key(dev2, BTN_RIGHT, f->ts_right);
|
||||
input_report_key(dev2, BTN_MIDDLE, f->ts_middle);
|
||||
input_sync(dev2);
|
||||
}
|
||||
}
|
||||
|
||||
static bool alps_is_valid_package_ss4_v2(struct psmouse *psmouse)
|
||||
|
||||
@@ -93,7 +93,7 @@ config VIDEO_OMAP3_DEBUG
|
||||
|
||||
config VIDEO_PXA27x
|
||||
tristate "PXA27x Quick Capture Interface driver"
|
||||
depends on VIDEO_DEV && HAS_DMA
|
||||
depends on VIDEO_DEV && VIDEO_V4L2 && HAS_DMA
|
||||
depends on PXA27x || COMPILE_TEST
|
||||
select VIDEOBUF2_DMA_SG
|
||||
select SG_SPLIT
|
||||
|
||||
@@ -214,6 +214,8 @@ static int ppi_set_params(struct ppi_if *ppi, struct ppi_params *params)
|
||||
if (params->dlen > 24 || params->dlen <= 0)
|
||||
return -EINVAL;
|
||||
pctrl = devm_pinctrl_get(ppi->dev);
|
||||
if (IS_ERR(pctrl))
|
||||
return PTR_ERR(pctrl);
|
||||
pstate = pinctrl_lookup_state(pctrl,
|
||||
pin_state[(params->dlen + 7) / 8 - 1]);
|
||||
if (pinctrl_select_state(pctrl, pstate))
|
||||
|
||||
@@ -926,10 +926,11 @@ static int s5p_mfc_release(struct file *file)
|
||||
mfc_debug_enter();
|
||||
if (dev)
|
||||
mutex_lock(&dev->mfc_mutex);
|
||||
s5p_mfc_clock_on();
|
||||
vb2_queue_release(&ctx->vq_src);
|
||||
vb2_queue_release(&ctx->vq_dst);
|
||||
if (dev) {
|
||||
s5p_mfc_clock_on();
|
||||
|
||||
/* Mark context as idle */
|
||||
clear_work_bit_irqsave(ctx);
|
||||
/*
|
||||
@@ -951,9 +952,9 @@ static int s5p_mfc_release(struct file *file)
|
||||
if (s5p_mfc_power_off() < 0)
|
||||
mfc_err("Power off failed\n");
|
||||
}
|
||||
mfc_debug(2, "Shutting down clock\n");
|
||||
s5p_mfc_clock_off();
|
||||
}
|
||||
mfc_debug(2, "Shutting down clock\n");
|
||||
s5p_mfc_clock_off();
|
||||
if (dev)
|
||||
dev->ctx[ctx->num] = NULL;
|
||||
s5p_mfc_dec_ctrls_delete(ctx);
|
||||
|
||||
@@ -305,16 +305,16 @@ int hva_hw_probe(struct platform_device *pdev, struct hva_dev *hva)
|
||||
/* get memory for registers */
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
hva->regs = devm_ioremap_resource(dev, regs);
|
||||
if (IS_ERR_OR_NULL(hva->regs)) {
|
||||
if (IS_ERR(hva->regs)) {
|
||||
dev_err(dev, "%s failed to get regs\n", HVA_PREFIX);
|
||||
return PTR_ERR(hva->regs);
|
||||
}
|
||||
|
||||
/* get memory for esram */
|
||||
esram = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (IS_ERR_OR_NULL(esram)) {
|
||||
if (!esram) {
|
||||
dev_err(dev, "%s failed to get esram\n", HVA_PREFIX);
|
||||
return PTR_ERR(esram);
|
||||
return -ENODEV;
|
||||
}
|
||||
hva->esram_addr = esram->start;
|
||||
hva->esram_size = resource_size(esram);
|
||||
|
||||
@@ -263,6 +263,8 @@ static void ite_set_carrier_params(struct ite_dev *dev)
|
||||
|
||||
if (allowance > ITE_RXDCR_MAX)
|
||||
allowance = ITE_RXDCR_MAX;
|
||||
|
||||
use_demodulator = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -453,10 +453,9 @@ static int gs_probe(struct spi_device *spi)
|
||||
static int gs_remove(struct spi_device *spi)
|
||||
{
|
||||
struct v4l2_subdev *sd = spi_get_drvdata(spi);
|
||||
struct gs *gs = to_gs(sd);
|
||||
|
||||
v4l2_device_unregister_subdev(sd);
|
||||
kfree(gs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -309,6 +309,9 @@ static void mxs_mmc_ac(struct mxs_mmc_host *host)
|
||||
cmd0 = BF_SSP(cmd->opcode, CMD0_CMD);
|
||||
cmd1 = cmd->arg;
|
||||
|
||||
if (cmd->opcode == MMC_STOP_TRANSMISSION)
|
||||
cmd0 |= BM_SSP_CMD0_APPEND_8CYC;
|
||||
|
||||
if (host->sdio_irq_en) {
|
||||
ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK;
|
||||
cmd0 |= BM_SSP_CMD0_CONT_CLKING_EN | BM_SSP_CMD0_SLOW_CLKING_EN;
|
||||
@@ -417,8 +420,7 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
|
||||
ssp->base + HW_SSP_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
if ((cmd->opcode == MMC_STOP_TRANSMISSION) ||
|
||||
(cmd->opcode == SD_IO_RW_EXTENDED))
|
||||
if (cmd->opcode == SD_IO_RW_EXTENDED)
|
||||
cmd0 |= BM_SSP_CMD0_APPEND_8CYC;
|
||||
|
||||
cmd1 = cmd->arg;
|
||||
|
||||
@@ -394,7 +394,8 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
|
||||
/* Power on the SDHCI controller and its children */
|
||||
acpi_device_fix_up_power(device);
|
||||
list_for_each_entry(child, &device->children, node)
|
||||
acpi_device_fix_up_power(child);
|
||||
if (child->status.present && child->status.enabled)
|
||||
acpi_device_fix_up_power(child);
|
||||
|
||||
if (acpi_bus_get_status(device) || !device->status.present)
|
||||
return -ENODEV;
|
||||
|
||||
@@ -537,7 +537,7 @@ config MTD_NAND_FSMC
|
||||
Flexible Static Memory Controller (FSMC)
|
||||
|
||||
config MTD_NAND_XWAY
|
||||
tristate "Support for NAND on Lantiq XWAY SoC"
|
||||
bool "Support for NAND on Lantiq XWAY SoC"
|
||||
depends on LANTIQ && SOC_TYPE_XWAY
|
||||
help
|
||||
Enables support for NAND Flash chips on Lantiq XWAY SoCs. NAND is attached
|
||||
|
||||
@@ -776,7 +776,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
||||
init_completion(&host->comp_controller);
|
||||
|
||||
host->irq = platform_get_irq(pdev, 0);
|
||||
if ((host->irq < 0) || (host->irq >= NR_IRQS)) {
|
||||
if (host->irq < 0) {
|
||||
dev_err(&pdev->dev, "failed to get platform irq\n");
|
||||
res = -EINVAL;
|
||||
goto err_exit3;
|
||||
|
||||
@@ -232,7 +232,6 @@ static const struct of_device_id xway_nand_match[] = {
|
||||
{ .compatible = "lantiq,nand-xway" },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, xway_nand_match);
|
||||
|
||||
static struct platform_driver xway_nand_driver = {
|
||||
.probe = xway_nand_probe,
|
||||
@@ -243,6 +242,4 @@ static struct platform_driver xway_nand_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(xway_nand_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
builtin_platform_driver(xway_nand_driver);
|
||||
|
||||
@@ -1077,12 +1077,14 @@ static int cqspi_setup_flash(struct cqspi_st *cqspi, struct device_node *np)
|
||||
|
||||
/* Get flash device data */
|
||||
for_each_available_child_of_node(dev->of_node, np) {
|
||||
if (of_property_read_u32(np, "reg", &cs)) {
|
||||
ret = of_property_read_u32(np, "reg", &cs);
|
||||
if (ret) {
|
||||
dev_err(dev, "Couldn't determine chip select.\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (cs > CQSPI_MAX_CHIPSELECT) {
|
||||
if (cs >= CQSPI_MAX_CHIPSELECT) {
|
||||
ret = -EINVAL;
|
||||
dev_err(dev, "Chip select %d out of range.\n", cs);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -112,13 +112,26 @@ static int atusb_read_reg(struct atusb *atusb, uint8_t reg)
|
||||
{
|
||||
struct usb_device *usb_dev = atusb->usb_dev;
|
||||
int ret;
|
||||
uint8_t *buffer;
|
||||
uint8_t value;
|
||||
|
||||
buffer = kmalloc(1, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_dbg(&usb_dev->dev, "atusb: reg = 0x%x\n", reg);
|
||||
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
|
||||
ATUSB_REG_READ, ATUSB_REQ_FROM_DEV,
|
||||
0, reg, &value, 1, 1000);
|
||||
return ret >= 0 ? value : ret;
|
||||
0, reg, buffer, 1, 1000);
|
||||
|
||||
if (ret >= 0) {
|
||||
value = buffer[0];
|
||||
kfree(buffer);
|
||||
return value;
|
||||
} else {
|
||||
kfree(buffer);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
static int atusb_write_subreg(struct atusb *atusb, uint8_t reg, uint8_t mask,
|
||||
@@ -587,9 +600,13 @@ static struct ieee802154_ops atusb_ops = {
|
||||
static int atusb_get_and_show_revision(struct atusb *atusb)
|
||||
{
|
||||
struct usb_device *usb_dev = atusb->usb_dev;
|
||||
unsigned char buffer[3];
|
||||
unsigned char *buffer;
|
||||
int ret;
|
||||
|
||||
buffer = kmalloc(3, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Get a couple of the ATMega Firmware values */
|
||||
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
|
||||
ATUSB_ID, ATUSB_REQ_FROM_DEV, 0, 0,
|
||||
@@ -605,15 +622,20 @@ static int atusb_get_and_show_revision(struct atusb *atusb)
|
||||
dev_info(&usb_dev->dev, "Please update to version 0.2 or newer");
|
||||
}
|
||||
|
||||
kfree(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int atusb_get_and_show_build(struct atusb *atusb)
|
||||
{
|
||||
struct usb_device *usb_dev = atusb->usb_dev;
|
||||
char build[ATUSB_BUILD_SIZE + 1];
|
||||
char *build;
|
||||
int ret;
|
||||
|
||||
build = kmalloc(ATUSB_BUILD_SIZE + 1, GFP_KERNEL);
|
||||
if (!build)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
|
||||
ATUSB_BUILD, ATUSB_REQ_FROM_DEV, 0, 0,
|
||||
build, ATUSB_BUILD_SIZE, 1000);
|
||||
@@ -622,6 +644,7 @@ static int atusb_get_and_show_build(struct atusb *atusb)
|
||||
dev_info(&usb_dev->dev, "Firmware: build %s\n", build);
|
||||
}
|
||||
|
||||
kfree(build);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -957,6 +957,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
|
||||
{
|
||||
resource_size_t allocated = 0, available = 0;
|
||||
struct nd_region *nd_region = to_nd_region(dev->parent);
|
||||
struct nd_namespace_common *ndns = to_ndns(dev);
|
||||
struct nd_mapping *nd_mapping;
|
||||
struct nvdimm_drvdata *ndd;
|
||||
struct nd_label_id label_id;
|
||||
@@ -964,7 +965,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
|
||||
u8 *uuid = NULL;
|
||||
int rc, i;
|
||||
|
||||
if (dev->driver || to_ndns(dev)->claim)
|
||||
if (dev->driver || ndns->claim)
|
||||
return -EBUSY;
|
||||
|
||||
if (is_namespace_pmem(dev)) {
|
||||
@@ -1034,20 +1035,16 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
|
||||
|
||||
nd_namespace_pmem_set_resource(nd_region, nspm,
|
||||
val * nd_region->ndr_mappings);
|
||||
} else if (is_namespace_blk(dev)) {
|
||||
struct nd_namespace_blk *nsblk = to_nd_namespace_blk(dev);
|
||||
|
||||
/*
|
||||
* Try to delete the namespace if we deleted all of its
|
||||
* allocation, this is not the seed device for the
|
||||
* region, and it is not actively claimed by a btt
|
||||
* instance.
|
||||
*/
|
||||
if (val == 0 && nd_region->ns_seed != dev
|
||||
&& !nsblk->common.claim)
|
||||
nd_device_unregister(dev, ND_ASYNC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to delete the namespace if we deleted all of its
|
||||
* allocation, this is not the seed device for the region, and
|
||||
* it is not actively claimed by a btt instance.
|
||||
*/
|
||||
if (val == 0 && nd_region->ns_seed != dev && !ndns->claim)
|
||||
nd_device_unregister(dev, ND_ASYNC);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -807,11 +807,6 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* get iATU unroll support */
|
||||
pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
|
||||
dev_dbg(pp->dev, "iATU unroll: %s\n",
|
||||
pp->iatu_unroll_enabled ? "enabled" : "disabled");
|
||||
|
||||
/* set the number of lanes */
|
||||
val = dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL);
|
||||
val &= ~PORT_LINK_MODE_MASK;
|
||||
@@ -882,6 +877,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
|
||||
* we should not program the ATU here.
|
||||
*/
|
||||
if (!pp->ops->rd_other_conf) {
|
||||
/* get iATU unroll support */
|
||||
pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
|
||||
dev_dbg(pp->dev, "iATU unroll: %s\n",
|
||||
pp->iatu_unroll_enabled ? "enabled" : "disabled");
|
||||
|
||||
dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0,
|
||||
PCIE_ATU_TYPE_MEM, pp->mem_base,
|
||||
pp->mem_bus_addr, pp->mem_size);
|
||||
|
||||
@@ -1050,6 +1050,7 @@ void set_pcie_port_type(struct pci_dev *pdev)
|
||||
pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
|
||||
if (!pos)
|
||||
return;
|
||||
|
||||
pdev->pcie_cap = pos;
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, ®16);
|
||||
pdev->pcie_flags_reg = reg16;
|
||||
@@ -1057,13 +1058,14 @@ void set_pcie_port_type(struct pci_dev *pdev)
|
||||
pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
|
||||
|
||||
/*
|
||||
* A Root Port is always the upstream end of a Link. No PCIe
|
||||
* component has two Links. Two Links are connected by a Switch
|
||||
* that has a Port on each Link and internal logic to connect the
|
||||
* two Ports.
|
||||
* A Root Port or a PCI-to-PCIe bridge is always the upstream end
|
||||
* of a Link. No PCIe component has two Links. Two Links are
|
||||
* connected by a Switch that has a Port on each Link and internal
|
||||
* logic to connect the two Ports.
|
||||
*/
|
||||
type = pci_pcie_type(pdev);
|
||||
if (type == PCI_EXP_TYPE_ROOT_PORT)
|
||||
if (type == PCI_EXP_TYPE_ROOT_PORT ||
|
||||
type == PCI_EXP_TYPE_PCIE_BRIDGE)
|
||||
pdev->has_secondary_link = 1;
|
||||
else if (type == PCI_EXP_TYPE_UPSTREAM ||
|
||||
type == PCI_EXP_TYPE_DOWNSTREAM) {
|
||||
|
||||
@@ -411,8 +411,8 @@ int rpmsg_register_device(struct rpmsg_device *rpdev)
|
||||
struct device *dev = &rpdev->dev;
|
||||
int ret;
|
||||
|
||||
dev_set_name(&rpdev->dev, "%s:%s",
|
||||
dev_name(dev->parent), rpdev->id.name);
|
||||
dev_set_name(&rpdev->dev, "%s.%s.%d.%d", dev_name(dev->parent),
|
||||
rpdev->id.name, rpdev->src, rpdev->dst);
|
||||
|
||||
rpdev->dev.bus = &rpmsg_bus;
|
||||
rpdev->dev.release = rpmsg_release_device;
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
|
||||
#define INITIAL_SRP_LIMIT 800
|
||||
#define DEFAULT_MAX_SECTORS 256
|
||||
#define MAX_TXU 1024 * 1024
|
||||
|
||||
static uint max_vdma_size = MAX_H_COPY_RDMA;
|
||||
|
||||
@@ -1239,7 +1240,7 @@ static long ibmvscsis_adapter_info(struct scsi_info *vscsi,
|
||||
}
|
||||
|
||||
info = dma_alloc_coherent(&vscsi->dma_dev->dev, sizeof(*info), &token,
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
if (!info) {
|
||||
dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n",
|
||||
iue->target);
|
||||
@@ -1291,7 +1292,7 @@ static long ibmvscsis_adapter_info(struct scsi_info *vscsi,
|
||||
info->mad_version = cpu_to_be32(MAD_VERSION_1);
|
||||
info->os_type = cpu_to_be32(LINUX);
|
||||
memset(&info->port_max_txu[0], 0, sizeof(info->port_max_txu));
|
||||
info->port_max_txu[0] = cpu_to_be32(128 * PAGE_SIZE);
|
||||
info->port_max_txu[0] = cpu_to_be32(MAX_TXU);
|
||||
|
||||
dma_wmb();
|
||||
rc = h_copy_rdma(sizeof(*info), vscsi->dds.window[LOCAL].liobn,
|
||||
@@ -1357,7 +1358,7 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue)
|
||||
}
|
||||
|
||||
cap = dma_alloc_coherent(&vscsi->dma_dev->dev, olen, &token,
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
if (!cap) {
|
||||
dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n",
|
||||
iue->target);
|
||||
|
||||
@@ -393,6 +393,7 @@ struct MPT3SAS_TARGET {
|
||||
* @eedp_enable: eedp support enable bit
|
||||
* @eedp_type: 0(type_1), 1(type_2), 2(type_3)
|
||||
* @eedp_block_length: block size
|
||||
* @ata_command_pending: SATL passthrough outstanding for device
|
||||
*/
|
||||
struct MPT3SAS_DEVICE {
|
||||
struct MPT3SAS_TARGET *sas_target;
|
||||
@@ -402,6 +403,17 @@ struct MPT3SAS_DEVICE {
|
||||
u8 block;
|
||||
u8 tlr_snoop_check;
|
||||
u8 ignore_delay_remove;
|
||||
/*
|
||||
* Bug workaround for SATL handling: the mpt2/3sas firmware
|
||||
* doesn't return BUSY or TASK_SET_FULL for subsequent
|
||||
* commands while a SATL pass through is in operation as the
|
||||
* spec requires, it simply does nothing with them until the
|
||||
* pass through completes, causing them possibly to timeout if
|
||||
* the passthrough is a long executing command (like format or
|
||||
* secure erase). This variable allows us to do the right
|
||||
* thing while a SATL command is pending.
|
||||
*/
|
||||
unsigned long ata_command_pending;
|
||||
};
|
||||
|
||||
#define MPT3_CMD_NOT_USED 0x8000 /* free */
|
||||
|
||||
@@ -3885,9 +3885,18 @@ _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc,
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
|
||||
static int _scsih_set_satl_pending(struct scsi_cmnd *scmd, bool pending)
|
||||
{
|
||||
return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
|
||||
struct MPT3SAS_DEVICE *priv = scmd->device->hostdata;
|
||||
|
||||
if (scmd->cmnd[0] != ATA_12 && scmd->cmnd[0] != ATA_16)
|
||||
return 0;
|
||||
|
||||
if (pending)
|
||||
return test_and_set_bit(0, &priv->ata_command_pending);
|
||||
|
||||
clear_bit(0, &priv->ata_command_pending);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3911,9 +3920,7 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc)
|
||||
if (!scmd)
|
||||
continue;
|
||||
count++;
|
||||
if (ata_12_16_cmd(scmd))
|
||||
scsi_internal_device_unblock(scmd->device,
|
||||
SDEV_RUNNING);
|
||||
_scsih_set_satl_pending(scmd, false);
|
||||
mpt3sas_base_free_smid(ioc, smid);
|
||||
scsi_dma_unmap(scmd);
|
||||
if (ioc->pci_error_recovery)
|
||||
@@ -4044,13 +4051,6 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
|
||||
if (ioc->logging_level & MPT_DEBUG_SCSI)
|
||||
scsi_print_command(scmd);
|
||||
|
||||
/*
|
||||
* Lock the device for any subsequent command until command is
|
||||
* done.
|
||||
*/
|
||||
if (ata_12_16_cmd(scmd))
|
||||
scsi_internal_device_block(scmd->device);
|
||||
|
||||
sas_device_priv_data = scmd->device->hostdata;
|
||||
if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
|
||||
scmd->result = DID_NO_CONNECT << 16;
|
||||
@@ -4064,6 +4064,19 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Bug work around for firmware SATL handling. The loop
|
||||
* is based on atomic operations and ensures consistency
|
||||
* since we're lockless at this point
|
||||
*/
|
||||
do {
|
||||
if (test_bit(0, &sas_device_priv_data->ata_command_pending)) {
|
||||
scmd->result = SAM_STAT_BUSY;
|
||||
scmd->scsi_done(scmd);
|
||||
return 0;
|
||||
}
|
||||
} while (_scsih_set_satl_pending(scmd, true));
|
||||
|
||||
sas_target_priv_data = sas_device_priv_data->sas_target;
|
||||
|
||||
/* invalid device handle */
|
||||
@@ -4626,8 +4639,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
|
||||
if (scmd == NULL)
|
||||
return 1;
|
||||
|
||||
if (ata_12_16_cmd(scmd))
|
||||
scsi_internal_device_unblock(scmd->device, SDEV_RUNNING);
|
||||
_scsih_set_satl_pending(scmd, false);
|
||||
|
||||
mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
|
||||
|
||||
|
||||
@@ -3489,7 +3489,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
||||
sizeof(struct ct6_dsd), 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!ctx_cachep)
|
||||
goto fail_free_gid_list;
|
||||
goto fail_free_srb_mempool;
|
||||
}
|
||||
ha->ctx_mempool = mempool_create_slab_pool(SRB_MIN_REQ,
|
||||
ctx_cachep);
|
||||
@@ -3642,7 +3642,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
||||
ha->loop_id_map = kzalloc(BITS_TO_LONGS(LOOPID_MAP_SIZE) * sizeof(long),
|
||||
GFP_KERNEL);
|
||||
if (!ha->loop_id_map)
|
||||
goto fail_async_pd;
|
||||
goto fail_loop_id_map;
|
||||
else {
|
||||
qla2x00_set_reserved_loop_ids(ha);
|
||||
ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0123,
|
||||
@@ -3651,6 +3651,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
||||
|
||||
return 0;
|
||||
|
||||
fail_loop_id_map:
|
||||
dma_pool_free(ha->s_dma_pool, ha->async_pd, ha->async_pd_dma);
|
||||
fail_async_pd:
|
||||
dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma);
|
||||
fail_ex_init_cb:
|
||||
@@ -3678,6 +3680,10 @@ fail_free_ms_iocb:
|
||||
dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma);
|
||||
ha->ms_iocb = NULL;
|
||||
ha->ms_iocb_dma = 0;
|
||||
|
||||
if (ha->sns_cmd)
|
||||
dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt),
|
||||
ha->sns_cmd, ha->sns_cmd_dma);
|
||||
fail_dma_pool:
|
||||
if (IS_QLA82XX(ha) || ql2xenabledif) {
|
||||
dma_pool_destroy(ha->fcp_cmnd_dma_pool);
|
||||
@@ -3695,10 +3701,12 @@ fail_free_nvram:
|
||||
kfree(ha->nvram);
|
||||
ha->nvram = NULL;
|
||||
fail_free_ctx_mempool:
|
||||
mempool_destroy(ha->ctx_mempool);
|
||||
if (ha->ctx_mempool)
|
||||
mempool_destroy(ha->ctx_mempool);
|
||||
ha->ctx_mempool = NULL;
|
||||
fail_free_srb_mempool:
|
||||
mempool_destroy(ha->srb_mempool);
|
||||
if (ha->srb_mempool)
|
||||
mempool_destroy(ha->srb_mempool);
|
||||
ha->srb_mempool = NULL;
|
||||
fail_free_gid_list:
|
||||
dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
|
||||
|
||||
@@ -587,7 +587,7 @@ static void ses_match_to_enclosure(struct enclosure_device *edev,
|
||||
|
||||
ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0);
|
||||
|
||||
if (scsi_is_sas_rphy(&sdev->sdev_gendev))
|
||||
if (scsi_is_sas_rphy(sdev->sdev_target->dev.parent))
|
||||
efd.addr = sas_get_address(sdev);
|
||||
|
||||
if (efd.addr) {
|
||||
|
||||
@@ -459,6 +459,7 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev)
|
||||
|
||||
if (IS_ERR(task)) {
|
||||
dev_err(dev, "can't create rproc_boot thread\n");
|
||||
ret = PTR_ERR(task);
|
||||
goto err_put_rproc;
|
||||
}
|
||||
|
||||
|
||||
@@ -1690,6 +1690,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
|
||||
pxa2xx_spi_write(drv_data, SSCR1, tmp);
|
||||
tmp = SSCR0_SCR(2) | SSCR0_Motorola | SSCR0_DataSize(8);
|
||||
pxa2xx_spi_write(drv_data, SSCR0, tmp);
|
||||
break;
|
||||
default:
|
||||
tmp = SSCR1_RxTresh(RX_THRESH_DFLT) |
|
||||
SSCR1_TxTresh(TX_THRESH_DFLT);
|
||||
|
||||
@@ -231,7 +231,7 @@ static int s5p_cec_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s5p_cec_runtime_suspend(struct device *dev)
|
||||
static int __maybe_unused s5p_cec_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct s5p_cec_dev *cec = dev_get_drvdata(dev);
|
||||
|
||||
@@ -239,7 +239,7 @@ static int s5p_cec_runtime_suspend(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s5p_cec_runtime_resume(struct device *dev)
|
||||
static int __maybe_unused s5p_cec_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct s5p_cec_dev *cec = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
@@ -392,7 +392,7 @@ dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page,
|
||||
if (dma_capable(dev, dev_addr, size) &&
|
||||
!range_straddles_page_boundary(phys, size) &&
|
||||
!xen_arch_need_swiotlb(dev, phys, dev_addr) &&
|
||||
!swiotlb_force) {
|
||||
(swiotlb_force != SWIOTLB_FORCE)) {
|
||||
/* we are not interested in the dma_addr returned by
|
||||
* xen_dma_map_page, only in the potential cache flushes executed
|
||||
* by the function. */
|
||||
@@ -549,7 +549,7 @@ xen_swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl,
|
||||
phys_addr_t paddr = sg_phys(sg);
|
||||
dma_addr_t dev_addr = xen_phys_to_bus(paddr);
|
||||
|
||||
if (swiotlb_force ||
|
||||
if (swiotlb_force == SWIOTLB_FORCE ||
|
||||
xen_arch_need_swiotlb(hwdev, paddr, dev_addr) ||
|
||||
!dma_capable(hwdev, dev_addr, sg->length) ||
|
||||
range_straddles_page_boundary(paddr, sg->length)) {
|
||||
|
||||
@@ -2507,9 +2507,20 @@ int ceph_get_caps(struct ceph_inode_info *ci, int need, int want,
|
||||
if (err < 0)
|
||||
ret = err;
|
||||
} else {
|
||||
ret = wait_event_interruptible(ci->i_cap_wq,
|
||||
try_get_cap_refs(ci, need, want, endoff,
|
||||
true, &_got, &err));
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
add_wait_queue(&ci->i_cap_wq, &wait);
|
||||
|
||||
while (!try_get_cap_refs(ci, need, want, endoff,
|
||||
true, &_got, &err)) {
|
||||
if (signal_pending(current)) {
|
||||
ret = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
|
||||
}
|
||||
|
||||
remove_wait_queue(&ci->i_cap_wq, &wait);
|
||||
|
||||
if (err == -EAGAIN)
|
||||
continue;
|
||||
if (err < 0)
|
||||
|
||||
@@ -1255,7 +1255,8 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
struct ceph_mds_client *mdsc =
|
||||
ceph_sb_to_client(dir->i_sb)->mdsc;
|
||||
struct ceph_mds_request *req;
|
||||
int op, mask, err;
|
||||
int op, err;
|
||||
u32 mask;
|
||||
|
||||
if (flags & LOOKUP_RCU)
|
||||
return -ECHILD;
|
||||
@@ -1270,7 +1271,7 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED;
|
||||
if (ceph_security_xattr_wanted(dir))
|
||||
mask |= CEPH_CAP_XATTR_SHARED;
|
||||
req->r_args.getattr.mask = mask;
|
||||
req->r_args.getattr.mask = cpu_to_le32(mask);
|
||||
|
||||
err = ceph_mdsc_do_request(mdsc, NULL, req);
|
||||
switch (err) {
|
||||
|
||||
@@ -305,7 +305,8 @@ static int frag_tree_split_cmp(const void *l, const void *r)
|
||||
{
|
||||
struct ceph_frag_tree_split *ls = (struct ceph_frag_tree_split*)l;
|
||||
struct ceph_frag_tree_split *rs = (struct ceph_frag_tree_split*)r;
|
||||
return ceph_frag_compare(ls->frag, rs->frag);
|
||||
return ceph_frag_compare(le32_to_cpu(ls->frag),
|
||||
le32_to_cpu(rs->frag));
|
||||
}
|
||||
|
||||
static bool is_frag_child(u32 f, struct ceph_inode_frag *frag)
|
||||
|
||||
@@ -288,12 +288,13 @@ static int parse_reply_info_extra(void **p, void *end,
|
||||
struct ceph_mds_reply_info_parsed *info,
|
||||
u64 features)
|
||||
{
|
||||
if (info->head->op == CEPH_MDS_OP_GETFILELOCK)
|
||||
u32 op = le32_to_cpu(info->head->op);
|
||||
|
||||
if (op == CEPH_MDS_OP_GETFILELOCK)
|
||||
return parse_reply_info_filelock(p, end, info, features);
|
||||
else if (info->head->op == CEPH_MDS_OP_READDIR ||
|
||||
info->head->op == CEPH_MDS_OP_LSSNAP)
|
||||
else if (op == CEPH_MDS_OP_READDIR || op == CEPH_MDS_OP_LSSNAP)
|
||||
return parse_reply_info_dir(p, end, info, features);
|
||||
else if (info->head->op == CEPH_MDS_OP_CREATE)
|
||||
else if (op == CEPH_MDS_OP_CREATE)
|
||||
return parse_reply_info_create(p, end, info, features);
|
||||
else
|
||||
return -EIO;
|
||||
|
||||
@@ -2025,7 +2025,6 @@ static void end_requests(struct fuse_conn *fc, struct list_head *head)
|
||||
struct fuse_req *req;
|
||||
req = list_entry(head->next, struct fuse_req, list);
|
||||
req->out.h.error = -ECONNABORTED;
|
||||
clear_bit(FR_PENDING, &req->flags);
|
||||
clear_bit(FR_SENT, &req->flags);
|
||||
list_del_init(&req->list);
|
||||
request_end(fc, req);
|
||||
@@ -2103,6 +2102,8 @@ void fuse_abort_conn(struct fuse_conn *fc)
|
||||
spin_lock(&fiq->waitq.lock);
|
||||
fiq->connected = 0;
|
||||
list_splice_init(&fiq->pending, &to_end2);
|
||||
list_for_each_entry(req, &to_end2, list)
|
||||
clear_bit(FR_PENDING, &req->flags);
|
||||
while (forget_pending(fiq))
|
||||
kfree(dequeue_forget(fiq, 1, NULL));
|
||||
wake_up_all_locked(&fiq->waitq);
|
||||
|
||||
@@ -68,7 +68,7 @@ static u64 time_to_jiffies(u64 sec, u32 nsec)
|
||||
if (sec || nsec) {
|
||||
struct timespec64 ts = {
|
||||
sec,
|
||||
max_t(u32, nsec, NSEC_PER_SEC - 1)
|
||||
min_t(u32, nsec, NSEC_PER_SEC - 1)
|
||||
};
|
||||
|
||||
return get_jiffies_64() + timespec64_to_jiffies(&ts);
|
||||
|
||||
@@ -922,11 +922,10 @@ int simple_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
||||
int error;
|
||||
|
||||
if (type == ACL_TYPE_ACCESS) {
|
||||
error = posix_acl_equiv_mode(acl, &inode->i_mode);
|
||||
if (error < 0)
|
||||
return 0;
|
||||
if (error == 0)
|
||||
acl = NULL;
|
||||
error = posix_acl_update_mode(inode,
|
||||
&inode->i_mode, &acl);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
|
||||
@@ -34,6 +34,11 @@
|
||||
#include <linux/slab.h>
|
||||
#include "ubifs.h"
|
||||
|
||||
static int try_read_node(const struct ubifs_info *c, void *buf, int type,
|
||||
int len, int lnum, int offs);
|
||||
static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
|
||||
struct ubifs_zbranch *zbr, void *node);
|
||||
|
||||
/*
|
||||
* Returned codes of 'matches_name()' and 'fallible_matches_name()' functions.
|
||||
* @NAME_LESS: name corresponding to the first argument is less than second
|
||||
@@ -402,7 +407,19 @@ static int tnc_read_node_nm(struct ubifs_info *c, struct ubifs_zbranch *zbr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = ubifs_tnc_read_node(c, zbr, node);
|
||||
if (c->replaying) {
|
||||
err = fallible_read_node(c, &zbr->key, zbr, node);
|
||||
/*
|
||||
* When the node was not found, return -ENOENT, 0 otherwise.
|
||||
* Negative return codes stay as-is.
|
||||
*/
|
||||
if (err == 0)
|
||||
err = -ENOENT;
|
||||
else if (err == 1)
|
||||
err = 0;
|
||||
} else {
|
||||
err = ubifs_tnc_read_node(c, zbr, node);
|
||||
}
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -2766,7 +2783,11 @@ struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c,
|
||||
if (nm->name) {
|
||||
if (err) {
|
||||
/* Handle collisions */
|
||||
err = resolve_collision(c, key, &znode, &n, nm);
|
||||
if (c->replaying)
|
||||
err = fallible_resolve_collision(c, key, &znode, &n,
|
||||
nm, 0);
|
||||
else
|
||||
err = resolve_collision(c, key, &znode, &n, nm);
|
||||
dbg_tnc("rc returned %d, znode %p, n %d",
|
||||
err, znode, n);
|
||||
if (unlikely(err < 0))
|
||||
|
||||
@@ -20,8 +20,7 @@
|
||||
#define R8A7794_CLK_QSPI 5
|
||||
#define R8A7794_CLK_SDH 6
|
||||
#define R8A7794_CLK_SD0 7
|
||||
#define R8A7794_CLK_Z 8
|
||||
#define R8A7794_CLK_RCAN 9
|
||||
#define R8A7794_CLK_RCAN 8
|
||||
|
||||
/* MSTP0 */
|
||||
#define R8A7794_CLK_MSIOF0 0
|
||||
|
||||
@@ -444,6 +444,10 @@ bool __rcu_is_watching(void);
|
||||
#error "Unknown RCU implementation specified to kernel configuration"
|
||||
#endif
|
||||
|
||||
#define RCU_SCHEDULER_INACTIVE 0
|
||||
#define RCU_SCHEDULER_INIT 1
|
||||
#define RCU_SCHEDULER_RUNNING 2
|
||||
|
||||
/*
|
||||
* init_rcu_head_on_stack()/destroy_rcu_head_on_stack() are needed for dynamic
|
||||
* initialization and destruction of rcu_head on the stack. rcu_head structures
|
||||
|
||||
@@ -66,6 +66,7 @@ struct svc_xprt {
|
||||
#define XPT_LISTENER 10 /* listening endpoint */
|
||||
#define XPT_CACHE_AUTH 11 /* cache auth info */
|
||||
#define XPT_LOCAL 12 /* connection from loopback interface */
|
||||
#define XPT_KILL_TEMP 13 /* call xpo_kill_temp_xprt before closing */
|
||||
|
||||
struct svc_serv *xpt_server; /* service for transport */
|
||||
atomic_t xpt_reserved; /* space on outq that is rsvd */
|
||||
|
||||
@@ -9,7 +9,13 @@ struct device;
|
||||
struct page;
|
||||
struct scatterlist;
|
||||
|
||||
extern int swiotlb_force;
|
||||
enum swiotlb_force {
|
||||
SWIOTLB_NORMAL, /* Default - depending on HW DMA mask etc. */
|
||||
SWIOTLB_FORCE, /* swiotlb=force */
|
||||
SWIOTLB_NO_FORCE, /* swiotlb=noforce */
|
||||
};
|
||||
|
||||
extern enum swiotlb_force swiotlb_force;
|
||||
|
||||
/*
|
||||
* Maximum allowable number of contiguous slabs to map,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user