mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 22:52:35 +02:00
Merge branch 'linux-linaro-lsk-v3.10' into linux-linaro-lsk-v3.10-android
Conflicts:
fs/exec.c
Resolution summary:
Conflict between upstream/LTS commit 9eae8ac6ab (fs: take
i_mutex during prepare_binprm for set[ug]id executables) and
android commit 9d0ff694bc (sched: move no_new_privs into new
atomic flags). Resolution: move task_no_new_privs() usage into
new function created by upstream/LTS comit.
This commit is contained in:
commit
4dddf72053
|
|
@ -91,5 +91,5 @@ mpp61 61 gpo, dev(wen1), uart1(txd), audio(rclk)
|
|||
mpp62 62 gpio, dev(a2), uart1(cts), tdm(drx), pcie(clkreq0),
|
||||
audio(mclk), uart0(cts)
|
||||
mpp63 63 gpo, spi0(sck), tclk
|
||||
mpp64 64 gpio, spi0(miso), spi0-1(cs1)
|
||||
mpp65 65 gpio, spi0(mosi), spi0-1(cs2)
|
||||
mpp64 64 gpio, spi0(miso), spi0(cs1)
|
||||
mpp65 65 gpio, spi0(mosi), spi0(cs2)
|
||||
|
|
|
|||
|
|
@ -41,15 +41,15 @@ mpp20 20 gpio, ge0(rxd4), ge1(rxd2), lcd(d20), ptp(clk)
|
|||
mpp21 21 gpio, ge0(rxd5), ge1(rxd3), lcd(d21), mem(bat)
|
||||
mpp22 22 gpio, ge0(rxd6), ge1(rxctl), lcd(d22), sata0(prsnt)
|
||||
mpp23 23 gpio, ge0(rxd7), ge1(rxclk), lcd(d23), sata1(prsnt)
|
||||
mpp24 24 gpio, lcd(hsync), sata1(prsnt), nf(bootcs-re), tdm(rst)
|
||||
mpp25 25 gpio, lcd(vsync), sata0(prsnt), nf(bootcs-we), tdm(pclk)
|
||||
mpp26 26 gpio, lcd(clk), tdm(fsync), vdd(cpu1-pd)
|
||||
mpp24 24 gpio, lcd(hsync), sata1(prsnt), tdm(rst)
|
||||
mpp25 25 gpio, lcd(vsync), sata0(prsnt), tdm(pclk)
|
||||
mpp26 26 gpio, lcd(clk), tdm(fsync)
|
||||
mpp27 27 gpio, lcd(e), tdm(dtx), ptp(trig)
|
||||
mpp28 28 gpio, lcd(pwm), tdm(drx), ptp(evreq)
|
||||
mpp29 29 gpio, lcd(ref-clk), tdm(int0), ptp(clk), vdd(cpu0-pd)
|
||||
mpp29 29 gpio, lcd(ref-clk), tdm(int0), ptp(clk)
|
||||
mpp30 30 gpio, tdm(int1), sd0(clk)
|
||||
mpp31 31 gpio, tdm(int2), sd0(cmd), vdd(cpu0-pd)
|
||||
mpp32 32 gpio, tdm(int3), sd0(d0), vdd(cpu1-pd)
|
||||
mpp31 31 gpio, tdm(int2), sd0(cmd)
|
||||
mpp32 32 gpio, tdm(int3), sd0(d0)
|
||||
mpp33 33 gpio, tdm(int4), sd0(d1), mem(bat)
|
||||
mpp34 34 gpio, tdm(int5), sd0(d2), sata0(prsnt)
|
||||
mpp35 35 gpio, tdm(int6), sd0(d3), sata1(prsnt)
|
||||
|
|
@ -57,21 +57,18 @@ mpp36 36 gpio, spi(mosi)
|
|||
mpp37 37 gpio, spi(miso)
|
||||
mpp38 38 gpio, spi(sck)
|
||||
mpp39 39 gpio, spi(cs0)
|
||||
mpp40 40 gpio, spi(cs1), uart2(cts), lcd(vga-hsync), vdd(cpu1-pd),
|
||||
pcie(clkreq0)
|
||||
mpp40 40 gpio, spi(cs1), uart2(cts), lcd(vga-hsync), pcie(clkreq0)
|
||||
mpp41 41 gpio, spi(cs2), uart2(rts), lcd(vga-vsync), sata1(prsnt),
|
||||
pcie(clkreq1)
|
||||
mpp42 42 gpio, uart2(rxd), uart0(cts), tdm(int7), tdm-1(timer),
|
||||
vdd(cpu0-pd)
|
||||
mpp43 43 gpio, uart2(txd), uart0(rts), spi(cs3), pcie(rstout),
|
||||
vdd(cpu2-3-pd){1}
|
||||
mpp42 42 gpio, uart2(rxd), uart0(cts), tdm(int7), tdm-1(timer)
|
||||
mpp43 43 gpio, uart2(txd), uart0(rts), spi(cs3), pcie(rstout)
|
||||
mpp44 44 gpio, uart2(cts), uart3(rxd), spi(cs4), pcie(clkreq2),
|
||||
mem(bat)
|
||||
mpp45 45 gpio, uart2(rts), uart3(txd), spi(cs5), sata1(prsnt)
|
||||
mpp46 46 gpio, uart3(rts), uart1(rts), spi(cs6), sata0(prsnt)
|
||||
mpp47 47 gpio, uart3(cts), uart1(cts), spi(cs7), pcie(clkreq3),
|
||||
ref(clkout)
|
||||
mpp48 48 gpio, tclk, dev(burst/last)
|
||||
mpp48 48 gpio, dev(clkout), dev(burst/last)
|
||||
|
||||
* Marvell Armada XP (mv78260 and mv78460 only)
|
||||
|
||||
|
|
@ -83,9 +80,9 @@ mpp51 51 gpio, dev(ad16)
|
|||
mpp52 52 gpio, dev(ad17)
|
||||
mpp53 53 gpio, dev(ad18)
|
||||
mpp54 54 gpio, dev(ad19)
|
||||
mpp55 55 gpio, dev(ad20), vdd(cpu0-pd)
|
||||
mpp56 56 gpio, dev(ad21), vdd(cpu1-pd)
|
||||
mpp57 57 gpio, dev(ad22), vdd(cpu2-3-pd){1}
|
||||
mpp55 55 gpio, dev(ad20)
|
||||
mpp56 56 gpio, dev(ad21)
|
||||
mpp57 57 gpio, dev(ad22)
|
||||
mpp58 58 gpio, dev(ad23)
|
||||
mpp59 59 gpio, dev(ad24)
|
||||
mpp60 60 gpio, dev(ad25)
|
||||
|
|
@ -95,6 +92,3 @@ mpp63 63 gpio, dev(ad28)
|
|||
mpp64 64 gpio, dev(ad29)
|
||||
mpp65 65 gpio, dev(ad30)
|
||||
mpp66 66 gpio, dev(ad31)
|
||||
|
||||
Notes:
|
||||
* {1} vdd(cpu2-3-pd) only available on mv78460.
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ Required properties:
|
|||
- compatible : "arm,pl022", "arm,primecell"
|
||||
- reg : Offset and length of the register set for the device
|
||||
- interrupts : Should contain SPI controller interrupt
|
||||
- num-cs : total number of chipselects
|
||||
|
||||
Optional properties:
|
||||
- num-cs : total number of chipselects
|
||||
- cs-gpios : should specify GPIOs used for chipselects.
|
||||
The gpios will be referred to as reg = <index> in the SPI child nodes.
|
||||
If unspecified, a single SPI device without a chip select can be used.
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 80
|
||||
SUBLEVEL = 86
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -25,10 +25,11 @@ __cmpxchg(volatile void *ptr, unsigned long expected, unsigned long new)
|
|||
" scond %3, [%1] \n"
|
||||
" bnz 1b \n"
|
||||
"2: \n"
|
||||
: "=&r"(prev)
|
||||
: "r"(ptr), "ir"(expected),
|
||||
"r"(new) /* can't be "ir". scond can't take limm for "b" */
|
||||
: "cc");
|
||||
: "=&r"(prev) /* Early clobber, to prevent reg reuse */
|
||||
: "r"(ptr), /* Not "m": llock only supports reg direct addr mode */
|
||||
"ir"(expected),
|
||||
"r"(new) /* can't be "ir". scond can't take LIMM for "b" */
|
||||
: "cc", "memory"); /* so that gcc knows memory is being written here */
|
||||
|
||||
return prev;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ struct callee_regs {
|
|||
long r13;
|
||||
};
|
||||
|
||||
#define instruction_pointer(regs) ((regs)->ret)
|
||||
#define instruction_pointer(regs) (unsigned long)((regs)->ret)
|
||||
#define profile_pc(regs) instruction_pointer(regs)
|
||||
|
||||
/* return 1 if user mode or 0 if kernel mode */
|
||||
|
|
|
|||
|
|
@ -159,13 +159,9 @@ __kvm_vcpu_return:
|
|||
@ Don't trap coprocessor accesses for host kernel
|
||||
set_hstr vmexit
|
||||
set_hdcr vmexit
|
||||
set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), after_vfp_restore
|
||||
|
||||
#ifdef CONFIG_VFPv3
|
||||
@ Save floating point registers we if let guest use them.
|
||||
tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
bne after_vfp_restore
|
||||
|
||||
@ Switch VFP/NEON hardware state to the host's
|
||||
add r7, vcpu, #VCPU_VFP_GUEST
|
||||
store_vfp_state r7
|
||||
|
|
@ -177,6 +173,8 @@ after_vfp_restore:
|
|||
@ Restore FPEXC_EN which we clobbered on entry
|
||||
pop {r2}
|
||||
VFPFMXR FPEXC, r2
|
||||
#else
|
||||
after_vfp_restore:
|
||||
#endif
|
||||
|
||||
@ Reset Hyp-role
|
||||
|
|
@ -472,7 +470,7 @@ switch_to_guest_vfp:
|
|||
push {r3-r7}
|
||||
|
||||
@ NEON/VFP used. Turn on VFP access.
|
||||
set_hcptr vmexit, (HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
|
||||
@ Switch VFP/NEON hardware state to the guest's
|
||||
add r7, r0, #VCPU_VFP_HOST
|
||||
|
|
|
|||
|
|
@ -592,8 +592,13 @@ ARM_BE8(rev r6, r6 )
|
|||
.endm
|
||||
|
||||
/* Configures the HCPTR (Hyp Coprocessor Trap Register) on entry/return
|
||||
* (hardware reset value is 0). Keep previous value in r2. */
|
||||
.macro set_hcptr operation, mask
|
||||
* (hardware reset value is 0). Keep previous value in r2.
|
||||
* An ISB is emited on vmexit/vmtrap, but executed on vmexit only if
|
||||
* VFP wasn't already enabled (always executed on vmtrap).
|
||||
* If a label is specified with vmexit, it is branched to if VFP wasn't
|
||||
* enabled.
|
||||
*/
|
||||
.macro set_hcptr operation, mask, label = none
|
||||
mrc p15, 4, r2, c1, c1, 2
|
||||
ldr r3, =\mask
|
||||
.if \operation == vmentry
|
||||
|
|
@ -602,6 +607,17 @@ ARM_BE8(rev r6, r6 )
|
|||
bic r3, r2, r3 @ Don't trap defined coproc-accesses
|
||||
.endif
|
||||
mcr p15, 4, r3, c1, c1, 2
|
||||
.if \operation != vmentry
|
||||
.if \operation == vmexit
|
||||
tst r2, #(HCPTR_TCP(10) | HCPTR_TCP(11))
|
||||
beq 1f
|
||||
.endif
|
||||
isb
|
||||
.if \label != none
|
||||
b \label
|
||||
.endif
|
||||
1:
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* Configures the HDCR (Hyp Debug Configuration Register) on entry/return
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@ void __init dove_init_early(void)
|
|||
orion_time_set_base(TIMER_VIRT_BASE);
|
||||
mvebu_mbus_init("marvell,dove-mbus",
|
||||
BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
|
||||
DOVE_MC_WINS_BASE, DOVE_MC_WINS_SZ);
|
||||
DOVE_MC_WINS_BASE, DOVE_MC_WINS_SZ, 0);
|
||||
}
|
||||
|
||||
static int __init dove_find_tclk(void)
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ int __init mx6q_clocks_init(void)
|
|||
clk[gpmi_io] = imx_clk_gate2("gpmi_io", "enfc", base + 0x78, 28);
|
||||
clk[gpmi_apb] = imx_clk_gate2("gpmi_apb", "usdhc3", base + 0x78, 30);
|
||||
clk[rom] = imx_clk_gate2("rom", "ahb", base + 0x7c, 0);
|
||||
clk[sata] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4);
|
||||
clk[sata] = imx_clk_gate2("sata", "ahb", base + 0x7c, 4);
|
||||
clk[sdma] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6);
|
||||
clk[spba] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12);
|
||||
clk[ssi1_ipg] = imx_clk_gate2("ssi1_ipg", "ipg", base + 0x7c, 18);
|
||||
|
|
|
|||
|
|
@ -530,7 +530,7 @@ void __init kirkwood_init_early(void)
|
|||
|
||||
mvebu_mbus_init("marvell,kirkwood-mbus",
|
||||
BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
|
||||
DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ);
|
||||
DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ, 0);
|
||||
}
|
||||
|
||||
int kirkwood_tclk;
|
||||
|
|
|
|||
|
|
@ -337,11 +337,11 @@ void __init mv78xx0_init_early(void)
|
|||
if (mv78xx0_core_index() == 0)
|
||||
mvebu_mbus_init("marvell,mv78xx0-mbus",
|
||||
BRIDGE_WINS_CPU0_BASE, BRIDGE_WINS_SZ,
|
||||
DDR_WINDOW_CPU0_BASE, DDR_WINDOW_CPU_SZ);
|
||||
DDR_WINDOW_CPU0_BASE, DDR_WINDOW_CPU_SZ, 0);
|
||||
else
|
||||
mvebu_mbus_init("marvell,mv78xx0-mbus",
|
||||
BRIDGE_WINS_CPU1_BASE, BRIDGE_WINS_SZ,
|
||||
DDR_WINDOW_CPU1_BASE, DDR_WINDOW_CPU_SZ);
|
||||
DDR_WINDOW_CPU1_BASE, DDR_WINDOW_CPU_SZ, 0);
|
||||
}
|
||||
|
||||
void __init_refok mv78xx0_timer_init(void)
|
||||
|
|
|
|||
|
|
@ -66,7 +66,8 @@ void __init armada_370_xp_init_early(void)
|
|||
ARMADA_370_XP_MBUS_WINS_BASE,
|
||||
ARMADA_370_XP_MBUS_WINS_SIZE,
|
||||
ARMADA_370_XP_SDRAM_WINS_BASE,
|
||||
ARMADA_370_XP_SDRAM_WINS_SIZE);
|
||||
ARMADA_370_XP_SDRAM_WINS_SIZE,
|
||||
coherency_available());
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
l2x0_of_init(0, ~0UL);
|
||||
|
|
|
|||
|
|
@ -137,6 +137,20 @@ static struct notifier_block mvebu_hwcc_platform_nb = {
|
|||
.notifier_call = mvebu_hwcc_platform_notifier,
|
||||
};
|
||||
|
||||
/*
|
||||
* Keep track of whether we have IO hardware coherency enabled or not.
|
||||
* On Armada 370's we will not be using it for example. We need to make
|
||||
* that available [through coherency_available()] so the mbus controller
|
||||
* doesn't enable the IO coherency bit in the attribute bits of the
|
||||
* chip selects.
|
||||
*/
|
||||
static int coherency_enabled;
|
||||
|
||||
int coherency_available(void)
|
||||
{
|
||||
return coherency_enabled;
|
||||
}
|
||||
|
||||
int __init coherency_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
|
@ -170,6 +184,7 @@ int __init coherency_init(void)
|
|||
coherency_base = of_iomap(np, 0);
|
||||
coherency_cpu_base = of_iomap(np, 1);
|
||||
set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
|
||||
coherency_enabled = 1;
|
||||
bus_register_notifier(&platform_bus_type,
|
||||
&mvebu_hwcc_platform_nb);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ int coherency_get_cpu_count(void);
|
|||
#endif
|
||||
|
||||
int set_cpu_coherent(int cpu_id, int smp_group_id);
|
||||
int coherency_available(void);
|
||||
int coherency_init(void);
|
||||
|
||||
#endif /* __MACH_370_XP_COHERENCY_H */
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ void __init orion5x_init_early(void)
|
|||
mbus_soc_name = NULL;
|
||||
mvebu_mbus_init(mbus_soc_name, ORION5X_BRIDGE_WINS_BASE,
|
||||
ORION5X_BRIDGE_WINS_SZ,
|
||||
ORION5X_DDR_WINS_BASE, ORION5X_DDR_WINS_SZ);
|
||||
ORION5X_DDR_WINS_BASE, ORION5X_DDR_WINS_SZ, 0);
|
||||
}
|
||||
|
||||
void orion5x_setup_wins(void)
|
||||
|
|
|
|||
|
|
@ -15,6 +15,10 @@ ccflags-y := -shared -fno-common -fno-builtin
|
|||
ccflags-y += -nostdlib -Wl,-soname=linux-vdso.so.1 \
|
||||
$(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
|
||||
|
||||
# Workaround for bare-metal (ELF) toolchains that neglect to pass -shared
|
||||
# down to collect2, resulting in silent corruption of the vDSO image.
|
||||
ccflags-y += -Wl,-shared
|
||||
|
||||
obj-y += vdso.o
|
||||
extra-y += vdso.lds vdso-offsets.h
|
||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||
|
|
|
|||
|
|
@ -92,6 +92,14 @@ static void reset_context(void *info)
|
|||
unsigned int cpu = smp_processor_id();
|
||||
struct mm_struct *mm = current->active_mm;
|
||||
|
||||
/*
|
||||
* current->active_mm could be init_mm for the idle thread immediately
|
||||
* after secondary CPU boot or hotplug. TTBR0_EL1 is already set to
|
||||
* the reserved value, so no need to reset any context.
|
||||
*/
|
||||
if (mm == &init_mm)
|
||||
return;
|
||||
|
||||
smp_rmb();
|
||||
asid = cpu_last_asid + cpu;
|
||||
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ static void __init free_unused_memmap(void)
|
|||
* memmap entries are valid from the bank end aligned to
|
||||
* MAX_ORDER_NR_PAGES.
|
||||
*/
|
||||
prev_end = ALIGN(start + __phys_to_pfn(reg->size),
|
||||
prev_end = ALIGN(__phys_to_pfn(reg->base + reg->size),
|
||||
MAX_ORDER_NR_PAGES);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,11 @@
|
|||
#endif
|
||||
|
||||
#ifndef FIXADDR_TOP
|
||||
#ifdef CONFIG_KVM_GUEST
|
||||
#define FIXADDR_TOP ((unsigned long)(long)(int)0x7ffe0000)
|
||||
#else
|
||||
#define FIXADDR_TOP ((unsigned long)(long)(int)0xfffe0000)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_MACH_GENERIC_SPACES_H */
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ void __init init_IRQ(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEBUG_STACKOVERFLOW
|
||||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
static inline void check_stack_overflow(void)
|
||||
{
|
||||
unsigned long sp;
|
||||
|
|
|
|||
|
|
@ -1626,7 +1626,7 @@ kvm_mips_complete_mmio_load(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||
if (vcpu->mmio_needed == 2)
|
||||
*gpr = *(int16_t *) run->mmio.data;
|
||||
else
|
||||
*gpr = *(int16_t *) run->mmio.data;
|
||||
*gpr = *(uint16_t *)run->mmio.data;
|
||||
|
||||
break;
|
||||
case 1:
|
||||
|
|
|
|||
|
|
@ -112,7 +112,16 @@ static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}
|
|||
|
||||
static bool regs_use_siar(struct pt_regs *regs)
|
||||
{
|
||||
return !!regs->result;
|
||||
/*
|
||||
* When we take a performance monitor exception the regs are setup
|
||||
* using perf_read_regs() which overloads some fields, in particular
|
||||
* regs->result to tell us whether to use SIAR.
|
||||
*
|
||||
* However if the regs are from another exception, eg. a syscall, then
|
||||
* they have not been setup using perf_read_regs() and so regs->result
|
||||
* is something random.
|
||||
*/
|
||||
return ((TRAP(regs) == 0xf00) && regs->result);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -276,6 +276,8 @@ ENTRY(_sclp_print_early)
|
|||
jno .Lesa2
|
||||
ahi %r15,-80
|
||||
stmh %r6,%r15,96(%r15) # store upper register halves
|
||||
basr %r13,0
|
||||
lmh %r0,%r15,.Lzeroes-.(%r13) # clear upper register halves
|
||||
.Lesa2:
|
||||
#endif
|
||||
lr %r10,%r2 # save string pointer
|
||||
|
|
@ -299,6 +301,8 @@ ENTRY(_sclp_print_early)
|
|||
#endif
|
||||
lm %r6,%r15,120(%r15) # restore registers
|
||||
br %r14
|
||||
.Lzeroes:
|
||||
.fill 64,4,0
|
||||
|
||||
.LwritedataS4:
|
||||
.long 0x00760005 # SCLP command for write data
|
||||
|
|
|
|||
|
|
@ -2306,7 +2306,7 @@ void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len,
|
|||
if (len & (8UL - 1))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
buf = kzalloc(len, GFP_KERNEL);
|
||||
buf = kzalloc(len, GFP_ATOMIC);
|
||||
if (!buf)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
|
|
|
|||
|
|
@ -1064,7 +1064,7 @@ static void __init load_hv_initrd(void)
|
|||
|
||||
void __init free_initrd_mem(unsigned long begin, unsigned long end)
|
||||
{
|
||||
free_bootmem(__pa(begin), end - begin);
|
||||
free_bootmem_late(__pa(begin), end - begin);
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ config SBUS
|
|||
|
||||
config NEED_DMA_MAP_STATE
|
||||
def_bool y
|
||||
depends on X86_64 || INTEL_IOMMU || DMA_API_DEBUG
|
||||
depends on X86_64 || INTEL_IOMMU || DMA_API_DEBUG || SWIOTLB
|
||||
|
||||
config NEED_SG_DMA_LENGTH
|
||||
def_bool y
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ ENTRY(efi_pe_entry)
|
|||
call reloc
|
||||
reloc:
|
||||
popl %ecx
|
||||
subl reloc, %ecx
|
||||
subl $reloc, %ecx
|
||||
movl %ecx, BP_code32_start(%eax)
|
||||
|
||||
sub $0x4, %esp
|
||||
|
|
|
|||
|
|
@ -544,7 +544,7 @@ struct kvm_arch {
|
|||
struct kvm_pic *vpic;
|
||||
struct kvm_ioapic *vioapic;
|
||||
struct kvm_pit *vpit;
|
||||
int vapics_in_nmi_mode;
|
||||
atomic_t vapics_in_nmi_mode;
|
||||
struct mutex apic_map_lock;
|
||||
struct kvm_apic_map *apic_map;
|
||||
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ get_matching_model_microcode(int cpu, unsigned long start,
|
|||
unsigned int mc_saved_count = mc_saved_data->mc_saved_count;
|
||||
int i;
|
||||
|
||||
while (leftover) {
|
||||
while (leftover && mc_saved_count < ARRAY_SIZE(mc_saved_tmp)) {
|
||||
mc_header = (struct microcode_header_intel *)ucode_ptr;
|
||||
|
||||
mc_size = get_totalsize(mc_header);
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ static void pit_do_work(struct kthread_work *work)
|
|||
* LVT0 to NMI delivery. Other PIC interrupts are just sent to
|
||||
* VCPU0, and only if its LVT0 is in EXTINT mode.
|
||||
*/
|
||||
if (kvm->arch.vapics_in_nmi_mode > 0)
|
||||
if (atomic_read(&kvm->arch.vapics_in_nmi_mode) > 0)
|
||||
kvm_for_each_vcpu(i, vcpu, kvm)
|
||||
kvm_apic_nmi_wd_deliver(vcpu);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1123,10 +1123,10 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val)
|
|||
if (!nmi_wd_enabled) {
|
||||
apic_debug("Receive NMI setting on APIC_LVT0 "
|
||||
"for cpu %d\n", apic->vcpu->vcpu_id);
|
||||
apic->vcpu->kvm->arch.vapics_in_nmi_mode++;
|
||||
atomic_inc(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
|
||||
}
|
||||
} else if (nmi_wd_enabled)
|
||||
apic->vcpu->kvm->arch.vapics_in_nmi_mode--;
|
||||
atomic_dec(&apic->vcpu->kvm->arch.vapics_in_nmi_mode);
|
||||
}
|
||||
|
||||
static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
|
||||
|
|
|
|||
|
|
@ -495,8 +495,10 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu)
|
|||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
if (svm->vmcb->control.next_rip != 0)
|
||||
if (svm->vmcb->control.next_rip != 0) {
|
||||
WARN_ON(!static_cpu_has(X86_FEATURE_NRIPS));
|
||||
svm->next_rip = svm->vmcb->control.next_rip;
|
||||
}
|
||||
|
||||
if (!svm->next_rip) {
|
||||
if (emulate_instruction(vcpu, EMULTYPE_SKIP) !=
|
||||
|
|
@ -4229,7 +4231,9 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
|
|||
break;
|
||||
}
|
||||
|
||||
vmcb->control.next_rip = info->next_rip;
|
||||
/* TODO: Advertise NRIPS to guest hypervisor unconditionally */
|
||||
if (static_cpu_has(X86_FEATURE_NRIPS))
|
||||
vmcb->control.next_rip = info->next_rip;
|
||||
vmcb->control.exit_code = icpt_info.exit_code;
|
||||
vmexit = nested_svm_exit_handled(svm);
|
||||
|
||||
|
|
|
|||
|
|
@ -84,6 +84,17 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
|
|||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
|
||||
},
|
||||
},
|
||||
/* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/931368 */
|
||||
/* https://bugs.launchpad.net/ubuntu/+source/alsa-driver/+bug/1033299 */
|
||||
{
|
||||
.callback = set_use_crs,
|
||||
.ident = "Foxconn K8M890-8237A",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Foxconn"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "K8M890-8237A"),
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
|
||||
},
|
||||
},
|
||||
|
||||
/* Now for the blacklist.. */
|
||||
|
||||
|
|
|
|||
|
|
@ -720,8 +720,12 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
|||
return -EINVAL;
|
||||
|
||||
disk = get_gendisk(MKDEV(major, minor), &part);
|
||||
if (!disk || part)
|
||||
if (!disk)
|
||||
return -EINVAL;
|
||||
if (part) {
|
||||
put_disk(disk);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
spin_lock_irq(disk->queue->queue_lock);
|
||||
|
|
|
|||
|
|
@ -422,9 +422,9 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
|||
/* allocate ext devt */
|
||||
idr_preload(GFP_KERNEL);
|
||||
|
||||
spin_lock(&ext_devt_lock);
|
||||
spin_lock_bh(&ext_devt_lock);
|
||||
idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_NOWAIT);
|
||||
spin_unlock(&ext_devt_lock);
|
||||
spin_unlock_bh(&ext_devt_lock);
|
||||
|
||||
idr_preload_end();
|
||||
if (idx < 0)
|
||||
|
|
@ -449,9 +449,9 @@ void blk_free_devt(dev_t devt)
|
|||
return;
|
||||
|
||||
if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
|
||||
spin_lock(&ext_devt_lock);
|
||||
spin_lock_bh(&ext_devt_lock);
|
||||
idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||
spin_unlock(&ext_devt_lock);
|
||||
spin_unlock_bh(&ext_devt_lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -691,13 +691,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
|
|||
} else {
|
||||
struct hd_struct *part;
|
||||
|
||||
spin_lock(&ext_devt_lock);
|
||||
spin_lock_bh(&ext_devt_lock);
|
||||
part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
|
||||
if (part && get_disk(part_to_disk(part))) {
|
||||
*partno = part->partno;
|
||||
disk = part_to_disk(part);
|
||||
}
|
||||
spin_unlock(&ext_devt_lock);
|
||||
spin_unlock_bh(&ext_devt_lock);
|
||||
}
|
||||
|
||||
return disk;
|
||||
|
|
|
|||
|
|
@ -63,19 +63,15 @@
|
|||
#define ACPI_SET64(ptr, val) (*ACPI_CAST64 (ptr) = (u64) (val))
|
||||
|
||||
/*
|
||||
* printf() format helpers
|
||||
* printf() format helper. This macros is a workaround for the difficulties
|
||||
* with emitting 64-bit integers and 64-bit pointers with the same code
|
||||
* for both 32-bit and 64-bit hosts.
|
||||
*/
|
||||
|
||||
/* Split 64-bit integer into two 32-bit values. Use with %8.8X%8.8X */
|
||||
|
||||
#define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i), ACPI_LODWORD(i)
|
||||
|
||||
#if ACPI_MACHINE_WIDTH == 64
|
||||
#define ACPI_FORMAT_NATIVE_UINT(i) ACPI_FORMAT_UINT64(i)
|
||||
#else
|
||||
#define ACPI_FORMAT_NATIVE_UINT(i) 0, (i)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Macros for moving data around to/from buffers that are possibly unaligned.
|
||||
* If the hardware supports the transfer of unaligned data, just do the store.
|
||||
|
|
|
|||
|
|
@ -446,7 +446,7 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
|
||||
obj_desc,
|
||||
ACPI_FORMAT_NATIVE_UINT(obj_desc->region.address),
|
||||
ACPI_FORMAT_UINT64(obj_desc->region.address),
|
||||
obj_desc->region.length));
|
||||
|
||||
/* Now the address and length are valid for this opregion */
|
||||
|
|
@ -544,7 +544,7 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
|
||||
obj_desc,
|
||||
ACPI_FORMAT_NATIVE_UINT(obj_desc->region.address),
|
||||
ACPI_FORMAT_UINT64(obj_desc->region.address),
|
||||
obj_desc->region.length));
|
||||
|
||||
/* Now the address and length are valid for this opregion */
|
||||
|
|
|
|||
|
|
@ -276,7 +276,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
|
||||
®ion_obj->region.handler->address_space, handler,
|
||||
ACPI_FORMAT_NATIVE_UINT(address),
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
acpi_ut_get_region_name(region_obj->region.
|
||||
space_id)));
|
||||
|
||||
|
|
|
|||
|
|
@ -621,8 +621,8 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
acpi_os_printf("\n");
|
||||
} else {
|
||||
acpi_os_printf(" base %8.8X%8.8X Length %X\n",
|
||||
ACPI_FORMAT_NATIVE_UINT(obj_desc->region.
|
||||
address),
|
||||
ACPI_FORMAT_UINT64(obj_desc->region.
|
||||
address),
|
||||
obj_desc->region.length);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -269,17 +269,15 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc,
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_BFIELD,
|
||||
" Region [%s:%X], Width %X, ByteBase %X, Offset %X at %p\n",
|
||||
" Region [%s:%X], Width %X, ByteBase %X, Offset %X at %8.8X%8.8X\n",
|
||||
acpi_ut_get_region_name(rgn_desc->region.
|
||||
space_id),
|
||||
rgn_desc->region.space_id,
|
||||
obj_desc->common_field.access_byte_width,
|
||||
obj_desc->common_field.base_byte_offset,
|
||||
field_datum_byte_offset, ACPI_CAST_PTR(void,
|
||||
(rgn_desc->
|
||||
region.
|
||||
address +
|
||||
region_offset))));
|
||||
field_datum_byte_offset,
|
||||
ACPI_FORMAT_UINT64(rgn_desc->region.address +
|
||||
region_offset)));
|
||||
|
||||
/* Invoke the appropriate address_space/op_region handler */
|
||||
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
if (!mem_info->mapped_logical_address) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not map memory at 0x%8.8X%8.8X, size %u",
|
||||
ACPI_FORMAT_NATIVE_UINT(address),
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
(u32) map_length));
|
||||
mem_info->mapped_length = 0;
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
|
|
@ -197,8 +197,7 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n",
|
||||
bit_width, function,
|
||||
ACPI_FORMAT_NATIVE_UINT(address)));
|
||||
bit_width, function, ACPI_FORMAT_UINT64(address)));
|
||||
|
||||
/*
|
||||
* Perform the memory read or write
|
||||
|
|
@ -300,8 +299,7 @@ acpi_ex_system_io_space_handler(u32 function,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"System-IO (width %u) R/W %u Address=%8.8X%8.8X\n",
|
||||
bit_width, function,
|
||||
ACPI_FORMAT_NATIVE_UINT(address)));
|
||||
bit_width, function, ACPI_FORMAT_UINT64(address)));
|
||||
|
||||
/* Decode the function parameter */
|
||||
|
||||
|
|
|
|||
|
|
@ -142,17 +142,17 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
byte_width = ACPI_DIV_8(bit_width);
|
||||
last_address = address + byte_width - 1;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO, "Address %p LastAddress %p Length %X",
|
||||
ACPI_CAST_PTR(void, address), ACPI_CAST_PTR(void,
|
||||
last_address),
|
||||
byte_width));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"Address %8.8X%8.8X LastAddress %8.8X%8.8X Length %X",
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
ACPI_FORMAT_UINT64(last_address), byte_width));
|
||||
|
||||
/* Maximum 16-bit address in I/O space */
|
||||
|
||||
if (last_address > ACPI_UINT16_MAX) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Illegal I/O port address/length above 64K: %p/0x%X",
|
||||
ACPI_CAST_PTR(void, address), byte_width));
|
||||
"Illegal I/O port address/length above 64K: %8.8X%8.8X/0x%X",
|
||||
ACPI_FORMAT_UINT64(address), byte_width));
|
||||
return_ACPI_STATUS(AE_LIMIT);
|
||||
}
|
||||
|
||||
|
|
@ -181,8 +181,8 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
|
||||
if (acpi_gbl_osi_data >= port_info->osi_dependency) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
"Denied AML access to port 0x%p/%X (%s 0x%.4X-0x%.4X)",
|
||||
ACPI_CAST_PTR(void, address),
|
||||
"Denied AML access to port 0x%8.8X%8.8X/%X (%s 0x%.4X-0x%.4X)",
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
byte_width, port_info->name,
|
||||
port_info->start,
|
||||
port_info->end));
|
||||
|
|
|
|||
|
|
@ -258,12 +258,11 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
switch (type) {
|
||||
case ACPI_TYPE_PROCESSOR:
|
||||
|
||||
acpi_os_printf("ID %02X Len %02X Addr %p\n",
|
||||
acpi_os_printf("ID %02X Len %02X Addr %8.8X%8.8X\n",
|
||||
obj_desc->processor.proc_id,
|
||||
obj_desc->processor.length,
|
||||
ACPI_CAST_PTR(void,
|
||||
obj_desc->processor.
|
||||
address));
|
||||
ACPI_FORMAT_UINT64(obj_desc->processor.
|
||||
address));
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_DEVICE:
|
||||
|
|
@ -334,8 +333,9 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
space_id));
|
||||
if (obj_desc->region.flags & AOPOBJ_DATA_VALID) {
|
||||
acpi_os_printf(" Addr %8.8X%8.8X Len %.4X\n",
|
||||
ACPI_FORMAT_NATIVE_UINT
|
||||
(obj_desc->region.address),
|
||||
ACPI_FORMAT_UINT64(obj_desc->
|
||||
region.
|
||||
address),
|
||||
obj_desc->region.length);
|
||||
} else {
|
||||
acpi_os_printf
|
||||
|
|
|
|||
|
|
@ -246,16 +246,12 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
|||
{
|
||||
struct acpi_table_header local_header;
|
||||
|
||||
/*
|
||||
* The reason that the Address is cast to a void pointer is so that we
|
||||
* can use %p which will work properly on both 32-bit and 64-bit hosts.
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) {
|
||||
|
||||
/* FACS only has signature and length fields */
|
||||
|
||||
ACPI_INFO((AE_INFO, "%4.4s %p %05X",
|
||||
header->signature, ACPI_CAST_PTR(void, address),
|
||||
ACPI_INFO((AE_INFO, "%4.4s 0x%8.8X%8.8X %05X",
|
||||
header->signature, ACPI_FORMAT_UINT64(address),
|
||||
header->length));
|
||||
} else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) {
|
||||
|
||||
|
|
@ -266,8 +262,8 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
|||
header)->oem_id, ACPI_OEM_ID_SIZE);
|
||||
acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE);
|
||||
|
||||
ACPI_INFO((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)",
|
||||
ACPI_CAST_PTR (void, address),
|
||||
ACPI_INFO((AE_INFO, "RSDP 0x%8.8X%8.8X %05X (v%.2d %6.6s)",
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
(ACPI_CAST_PTR(struct acpi_table_rsdp, header)->
|
||||
revision >
|
||||
0) ? ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
|
|
@ -281,8 +277,8 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
|||
acpi_tb_cleanup_table_header(&local_header, header);
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)",
|
||||
local_header.signature, ACPI_CAST_PTR(void, address),
|
||||
"%-4.4s 0x%8.8X%8.8X %05X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
|
||||
local_header.signature, ACPI_FORMAT_UINT64(address),
|
||||
local_header.length, local_header.revision,
|
||||
local_header.oem_id, local_header.oem_table_id,
|
||||
local_header.oem_revision,
|
||||
|
|
@ -474,8 +470,8 @@ acpi_tb_install_table(acpi_physical_address address,
|
|||
table = acpi_os_map_memory(address, sizeof(struct acpi_table_header));
|
||||
if (!table) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not map memory for table [%s] at %p",
|
||||
signature, ACPI_CAST_PTR(void, address)));
|
||||
"Could not map memory for table [%s] at %8.8X%8.8X",
|
||||
signature, ACPI_FORMAT_UINT64(address)));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -107,10 +107,10 @@ acpi_ut_add_address_range(acpi_adr_space_type space_id,
|
|||
acpi_gbl_address_range_list[space_id] = range_info;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"\nAdded [%4.4s] address range: 0x%p-0x%p\n",
|
||||
"\nAdded [%4.4s] address range: 0x%8.8X%8.8X-0x%8.8X%8.8X\n",
|
||||
acpi_ut_get_node_name(range_info->region_node),
|
||||
ACPI_CAST_PTR(void, address),
|
||||
ACPI_CAST_PTR(void, range_info->end_address)));
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
ACPI_FORMAT_UINT64(range_info->end_address)));
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
|
@ -160,15 +160,13 @@ acpi_ut_remove_address_range(acpi_adr_space_type space_id,
|
|||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"\nRemoved [%4.4s] address range: 0x%p-0x%p\n",
|
||||
"\nRemoved [%4.4s] address range: 0x%8.8X%8.8X-0x%8.8X%8.8X\n",
|
||||
acpi_ut_get_node_name(range_info->
|
||||
region_node),
|
||||
ACPI_CAST_PTR(void,
|
||||
range_info->
|
||||
start_address),
|
||||
ACPI_CAST_PTR(void,
|
||||
range_info->
|
||||
end_address)));
|
||||
ACPI_FORMAT_UINT64(range_info->
|
||||
start_address),
|
||||
ACPI_FORMAT_UINT64(range_info->
|
||||
end_address)));
|
||||
|
||||
ACPI_FREE(range_info);
|
||||
return_VOID;
|
||||
|
|
@ -244,9 +242,9 @@ acpi_ut_check_address_range(acpi_adr_space_type space_id,
|
|||
region_node);
|
||||
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"0x%p-0x%p %s conflicts with Region %s %d",
|
||||
ACPI_CAST_PTR(void, address),
|
||||
ACPI_CAST_PTR(void, end_address),
|
||||
"0x%8.8X%8.8X-0x%8.8X%8.8X %s conflicts with Region %s %d",
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
ACPI_FORMAT_UINT64(end_address),
|
||||
acpi_ut_get_region_name(space_id),
|
||||
pathname, overlap_count));
|
||||
ACPI_FREE(pathname);
|
||||
|
|
|
|||
|
|
@ -165,10 +165,12 @@ acpi_status acpi_enable_subsystem(u32 flags)
|
|||
* Obtain a permanent mapping for the FACS. This is required for the
|
||||
* Global Lock and the Firmware Waking Vector
|
||||
*/
|
||||
status = acpi_tb_initialize_facs();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
|
||||
return_ACPI_STATUS(status);
|
||||
if (!(flags & ACPI_NO_FACS_INIT)) {
|
||||
status = acpi_tb_initialize_facs();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_WARNING((AE_INFO, "Could not map the FACS table"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
|
|
|
|||
|
|
@ -4150,9 +4150,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
{ "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
/* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */
|
||||
/* drives which fail FPDMA_AA activation (some may freeze afterwards) */
|
||||
{ "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA },
|
||||
{ "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA },
|
||||
{ "VB0250EAVER", "HPG7", ATA_HORKAGE_BROKEN_FPDMA_AA },
|
||||
|
||||
/* Blacklist entries taken from Silicon Image 3124/3132
|
||||
Windows driver .inf file - also several Linux problem reports */
|
||||
|
|
@ -4200,6 +4201,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
{ "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
|
||||
/* devices that don't properly handle TRIM commands */
|
||||
{ "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, },
|
||||
|
||||
/*
|
||||
* Some WD SATA-I drives spin up and down erratically when the link
|
||||
* is put into the slumber mode. We don't have full list of the
|
||||
|
|
@ -4504,7 +4508,8 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev)
|
|||
else /* In the ancient relic department - skip all of this */
|
||||
return 0;
|
||||
|
||||
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
|
||||
/* On some disks, this command causes spin-up, so we need longer timeout */
|
||||
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 15000);
|
||||
|
||||
DPRINTK("EXIT, err_mask=%x\n", err_mask);
|
||||
return err_mask;
|
||||
|
|
|
|||
|
|
@ -460,6 +460,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
|
|||
ATA_LFLAG_NO_SRST |
|
||||
ATA_LFLAG_ASSUME_ATA;
|
||||
}
|
||||
} else if (vendor == 0x11ab && devid == 0x4140) {
|
||||
/* Marvell 4140 quirks */
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
/* port 4 is for SEMB device and it doesn't like SRST */
|
||||
if (link->pmp == 4)
|
||||
link->flags |= ATA_LFLAG_DISABLED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2512,7 +2512,8 @@ static unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf)
|
|||
rbuf[14] = (lowest_aligned >> 8) & 0x3f;
|
||||
rbuf[15] = lowest_aligned;
|
||||
|
||||
if (ata_id_has_trim(args->id)) {
|
||||
if (ata_id_has_trim(args->id) &&
|
||||
!(dev->horkage & ATA_HORKAGE_NOTRIM)) {
|
||||
rbuf[14] |= 0x80; /* TPE */
|
||||
|
||||
if (ata_id_has_zero_after_trim(args->id))
|
||||
|
|
|
|||
|
|
@ -1068,7 +1068,7 @@ static struct of_device_id octeon_cf_match[] = {
|
|||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, octeon_i2c_match);
|
||||
MODULE_DEVICE_TABLE(of, octeon_cf_match);
|
||||
|
||||
static struct platform_driver octeon_cf_driver = {
|
||||
.probe = octeon_cf_probe,
|
||||
|
|
|
|||
|
|
@ -543,10 +543,8 @@ static void fw_dev_release(struct device *dev)
|
|||
module_put(THIS_MODULE);
|
||||
}
|
||||
|
||||
static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
static int do_firmware_uevent(struct firmware_priv *fw_priv, struct kobj_uevent_env *env)
|
||||
{
|
||||
struct firmware_priv *fw_priv = to_firmware_priv(dev);
|
||||
|
||||
if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->buf->fw_id))
|
||||
return -ENOMEM;
|
||||
if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout))
|
||||
|
|
@ -557,6 +555,18 @@ static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
struct firmware_priv *fw_priv = to_firmware_priv(dev);
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&fw_lock);
|
||||
if (fw_priv->buf)
|
||||
err = do_firmware_uevent(fw_priv, env);
|
||||
mutex_unlock(&fw_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct class firmware_class = {
|
||||
.name = "firmware",
|
||||
.class_attrs = firmware_class_attrs,
|
||||
|
|
|
|||
|
|
@ -1586,7 +1586,7 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
|
|||
&ival);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
memcpy(val + (i * val_bytes), &ival, val_bytes);
|
||||
map->format.format_val(val + (i * val_bytes), ival, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1851,11 +1851,11 @@ static struct rbd_obj_request *rbd_obj_request_create(const char *object_name,
|
|||
rbd_assert(obj_request_type_valid(type));
|
||||
|
||||
size = strlen(object_name) + 1;
|
||||
name = kmalloc(size, GFP_KERNEL);
|
||||
name = kmalloc(size, GFP_NOIO);
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
obj_request = kmem_cache_zalloc(rbd_obj_request_cache, GFP_KERNEL);
|
||||
obj_request = kmem_cache_zalloc(rbd_obj_request_cache, GFP_NOIO);
|
||||
if (!obj_request) {
|
||||
kfree(name);
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -1234,6 +1234,8 @@ static int btusb_setup_intel(struct hci_dev *hdev)
|
|||
}
|
||||
fw_ptr = fw->data;
|
||||
|
||||
kfree_skb(skb);
|
||||
|
||||
/* This Intel specific command enables the manufacturer mode of the
|
||||
* controller.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -838,7 +838,7 @@ fs_initcall(mvebu_mbus_debugfs_init);
|
|||
int __init mvebu_mbus_init(const char *soc, phys_addr_t mbuswins_phys_base,
|
||||
size_t mbuswins_size,
|
||||
phys_addr_t sdramwins_phys_base,
|
||||
size_t sdramwins_size)
|
||||
size_t sdramwins_size, int is_coherent)
|
||||
{
|
||||
struct mvebu_mbus_state *mbus = &mbus_state;
|
||||
const struct of_device_id *of_id;
|
||||
|
|
@ -865,8 +865,7 @@ int __init mvebu_mbus_init(const char *soc, phys_addr_t mbuswins_phys_base,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric"))
|
||||
mbus->hw_io_coherency = 1;
|
||||
mbus->hw_io_coherency = is_coherent;
|
||||
|
||||
for (win = 0; win < mbus->soc->num_wins; win++)
|
||||
mvebu_mbus_disable_window(mbus, win);
|
||||
|
|
|
|||
|
|
@ -583,7 +583,7 @@ static inline int needs_ilk_vtd_wa(void)
|
|||
/* Query intel_iommu to see if we need the workaround. Presumably that
|
||||
* was loaded first.
|
||||
*/
|
||||
if ((gpu_devid == PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB ||
|
||||
if ((gpu_devid == PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG ||
|
||||
gpu_devid == PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG) &&
|
||||
intel_iommu_gfx_mapped)
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -618,6 +618,9 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
ibmvtpm->dev = dev;
|
||||
ibmvtpm->vdev = vio_dev;
|
||||
|
||||
crq_q = &ibmvtpm->crq_queue;
|
||||
crq_q->crq_addr = (struct ibmvtpm_crq *)get_zeroed_page(GFP_KERNEL);
|
||||
if (!crq_q->crq_addr) {
|
||||
|
|
@ -662,8 +665,6 @@ static int tpm_ibmvtpm_probe(struct vio_dev *vio_dev,
|
|||
|
||||
crq_q->index = 0;
|
||||
|
||||
ibmvtpm->dev = dev;
|
||||
ibmvtpm->vdev = vio_dev;
|
||||
TPM_VPRIV(chip) = (void *)ibmvtpm;
|
||||
|
||||
spin_lock_init(&ibmvtpm->rtce_lock);
|
||||
|
|
|
|||
|
|
@ -135,6 +135,9 @@ int cpuidle_idle_call(void)
|
|||
|
||||
/* ask the governor for the next state */
|
||||
next_state = cpuidle_curr_governor->select(drv, dev);
|
||||
if (next_state < 0)
|
||||
return -EBUSY;
|
||||
|
||||
if (need_resched()) {
|
||||
dev->last_residency = 0;
|
||||
/* give the governor an opportunity to reflect on the outcome */
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|||
data->needs_update = 0;
|
||||
}
|
||||
|
||||
data->last_state_idx = 0;
|
||||
data->last_state_idx = CPUIDLE_DRIVER_STATE_START - 1;
|
||||
data->exit_us = 0;
|
||||
|
||||
/* Special case when user has set very strict latency requirement */
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
|
||||
/* Buffer, its dma address and lock */
|
||||
struct buf_data {
|
||||
u8 buf[RN_BUF_SIZE];
|
||||
u8 buf[RN_BUF_SIZE] ____cacheline_aligned;
|
||||
dma_addr_t addr;
|
||||
struct completion filled;
|
||||
u32 hw_desc[DESC_JOB_O_LEN];
|
||||
|
|
|
|||
|
|
@ -935,7 +935,8 @@ static int sg_to_link_tbl(struct scatterlist *sg, int sg_count,
|
|||
sg_count--;
|
||||
link_tbl_ptr--;
|
||||
}
|
||||
be16_add_cpu(&link_tbl_ptr->len, cryptlen);
|
||||
link_tbl_ptr->len = cpu_to_be16(be16_to_cpu(link_tbl_ptr->len)
|
||||
+ cryptlen);
|
||||
|
||||
/* tag end of link table */
|
||||
link_tbl_ptr->j_extent = DESC_PTR_LNKTBL_RETURN;
|
||||
|
|
@ -2621,6 +2622,7 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev,
|
|||
break;
|
||||
default:
|
||||
dev_err(dev, "unknown algorithm type %d\n", t_alg->algt.type);
|
||||
kfree(t_alg);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -393,7 +393,8 @@ static void __mv_xor_slot_cleanup(struct mv_xor_chan *mv_chan)
|
|||
dma_cookie_t cookie = 0;
|
||||
int busy = mv_chan_is_busy(mv_chan);
|
||||
u32 current_desc = mv_chan_get_current_desc(mv_chan);
|
||||
int seen_current = 0;
|
||||
int current_cleaned = 0;
|
||||
struct mv_xor_desc *hw_desc;
|
||||
|
||||
dev_dbg(mv_chan_to_devp(mv_chan), "%s %d\n", __func__, __LINE__);
|
||||
dev_dbg(mv_chan_to_devp(mv_chan), "current_desc %x\n", current_desc);
|
||||
|
|
@ -405,38 +406,57 @@ static void __mv_xor_slot_cleanup(struct mv_xor_chan *mv_chan)
|
|||
|
||||
list_for_each_entry_safe(iter, _iter, &mv_chan->chain,
|
||||
chain_node) {
|
||||
prefetch(_iter);
|
||||
prefetch(&_iter->async_tx);
|
||||
|
||||
/* do not advance past the current descriptor loaded into the
|
||||
* hardware channel, subsequent descriptors are either in
|
||||
* process or have not been submitted
|
||||
*/
|
||||
if (seen_current)
|
||||
break;
|
||||
/* clean finished descriptors */
|
||||
hw_desc = iter->hw_desc;
|
||||
if (hw_desc->status & XOR_DESC_SUCCESS) {
|
||||
cookie = mv_xor_run_tx_complete_actions(iter, mv_chan,
|
||||
cookie);
|
||||
|
||||
/* stop the search if we reach the current descriptor and the
|
||||
* channel is busy
|
||||
*/
|
||||
if (iter->async_tx.phys == current_desc) {
|
||||
seen_current = 1;
|
||||
if (busy)
|
||||
/* done processing desc, clean slot */
|
||||
mv_xor_clean_slot(iter, mv_chan);
|
||||
|
||||
/* break if we did cleaned the current */
|
||||
if (iter->async_tx.phys == current_desc) {
|
||||
current_cleaned = 1;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (iter->async_tx.phys == current_desc) {
|
||||
current_cleaned = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cookie = mv_xor_run_tx_complete_actions(iter, mv_chan, cookie);
|
||||
|
||||
if (mv_xor_clean_slot(iter, mv_chan))
|
||||
break;
|
||||
}
|
||||
|
||||
if ((busy == 0) && !list_empty(&mv_chan->chain)) {
|
||||
struct mv_xor_desc_slot *chain_head;
|
||||
chain_head = list_entry(mv_chan->chain.next,
|
||||
struct mv_xor_desc_slot,
|
||||
chain_node);
|
||||
|
||||
mv_xor_start_new_chain(mv_chan, chain_head);
|
||||
if (current_cleaned) {
|
||||
/*
|
||||
* current descriptor cleaned and removed, run
|
||||
* from list head
|
||||
*/
|
||||
iter = list_entry(mv_chan->chain.next,
|
||||
struct mv_xor_desc_slot,
|
||||
chain_node);
|
||||
mv_xor_start_new_chain(mv_chan, iter);
|
||||
} else {
|
||||
if (!list_is_last(&iter->chain_node, &mv_chan->chain)) {
|
||||
/*
|
||||
* descriptors are still waiting after
|
||||
* current, trigger them
|
||||
*/
|
||||
iter = list_entry(iter->chain_node.next,
|
||||
struct mv_xor_desc_slot,
|
||||
chain_node);
|
||||
mv_xor_start_new_chain(mv_chan, iter);
|
||||
} else {
|
||||
/*
|
||||
* some descriptors are still waiting
|
||||
* to be cleaned
|
||||
*/
|
||||
tasklet_schedule(&mv_chan->irq_tasklet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cookie > 0)
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#define XOR_OPERATION_MODE_XOR 0
|
||||
#define XOR_OPERATION_MODE_MEMCPY 2
|
||||
#define XOR_OPERATION_MODE_MEMSET 4
|
||||
#define XOR_DESC_SUCCESS 0x40000000
|
||||
|
||||
#define XOR_CURR_DESC(chan) (chan->mmr_base + 0x210 + (chan->idx * 4))
|
||||
#define XOR_NEXT_DESC(chan) (chan->mmr_base + 0x200 + (chan->idx * 4))
|
||||
|
|
|
|||
|
|
@ -623,7 +623,7 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
u32 reg;
|
||||
u64 limit, prv = 0;
|
||||
u64 tmp_mb;
|
||||
u32 mb, kb;
|
||||
u32 gb, mb;
|
||||
u32 rir_way;
|
||||
|
||||
/*
|
||||
|
|
@ -636,8 +636,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
pvt->tolm = GET_TOLM(reg);
|
||||
tmp_mb = (1 + pvt->tolm) >> 20;
|
||||
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
edac_dbg(0, "TOLM: %u.%03u GB (0x%016Lx)\n", mb, kb, (u64)pvt->tolm);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "TOLM: %u.%03u GB (0x%016Lx)\n",
|
||||
gb, (mb*1000)/1024, (u64)pvt->tolm);
|
||||
|
||||
/* Address range is already 45:25 */
|
||||
pci_read_config_dword(pvt->pci_sad1, TOHM,
|
||||
|
|
@ -645,8 +646,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
pvt->tohm = GET_TOHM(reg);
|
||||
tmp_mb = (1 + pvt->tohm) >> 20;
|
||||
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
edac_dbg(0, "TOHM: %u.%03u GB (0x%016Lx)\n", mb, kb, (u64)pvt->tohm);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "TOHM: %u.%03u GB (0x%016Lx)\n",
|
||||
gb, (mb*1000)/1024, (u64)pvt->tohm);
|
||||
|
||||
/*
|
||||
* Step 2) Get SAD range and SAD Interleave list
|
||||
|
|
@ -668,11 +670,11 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
break;
|
||||
|
||||
tmp_mb = (limit + 1) >> 20;
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "SAD#%d %s up to %u.%03u GB (0x%016Lx) Interleave: %s reg=0x%08x\n",
|
||||
n_sads,
|
||||
get_dram_attr(reg),
|
||||
mb, kb,
|
||||
gb, (mb*1000)/1024,
|
||||
((u64)tmp_mb) << 20L,
|
||||
INTERLEAVE_MODE(reg) ? "8:6" : "[8:6]XOR[18:16]",
|
||||
reg);
|
||||
|
|
@ -702,9 +704,9 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
break;
|
||||
tmp_mb = (limit + 1) >> 20;
|
||||
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "TAD#%d: up to %u.%03u GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n",
|
||||
n_tads, mb, kb,
|
||||
n_tads, gb, (mb*1000)/1024,
|
||||
((u64)tmp_mb) << 20L,
|
||||
(u32)TAD_SOCK(reg),
|
||||
(u32)TAD_CH(reg),
|
||||
|
|
@ -727,10 +729,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
tad_ch_nilv_offset[j],
|
||||
®);
|
||||
tmp_mb = TAD_OFFSET(reg) >> 20;
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "TAD CH#%d, offset #%d: %u.%03u GB (0x%016Lx), reg=0x%08x\n",
|
||||
i, j,
|
||||
mb, kb,
|
||||
gb, (mb*1000)/1024,
|
||||
((u64)tmp_mb) << 20L,
|
||||
reg);
|
||||
}
|
||||
|
|
@ -752,10 +754,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
|
||||
tmp_mb = RIR_LIMIT(reg) >> 20;
|
||||
rir_way = 1 << RIR_WAY(reg);
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "CH#%d RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d, reg=0x%08x\n",
|
||||
i, j,
|
||||
mb, kb,
|
||||
gb, (mb*1000)/1024,
|
||||
((u64)tmp_mb) << 20L,
|
||||
rir_way,
|
||||
reg);
|
||||
|
|
@ -766,10 +768,10 @@ static void get_memory_layout(const struct mem_ctl_info *mci)
|
|||
®);
|
||||
tmp_mb = RIR_OFFSET(reg) << 6;
|
||||
|
||||
mb = div_u64_rem(tmp_mb, 1000, &kb);
|
||||
gb = div_u64_rem(tmp_mb, 1024, &mb);
|
||||
edac_dbg(0, "CH#%d RIR#%d INTL#%d, offset %u.%03u GB (0x%016Lx), tgt: %d, reg=0x%08x\n",
|
||||
i, j, k,
|
||||
mb, kb,
|
||||
gb, (mb*1000)/1024,
|
||||
((u64)tmp_mb) << 20L,
|
||||
(u32)RIR_RNK_TGT(reg),
|
||||
reg);
|
||||
|
|
@ -806,7 +808,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
|
|||
u8 ch_way,sck_way;
|
||||
u32 tad_offset;
|
||||
u32 rir_way;
|
||||
u32 mb, kb;
|
||||
u32 mb, gb;
|
||||
u64 ch_addr, offset, limit, prv = 0;
|
||||
|
||||
|
||||
|
|
@ -1022,10 +1024,10 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
|
|||
continue;
|
||||
|
||||
limit = RIR_LIMIT(reg);
|
||||
mb = div_u64_rem(limit >> 20, 1000, &kb);
|
||||
gb = div_u64_rem(limit >> 20, 1024, &mb);
|
||||
edac_dbg(0, "RIR#%d, limit: %u.%03u GB (0x%016Lx), way: %d\n",
|
||||
n_rir,
|
||||
mb, kb,
|
||||
gb, (mb*1000)/1024,
|
||||
limit,
|
||||
1 << RIR_WAY(reg));
|
||||
if (ch_addr <= limit)
|
||||
|
|
|
|||
|
|
@ -1955,8 +1955,11 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
|
|||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return -EINVAL;
|
||||
|
||||
/* For some reason crtc x/y offsets are signed internally. */
|
||||
if (crtc_req->x > INT_MAX || crtc_req->y > INT_MAX)
|
||||
/*
|
||||
* Universal plane src offsets are only 16.16, prevent havoc for
|
||||
* drivers using universal plane code internally.
|
||||
*/
|
||||
if (crtc_req->x & 0xffff0000 || crtc_req->y & 0xffff0000)
|
||||
return -ERANGE;
|
||||
|
||||
drm_modeset_lock_all(dev);
|
||||
|
|
|
|||
|
|
@ -441,7 +441,7 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|||
struct intel_gmbus,
|
||||
adapter);
|
||||
struct drm_i915_private *dev_priv = bus->dev_priv;
|
||||
int i, reg_offset;
|
||||
int i = 0, inc, try = 0, reg_offset;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&dev_priv->gmbus_mutex);
|
||||
|
|
@ -453,12 +453,14 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|||
|
||||
reg_offset = dev_priv->gpio_mmio_base;
|
||||
|
||||
retry:
|
||||
I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
for (; i < num; i += inc) {
|
||||
inc = 1;
|
||||
if (gmbus_is_index_read(msgs, i, num)) {
|
||||
ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
|
||||
i += 1; /* set i to the index of the read xfer */
|
||||
inc = 2; /* an index read is two msgs */
|
||||
} else if (msgs[i].flags & I2C_M_RD) {
|
||||
ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
|
||||
} else {
|
||||
|
|
@ -530,6 +532,18 @@ gmbus_xfer(struct i2c_adapter *adapter,
|
|||
adapter->name, msgs[i].addr,
|
||||
(msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
|
||||
|
||||
/*
|
||||
* Passive adapters sometimes NAK the first probe. Retry the first
|
||||
* message once on -ENXIO for GMBUS transfers; the bit banging algorithm
|
||||
* has retries internally. See also the retry loop in
|
||||
* drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
|
||||
*/
|
||||
if (ret == -ENXIO && i == 0 && try++ == 0) {
|
||||
DRM_DEBUG_KMS("GMBUS [%s] NAK on first message, retry\n",
|
||||
adapter->name);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
||||
timeout:
|
||||
|
|
|
|||
|
|
@ -1487,6 +1487,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector,
|
|||
return MODE_BANDWIDTH;
|
||||
}
|
||||
|
||||
if ((mode->hdisplay % 8) != 0 || (mode->hsync_start % 8) != 0 ||
|
||||
(mode->hsync_end % 8) != 0 || (mode->htotal % 8) != 0) {
|
||||
return MODE_H_ILLEGAL;
|
||||
}
|
||||
|
||||
if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 ||
|
||||
mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 ||
|
||||
mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 ||
|
||||
|
|
|
|||
|
|
@ -500,6 +500,7 @@ int qxl_hw_surface_alloc(struct qxl_device *qdev,
|
|||
|
||||
cmd = (struct qxl_surface_cmd *)qxl_release_map(qdev, release);
|
||||
cmd->type = QXL_SURFACE_CMD_CREATE;
|
||||
cmd->flags = QXL_SURF_FLAG_KEEP_DATA;
|
||||
cmd->u.surface_create.format = surf->surf.format;
|
||||
cmd->u.surface_create.width = surf->surf.width;
|
||||
cmd->u.surface_create.height = surf->surf.height;
|
||||
|
|
|
|||
|
|
@ -251,8 +251,10 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
|
|||
}
|
||||
}
|
||||
}
|
||||
mb();
|
||||
radeon_gart_tlb_flush(rdev);
|
||||
if (rdev->gart.ptr) {
|
||||
mb();
|
||||
radeon_gart_tlb_flush(rdev);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -294,8 +296,10 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
|
|||
}
|
||||
}
|
||||
}
|
||||
mb();
|
||||
radeon_gart_tlb_flush(rdev);
|
||||
if (rdev->gart.ptr) {
|
||||
mb();
|
||||
radeon_gart_tlb_flush(rdev);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,10 +73,12 @@ static void radeon_hotplug_work_func(struct work_struct *work)
|
|||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
struct drm_connector *connector;
|
||||
|
||||
mutex_lock(&mode_config->mutex);
|
||||
if (mode_config->num_connector) {
|
||||
list_for_each_entry(connector, &mode_config->connector_list, head)
|
||||
radeon_connector_hotplug(connector);
|
||||
}
|
||||
mutex_unlock(&mode_config->mutex);
|
||||
/* Just fire off a uevent and let userspace tell us what to do */
|
||||
drm_helper_hpd_irq_event(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,14 +31,11 @@
|
|||
/* output format */
|
||||
#define MCP3021_SAR_SHIFT 2
|
||||
#define MCP3021_SAR_MASK 0x3ff
|
||||
|
||||
#define MCP3021_OUTPUT_RES 10 /* 10-bit resolution */
|
||||
#define MCP3021_OUTPUT_SCALE 4
|
||||
|
||||
#define MCP3221_SAR_SHIFT 0
|
||||
#define MCP3221_SAR_MASK 0xfff
|
||||
#define MCP3221_OUTPUT_RES 12 /* 12-bit resolution */
|
||||
#define MCP3221_OUTPUT_SCALE 1
|
||||
|
||||
enum chips {
|
||||
mcp3021,
|
||||
|
|
@ -54,7 +51,6 @@ struct mcp3021_data {
|
|||
u16 sar_shift;
|
||||
u16 sar_mask;
|
||||
u8 output_res;
|
||||
u8 output_scale;
|
||||
};
|
||||
|
||||
static int mcp3021_read16(struct i2c_client *client)
|
||||
|
|
@ -84,13 +80,7 @@ static int mcp3021_read16(struct i2c_client *client)
|
|||
|
||||
static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
|
||||
{
|
||||
if (val == 0)
|
||||
return 0;
|
||||
|
||||
val = val * data->output_scale - data->output_scale / 2;
|
||||
|
||||
return val * DIV_ROUND_CLOSEST(data->vdd,
|
||||
(1 << data->output_res) * data->output_scale);
|
||||
return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
|
||||
}
|
||||
|
||||
static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
|
||||
|
|
@ -132,14 +122,12 @@ static int mcp3021_probe(struct i2c_client *client,
|
|||
data->sar_shift = MCP3021_SAR_SHIFT;
|
||||
data->sar_mask = MCP3021_SAR_MASK;
|
||||
data->output_res = MCP3021_OUTPUT_RES;
|
||||
data->output_scale = MCP3021_OUTPUT_SCALE;
|
||||
break;
|
||||
|
||||
case mcp3221:
|
||||
data->sar_shift = MCP3221_SAR_SHIFT;
|
||||
data->sar_mask = MCP3221_SAR_MASK;
|
||||
data->output_res = MCP3221_OUTPUT_RES;
|
||||
data->output_scale = MCP3221_OUTPUT_SCALE;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,6 +63,9 @@
|
|||
#define AT91_TWI_UNRE 0x0080 /* Underrun Error */
|
||||
#define AT91_TWI_NACK 0x0100 /* Not Acknowledged */
|
||||
|
||||
#define AT91_TWI_INT_MASK \
|
||||
(AT91_TWI_TXCOMP | AT91_TWI_RXRDY | AT91_TWI_TXRDY | AT91_TWI_NACK)
|
||||
|
||||
#define AT91_TWI_IER 0x0024 /* Interrupt Enable Register */
|
||||
#define AT91_TWI_IDR 0x0028 /* Interrupt Disable Register */
|
||||
#define AT91_TWI_IMR 0x002c /* Interrupt Mask Register */
|
||||
|
|
@ -118,13 +121,12 @@ static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned val)
|
|||
|
||||
static void at91_disable_twi_interrupts(struct at91_twi_dev *dev)
|
||||
{
|
||||
at91_twi_write(dev, AT91_TWI_IDR,
|
||||
AT91_TWI_TXCOMP | AT91_TWI_RXRDY | AT91_TWI_TXRDY);
|
||||
at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_INT_MASK);
|
||||
}
|
||||
|
||||
static void at91_twi_irq_save(struct at91_twi_dev *dev)
|
||||
{
|
||||
dev->imr = at91_twi_read(dev, AT91_TWI_IMR) & 0x7;
|
||||
dev->imr = at91_twi_read(dev, AT91_TWI_IMR) & AT91_TWI_INT_MASK;
|
||||
at91_disable_twi_interrupts(dev);
|
||||
}
|
||||
|
||||
|
|
@ -214,6 +216,14 @@ static void at91_twi_write_data_dma_callback(void *data)
|
|||
dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg),
|
||||
dev->buf_len, DMA_TO_DEVICE);
|
||||
|
||||
/*
|
||||
* When this callback is called, THR/TX FIFO is likely not to be empty
|
||||
* yet. So we have to wait for TXCOMP or NACK bits to be set into the
|
||||
* Status Register to be sure that the STOP bit has been sent and the
|
||||
* transfer is completed. The NACK interrupt has already been enabled,
|
||||
* we just have to enable TXCOMP one.
|
||||
*/
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP);
|
||||
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
|
||||
}
|
||||
|
||||
|
|
@ -308,7 +318,7 @@ static void at91_twi_read_data_dma_callback(void *data)
|
|||
/* The last two bytes have to be read without using dma */
|
||||
dev->buf += dev->buf_len - 2;
|
||||
dev->buf_len = 2;
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_RXRDY);
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_RXRDY | AT91_TWI_TXCOMP);
|
||||
}
|
||||
|
||||
static void at91_twi_read_data_dma(struct at91_twi_dev *dev)
|
||||
|
|
@ -369,7 +379,7 @@ static irqreturn_t atmel_twi_interrupt(int irq, void *dev_id)
|
|||
/* catch error flags */
|
||||
dev->transfer_status |= status;
|
||||
|
||||
if (irqstatus & AT91_TWI_TXCOMP) {
|
||||
if (irqstatus & (AT91_TWI_TXCOMP | AT91_TWI_NACK)) {
|
||||
at91_disable_twi_interrupts(dev);
|
||||
complete(&dev->cmd_complete);
|
||||
}
|
||||
|
|
@ -382,6 +392,34 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
|
|||
int ret;
|
||||
bool has_unre_flag = dev->pdata->has_unre_flag;
|
||||
|
||||
/*
|
||||
* WARNING: the TXCOMP bit in the Status Register is NOT a clear on
|
||||
* read flag but shows the state of the transmission at the time the
|
||||
* Status Register is read. According to the programmer datasheet,
|
||||
* TXCOMP is set when both holding register and internal shifter are
|
||||
* empty and STOP condition has been sent.
|
||||
* Consequently, we should enable NACK interrupt rather than TXCOMP to
|
||||
* detect transmission failure.
|
||||
*
|
||||
* Besides, the TXCOMP bit is already set before the i2c transaction
|
||||
* has been started. For read transactions, this bit is cleared when
|
||||
* writing the START bit into the Control Register. So the
|
||||
* corresponding interrupt can safely be enabled just after.
|
||||
* However for write transactions managed by the CPU, we first write
|
||||
* into THR, so TXCOMP is cleared. Then we can safely enable TXCOMP
|
||||
* interrupt. If TXCOMP interrupt were enabled before writing into THR,
|
||||
* the interrupt handler would be called immediately and the i2c command
|
||||
* would be reported as completed.
|
||||
* Also when a write transaction is managed by the DMA controller,
|
||||
* enabling the TXCOMP interrupt in this function may lead to a race
|
||||
* condition since we don't know whether the TXCOMP interrupt is enabled
|
||||
* before or after the DMA has started to write into THR. So the TXCOMP
|
||||
* interrupt is enabled later by at91_twi_write_data_dma_callback().
|
||||
* Immediately after in that DMA callback, we still need to send the
|
||||
* STOP condition manually writing the corresponding bit into the
|
||||
* Control Register.
|
||||
*/
|
||||
|
||||
dev_dbg(dev->dev, "transfer: %s %d bytes.\n",
|
||||
(dev->msg->flags & I2C_M_RD) ? "read" : "write", dev->buf_len);
|
||||
|
||||
|
|
@ -412,26 +450,24 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
|
|||
* seems to be the best solution.
|
||||
*/
|
||||
if (dev->use_dma && (dev->buf_len > AT91_I2C_DMA_THRESHOLD)) {
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_NACK);
|
||||
at91_twi_read_data_dma(dev);
|
||||
/*
|
||||
* It is important to enable TXCOMP irq here because
|
||||
* doing it only when transferring the last two bytes
|
||||
* will mask NACK errors since TXCOMP is set when a
|
||||
* NACK occurs.
|
||||
*/
|
||||
} else {
|
||||
at91_twi_write(dev, AT91_TWI_IER,
|
||||
AT91_TWI_TXCOMP);
|
||||
} else
|
||||
at91_twi_write(dev, AT91_TWI_IER,
|
||||
AT91_TWI_TXCOMP | AT91_TWI_RXRDY);
|
||||
AT91_TWI_TXCOMP |
|
||||
AT91_TWI_NACK |
|
||||
AT91_TWI_RXRDY);
|
||||
}
|
||||
} else {
|
||||
if (dev->use_dma && (dev->buf_len > AT91_I2C_DMA_THRESHOLD)) {
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_NACK);
|
||||
at91_twi_write_data_dma(dev);
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP);
|
||||
} else {
|
||||
at91_twi_write_next_byte(dev);
|
||||
at91_twi_write(dev, AT91_TWI_IER,
|
||||
AT91_TWI_TXCOMP | AT91_TWI_TXRDY);
|
||||
AT91_TWI_TXCOMP |
|
||||
AT91_TWI_NACK |
|
||||
AT91_TWI_TXRDY);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
#include "ad5624r.h"
|
||||
|
||||
static int ad5624r_spi_write(struct spi_device *spi,
|
||||
u8 cmd, u8 addr, u16 val, u8 len)
|
||||
u8 cmd, u8 addr, u16 val, u8 shift)
|
||||
{
|
||||
u32 data;
|
||||
u8 msg[3];
|
||||
|
|
@ -35,7 +35,7 @@ static int ad5624r_spi_write(struct spi_device *spi,
|
|||
* 14-, 12-bit input code followed by 0, 2, or 4 don't care bits,
|
||||
* for the AD5664R, AD5644R, and AD5624R, respectively.
|
||||
*/
|
||||
data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << (16 - len));
|
||||
data = (0 << 22) | (cmd << 19) | (addr << 16) | (val << shift);
|
||||
msg[0] = data >> 16;
|
||||
msg[1] = data >> 8;
|
||||
msg[2] = data;
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ struct adis16400_state {
|
|||
int filt_int;
|
||||
|
||||
struct adis adis;
|
||||
unsigned long avail_scan_mask[2];
|
||||
};
|
||||
|
||||
/* At the moment triggers are only used for ring buffer
|
||||
|
|
|
|||
|
|
@ -438,6 +438,11 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
|||
*val = st->variant->temp_scale_nano / 1000000;
|
||||
*val2 = (st->variant->temp_scale_nano % 1000000);
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
case IIO_PRESSURE:
|
||||
/* 20 uBar = 0.002kPascal */
|
||||
*val = 0;
|
||||
*val2 = 2000;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -480,10 +485,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
|||
}
|
||||
}
|
||||
|
||||
#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si) { \
|
||||
#define ADIS16400_VOLTAGE_CHAN(addr, bits, name, si, chn) { \
|
||||
.type = IIO_VOLTAGE, \
|
||||
.indexed = 1, \
|
||||
.channel = 0, \
|
||||
.channel = chn, \
|
||||
.extend_name = name, \
|
||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
|
||||
BIT(IIO_CHAN_INFO_SCALE), \
|
||||
|
|
@ -499,10 +504,10 @@ static int adis16400_read_raw(struct iio_dev *indio_dev,
|
|||
}
|
||||
|
||||
#define ADIS16400_SUPPLY_CHAN(addr, bits) \
|
||||
ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY)
|
||||
ADIS16400_VOLTAGE_CHAN(addr, bits, "supply", ADIS16400_SCAN_SUPPLY, 0)
|
||||
|
||||
#define ADIS16400_AUX_ADC_CHAN(addr, bits) \
|
||||
ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC)
|
||||
ADIS16400_VOLTAGE_CHAN(addr, bits, NULL, ADIS16400_SCAN_ADC, 1)
|
||||
|
||||
#define ADIS16400_GYRO_CHAN(mod, addr, bits) { \
|
||||
.type = IIO_ANGL_VEL, \
|
||||
|
|
@ -819,11 +824,6 @@ static const struct iio_info adis16400_info = {
|
|||
.debugfs_reg_access = adis_debugfs_reg_access,
|
||||
};
|
||||
|
||||
static const unsigned long adis16400_burst_scan_mask[] = {
|
||||
~0UL,
|
||||
0,
|
||||
};
|
||||
|
||||
static const char * const adis16400_status_error_msgs[] = {
|
||||
[ADIS16400_DIAG_STAT_ZACCL_FAIL] = "Z-axis accelerometer self-test failure",
|
||||
[ADIS16400_DIAG_STAT_YACCL_FAIL] = "Y-axis accelerometer self-test failure",
|
||||
|
|
@ -871,6 +871,20 @@ static const struct adis_data adis16400_data = {
|
|||
BIT(ADIS16400_DIAG_STAT_POWER_LOW),
|
||||
};
|
||||
|
||||
static void adis16400_setup_chan_mask(struct adis16400_state *st)
|
||||
{
|
||||
const struct adis16400_chip_info *chip_info = st->variant;
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < chip_info->num_channels; i++) {
|
||||
const struct iio_chan_spec *ch = &chip_info->channels[i];
|
||||
|
||||
if (ch->scan_index >= 0 &&
|
||||
ch->scan_index != ADIS16400_SCAN_TIMESTAMP)
|
||||
st->avail_scan_mask[0] |= BIT(ch->scan_index);
|
||||
}
|
||||
}
|
||||
|
||||
static int adis16400_probe(struct spi_device *spi)
|
||||
{
|
||||
struct adis16400_state *st;
|
||||
|
|
@ -894,8 +908,10 @@ static int adis16400_probe(struct spi_device *spi)
|
|||
indio_dev->info = &adis16400_info;
|
||||
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||
|
||||
if (!(st->variant->flags & ADIS16400_NO_BURST))
|
||||
indio_dev->available_scan_masks = adis16400_burst_scan_mask;
|
||||
if (!(st->variant->flags & ADIS16400_NO_BURST)) {
|
||||
adis16400_setup_chan_mask(st);
|
||||
indio_dev->available_scan_masks = st->avail_scan_mask;
|
||||
}
|
||||
|
||||
ret = adis_init(&st->adis, indio_dev, spi, &adis16400_data);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -49,6 +49,8 @@ static int
|
|||
isert_rdma_accept(struct isert_conn *isert_conn);
|
||||
struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np);
|
||||
|
||||
static void isert_release_work(struct work_struct *work);
|
||||
|
||||
static void
|
||||
isert_qp_event_callback(struct ib_event *e, void *context)
|
||||
{
|
||||
|
|
@ -202,7 +204,7 @@ isert_alloc_rx_descriptors(struct isert_conn *isert_conn)
|
|||
static void
|
||||
isert_free_rx_descriptors(struct isert_conn *isert_conn)
|
||||
{
|
||||
struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
|
||||
struct ib_device *ib_dev = isert_conn->conn_device->ib_device;
|
||||
struct iser_rx_desc *rx_desc;
|
||||
int i;
|
||||
|
||||
|
|
@ -432,6 +434,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
init_completion(&isert_conn->conn_wait_comp_err);
|
||||
kref_init(&isert_conn->conn_kref);
|
||||
mutex_init(&isert_conn->conn_mutex);
|
||||
INIT_WORK(&isert_conn->release_work, isert_release_work);
|
||||
|
||||
isert_conn->conn_cm_id = cma_id;
|
||||
isert_conn->responder_resources = event->param.conn.responder_resources;
|
||||
|
|
@ -527,14 +530,15 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
static void
|
||||
isert_connect_release(struct isert_conn *isert_conn)
|
||||
{
|
||||
struct ib_device *ib_dev = isert_conn->conn_cm_id->device;
|
||||
struct isert_device *device = isert_conn->conn_device;
|
||||
int cq_index;
|
||||
struct ib_device *ib_dev = device->ib_device;
|
||||
|
||||
pr_debug("Entering isert_connect_release(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
|
||||
|
||||
isert_free_rx_descriptors(isert_conn);
|
||||
rdma_destroy_id(isert_conn->conn_cm_id);
|
||||
if (isert_conn->conn_cm_id)
|
||||
rdma_destroy_id(isert_conn->conn_cm_id);
|
||||
|
||||
if (isert_conn->conn_qp) {
|
||||
cq_index = ((struct isert_cq_desc *)
|
||||
|
|
@ -673,6 +677,7 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id,
|
|||
{
|
||||
struct isert_np *isert_np = cma_id->context;
|
||||
struct isert_conn *isert_conn;
|
||||
bool terminating = false;
|
||||
|
||||
if (isert_np->np_cm_id == cma_id)
|
||||
return isert_np_cma_handler(cma_id->context, event);
|
||||
|
|
@ -680,21 +685,37 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id,
|
|||
isert_conn = cma_id->qp->qp_context;
|
||||
|
||||
mutex_lock(&isert_conn->conn_mutex);
|
||||
terminating = (isert_conn->state == ISER_CONN_TERMINATING);
|
||||
isert_conn_terminate(isert_conn);
|
||||
mutex_unlock(&isert_conn->conn_mutex);
|
||||
|
||||
pr_info("conn %p completing conn_wait\n", isert_conn);
|
||||
complete(&isert_conn->conn_wait);
|
||||
|
||||
if (terminating)
|
||||
goto out;
|
||||
|
||||
mutex_lock(&isert_np->np_accept_mutex);
|
||||
if (!list_empty(&isert_conn->conn_accept_node)) {
|
||||
list_del_init(&isert_conn->conn_accept_node);
|
||||
isert_put_conn(isert_conn);
|
||||
queue_work(isert_release_wq, &isert_conn->release_work);
|
||||
}
|
||||
mutex_unlock(&isert_np->np_accept_mutex);
|
||||
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static int
|
||||
isert_connect_error(struct rdma_cm_id *cma_id)
|
||||
{
|
||||
struct isert_conn *isert_conn = cma_id->qp->qp_context;
|
||||
|
||||
isert_conn->conn_cm_id = NULL;
|
||||
isert_put_conn(isert_conn);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -724,7 +745,7 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */
|
||||
case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */
|
||||
case RDMA_CM_EVENT_CONNECT_ERROR:
|
||||
isert_connect_error(cma_id);
|
||||
ret = isert_connect_error(cma_id);
|
||||
break;
|
||||
default:
|
||||
pr_err("Unhandled RDMA CMA event: %d\n", event->event);
|
||||
|
|
@ -2418,7 +2439,6 @@ static void isert_wait_conn(struct iscsi_conn *conn)
|
|||
|
||||
wait_for_completion(&isert_conn->conn_wait_comp_err);
|
||||
|
||||
INIT_WORK(&isert_conn->release_work, isert_release_work);
|
||||
queue_work(isert_release_wq, &isert_conn->release_work);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1241,10 +1241,11 @@ static bool elantech_is_signature_valid(const unsigned char *param)
|
|||
return true;
|
||||
|
||||
/*
|
||||
* Some models have a revision higher then 20. Meaning param[2] may
|
||||
* be 10 or 20, skip the rates check for these.
|
||||
* Some hw_version >= 4 models have a revision higher then 20. Meaning
|
||||
* that param[2] may be 10 or 20, skip the rates check for these.
|
||||
*/
|
||||
if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40)
|
||||
if ((param[0] & 0x0f) >= 0x06 && (param[1] & 0xaf) == 0x0f &&
|
||||
param[2] < 40)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rates); i++)
|
||||
|
|
|
|||
|
|
@ -626,6 +626,9 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
/* TSC-25 data sheet specifies a delay after the RESET command */
|
||||
msleep(150);
|
||||
|
||||
/* set coordinate output rate */
|
||||
buf[0] = buf[1] = 0xFF;
|
||||
ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
|
||||
|
|
|
|||
|
|
@ -6221,7 +6221,7 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
|
|||
mddev->ctime != info->ctime ||
|
||||
mddev->level != info->level ||
|
||||
/* mddev->layout != info->layout || */
|
||||
!mddev->persistent != info->not_persistent||
|
||||
mddev->persistent != !info->not_persistent ||
|
||||
mddev->chunk_sectors != info->chunk_size >> 9 ||
|
||||
/* ignore bottom 8 bits of state, and allow SB_BITMAP_PRESENT to change */
|
||||
((state^info->state) & 0xfffffe00)
|
||||
|
|
|
|||
|
|
@ -309,8 +309,8 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
|||
|
||||
if (s < 0 && nr_center < -s) {
|
||||
/* not enough in central node */
|
||||
shift(left, center, nr_center);
|
||||
s = nr_center - target;
|
||||
shift(left, center, -nr_center);
|
||||
s += nr_center;
|
||||
shift(left, right, s);
|
||||
nr_right += s;
|
||||
} else
|
||||
|
|
@ -323,7 +323,7 @@ static void redistribute3(struct dm_btree_info *info, struct btree_node *parent,
|
|||
if (s > 0 && nr_center < s) {
|
||||
/* not enough in central node */
|
||||
shift(center, right, nr_center);
|
||||
s = target - nr_center;
|
||||
s -= nr_center;
|
||||
shift(left, right, s);
|
||||
nr_left -= s;
|
||||
} else
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ int dm_btree_del(struct dm_btree_info *info, dm_block_t root)
|
|||
int r;
|
||||
struct del_stack *s;
|
||||
|
||||
s = kmalloc(sizeof(*s), GFP_KERNEL);
|
||||
s = kmalloc(sizeof(*s), GFP_NOIO);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
s->tm = info->tm;
|
||||
|
|
|
|||
|
|
@ -327,7 +327,7 @@ static void raid1_end_read_request(struct bio *bio, int error)
|
|||
spin_lock_irqsave(&conf->device_lock, flags);
|
||||
if (r1_bio->mddev->degraded == conf->raid_disks ||
|
||||
(r1_bio->mddev->degraded == conf->raid_disks-1 &&
|
||||
!test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)))
|
||||
test_bit(In_sync, &conf->mirrors[mirror].rdev->flags)))
|
||||
uptodate = 1;
|
||||
spin_unlock_irqrestore(&conf->device_lock, flags);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -606,6 +606,10 @@ static int af9013_set_frontend(struct dvb_frontend *fe)
|
|||
}
|
||||
}
|
||||
|
||||
/* Return an error if can't find bandwidth or the right clock */
|
||||
if (i == ARRAY_SIZE(coeff_lut))
|
||||
return -EINVAL;
|
||||
|
||||
ret = af9013_wr_regs(state, 0xae00, coeff_lut[i].val,
|
||||
sizeof(coeff_lut[i].val));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -963,6 +963,10 @@ static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
|
|||
struct cx24116_state *state = fe->demodulator_priv;
|
||||
int i, ret;
|
||||
|
||||
/* Validate length */
|
||||
if (d->msg_len > sizeof(d->msg))
|
||||
return -EINVAL;
|
||||
|
||||
/* Dump DiSEqC message */
|
||||
if (debug) {
|
||||
printk(KERN_INFO "cx24116: %s(", __func__);
|
||||
|
|
@ -974,10 +978,6 @@ static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
|
|||
printk(") toneburst=%d\n", toneburst);
|
||||
}
|
||||
|
||||
/* Validate length */
|
||||
if (d->msg_len > (CX24116_ARGLEN - CX24116_DISEQC_MSGOFS))
|
||||
return -EINVAL;
|
||||
|
||||
/* DiSEqC message */
|
||||
for (i = 0; i < d->msg_len; i++)
|
||||
state->dsec_cmd.args[CX24116_DISEQC_MSGOFS + i] = d->msg[i];
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ static int s5h1420_send_master_cmd (struct dvb_frontend* fe,
|
|||
int result = 0;
|
||||
|
||||
dprintk("enter %s\n", __func__);
|
||||
if (cmd->msg_len > 8)
|
||||
if (cmd->msg_len > sizeof(cmd->msg))
|
||||
return -EINVAL;
|
||||
|
||||
/* setup for DISEQC */
|
||||
|
|
|
|||
|
|
@ -201,6 +201,8 @@ static ssize_t power_ro_lock_show(struct device *dev,
|
|||
|
||||
ret = snprintf(buf, PAGE_SIZE, "%d\n", locked);
|
||||
|
||||
mmc_blk_put(md);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1839,9 +1841,11 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
|
|||
break;
|
||||
case MMC_BLK_CMD_ERR:
|
||||
ret = mmc_blk_cmd_err(md, card, brq, req, ret);
|
||||
if (!mmc_blk_reset(md, card->host, type))
|
||||
break;
|
||||
goto cmd_abort;
|
||||
if (mmc_blk_reset(md, card->host, type))
|
||||
goto cmd_abort;
|
||||
if (!ret)
|
||||
goto start_new_req;
|
||||
break;
|
||||
case MMC_BLK_RETRY:
|
||||
if (retry++ < 5)
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
#define ESDHC_DMA_SYSCTL 0x40c
|
||||
#define ESDHC_DMA_SNOOP 0x00000040
|
||||
|
||||
#define ESDHC_HOST_CONTROL_RES 0x05
|
||||
#define ESDHC_HOST_CONTROL_RES 0x01
|
||||
|
||||
static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -255,6 +255,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
|
|||
mmc_of_parse(host->mmc);
|
||||
sdhci_get_of_property(pdev);
|
||||
pdata = pxav3_get_mmc_pdata(dev);
|
||||
pdev->dev.platform_data = pdata;
|
||||
} else if (pdata) {
|
||||
/* on-chip device */
|
||||
if (pdata->flags & PXA_FLAG_CARD_PERMANENT)
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@ static void nw_en_write(void)
|
|||
* we want to write a bit pattern XXX1 to Xilinx to enable
|
||||
* the write gate, which will be open for about the next 2ms.
|
||||
*/
|
||||
spin_lock_irqsave(&nw_gpio_lock, flags);
|
||||
raw_spin_lock_irqsave(&nw_gpio_lock, flags);
|
||||
nw_cpld_modify(CPLD_FLASH_WR_ENABLE, CPLD_FLASH_WR_ENABLE);
|
||||
spin_unlock_irqrestore(&nw_gpio_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&nw_gpio_lock, flags);
|
||||
|
||||
/*
|
||||
* let the ISA bus to catch on...
|
||||
|
|
|
|||
|
|
@ -199,6 +199,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
|
|||
return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
|
||||
|
||||
mutex_lock(&dev->lock);
|
||||
mutex_lock(&mtd_table_mutex);
|
||||
|
||||
if (dev->open)
|
||||
goto unlock;
|
||||
|
|
@ -222,6 +223,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
|
|||
|
||||
unlock:
|
||||
dev->open++;
|
||||
mutex_unlock(&mtd_table_mutex);
|
||||
mutex_unlock(&dev->lock);
|
||||
blktrans_dev_put(dev);
|
||||
return ret;
|
||||
|
|
@ -232,6 +234,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
|
|||
error_put:
|
||||
module_put(dev->tr->owner);
|
||||
kref_put(&dev->ref, blktrans_dev_release);
|
||||
mutex_unlock(&mtd_table_mutex);
|
||||
mutex_unlock(&dev->lock);
|
||||
blktrans_dev_put(dev);
|
||||
return ret;
|
||||
|
|
@ -245,6 +248,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
|
|||
return;
|
||||
|
||||
mutex_lock(&dev->lock);
|
||||
mutex_lock(&mtd_table_mutex);
|
||||
|
||||
if (--dev->open)
|
||||
goto unlock;
|
||||
|
|
@ -258,6 +262,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
|
|||
__put_mtd_device(dev->mtd);
|
||||
}
|
||||
unlock:
|
||||
mutex_unlock(&mtd_table_mutex);
|
||||
mutex_unlock(&dev->lock);
|
||||
blktrans_dev_put(dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@
|
|||
#define PSF_TX 0x1000
|
||||
#define EXT_EVENT 1
|
||||
#define CAL_EVENT 7
|
||||
#define CAL_TRIGGER 7
|
||||
#define CAL_TRIGGER 1
|
||||
#define PER_TRIGGER 6
|
||||
|
||||
#define MII_DP83640_MICR 0x11
|
||||
|
|
|
|||
|
|
@ -1023,12 +1023,14 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
|
|||
|
||||
/* According to 802.3az,the EEE is supported only in full duplex-mode.
|
||||
* Also EEE feature is active when core is operating with MII, GMII
|
||||
* or RGMII.
|
||||
* or RGMII (all kinds). Internal PHYs are also allowed to proceed and
|
||||
* should return an error if they do not support EEE.
|
||||
*/
|
||||
if ((phydev->duplex == DUPLEX_FULL) &&
|
||||
((phydev->interface == PHY_INTERFACE_MODE_MII) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_GMII) ||
|
||||
(phydev->interface == PHY_INTERFACE_MODE_RGMII))) {
|
||||
(phydev->interface >= PHY_INTERFACE_MODE_RGMII &&
|
||||
phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID))) {
|
||||
int eee_lp, eee_cap, eee_adv;
|
||||
u32 lp, cap, adv;
|
||||
int status;
|
||||
|
|
|
|||
|
|
@ -195,11 +195,13 @@ static bool ath_prepare_reset(struct ath_softc *sc)
|
|||
ath9k_debug_samp_bb_mac(sc);
|
||||
ath9k_hw_disable_interrupts(ah);
|
||||
|
||||
if (!ath_drain_all_txq(sc))
|
||||
ret = false;
|
||||
|
||||
if (!ath_stoprecv(sc))
|
||||
ret = false;
|
||||
if (AR_SREV_9300_20_OR_LATER(ah)) {
|
||||
ret &= ath_stoprecv(sc);
|
||||
ret &= ath_drain_all_txq(sc);
|
||||
} else {
|
||||
ret &= ath_drain_all_txq(sc);
|
||||
ret &= ath_stoprecv(sc);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@ struct backend_info {
|
|||
enum xenbus_state frontend_state;
|
||||
struct xenbus_watch hotplug_status_watch;
|
||||
u8 have_hotplug_status_watch:1;
|
||||
|
||||
const char *hotplug_script;
|
||||
};
|
||||
|
||||
static int connect_rings(struct backend_info *);
|
||||
|
|
@ -55,6 +57,7 @@ static int netback_remove(struct xenbus_device *dev)
|
|||
xenvif_free(be->vif);
|
||||
be->vif = NULL;
|
||||
}
|
||||
kfree(be->hotplug_script);
|
||||
kfree(be);
|
||||
dev_set_drvdata(&dev->dev, NULL);
|
||||
return 0;
|
||||
|
|
@ -72,6 +75,7 @@ static int netback_probe(struct xenbus_device *dev,
|
|||
struct xenbus_transaction xbt;
|
||||
int err;
|
||||
int sg;
|
||||
const char *script;
|
||||
struct backend_info *be = kzalloc(sizeof(struct backend_info),
|
||||
GFP_KERNEL);
|
||||
if (!be) {
|
||||
|
|
@ -132,6 +136,15 @@ static int netback_probe(struct xenbus_device *dev,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL);
|
||||
if (IS_ERR(script)) {
|
||||
err = PTR_ERR(script);
|
||||
xenbus_dev_fatal(dev, err, "reading script");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
be->hotplug_script = script;
|
||||
|
||||
err = xenbus_switch_state(dev, XenbusStateInitWait);
|
||||
if (err)
|
||||
goto fail;
|
||||
|
|
@ -162,22 +175,14 @@ static int netback_uevent(struct xenbus_device *xdev,
|
|||
struct kobj_uevent_env *env)
|
||||
{
|
||||
struct backend_info *be = dev_get_drvdata(&xdev->dev);
|
||||
char *val;
|
||||
|
||||
val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
|
||||
if (IS_ERR(val)) {
|
||||
int err = PTR_ERR(val);
|
||||
xenbus_dev_fatal(xdev, err, "reading script");
|
||||
return err;
|
||||
} else {
|
||||
if (add_uevent_var(env, "script=%s", val)) {
|
||||
kfree(val);
|
||||
return -ENOMEM;
|
||||
}
|
||||
kfree(val);
|
||||
}
|
||||
if (!be)
|
||||
return 0;
|
||||
|
||||
if (!be || !be->vif)
|
||||
if (add_uevent_var(env, "script=%s", be->hotplug_script))
|
||||
return -ENOMEM;
|
||||
|
||||
if (!be->vif)
|
||||
return 0;
|
||||
|
||||
return add_uevent_var(env, "vif=%s", be->vif->dev->name);
|
||||
|
|
|
|||
|
|
@ -104,6 +104,9 @@
|
|||
#define TOPIC_EXCA_IF_CONTROL 0x3e /* 8 bit */
|
||||
#define TOPIC_EXCA_IFC_33V_ENA 0x01
|
||||
|
||||
#define TOPIC_PCI_CFG_PPBCN 0x3e /* 16-bit */
|
||||
#define TOPIC_PCI_CFG_PPBCN_WBEN 0x0400
|
||||
|
||||
static void topic97_zoom_video(struct pcmcia_socket *sock, int onoff)
|
||||
{
|
||||
struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
|
||||
|
|
@ -138,6 +141,7 @@ static int topic97_override(struct yenta_socket *socket)
|
|||
static int topic95_override(struct yenta_socket *socket)
|
||||
{
|
||||
u8 fctrl;
|
||||
u16 ppbcn;
|
||||
|
||||
/* enable 3.3V support for 16bit cards */
|
||||
fctrl = exca_readb(socket, TOPIC_EXCA_IF_CONTROL);
|
||||
|
|
@ -146,6 +150,18 @@ static int topic95_override(struct yenta_socket *socket)
|
|||
/* tell yenta to use exca registers to power 16bit cards */
|
||||
socket->flags |= YENTA_16BIT_POWER_EXCA | YENTA_16BIT_POWER_DF;
|
||||
|
||||
/* Disable write buffers to prevent lockups under load with numerous
|
||||
Cardbus cards, observed on Tecra 500CDT and reported elsewhere on the
|
||||
net. This is not a power-on default according to the datasheet
|
||||
but some BIOSes seem to set it. */
|
||||
if (pci_read_config_word(socket->dev, TOPIC_PCI_CFG_PPBCN, &ppbcn) == 0
|
||||
&& socket->dev->revision <= 7
|
||||
&& (ppbcn & TOPIC_PCI_CFG_PPBCN_WBEN)) {
|
||||
ppbcn &= ~TOPIC_PCI_CFG_PPBCN_WBEN;
|
||||
pci_write_config_word(socket->dev, TOPIC_PCI_CFG_PPBCN, ppbcn);
|
||||
dev_info(&socket->dev->dev, "Disabled ToPIC95 Cardbus write buffers.\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -358,11 +358,11 @@ static struct mvebu_mpp_mode mv88f6710_mpp_modes[] = {
|
|||
MPP_MODE(64,
|
||||
MPP_FUNCTION(0x0, "gpio", NULL),
|
||||
MPP_FUNCTION(0x1, "spi0", "miso"),
|
||||
MPP_FUNCTION(0x2, "spi0-1", "cs1")),
|
||||
MPP_FUNCTION(0x2, "spi0", "cs1")),
|
||||
MPP_MODE(65,
|
||||
MPP_FUNCTION(0x0, "gpio", NULL),
|
||||
MPP_FUNCTION(0x1, "spi0", "mosi"),
|
||||
MPP_FUNCTION(0x2, "spi0-1", "cs2")),
|
||||
MPP_FUNCTION(0x2, "spi0", "cs2")),
|
||||
};
|
||||
|
||||
static struct mvebu_pinctrl_soc_info armada_370_pinctrl_info;
|
||||
|
|
|
|||
|
|
@ -14,10 +14,7 @@
|
|||
* available: mv78230, mv78260 and mv78460. From a pin muxing
|
||||
* perspective, the mv78230 has 49 MPP pins. The mv78260 and mv78460
|
||||
* both have 67 MPP pins (more GPIOs and address lines for the memory
|
||||
* bus mainly). The only difference between the mv78260 and the
|
||||
* mv78460 in terms of pin muxing is the addition of two functions on
|
||||
* pins 43 and 56 to access the VDD of the CPU2 and 3 (mv78260 has two
|
||||
* cores, mv78460 has four cores).
|
||||
* bus mainly).
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
|
|
@ -159,20 +156,17 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_MODE(24,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "sata1", "prsnt", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "nf", "bootcs-re", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "rst", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "hsync", V_MV78230_PLUS)),
|
||||
MPP_MODE(25,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "sata0", "prsnt", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "nf", "bootcs-we", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "pclk", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "vsync", V_MV78230_PLUS)),
|
||||
MPP_MODE(26,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "fsync", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "clk", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "vdd", "cpu1-pd", V_MV78230_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "clk", V_MV78230_PLUS)),
|
||||
MPP_MODE(27,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "ptp", "trig", V_MV78230_PLUS),
|
||||
|
|
@ -187,8 +181,7 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "ptp", "clk", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "int0", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "ref-clk", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "vdd", "cpu0-pd", V_MV78230_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "ref-clk", V_MV78230_PLUS)),
|
||||
MPP_MODE(30,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "sd0", "clk", V_MV78230_PLUS),
|
||||
|
|
@ -196,13 +189,11 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_MODE(31,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "sd0", "cmd", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "int2", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "vdd", "cpu0-pd", V_MV78230_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "int2", V_MV78230_PLUS)),
|
||||
MPP_MODE(32,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "sd0", "d0", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "int3", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "vdd", "cpu1-pd", V_MV78230_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "int3", V_MV78230_PLUS)),
|
||||
MPP_MODE(33,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "sd0", "d1", V_MV78230_PLUS),
|
||||
|
|
@ -234,7 +225,6 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "spi", "cs1", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "uart2", "cts", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "vdd", "cpu1-pd", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "lcd", "vga-hsync", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "pcie", "clkreq0", V_MV78230_PLUS)),
|
||||
MPP_MODE(41,
|
||||
|
|
@ -249,15 +239,13 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_VAR_FUNCTION(0x1, "uart2", "rxd", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "uart0", "cts", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "tdm", "int7", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "tdm-1", "timer", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "vdd", "cpu0-pd", V_MV78230_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x4, "tdm-1", "timer", V_MV78230_PLUS)),
|
||||
MPP_MODE(43,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "uart2", "txd", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "uart0", "rts", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x3, "spi", "cs3", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "pcie", "rstout", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x5, "vdd", "cpu2-3-pd", V_MV78460)),
|
||||
MPP_VAR_FUNCTION(0x4, "pcie", "rstout", V_MV78230_PLUS)),
|
||||
MPP_MODE(44,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "uart2", "cts", V_MV78230_PLUS),
|
||||
|
|
@ -286,7 +274,7 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_VAR_FUNCTION(0x5, "pcie", "clkreq3", V_MV78230_PLUS)),
|
||||
MPP_MODE(48,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "tclk", NULL, V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "clkout", V_MV78230_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "dev", "burst/last", V_MV78230_PLUS)),
|
||||
MPP_MODE(49,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78260_PLUS),
|
||||
|
|
@ -308,16 +296,13 @@ static struct mvebu_mpp_mode armada_xp_mpp_modes[] = {
|
|||
MPP_VAR_FUNCTION(0x1, "dev", "ad19", V_MV78260_PLUS)),
|
||||
MPP_MODE(55,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad20", V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "vdd", "cpu0-pd", V_MV78260_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad20", V_MV78260_PLUS)),
|
||||
MPP_MODE(56,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad21", V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "vdd", "cpu1-pd", V_MV78260_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad21", V_MV78260_PLUS)),
|
||||
MPP_MODE(57,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad22", V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x2, "vdd", "cpu2-3-pd", V_MV78460)),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad22", V_MV78260_PLUS)),
|
||||
MPP_MODE(58,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_MV78260_PLUS),
|
||||
MPP_VAR_FUNCTION(0x1, "dev", "ad23", V_MV78260_PLUS)),
|
||||
|
|
|
|||
|
|
@ -769,7 +769,7 @@ static int suspend_prepare(struct regulator_dev *rdev, suspend_state_t state)
|
|||
static void print_constraints(struct regulator_dev *rdev)
|
||||
{
|
||||
struct regulation_constraints *constraints = rdev->constraints;
|
||||
char buf[80] = "";
|
||||
char buf[160] = "";
|
||||
int count = 0;
|
||||
int ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -3898,10 +3898,6 @@ static int hpsa_kdump_hard_reset_controller(struct pci_dev *pdev)
|
|||
|
||||
/* Save the PCI command register */
|
||||
pci_read_config_word(pdev, 4, &command_register);
|
||||
/* Turn the board off. This is so that later pci_restore_state()
|
||||
* won't turn the board on before the rest of config space is ready.
|
||||
*/
|
||||
pci_disable_device(pdev);
|
||||
pci_save_state(pdev);
|
||||
|
||||
/* find the first memory BAR, so we can find the cfg table */
|
||||
|
|
@ -3949,11 +3945,6 @@ static int hpsa_kdump_hard_reset_controller(struct pci_dev *pdev)
|
|||
goto unmap_cfgtable;
|
||||
|
||||
pci_restore_state(pdev);
|
||||
rc = pci_enable_device(pdev);
|
||||
if (rc) {
|
||||
dev_warn(&pdev->dev, "failed to enable device.\n");
|
||||
goto unmap_cfgtable;
|
||||
}
|
||||
pci_write_config_word(pdev, 4, command_register);
|
||||
|
||||
/* Some devices (notably the HP Smart Array 5i Controller)
|
||||
|
|
@ -4448,6 +4439,23 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
|
|||
if (!reset_devices)
|
||||
return 0;
|
||||
|
||||
/* kdump kernel is loading, we don't know in which state is
|
||||
* the pci interface. The dev->enable_cnt is equal zero
|
||||
* so we call enable+disable, wait a while and switch it on.
|
||||
*/
|
||||
rc = pci_enable_device(pdev);
|
||||
if (rc) {
|
||||
dev_warn(&pdev->dev, "Failed to enable PCI device\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
pci_disable_device(pdev);
|
||||
msleep(260); /* a randomly chosen number */
|
||||
rc = pci_enable_device(pdev);
|
||||
if (rc) {
|
||||
dev_warn(&pdev->dev, "failed to enable device.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
pci_set_master(pdev);
|
||||
/* Reset the controller with a PCI power-cycle or via doorbell */
|
||||
rc = hpsa_kdump_hard_reset_controller(pdev);
|
||||
|
||||
|
|
@ -4456,10 +4464,11 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
|
|||
* "performant mode". Or, it might be 640x, which can't reset
|
||||
* due to concerns about shared bbwc between 6402/6404 pair.
|
||||
*/
|
||||
if (rc == -ENOTSUPP)
|
||||
return rc; /* just try to do the kdump anyhow. */
|
||||
if (rc)
|
||||
return -ENODEV;
|
||||
if (rc) {
|
||||
if (rc != -ENOTSUPP) /* just try to do the kdump anyhow. */
|
||||
rc = -ENODEV;
|
||||
goto out_disable;
|
||||
}
|
||||
|
||||
/* Now try to get the controller to respond to a no-op */
|
||||
dev_warn(&pdev->dev, "Waiting for controller to respond to no-op\n");
|
||||
|
|
@ -4470,7 +4479,11 @@ static int hpsa_init_reset_devices(struct pci_dev *pdev)
|
|||
dev_warn(&pdev->dev, "no-op failed%s\n",
|
||||
(i < 11 ? "; re-trying" : ""));
|
||||
}
|
||||
return 0;
|
||||
|
||||
out_disable:
|
||||
|
||||
pci_disable_device(pdev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
|
||||
|
|
@ -4613,6 +4626,7 @@ static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h)
|
|||
iounmap(h->transtable);
|
||||
if (h->cfgtable)
|
||||
iounmap(h->cfgtable);
|
||||
pci_disable_device(h->pdev);
|
||||
pci_release_regions(h->pdev);
|
||||
kfree(h);
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user