Merge branch 'drm-intel-fixes' into drm-intel-next

This commit is contained in:
Keith Packard 2011-06-29 10:34:54 -07:00
commit 8eb2c0ee67
226 changed files with 1980 additions and 1188 deletions

View File

@ -520,59 +520,20 @@ Support for power domains is provided through the pwr_domain field of struct
device. This field is a pointer to an object of type struct dev_power_domain, device. This field is a pointer to an object of type struct dev_power_domain,
defined in include/linux/pm.h, providing a set of power management callbacks defined in include/linux/pm.h, providing a set of power management callbacks
analogous to the subsystem-level and device driver callbacks that are executed analogous to the subsystem-level and device driver callbacks that are executed
for the given device during all power transitions, in addition to the respective for the given device during all power transitions, instead of the respective
subsystem-level callbacks. Specifically, the power domain "suspend" callbacks subsystem-level callbacks. Specifically, if a device's pm_domain pointer is
(i.e. ->runtime_suspend(), ->suspend(), ->freeze(), ->poweroff(), etc.) are not NULL, the ->suspend() callback from the object pointed to by it will be
executed after the analogous subsystem-level callbacks, while the power domain executed instead of its subsystem's (e.g. bus type's) ->suspend() callback and
"resume" callbacks (i.e. ->runtime_resume(), ->resume(), ->thaw(), ->restore, anlogously for all of the remaining callbacks. In other words, power management
etc.) are executed before the analogous subsystem-level callbacks. Error codes domain callbacks, if defined for the given device, always take precedence over
returned by the "suspend" and "resume" power domain callbacks are ignored. the callbacks provided by the device's subsystem (e.g. bus type).
Power domain ->runtime_idle() callback is executed before the subsystem-level The support for device power management domains is only relevant to platforms
->runtime_idle() callback and the result returned by it is not ignored. Namely, needing to use the same device driver power management callbacks in many
if it returns error code, the subsystem-level ->runtime_idle() callback will not different power domain configurations and wanting to avoid incorporating the
be called and the helper function rpm_idle() executing it will return error support for power domains into subsystem-level callbacks, for example by
code. This mechanism is intended to help platforms where saving device state modifying the platform bus type. Other platforms need not implement it or take
is a time consuming operation and should only be carried out if all devices it into account in any way.
in the power domain are idle, before turning off the shared power resource(s).
Namely, the power domain ->runtime_idle() callback may return error code until
the pm_runtime_idle() helper (or its asychronous version) has been called for
all devices in the power domain (it is recommended that the returned error code
be -EBUSY in those cases), preventing the subsystem-level ->runtime_idle()
callback from being run prematurely.
The support for device power domains is only relevant to platforms needing to
use the same subsystem-level (e.g. platform bus type) and device driver power
management callbacks in many different power domain configurations and wanting
to avoid incorporating the support for power domains into the subsystem-level
callbacks. The other platforms need not implement it or take it into account
in any way.
System Devices
--------------
System devices (sysdevs) follow a slightly different API, which can be found in
include/linux/sysdev.h
drivers/base/sys.c
System devices will be suspended with interrupts disabled, and after all other
devices have been suspended. On resume, they will be resumed before any other
devices, and also with interrupts disabled. These things occur in special
"sysdev_driver" phases, which affect only system devices.
Thus, after the suspend_noirq (or freeze_noirq or poweroff_noirq) phase, when
the non-boot CPUs are all offline and IRQs are disabled on the remaining online
CPU, then a sysdev_driver.suspend phase is carried out, and the system enters a
sleep state (or a system image is created). During resume (or after the image
has been created or loaded) a sysdev_driver.resume phase is carried out, IRQs
are enabled on the only online CPU, the non-boot CPUs are enabled, and the
resume_noirq (or thaw_noirq or restore_noirq) phase begins.
Code to actually enter and exit the system-wide low power state sometimes
involves hardware details that are only known to the boot firmware, and
may leave a CPU running software (from SRAM or flash memory) that monitors
the system and manages its wakeup sequence.
Device Low Power (suspend) States Device Low Power (suspend) States

View File

@ -566,11 +566,6 @@ to do this is:
pm_runtime_set_active(dev); pm_runtime_set_active(dev);
pm_runtime_enable(dev); pm_runtime_enable(dev);
The PM core always increments the run-time usage counter before calling the
->prepare() callback and decrements it after calling the ->complete() callback.
Hence disabling run-time PM temporarily like this will not cause any run-time
suspend callbacks to be lost.
7. Generic subsystem callbacks 7. Generic subsystem callbacks
Subsystems may wish to conserve code space by using the set of generic power Subsystems may wish to conserve code space by using the set of generic power

View File

@ -76,6 +76,13 @@ A transfer's actual_length may be positive even when an error has been
reported. That's because transfers often involve several packets, so that reported. That's because transfers often involve several packets, so that
one or more packets could finish before an error stops further endpoint I/O. one or more packets could finish before an error stops further endpoint I/O.
For isochronous URBs, the urb status value is non-zero only if the URB is
unlinked, the device is removed, the host controller is disabled, or the total
transferred length is less than the requested length and the URB_SHORT_NOT_OK
flag is set. Completion handlers for isochronous URBs should only see
urb->status set to zero, -ENOENT, -ECONNRESET, -ESHUTDOWN, or -EREMOTEIO.
Individual frame descriptor status fields may report more status codes.
0 Transfer completed successfully 0 Transfer completed successfully
@ -132,7 +139,7 @@ one or more packets could finish before an error stops further endpoint I/O.
device removal events immediately. device removal events immediately.
-EXDEV ISO transfer only partially completed -EXDEV ISO transfer only partially completed
look at individual frame status for details (only set in iso_frame_desc[n].status, not urb->status)
-EINVAL ISO madness, if this happens: Log off and go home -EINVAL ISO madness, if this happens: Log off and go home

View File

@ -6434,8 +6434,9 @@ S: Maintained
F: drivers/usb/misc/rio500* F: drivers/usb/misc/rio500*
USB EHCI DRIVER USB EHCI DRIVER
M: Alan Stern <stern@rowland.harvard.edu>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Orphan S: Maintained
F: Documentation/usb/ehci.txt F: Documentation/usb/ehci.txt
F: drivers/usb/host/ehci* F: drivers/usb/host/ehci*
@ -6465,6 +6466,12 @@ S: Maintained
F: Documentation/hid/hiddev.txt F: Documentation/hid/hiddev.txt
F: drivers/hid/usbhid/ F: drivers/hid/usbhid/
USB/IP DRIVERS
M: Matt Mooney <mfm@muteddisk.com>
L: linux-usb@vger.kernel.org
S: Maintained
F: drivers/staging/usbip/
USB ISP116X DRIVER USB ISP116X DRIVER
M: Olav Kongas <ok@artecdesign.ee> M: Olav Kongas <ok@artecdesign.ee>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
@ -6494,8 +6501,9 @@ S: Maintained
F: sound/usb/midi.* F: sound/usb/midi.*
USB OHCI DRIVER USB OHCI DRIVER
M: Alan Stern <stern@rowland.harvard.edu>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Orphan S: Maintained
F: Documentation/usb/ohci.txt F: Documentation/usb/ohci.txt
F: drivers/usb/host/ohci* F: drivers/usb/host/ohci*

View File

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 0 PATCHLEVEL = 0
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc4 EXTRAVERSION = -rc5
NAME = Sneaky Weasel NAME = Sneaky Weasel
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -56,7 +56,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
* Given a kernel address, find the home node of the underlying memory. * Given a kernel address, find the home node of the underlying memory.
*/ */
#define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr)) #define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
/* /*
* Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory

View File

@ -597,6 +597,8 @@ __common_mmu_cache_on:
sub pc, lr, r0, lsr #32 @ properly flush pipeline sub pc, lr, r0, lsr #32 @ properly flush pipeline
#endif #endif
#define PROC_ENTRY_SIZE (4*5)
/* /*
* Here follow the relocatable cache support functions for the * Here follow the relocatable cache support functions for the
* various processors. This is a generic hook for locating an * various processors. This is a generic hook for locating an
@ -624,7 +626,7 @@ call_cache_fn: adr r12, proc_types
ARM( addeq pc, r12, r3 ) @ call cache function ARM( addeq pc, r12, r3 ) @ call cache function
THUMB( addeq r12, r3 ) THUMB( addeq r12, r3 )
THUMB( moveq pc, r12 ) @ call cache function THUMB( moveq pc, r12 ) @ call cache function
add r12, r12, #4*5 add r12, r12, #PROC_ENTRY_SIZE
b 1b b 1b
/* /*
@ -794,6 +796,16 @@ proc_types:
.size proc_types, . - proc_types .size proc_types, . - proc_types
/*
* If you get a "non-constant expression in ".if" statement"
* error from the assembler on this line, check that you have
* not accidentally written a "b" instruction where you should
* have written W(b).
*/
.if (. - proc_types) % PROC_ENTRY_SIZE != 0
.error "The size of one or more proc_types entries is wrong."
.endif
/* /*
* Turn off the Cache and MMU. ARMv3 does not support * Turn off the Cache and MMU. ARMv3 does not support
* reading the control register, but ARMv4 does. * reading the control register, but ARMv4 does.

View File

@ -13,6 +13,9 @@
* Do not include any C declarations in this file - it is included by * Do not include any C declarations in this file - it is included by
* assembler source. * assembler source.
*/ */
#ifndef __ASM_ASSEMBLER_H__
#define __ASM_ASSEMBLER_H__
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#error "Only include this from assembly code" #error "Only include this from assembly code"
#endif #endif
@ -290,3 +293,4 @@
.macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f .macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort
.endm .endm
#endif /* __ASM_ASSEMBLER_H__ */

View File

@ -1,3 +1,5 @@
#include <asm/assembler.h>
/* /*
* Interrupt handling. Preserves r7, r8, r9 * Interrupt handling. Preserves r7, r8, r9
*/ */

View File

@ -193,8 +193,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
offset -= 0x02000000; offset -= 0x02000000;
offset += sym->st_value - loc; offset += sym->st_value - loc;
/* only Thumb addresses allowed (no interworking) */ /*
if (!(offset & 1) || * For function symbols, only Thumb addresses are
* allowed (no interworking).
*
* For non-function symbols, the destination
* has no specific ARM/Thumb disposition, so
* the branch is resolved under the assumption
* that interworking is not required.
*/
if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&
!(offset & 1)) ||
offset <= (s32)0xff000000 || offset <= (s32)0xff000000 ||
offset >= (s32)0x01000000) { offset >= (s32)0x01000000) {
pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n", pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n",

View File

@ -318,9 +318,13 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
smp_store_cpu_info(cpu); smp_store_cpu_info(cpu);
/* /*
* OK, now it's safe to let the boot CPU continue * OK, now it's safe to let the boot CPU continue. Wait for
* the CPU migration code to notice that the CPU is online
* before we continue.
*/ */
set_cpu_online(cpu, true); set_cpu_online(cpu, true);
while (!cpu_active(cpu))
cpu_relax();
/* /*
* OK, it's off to the idle thread for us * OK, it's off to the idle thread for us

View File

@ -35,6 +35,7 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
tcfg->clocks = exynos4_serial_clocks; tcfg->clocks = exynos4_serial_clocks;
tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);
} }
tcfg->flags |= NO_NEED_CHECK_CLKSRC;
} }
s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);

View File

@ -6,12 +6,14 @@ config ARCH_H7201
bool "gms30c7201" bool "gms30c7201"
depends on ARCH_H720X depends on ARCH_H720X
select CPU_H7201 select CPU_H7201
select ZONE_DMA
help help
Say Y here if you are using the Hynix GMS30C7201 Reference Board Say Y here if you are using the Hynix GMS30C7201 Reference Board
config ARCH_H7202 config ARCH_H7202
bool "hms30c7202" bool "hms30c7202"
select CPU_H7202 select CPU_H7202
select ZONE_DMA
depends on ARCH_H720X depends on ARCH_H720X
help help
Say Y here if you are using the Hynix HMS30C7202 Reference Board Say Y here if you are using the Hynix HMS30C7202 Reference Board

View File

@ -110,10 +110,18 @@ static pin_cfg_t mop500_pins_common[] = {
GPIO168_KP_O0, GPIO168_KP_O0,
/* UART */ /* UART */
GPIO0_U0_CTSn | PIN_INPUT_PULLUP, /* uart-0 pins gpio configuration should be
GPIO1_U0_RTSn | PIN_OUTPUT_HIGH, * kept intact to prevent glitch in tx line
GPIO2_U0_RXD | PIN_INPUT_PULLUP, * when tty dev is opened. Later these pins
GPIO3_U0_TXD | PIN_OUTPUT_HIGH, * are configured to uart mop500_pins_uart0
*
* It will be replaced with uart configuration
* once the issue is solved.
*/
GPIO0_GPIO | PIN_INPUT_PULLUP,
GPIO1_GPIO | PIN_OUTPUT_HIGH,
GPIO2_GPIO | PIN_INPUT_PULLUP,
GPIO3_GPIO | PIN_OUTPUT_HIGH,
GPIO29_U2_RXD | PIN_INPUT_PULLUP, GPIO29_U2_RXD | PIN_INPUT_PULLUP,
GPIO30_U2_TXD | PIN_OUTPUT_HIGH, GPIO30_U2_TXD | PIN_OUTPUT_HIGH,

View File

@ -27,18 +27,21 @@
#include <linux/leds-lp5521.h> #include <linux/leds-lp5521.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/delay.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <plat/i2c.h> #include <plat/i2c.h>
#include <plat/ste_dma40.h> #include <plat/ste_dma40.h>
#include <plat/pincfg.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/setup.h> #include <mach/setup.h>
#include <mach/devices.h> #include <mach/devices.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include "pins-db8500.h"
#include "ste-dma40-db8500.h" #include "ste-dma40-db8500.h"
#include "devices-db8500.h" #include "devices-db8500.h"
#include "board-mop500.h" #include "board-mop500.h"
@ -393,12 +396,63 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
}; };
#endif #endif
static pin_cfg_t mop500_pins_uart0[] = {
GPIO0_U0_CTSn | PIN_INPUT_PULLUP,
GPIO1_U0_RTSn | PIN_OUTPUT_HIGH,
GPIO2_U0_RXD | PIN_INPUT_PULLUP,
GPIO3_U0_TXD | PIN_OUTPUT_HIGH,
};
#define PRCC_K_SOFTRST_SET 0x18
#define PRCC_K_SOFTRST_CLEAR 0x1C
static void ux500_uart0_reset(void)
{
void __iomem *prcc_rst_set, *prcc_rst_clr;
prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
PRCC_K_SOFTRST_SET);
prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
PRCC_K_SOFTRST_CLEAR);
/* Activate soft reset PRCC_K_SOFTRST_CLEAR */
writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
udelay(1);
/* Release soft reset PRCC_K_SOFTRST_SET */
writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
udelay(1);
}
static void ux500_uart0_init(void)
{
int ret;
ret = nmk_config_pins(mop500_pins_uart0,
ARRAY_SIZE(mop500_pins_uart0));
if (ret < 0)
pr_err("pl011: uart pins_enable failed\n");
}
static void ux500_uart0_exit(void)
{
int ret;
ret = nmk_config_pins_sleep(mop500_pins_uart0,
ARRAY_SIZE(mop500_pins_uart0));
if (ret < 0)
pr_err("pl011: uart pins_disable failed\n");
}
static struct amba_pl011_data uart0_plat = { static struct amba_pl011_data uart0_plat = {
#ifdef CONFIG_STE_DMA40 #ifdef CONFIG_STE_DMA40
.dma_filter = stedma40_filter, .dma_filter = stedma40_filter,
.dma_rx_param = &uart0_dma_cfg_rx, .dma_rx_param = &uart0_dma_cfg_rx,
.dma_tx_param = &uart0_dma_cfg_tx, .dma_tx_param = &uart0_dma_cfg_tx,
#endif #endif
.init = ux500_uart0_init,
.exit = ux500_uart0_exit,
.reset = ux500_uart0_reset,
}; };
static struct amba_pl011_data uart1_plat = { static struct amba_pl011_data uart1_plat = {

View File

@ -210,19 +210,21 @@ cpu_v7_name:
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
.globl cpu_v7_suspend_size .globl cpu_v7_suspend_size
.equ cpu_v7_suspend_size, 4 * 8 .equ cpu_v7_suspend_size, 4 * 9
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
ENTRY(cpu_v7_do_suspend) ENTRY(cpu_v7_do_suspend)
stmfd sp!, {r4 - r11, lr} stmfd sp!, {r4 - r11, lr}
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
mrc p15, 0, r5, c13, c0, 1 @ Context ID mrc p15, 0, r5, c13, c0, 1 @ Context ID
mrc p15, 0, r6, c13, c0, 3 @ User r/o thread ID
stmia r0!, {r4 - r6}
mrc p15, 0, r6, c3, c0, 0 @ Domain ID mrc p15, 0, r6, c3, c0, 0 @ Domain ID
mrc p15, 0, r7, c2, c0, 0 @ TTB 0 mrc p15, 0, r7, c2, c0, 0 @ TTB 0
mrc p15, 0, r8, c2, c0, 1 @ TTB 1 mrc p15, 0, r8, c2, c0, 1 @ TTB 1
mrc p15, 0, r9, c1, c0, 0 @ Control register mrc p15, 0, r9, c1, c0, 0 @ Control register
mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register
mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control
stmia r0, {r4 - r11} stmia r0, {r6 - r11}
ldmfd sp!, {r4 - r11, pc} ldmfd sp!, {r4 - r11, pc}
ENDPROC(cpu_v7_do_suspend) ENDPROC(cpu_v7_do_suspend)
@ -230,9 +232,11 @@ ENTRY(cpu_v7_do_resume)
mov ip, #0 mov ip, #0
mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
ldmia r0, {r4 - r11} ldmia r0!, {r4 - r6}
mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
mcr p15, 0, r5, c13, c0, 1 @ Context ID mcr p15, 0, r5, c13, c0, 1 @ Context ID
mcr p15, 0, r6, c13, c0, 3 @ User r/o thread ID
ldmia r0, {r6 - r11}
mcr p15, 0, r6, c3, c0, 0 @ Domain ID mcr p15, 0, r6, c3, c0, 0 @ Domain ID
mcr p15, 0, r7, c2, c0, 0 @ TTB 0 mcr p15, 0, r7, c2, c0, 0 @ TTB 0
mcr p15, 0, r8, c2, c0, 1 @ TTB 1 mcr p15, 0, r8, c2, c0, 1 @ TTB 1
@ -418,9 +422,9 @@ ENTRY(v7_processor_functions)
.word cpu_v7_dcache_clean_area .word cpu_v7_dcache_clean_area
.word cpu_v7_switch_mm .word cpu_v7_switch_mm
.word cpu_v7_set_pte_ext .word cpu_v7_set_pte_ext
.word 0 .word cpu_v7_suspend_size
.word 0 .word cpu_v7_do_suspend
.word 0 .word cpu_v7_do_resume
.size v7_processor_functions, . - v7_processor_functions .size v7_processor_functions, . - v7_processor_functions
.section ".rodata" .section ".rodata"

View File

@ -18,6 +18,7 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/ptrace.h>
static int cp6_trap(struct pt_regs *regs, unsigned int instr) static int cp6_trap(struct pt_regs *regs, unsigned int instr)
{ {

View File

@ -224,6 +224,8 @@
#define S5PV210_UFSTAT_RXMASK (255<<0) #define S5PV210_UFSTAT_RXMASK (255<<0)
#define S5PV210_UFSTAT_RXSHIFT (0) #define S5PV210_UFSTAT_RXSHIFT (0)
#define NO_NEED_CHECK_CLKSRC 1
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* struct s3c24xx_uart_clksrc /* struct s3c24xx_uart_clksrc

View File

@ -14,12 +14,6 @@ extern struct pglist_data *node_data[];
#define NODE_DATA(nid) (node_data[nid]) #define NODE_DATA(nid) (node_data[nid])
#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn) #define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) \
({ \
pg_data_t *__pgdat = NODE_DATA(nid); \
__pgdat->node_start_pfn + __pgdat->node_spanned_pages - 1; \
})
#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
/* /*
@ -44,7 +38,7 @@ static __inline__ int pfn_to_nid(unsigned long pfn)
int node; int node;
for (node = 0 ; node < MAX_NUMNODES ; node++) for (node = 0 ; node < MAX_NUMNODES ; node++)
if (pfn >= node_start_pfn(node) && pfn <= node_end_pfn(node)) if (pfn >= node_start_pfn(node) && pfn < node_end_pfn(node))
break; break;
return node; return node;

View File

@ -15,6 +15,7 @@
* User space memory access functions * User space memory access functions
*/ */
#include <linux/thread_info.h> #include <linux/thread_info.h>
#include <linux/kernel.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/errno.h> #include <asm/errno.h>

View File

@ -14,13 +14,6 @@ extern struct node_map_data node_data[];
#define NODE_DATA(nid) (&node_data[nid].pg_data) #define NODE_DATA(nid) (&node_data[nid].pg_data)
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) \
({ \
pg_data_t *__pgdat = NODE_DATA(nid); \
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
})
/* We have these possible memory map layouts: /* We have these possible memory map layouts:
* Astro: 0-3.75, 67.75-68, 4-64 * Astro: 0-3.75, 67.75-68, 4-64
* zx1: 0-1, 257-260, 4-256 * zx1: 0-1, 257-260, 4-256

View File

@ -38,13 +38,6 @@ u64 memory_hotplug_max(void);
#define memory_hotplug_max() memblock_end_of_DRAM() #define memory_hotplug_max() memblock_end_of_DRAM()
#endif #endif
/*
* Following are macros that each numa implmentation must define.
*/
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn)
#else #else
#define memory_hotplug_max() memblock_end_of_DRAM() #define memory_hotplug_max() memblock_end_of_DRAM()
#endif /* CONFIG_NEED_MULTIPLE_NODES */ #endif /* CONFIG_NEED_MULTIPLE_NODES */

View File

@ -579,6 +579,7 @@ config S390_GUEST
def_bool y def_bool y
prompt "s390 guest support for KVM (EXPERIMENTAL)" prompt "s390 guest support for KVM (EXPERIMENTAL)"
depends on 64BIT && EXPERIMENTAL depends on 64BIT && EXPERIMENTAL
select VIRTUALIZATION
select VIRTIO select VIRTIO
select VIRTIO_RING select VIRTIO_RING
select VIRTIO_CONSOLE select VIRTIO_CONSOLE

View File

@ -262,7 +262,7 @@ void smp_ctl_set_bit(int cr, int bit)
memset(&parms.orvals, 0, sizeof(parms.orvals)); memset(&parms.orvals, 0, sizeof(parms.orvals));
memset(&parms.andvals, 0xff, sizeof(parms.andvals)); memset(&parms.andvals, 0xff, sizeof(parms.andvals));
parms.orvals[cr] = 1 << bit; parms.orvals[cr] = 1UL << bit;
on_each_cpu(smp_ctl_bit_callback, &parms, 1); on_each_cpu(smp_ctl_bit_callback, &parms, 1);
} }
EXPORT_SYMBOL(smp_ctl_set_bit); EXPORT_SYMBOL(smp_ctl_set_bit);
@ -276,7 +276,7 @@ void smp_ctl_clear_bit(int cr, int bit)
memset(&parms.orvals, 0, sizeof(parms.orvals)); memset(&parms.orvals, 0, sizeof(parms.orvals));
memset(&parms.andvals, 0xff, sizeof(parms.andvals)); memset(&parms.andvals, 0xff, sizeof(parms.andvals));
parms.andvals[cr] = ~(1L << bit); parms.andvals[cr] = ~(1UL << bit);
on_each_cpu(smp_ctl_bit_callback, &parms, 1); on_each_cpu(smp_ctl_bit_callback, &parms, 1);
} }
EXPORT_SYMBOL(smp_ctl_clear_bit); EXPORT_SYMBOL(smp_ctl_clear_bit);

View File

@ -25,7 +25,7 @@ extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth);
#include "hwsampler.h" #include "hwsampler.h"
#define DEFAULT_INTERVAL 4096 #define DEFAULT_INTERVAL 4127518
#define DEFAULT_SDBT_BLOCKS 1 #define DEFAULT_SDBT_BLOCKS 1
#define DEFAULT_SDB_BLOCKS 511 #define DEFAULT_SDB_BLOCKS 511
@ -151,6 +151,12 @@ static int oprofile_hwsampler_init(struct oprofile_operations *ops)
if (oprofile_max_interval == 0) if (oprofile_max_interval == 0)
return -ENODEV; return -ENODEV;
/* The initial value should be sane */
if (oprofile_hw_interval < oprofile_min_interval)
oprofile_hw_interval = oprofile_min_interval;
if (oprofile_hw_interval > oprofile_max_interval)
oprofile_hw_interval = oprofile_max_interval;
if (oprofile_timer_init(ops)) if (oprofile_timer_init(ops))
return -ENODEV; return -ENODEV;

View File

@ -9,10 +9,6 @@
extern struct pglist_data *node_data[]; extern struct pglist_data *node_data[];
#define NODE_DATA(nid) (node_data[nid]) #define NODE_DATA(nid) (node_data[nid])
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
NODE_DATA(nid)->node_spanned_pages)
static inline int pfn_to_nid(unsigned long pfn) static inline int pfn_to_nid(unsigned long pfn)
{ {
int nid; int nid;

View File

@ -8,8 +8,6 @@
extern struct pglist_data *node_data[]; extern struct pglist_data *node_data[];
#define NODE_DATA(nid) (node_data[nid]) #define NODE_DATA(nid) (node_data[nid])
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn)
extern int numa_cpu_lookup_table[]; extern int numa_cpu_lookup_table[];
extern cpumask_t numa_cpumask_lookup_table[]; extern cpumask_t numa_cpumask_lookup_table[];

View File

@ -40,17 +40,6 @@ static inline int pfn_to_nid(unsigned long pfn)
return highbits_to_node[__pfn_to_highbits(pfn)]; return highbits_to_node[__pfn_to_highbits(pfn)];
} }
/*
* Following are macros that each numa implmentation must define.
*/
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) \
({ \
pg_data_t *__pgdat = NODE_DATA(nid); \
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
})
#define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr) #define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr)
static inline int pfn_valid(int pfn) static inline int pfn_valid(int pfn)

View File

@ -0,0 +1,6 @@
#ifndef __UM_PERCPU_H
#define __UM_PERCPU_H
#include <asm-generic/percpu.h>
#endif /* __UM_PERCPU_H */

View File

@ -48,17 +48,6 @@ static inline int pfn_to_nid(unsigned long pfn)
#endif #endif
} }
/*
* Following are macros that each numa implmentation must define.
*/
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) \
({ \
pg_data_t *__pgdat = NODE_DATA(nid); \
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
})
static inline int pfn_valid(int pfn) static inline int pfn_valid(int pfn)
{ {
int nid = pfn_to_nid(pfn); int nid = pfn_to_nid(pfn);

View File

@ -13,8 +13,5 @@ extern struct pglist_data *node_data[];
#define NODE_DATA(nid) (node_data[nid]) #define NODE_DATA(nid) (node_data[nid])
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
NODE_DATA(nid)->node_spanned_pages)
#endif #endif
#endif /* _ASM_X86_MMZONE_64_H */ #endif /* _ASM_X86_MMZONE_64_H */

View File

@ -188,7 +188,7 @@ static bool resource_contains(struct resource *res, resource_size_t point)
return false; return false;
} }
static void coalesce_windows(struct pci_root_info *info, int type) static void coalesce_windows(struct pci_root_info *info, unsigned long type)
{ {
int i, j; int i, j;
struct resource *res1, *res2; struct resource *res1, *res2;

View File

@ -927,7 +927,7 @@ static int throtl_dispatch(struct request_queue *q)
bio_list_init(&bio_list_on_stack); bio_list_init(&bio_list_on_stack);
throtl_log(td, "dispatch nr_queued=%lu read=%u write=%u", throtl_log(td, "dispatch nr_queued=%d read=%u write=%u",
total_nr_queued(td), td->nr_queued[READ], total_nr_queued(td), td->nr_queued[READ],
td->nr_queued[WRITE]); td->nr_queued[WRITE]);
@ -1204,7 +1204,7 @@ int blk_throtl_bio(struct request_queue *q, struct bio **biop)
} }
queue_bio: queue_bio:
throtl_log_tg(td, tg, "[%c] bio. bdisp=%u sz=%u bps=%llu" throtl_log_tg(td, tg, "[%c] bio. bdisp=%llu sz=%u bps=%llu"
" iodisp=%u iops=%u queued=%d/%d", " iodisp=%u iops=%u queued=%d/%d",
rw == READ ? 'R' : 'W', rw == READ ? 'R' : 'W',
tg->bytes_disp[rw], bio->bi_size, tg->bps[rw], tg->bytes_disp[rw], bio->bi_size, tg->bps[rw],

View File

@ -988,9 +988,10 @@ static void cfq_group_served(struct cfq_data *cfqd, struct cfq_group *cfqg,
cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime, cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime,
st->min_vdisktime); st->min_vdisktime);
cfq_log_cfqq(cfqq->cfqd, cfqq, "sl_used=%u disp=%u charge=%u iops=%u" cfq_log_cfqq(cfqq->cfqd, cfqq,
" sect=%u", used_sl, cfqq->slice_dispatch, charge, "sl_used=%u disp=%u charge=%u iops=%u sect=%lu",
iops_mode(cfqd), cfqq->nr_sectors); used_sl, cfqq->slice_dispatch, charge,
iops_mode(cfqd), cfqq->nr_sectors);
cfq_blkiocg_update_timeslice_used(&cfqg->blkg, used_sl, cfq_blkiocg_update_timeslice_used(&cfqg->blkg, used_sl,
unaccounted_sl); unaccounted_sl);
cfq_blkiocg_set_start_empty_time(&cfqg->blkg); cfq_blkiocg_set_start_empty_time(&cfqg->blkg);
@ -2023,8 +2024,8 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
*/ */
if (sample_valid(cic->ttime_samples) && if (sample_valid(cic->ttime_samples) &&
(cfqq->slice_end - jiffies < cic->ttime_mean)) { (cfqq->slice_end - jiffies < cic->ttime_mean)) {
cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%d", cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%lu",
cic->ttime_mean); cic->ttime_mean);
return; return;
} }
@ -2772,8 +2773,11 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd,
smp_wmb(); smp_wmb();
cic->key = cfqd_dead_key(cfqd); cic->key = cfqd_dead_key(cfqd);
if (ioc->ioc_data == cic) if (rcu_dereference(ioc->ioc_data) == cic) {
spin_lock(&ioc->lock);
rcu_assign_pointer(ioc->ioc_data, NULL); rcu_assign_pointer(ioc->ioc_data, NULL);
spin_unlock(&ioc->lock);
}
if (cic->cfqq[BLK_RW_ASYNC]) { if (cic->cfqq[BLK_RW_ASYNC]) {
cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]); cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]);

View File

@ -1371,6 +1371,7 @@ struct disk_events {
struct gendisk *disk; /* the associated disk */ struct gendisk *disk; /* the associated disk */
spinlock_t lock; spinlock_t lock;
struct mutex block_mutex; /* protects blocking */
int block; /* event blocking depth */ int block; /* event blocking depth */
unsigned int pending; /* events already sent out */ unsigned int pending; /* events already sent out */
unsigned int clearing; /* events being cleared */ unsigned int clearing; /* events being cleared */
@ -1414,22 +1415,44 @@ static unsigned long disk_events_poll_jiffies(struct gendisk *disk)
return msecs_to_jiffies(intv_msecs); return msecs_to_jiffies(intv_msecs);
} }
static void __disk_block_events(struct gendisk *disk, bool sync) /**
* disk_block_events - block and flush disk event checking
* @disk: disk to block events for
*
* On return from this function, it is guaranteed that event checking
* isn't in progress and won't happen until unblocked by
* disk_unblock_events(). Events blocking is counted and the actual
* unblocking happens after the matching number of unblocks are done.
*
* Note that this intentionally does not block event checking from
* disk_clear_events().
*
* CONTEXT:
* Might sleep.
*/
void disk_block_events(struct gendisk *disk)
{ {
struct disk_events *ev = disk->ev; struct disk_events *ev = disk->ev;
unsigned long flags; unsigned long flags;
bool cancel; bool cancel;
if (!ev)
return;
/*
* Outer mutex ensures that the first blocker completes canceling
* the event work before further blockers are allowed to finish.
*/
mutex_lock(&ev->block_mutex);
spin_lock_irqsave(&ev->lock, flags); spin_lock_irqsave(&ev->lock, flags);
cancel = !ev->block++; cancel = !ev->block++;
spin_unlock_irqrestore(&ev->lock, flags); spin_unlock_irqrestore(&ev->lock, flags);
if (cancel) { if (cancel)
if (sync) cancel_delayed_work_sync(&disk->ev->dwork);
cancel_delayed_work_sync(&disk->ev->dwork);
else mutex_unlock(&ev->block_mutex);
cancel_delayed_work(&disk->ev->dwork);
}
} }
static void __disk_unblock_events(struct gendisk *disk, bool check_now) static void __disk_unblock_events(struct gendisk *disk, bool check_now)
@ -1460,27 +1483,6 @@ out_unlock:
spin_unlock_irqrestore(&ev->lock, flags); spin_unlock_irqrestore(&ev->lock, flags);
} }
/**
* disk_block_events - block and flush disk event checking
* @disk: disk to block events for
*
* On return from this function, it is guaranteed that event checking
* isn't in progress and won't happen until unblocked by
* disk_unblock_events(). Events blocking is counted and the actual
* unblocking happens after the matching number of unblocks are done.
*
* Note that this intentionally does not block event checking from
* disk_clear_events().
*
* CONTEXT:
* Might sleep.
*/
void disk_block_events(struct gendisk *disk)
{
if (disk->ev)
__disk_block_events(disk, true);
}
/** /**
* disk_unblock_events - unblock disk event checking * disk_unblock_events - unblock disk event checking
* @disk: disk to unblock events for * @disk: disk to unblock events for
@ -1508,10 +1510,18 @@ void disk_unblock_events(struct gendisk *disk)
*/ */
void disk_check_events(struct gendisk *disk) void disk_check_events(struct gendisk *disk)
{ {
if (disk->ev) { struct disk_events *ev = disk->ev;
__disk_block_events(disk, false); unsigned long flags;
__disk_unblock_events(disk, true);
if (!ev)
return;
spin_lock_irqsave(&ev->lock, flags);
if (!ev->block) {
cancel_delayed_work(&ev->dwork);
queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
} }
spin_unlock_irqrestore(&ev->lock, flags);
} }
EXPORT_SYMBOL_GPL(disk_check_events); EXPORT_SYMBOL_GPL(disk_check_events);
@ -1546,7 +1556,7 @@ unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask)
spin_unlock_irq(&ev->lock); spin_unlock_irq(&ev->lock);
/* uncondtionally schedule event check and wait for it to finish */ /* uncondtionally schedule event check and wait for it to finish */
__disk_block_events(disk, true); disk_block_events(disk);
queue_delayed_work(system_nrt_wq, &ev->dwork, 0); queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
flush_delayed_work(&ev->dwork); flush_delayed_work(&ev->dwork);
__disk_unblock_events(disk, false); __disk_unblock_events(disk, false);
@ -1664,7 +1674,7 @@ static ssize_t disk_events_poll_msecs_store(struct device *dev,
if (intv < 0 && intv != -1) if (intv < 0 && intv != -1)
return -EINVAL; return -EINVAL;
__disk_block_events(disk, true); disk_block_events(disk);
disk->ev->poll_msecs = intv; disk->ev->poll_msecs = intv;
__disk_unblock_events(disk, true); __disk_unblock_events(disk, true);
@ -1750,6 +1760,7 @@ static void disk_add_events(struct gendisk *disk)
INIT_LIST_HEAD(&ev->node); INIT_LIST_HEAD(&ev->node);
ev->disk = disk; ev->disk = disk;
spin_lock_init(&ev->lock); spin_lock_init(&ev->lock);
mutex_init(&ev->block_mutex);
ev->block = 1; ev->block = 1;
ev->poll_msecs = -1; ev->poll_msecs = -1;
INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn); INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
@ -1770,7 +1781,7 @@ static void disk_del_events(struct gendisk *disk)
if (!disk->ev) if (!disk->ev)
return; return;
__disk_block_events(disk, true); disk_block_events(disk);
mutex_lock(&disk_events_mutex); mutex_lock(&disk_events_mutex);
list_del_init(&disk->ev->node); list_del_init(&disk->ev->node);

View File

@ -4143,9 +4143,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
* Devices which choke on SETXFER. Applies only if both the * Devices which choke on SETXFER. Applies only if both the
* device and controller are SATA. * device and controller are SATA.
*/ */
{ "PIONEER DVD-RW DVRTD08", "1.00", ATA_HORKAGE_NOSETXFER }, { "PIONEER DVD-RW DVRTD08", NULL, ATA_HORKAGE_NOSETXFER },
{ "PIONEER DVD-RW DVR-212D", "1.28", ATA_HORKAGE_NOSETXFER }, { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER },
{ "PIONEER DVD-RW DVR-216D", "1.08", ATA_HORKAGE_NOSETXFER }, { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER },
/* End Marker */ /* End Marker */
{ } { }

View File

@ -3797,6 +3797,12 @@ EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
*/ */
int ata_sas_port_start(struct ata_port *ap) int ata_sas_port_start(struct ata_port *ap)
{ {
/*
* the port is marked as frozen at allocation time, but if we don't
* have new eh, we won't thaw it
*/
if (!ap->ops->error_handler)
ap->pflags &= ~ATA_PFLAG_FROZEN;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(ata_sas_port_start); EXPORT_SYMBOL_GPL(ata_sas_port_start);

View File

@ -161,6 +161,9 @@ static const struct pci_device_id marvell_pci_tbl[] = {
{ PCI_DEVICE(0x11AB, 0x6121), }, { PCI_DEVICE(0x11AB, 0x6121), },
{ PCI_DEVICE(0x11AB, 0x6123), }, { PCI_DEVICE(0x11AB, 0x6123), },
{ PCI_DEVICE(0x11AB, 0x6145), }, { PCI_DEVICE(0x11AB, 0x6145), },
{ PCI_DEVICE(0x1B4B, 0x91A0), },
{ PCI_DEVICE(0x1B4B, 0x91A4), },
{ } /* terminate list */ { } /* terminate list */
}; };

View File

@ -389,7 +389,7 @@ static void sata_dwc_tf_dump(struct ata_taskfile *tf)
/* /*
* Function: get_burst_length_encode * Function: get_burst_length_encode
* arguments: datalength: length in bytes of data * arguments: datalength: length in bytes of data
* returns value to be programmed in register corrresponding to data length * returns value to be programmed in register corresponding to data length
* This value is effectively the log(base 2) of the length * This value is effectively the log(base 2) of the length
*/ */
static int get_burst_length_encode(int datalength) static int get_burst_length_encode(int datalength)

View File

@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);
* *
* Returns &struct platform_device pointer on success, or ERR_PTR() on error. * Returns &struct platform_device pointer on success, or ERR_PTR() on error.
*/ */
struct platform_device *__init_or_module platform_device_register_resndata( struct platform_device *platform_device_register_resndata(
struct device *parent, struct device *parent,
const char *name, int id, const char *name, int id,
const struct resource *res, unsigned int num, const struct resource *res, unsigned int num,

View File

@ -387,7 +387,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
clknb = container_of(nb, struct pm_clk_notifier_block, nb); clknb = container_of(nb, struct pm_clk_notifier_block, nb);
switch (action) { switch (action) {
case BUS_NOTIFY_ADD_DEVICE: case BUS_NOTIFY_BIND_DRIVER:
if (clknb->con_ids[0]) { if (clknb->con_ids[0]) {
for (con_id = clknb->con_ids; *con_id; con_id++) for (con_id = clknb->con_ids; *con_id; con_id++)
enable_clock(dev, *con_id); enable_clock(dev, *con_id);
@ -395,7 +395,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
enable_clock(dev, NULL); enable_clock(dev, NULL);
} }
break; break;
case BUS_NOTIFY_DEL_DEVICE: case BUS_NOTIFY_UNBOUND_DRIVER:
if (clknb->con_ids[0]) { if (clknb->con_ids[0]) {
for (con_id = clknb->con_ids; *con_id; con_id++) for (con_id = clknb->con_ids; *con_id; con_id++)
disable_clock(dev, *con_id); disable_clock(dev, *con_id);

View File

@ -57,7 +57,8 @@ static int async_error;
*/ */
void device_pm_init(struct device *dev) void device_pm_init(struct device *dev)
{ {
dev->power.in_suspend = false; dev->power.is_prepared = false;
dev->power.is_suspended = false;
init_completion(&dev->power.completion); init_completion(&dev->power.completion);
complete_all(&dev->power.completion); complete_all(&dev->power.completion);
dev->power.wakeup = NULL; dev->power.wakeup = NULL;
@ -91,7 +92,7 @@ void device_pm_add(struct device *dev)
pr_debug("PM: Adding info for %s:%s\n", pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
mutex_lock(&dpm_list_mtx); mutex_lock(&dpm_list_mtx);
if (dev->parent && dev->parent->power.in_suspend) if (dev->parent && dev->parent->power.is_prepared)
dev_warn(dev, "parent %s should not be sleeping\n", dev_warn(dev, "parent %s should not be sleeping\n",
dev_name(dev->parent)); dev_name(dev->parent));
list_add_tail(&dev->power.entry, &dpm_list); list_add_tail(&dev->power.entry, &dpm_list);
@ -511,7 +512,14 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
dpm_wait(dev->parent, async); dpm_wait(dev->parent, async);
device_lock(dev); device_lock(dev);
dev->power.in_suspend = false; /*
* This is a fib. But we'll allow new children to be added below
* a resumed device, even if the device hasn't been completed yet.
*/
dev->power.is_prepared = false;
if (!dev->power.is_suspended)
goto Unlock;
if (dev->pwr_domain) { if (dev->pwr_domain) {
pm_dev_dbg(dev, state, "power domain "); pm_dev_dbg(dev, state, "power domain ");
@ -548,6 +556,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
} }
End: End:
dev->power.is_suspended = false;
Unlock:
device_unlock(dev); device_unlock(dev);
complete_all(&dev->power.completion); complete_all(&dev->power.completion);
@ -670,7 +681,7 @@ void dpm_complete(pm_message_t state)
struct device *dev = to_device(dpm_prepared_list.prev); struct device *dev = to_device(dpm_prepared_list.prev);
get_device(dev); get_device(dev);
dev->power.in_suspend = false; dev->power.is_prepared = false;
list_move(&dev->power.entry, &list); list_move(&dev->power.entry, &list);
mutex_unlock(&dpm_list_mtx); mutex_unlock(&dpm_list_mtx);
@ -835,11 +846,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
device_lock(dev); device_lock(dev);
if (async_error) if (async_error)
goto End; goto Unlock;
if (pm_wakeup_pending()) { if (pm_wakeup_pending()) {
async_error = -EBUSY; async_error = -EBUSY;
goto End; goto Unlock;
} }
if (dev->pwr_domain) { if (dev->pwr_domain) {
@ -877,6 +888,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
} }
End: End:
dev->power.is_suspended = !error;
Unlock:
device_unlock(dev); device_unlock(dev);
complete_all(&dev->power.completion); complete_all(&dev->power.completion);
@ -1042,7 +1056,7 @@ int dpm_prepare(pm_message_t state)
put_device(dev); put_device(dev);
break; break;
} }
dev->power.in_suspend = true; dev->power.is_prepared = true;
if (!list_empty(&dev->power.entry)) if (!list_empty(&dev->power.entry))
list_move_tail(&dev->power.entry, &dpm_prepared_list); list_move_tail(&dev->power.entry, &dpm_prepared_list);
put_device(dev); put_device(dev);

View File

@ -139,6 +139,7 @@ static int cn_call_callback(struct sk_buff *skb)
spin_unlock_bh(&dev->cbdev->queue_lock); spin_unlock_bh(&dev->cbdev->queue_lock);
if (cbq != NULL) { if (cbq != NULL) {
err = 0;
cbq->callback(msg, nsp); cbq->callback(msg, nsp);
kfree_skb(skb); kfree_skb(skb);
cn_queue_release_callback(cbq); cn_queue_release_callback(cbq);

View File

@ -13,6 +13,7 @@ menu "Google Firmware Drivers"
config GOOGLE_SMI config GOOGLE_SMI
tristate "SMI interface for Google platforms" tristate "SMI interface for Google platforms"
depends on ACPI && DMI depends on ACPI && DMI
select EFI
select EFI_VARS select EFI_VARS
help help
Say Y here if you want to enable SMI callbacks for Google Say Y here if you want to enable SMI callbacks for Google

View File

@ -34,6 +34,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/mman.h> #include <linux/mman.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/shmem_fs.h>
#include "drmP.h" #include "drmP.h"
/** @file drm_gem.c /** @file drm_gem.c

View File

@ -31,6 +31,7 @@
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_trace.h" #include "i915_trace.h"
#include "intel_drv.h" #include "intel_drv.h"
#include <linux/shmem_fs.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/swap.h> #include <linux/swap.h>
#include <linux/pci.h> #include <linux/pci.h>
@ -359,8 +360,7 @@ i915_gem_shmem_pread_fast(struct drm_device *dev,
if ((page_offset + remain) > PAGE_SIZE) if ((page_offset + remain) > PAGE_SIZE)
page_length = PAGE_SIZE - page_offset; page_length = PAGE_SIZE - page_offset;
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
GFP_HIGHUSER | __GFP_RECLAIMABLE);
if (IS_ERR(page)) if (IS_ERR(page))
return PTR_ERR(page); return PTR_ERR(page);
@ -463,8 +463,7 @@ i915_gem_shmem_pread_slow(struct drm_device *dev,
if ((data_page_offset + page_length) > PAGE_SIZE) if ((data_page_offset + page_length) > PAGE_SIZE)
page_length = PAGE_SIZE - data_page_offset; page_length = PAGE_SIZE - data_page_offset;
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
GFP_HIGHUSER | __GFP_RECLAIMABLE);
if (IS_ERR(page)) { if (IS_ERR(page)) {
ret = PTR_ERR(page); ret = PTR_ERR(page);
goto out; goto out;
@ -797,8 +796,7 @@ i915_gem_shmem_pwrite_fast(struct drm_device *dev,
if ((page_offset + remain) > PAGE_SIZE) if ((page_offset + remain) > PAGE_SIZE)
page_length = PAGE_SIZE - page_offset; page_length = PAGE_SIZE - page_offset;
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
GFP_HIGHUSER | __GFP_RECLAIMABLE);
if (IS_ERR(page)) if (IS_ERR(page))
return PTR_ERR(page); return PTR_ERR(page);
@ -907,8 +905,7 @@ i915_gem_shmem_pwrite_slow(struct drm_device *dev,
if ((data_page_offset + page_length) > PAGE_SIZE) if ((data_page_offset + page_length) > PAGE_SIZE)
page_length = PAGE_SIZE - data_page_offset; page_length = PAGE_SIZE - data_page_offset;
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT, page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
GFP_HIGHUSER | __GFP_RECLAIMABLE);
if (IS_ERR(page)) { if (IS_ERR(page)) {
ret = PTR_ERR(page); ret = PTR_ERR(page);
goto out; goto out;
@ -1558,12 +1555,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
inode = obj->base.filp->f_path.dentry->d_inode; inode = obj->base.filp->f_path.dentry->d_inode;
mapping = inode->i_mapping; mapping = inode->i_mapping;
gfpmask |= mapping_gfp_mask(mapping);
for (i = 0; i < page_count; i++) { for (i = 0; i < page_count; i++) {
page = read_cache_page_gfp(mapping, i, page = shmem_read_mapping_page_gfp(mapping, i, gfpmask);
GFP_HIGHUSER |
__GFP_COLD |
__GFP_RECLAIMABLE |
gfpmask);
if (IS_ERR(page)) if (IS_ERR(page))
goto err_pages; goto err_pages;
@ -1701,13 +1696,10 @@ i915_gem_object_truncate(struct drm_i915_gem_object *obj)
/* Our goal here is to return as much of the memory as /* Our goal here is to return as much of the memory as
* is possible back to the system as we are called from OOM. * is possible back to the system as we are called from OOM.
* To do this we must instruct the shmfs to drop all of its * To do this we must instruct the shmfs to drop all of its
* backing pages, *now*. Here we mirror the actions taken * backing pages, *now*.
* when by shmem_delete_inode() to release the backing store.
*/ */
inode = obj->base.filp->f_path.dentry->d_inode; inode = obj->base.filp->f_path.dentry->d_inode;
truncate_inode_pages(inode->i_mapping, 0); shmem_truncate_range(inode, 0, (loff_t)-1);
if (inode->i_op->truncate_range)
inode->i_op->truncate_range(inode, 0, (loff_t)-1);
obj->madv = __I915_MADV_PURGED; obj->madv = __I915_MADV_PURGED;
} }
@ -3688,6 +3680,7 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_i915_gem_object *obj; struct drm_i915_gem_object *obj;
struct address_space *mapping;
obj = kzalloc(sizeof(*obj), GFP_KERNEL); obj = kzalloc(sizeof(*obj), GFP_KERNEL);
if (obj == NULL) if (obj == NULL)
@ -3698,6 +3691,9 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
return NULL; return NULL;
} }
mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
mapping_set_gfp_mask(mapping, GFP_HIGHUSER | __GFP_RECLAIMABLE);
i915_gem_info_add_obj(dev_priv, size); i915_gem_info_add_obj(dev_priv, size);
obj->base.write_domain = I915_GEM_DOMAIN_CPU; obj->base.write_domain = I915_GEM_DOMAIN_CPU;
@ -4089,8 +4085,7 @@ void i915_gem_detach_phys_object(struct drm_device *dev,
page_count = obj->base.size / PAGE_SIZE; page_count = obj->base.size / PAGE_SIZE;
for (i = 0; i < page_count; i++) { for (i = 0; i < page_count; i++) {
struct page *page = read_cache_page_gfp(mapping, i, struct page *page = shmem_read_mapping_page(mapping, i);
GFP_HIGHUSER | __GFP_RECLAIMABLE);
if (!IS_ERR(page)) { if (!IS_ERR(page)) {
char *dst = kmap_atomic(page); char *dst = kmap_atomic(page);
memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE); memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE);
@ -4151,8 +4146,7 @@ i915_gem_attach_phys_object(struct drm_device *dev,
struct page *page; struct page *page;
char *dst, *src; char *dst, *src;
page = read_cache_page_gfp(mapping, i, page = shmem_read_mapping_page(mapping, i);
GFP_HIGHUSER | __GFP_RECLAIMABLE);
if (IS_ERR(page)) if (IS_ERR(page))
return PTR_ERR(page); return PTR_ERR(page);

View File

@ -2013,9 +2013,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
rdev->config.evergreen.tile_config |= (3 << 0); rdev->config.evergreen.tile_config |= (3 << 0);
break; break;
} }
/* num banks is 8 on all fusion asics */ /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
if (rdev->flags & RADEON_IS_IGP) if (rdev->flags & RADEON_IS_IGP)
rdev->config.evergreen.tile_config |= 8 << 4; rdev->config.evergreen.tile_config |= 1 << 4;
else else
rdev->config.evergreen.tile_config |= rdev->config.evergreen.tile_config |=
((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;

View File

@ -179,6 +179,7 @@ void radeon_pm_resume(struct radeon_device *rdev);
void radeon_combios_get_power_modes(struct radeon_device *rdev); void radeon_combios_get_power_modes(struct radeon_device *rdev);
void radeon_atombios_get_power_modes(struct radeon_device *rdev); void radeon_atombios_get_power_modes(struct radeon_device *rdev);
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type); void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type);
int radeon_atom_get_max_vddc(struct radeon_device *rdev, u16 *voltage);
void rs690_pm_info(struct radeon_device *rdev); void rs690_pm_info(struct radeon_device *rdev);
extern int rv6xx_get_temp(struct radeon_device *rdev); extern int rv6xx_get_temp(struct radeon_device *rdev);
extern int rv770_get_temp(struct radeon_device *rdev); extern int rv770_get_temp(struct radeon_device *rdev);

View File

@ -2320,6 +2320,14 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
le16_to_cpu(clock_info->r600.usVDDC); le16_to_cpu(clock_info->r600.usVDDC);
} }
/* patch up vddc if necessary */
if (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage == 0xff01) {
u16 vddc;
if (radeon_atom_get_max_vddc(rdev, &vddc) == 0)
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
}
if (rdev->flags & RADEON_IS_IGP) { if (rdev->flags & RADEON_IS_IGP) {
/* skip invalid modes */ /* skip invalid modes */
if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0) if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
@ -2630,7 +2638,35 @@ void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 v
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
} }
int radeon_atom_get_max_vddc(struct radeon_device *rdev,
u16 *voltage)
{
union set_voltage args;
int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
u8 frev, crev;
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
return -EINVAL;
switch (crev) {
case 1:
return -EINVAL;
case 2:
args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
args.v2.ucVoltageMode = 0;
args.v2.usVoltageLevel = 0;
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
*voltage = le16_to_cpu(args.v2.usVoltageLevel);
break;
default:
DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
return -EINVAL;
}
return 0;
}
void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
{ {

View File

@ -31,6 +31,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/shmem_fs.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/swap.h> #include <linux/swap.h>
#include <linux/slab.h> #include <linux/slab.h>
@ -484,7 +485,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
for (i = 0; i < ttm->num_pages; ++i) { for (i = 0; i < ttm->num_pages; ++i) {
from_page = read_mapping_page(swap_space, i, NULL); from_page = shmem_read_mapping_page(swap_space, i);
if (IS_ERR(from_page)) { if (IS_ERR(from_page)) {
ret = PTR_ERR(from_page); ret = PTR_ERR(from_page);
goto out_err; goto out_err;
@ -557,7 +558,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
from_page = ttm->pages[i]; from_page = ttm->pages[i];
if (unlikely(from_page == NULL)) if (unlikely(from_page == NULL))
continue; continue;
to_page = read_mapping_page(swap_space, i, NULL); to_page = shmem_read_mapping_page(swap_space, i);
if (unlikely(IS_ERR(to_page))) { if (unlikely(IS_ERR(to_page))) {
ret = PTR_ERR(to_page); ret = PTR_ERR(to_page);
goto out_err; goto out_err;

View File

@ -1423,6 +1423,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) }, { HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },

View File

@ -449,6 +449,7 @@
#define USB_VENDOR_ID_LUMIO 0x202e #define USB_VENDOR_ID_LUMIO 0x202e
#define USB_DEVICE_ID_CRYSTALTOUCH 0x0006 #define USB_DEVICE_ID_CRYSTALTOUCH 0x0006
#define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007
#define USB_VENDOR_ID_MCC 0x09db #define USB_VENDOR_ID_MCC 0x09db
#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076

View File

@ -271,6 +271,8 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
} }
return 1; return 1;
case HID_DG_CONTACTID: case HID_DG_CONTACTID:
if (!td->maxcontacts)
td->maxcontacts = MT_DEFAULT_MAXCONTACT;
input_mt_init_slots(hi->input, td->maxcontacts); input_mt_init_slots(hi->input, td->maxcontacts);
td->last_slot_field = usage->hid; td->last_slot_field = usage->hid;
td->last_field_index = field->index; td->last_field_index = field->index;
@ -547,9 +549,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
if (ret) if (ret)
goto fail; goto fail;
if (!td->maxcontacts)
td->maxcontacts = MT_DEFAULT_MAXCONTACT;
td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot), td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot),
GFP_KERNEL); GFP_KERNEL);
if (!td->slots) { if (!td->slots) {
@ -677,6 +676,9 @@ static const struct hid_device_id mt_devices[] = {
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, HID_USB_DEVICE(USB_VENDOR_ID_LUMIO,
USB_DEVICE_ID_CRYSTALTOUCH) }, USB_DEVICE_ID_CRYSTALTOUCH) },
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
HID_USB_DEVICE(USB_VENDOR_ID_LUMIO,
USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
/* MosArt panels */ /* MosArt panels */
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
@ -707,10 +709,10 @@ static const struct hid_device_id mt_devices[] = {
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, HID_USB_DEVICE(USB_VENDOR_ID_STANTUM,
USB_DEVICE_ID_MTP)}, USB_DEVICE_ID_MTP)},
{ .driver_data = MT_CLS_CONFIDENCE, { .driver_data = MT_CLS_CONFIDENCE,
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM,
USB_DEVICE_ID_MTP_STM)}, USB_DEVICE_ID_MTP_STM)},
{ .driver_data = MT_CLS_CONFIDENCE, { .driver_data = MT_CLS_CONFIDENCE,
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX,
USB_DEVICE_ID_MTP_SITRONIX)}, USB_DEVICE_ID_MTP_SITRONIX)},
/* Touch International panels */ /* Touch International panels */

View File

@ -1463,9 +1463,9 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb)
struct c4iw_qp_attributes attrs; struct c4iw_qp_attributes attrs;
int disconnect = 1; int disconnect = 1;
int release = 0; int release = 0;
int abort = 0;
struct tid_info *t = dev->rdev.lldi.tids; struct tid_info *t = dev->rdev.lldi.tids;
unsigned int tid = GET_TID(hdr); unsigned int tid = GET_TID(hdr);
int ret;
ep = lookup_tid(t, tid); ep = lookup_tid(t, tid);
PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid);
@ -1501,10 +1501,12 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb)
start_ep_timer(ep); start_ep_timer(ep);
__state_set(&ep->com, CLOSING); __state_set(&ep->com, CLOSING);
attrs.next_state = C4IW_QP_STATE_CLOSING; attrs.next_state = C4IW_QP_STATE_CLOSING;
abort = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, ret = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,
C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
peer_close_upcall(ep); if (ret != -ECONNRESET) {
disconnect = 1; peer_close_upcall(ep);
disconnect = 1;
}
break; break;
case ABORTING: case ABORTING:
disconnect = 0; disconnect = 0;
@ -2109,15 +2111,16 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp)
break; break;
} }
mutex_unlock(&ep->com.mutex);
if (close) { if (close) {
if (abrupt) if (abrupt) {
ret = abort_connection(ep, NULL, gfp); close_complete_upcall(ep);
else ret = send_abort(ep, NULL, gfp);
} else
ret = send_halfclose(ep, gfp); ret = send_halfclose(ep, gfp);
if (ret) if (ret)
fatal = 1; fatal = 1;
} }
mutex_unlock(&ep->com.mutex);
if (fatal) if (fatal)
release_ep_resources(ep); release_ep_resources(ep);
return ret; return ret;
@ -2301,6 +2304,31 @@ static int fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb)
return 0; return 0;
} }
static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)
{
struct cpl_abort_req_rss *req = cplhdr(skb);
struct c4iw_ep *ep;
struct tid_info *t = dev->rdev.lldi.tids;
unsigned int tid = GET_TID(req);
ep = lookup_tid(t, tid);
if (is_neg_adv_abort(req->status)) {
PDBG("%s neg_adv_abort ep %p tid %u\n", __func__, ep,
ep->hwtid);
kfree_skb(skb);
return 0;
}
PDBG("%s ep %p tid %u state %u\n", __func__, ep, ep->hwtid,
ep->com.state);
/*
* Wake up any threads in rdma_init() or rdma_fini().
*/
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
sched(dev, skb);
return 0;
}
/* /*
* Most upcalls from the T4 Core go to sched() to * Most upcalls from the T4 Core go to sched() to
* schedule the processing on a work queue. * schedule the processing on a work queue.
@ -2317,7 +2345,7 @@ c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS] = {
[CPL_PASS_ESTABLISH] = sched, [CPL_PASS_ESTABLISH] = sched,
[CPL_PEER_CLOSE] = sched, [CPL_PEER_CLOSE] = sched,
[CPL_CLOSE_CON_RPL] = sched, [CPL_CLOSE_CON_RPL] = sched,
[CPL_ABORT_REQ_RSS] = sched, [CPL_ABORT_REQ_RSS] = peer_abort_intr,
[CPL_RDMA_TERMINATE] = sched, [CPL_RDMA_TERMINATE] = sched,
[CPL_FW4_ACK] = sched, [CPL_FW4_ACK] = sched,
[CPL_SET_TCB_RPL] = set_tcb_rpl, [CPL_SET_TCB_RPL] = set_tcb_rpl,

View File

@ -801,6 +801,10 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,
if (ucontext) { if (ucontext) {
memsize = roundup(memsize, PAGE_SIZE); memsize = roundup(memsize, PAGE_SIZE);
hwentries = memsize / sizeof *chp->cq.queue; hwentries = memsize / sizeof *chp->cq.queue;
while (hwentries > T4_MAX_IQ_SIZE) {
memsize -= PAGE_SIZE;
hwentries = memsize / sizeof *chp->cq.queue;
}
} }
chp->cq.size = hwentries; chp->cq.size = hwentries;
chp->cq.memsize = memsize; chp->cq.memsize = memsize;

View File

@ -625,7 +625,7 @@ pbl_done:
mhp->attr.perms = c4iw_ib_to_tpt_access(acc); mhp->attr.perms = c4iw_ib_to_tpt_access(acc);
mhp->attr.va_fbo = virt; mhp->attr.va_fbo = virt;
mhp->attr.page_size = shift - 12; mhp->attr.page_size = shift - 12;
mhp->attr.len = (u32) length; mhp->attr.len = length;
err = register_mem(rhp, php, mhp, shift); err = register_mem(rhp, php, mhp, shift);
if (err) if (err)

View File

@ -1207,11 +1207,8 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp,
c4iw_get_ep(&qhp->ep->com); c4iw_get_ep(&qhp->ep->com);
} }
ret = rdma_fini(rhp, qhp, ep); ret = rdma_fini(rhp, qhp, ep);
if (ret) { if (ret)
if (internal)
c4iw_get_ep(&qhp->ep->com);
goto err; goto err;
}
break; break;
case C4IW_QP_STATE_TERMINATE: case C4IW_QP_STATE_TERMINATE:
set_state(qhp, C4IW_QP_STATE_TERMINATE); set_state(qhp, C4IW_QP_STATE_TERMINATE);

View File

@ -469,6 +469,8 @@ static u8 ib_rate_to_delay[IB_RATE_120_GBPS + 1] = {
#define IB_7322_LT_STATE_RECOVERIDLE 0x0f #define IB_7322_LT_STATE_RECOVERIDLE 0x0f
#define IB_7322_LT_STATE_CFGENH 0x10 #define IB_7322_LT_STATE_CFGENH 0x10
#define IB_7322_LT_STATE_CFGTEST 0x11 #define IB_7322_LT_STATE_CFGTEST 0x11
#define IB_7322_LT_STATE_CFGWAITRMTTEST 0x12
#define IB_7322_LT_STATE_CFGWAITENH 0x13
/* link state machine states from IBC */ /* link state machine states from IBC */
#define IB_7322_L_STATE_DOWN 0x0 #define IB_7322_L_STATE_DOWN 0x0
@ -498,8 +500,10 @@ static const u8 qib_7322_physportstate[0x20] = {
IB_PHYSPORTSTATE_LINK_ERR_RECOVER, IB_PHYSPORTSTATE_LINK_ERR_RECOVER,
[IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH, [IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH,
[IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN, [IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN,
[0x12] = IB_PHYSPORTSTATE_CFG_TRAIN, [IB_7322_LT_STATE_CFGWAITRMTTEST] =
[0x13] = IB_PHYSPORTSTATE_CFG_WAIT_ENH, IB_PHYSPORTSTATE_CFG_TRAIN,
[IB_7322_LT_STATE_CFGWAITENH] =
IB_PHYSPORTSTATE_CFG_WAIT_ENH,
[0x14] = IB_PHYSPORTSTATE_CFG_TRAIN, [0x14] = IB_PHYSPORTSTATE_CFG_TRAIN,
[0x15] = IB_PHYSPORTSTATE_CFG_TRAIN, [0x15] = IB_PHYSPORTSTATE_CFG_TRAIN,
[0x16] = IB_PHYSPORTSTATE_CFG_TRAIN, [0x16] = IB_PHYSPORTSTATE_CFG_TRAIN,
@ -1692,7 +1696,9 @@ static void handle_serdes_issues(struct qib_pportdata *ppd, u64 ibcst)
break; break;
} }
if (ibclt == IB_7322_LT_STATE_CFGTEST && if (((ibclt >= IB_7322_LT_STATE_CFGTEST &&
ibclt <= IB_7322_LT_STATE_CFGWAITENH) ||
ibclt == IB_7322_LT_STATE_LINKUP) &&
(ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) { (ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) {
force_h1(ppd); force_h1(ppd);
ppd->cpspec->qdr_reforce = 1; ppd->cpspec->qdr_reforce = 1;
@ -7301,12 +7307,17 @@ static void ibsd_wr_allchans(struct qib_pportdata *ppd, int addr, unsigned data,
static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable) static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable)
{ {
u64 data = qib_read_kreg_port(ppd, krp_serdesctrl); u64 data = qib_read_kreg_port(ppd, krp_serdesctrl);
printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS %s\n", u8 state = SYM_FIELD(data, IBSerdesCtrl_0, RXLOSEN);
ppd->dd->unit, ppd->port, (enable ? "on" : "off"));
if (enable) if (enable && !state) {
printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS on\n",
ppd->dd->unit, ppd->port);
data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN); data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
else } else if (!enable && state) {
printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS off\n",
ppd->dd->unit, ppd->port);
data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN); data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
}
qib_write_kreg_port(ppd, krp_serdesctrl, data); qib_write_kreg_port(ppd, krp_serdesctrl, data);
} }

View File

@ -96,8 +96,12 @@ void qib_handle_e_ibstatuschanged(struct qib_pportdata *ppd, u64 ibcs)
* states, or if it transitions from any of the up (INIT or better) * states, or if it transitions from any of the up (INIT or better)
* states into any of the down states (except link recovery), then * states into any of the down states (except link recovery), then
* call the chip-specific code to take appropriate actions. * call the chip-specific code to take appropriate actions.
*
* ppd->lflags could be 0 if this is the first time the interrupt
* handlers has been called but the link is already up.
*/ */
if (lstate >= IB_PORT_INIT && (ppd->lflags & QIBL_LINKDOWN) && if (lstate >= IB_PORT_INIT &&
(!ppd->lflags || (ppd->lflags & QIBL_LINKDOWN)) &&
ltstate == IB_PHYSPORTSTATE_LINKUP) { ltstate == IB_PHYSPORTSTATE_LINKUP) {
/* transitioned to UP */ /* transitioned to UP */
if (dd->f_ib_updown(ppd, 1, ibcs)) if (dd->f_ib_updown(ppd, 1, ibcs))

View File

@ -593,7 +593,7 @@ static void lp5521_unregister_sysfs(struct i2c_client *client)
&lp5521_led_attribute_group); &lp5521_led_attribute_group);
} }
static int __init lp5521_init_led(struct lp5521_led *led, static int __devinit lp5521_init_led(struct lp5521_led *led,
struct i2c_client *client, struct i2c_client *client,
int chan, struct lp5521_platform_data *pdata) int chan, struct lp5521_platform_data *pdata)
{ {
@ -637,7 +637,7 @@ static int __init lp5521_init_led(struct lp5521_led *led,
return 0; return 0;
} }
static int lp5521_probe(struct i2c_client *client, static int __devinit lp5521_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct lp5521_chip *chip; struct lp5521_chip *chip;

View File

@ -826,7 +826,7 @@ static int __init lp5523_init_engine(struct lp5523_engine *engine, int id)
return 0; return 0;
} }
static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev, static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev,
int chan, struct lp5523_platform_data *pdata) int chan, struct lp5523_platform_data *pdata)
{ {
char name[32]; char name[32];
@ -872,7 +872,7 @@ static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev,
static struct i2c_driver lp5523_driver; static struct i2c_driver lp5523_driver;
static int lp5523_probe(struct i2c_client *client, static int __devinit lp5523_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct lp5523_chip *chip; struct lp5523_chip *chip;

View File

@ -7088,6 +7088,7 @@ static int remove_and_add_spares(mddev_t *mddev)
list_for_each_entry(rdev, &mddev->disks, same_set) { list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->raid_disk >= 0 && if (rdev->raid_disk >= 0 &&
!test_bit(In_sync, &rdev->flags) && !test_bit(In_sync, &rdev->flags) &&
!test_bit(Faulty, &rdev->flags) &&
!test_bit(Blocked, &rdev->flags)) !test_bit(Blocked, &rdev->flags))
spares++; spares++;
if (rdev->raid_disk < 0 if (rdev->raid_disk < 0

View File

@ -47,7 +47,7 @@ static uint32_t sg_dwiter_read_buffer(struct sg_mapping_iter *miter)
static inline bool needs_unaligned_copy(const void *ptr) static inline bool needs_unaligned_copy(const void *ptr)
{ {
#ifdef HAVE_EFFICIENT_UNALIGNED_ACCESS #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
return false; return false;
#else #else
return ((ptr - NULL) & 3) != 0; return ((ptr - NULL) & 3) != 0;

View File

@ -270,7 +270,7 @@ ioc4_variant(struct ioc4_driver_data *idd)
return IOC4_VARIANT_PCI_RT; return IOC4_VARIANT_PCI_RT;
} }
static void __devinit static void
ioc4_load_modules(struct work_struct *work) ioc4_load_modules(struct work_struct *work)
{ {
request_module("sgiioc4"); request_module("sgiioc4");

View File

@ -120,6 +120,7 @@ static int recur_count = REC_NUM_DEFAULT;
static enum cname cpoint = CN_INVALID; static enum cname cpoint = CN_INVALID;
static enum ctype cptype = CT_NONE; static enum ctype cptype = CT_NONE;
static int count = DEFAULT_COUNT; static int count = DEFAULT_COUNT;
static DEFINE_SPINLOCK(count_lock);
module_param(recur_count, int, 0644); module_param(recur_count, int, 0644);
MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\ MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\
@ -230,11 +231,14 @@ static const char *cp_name_to_str(enum cname name)
static int lkdtm_parse_commandline(void) static int lkdtm_parse_commandline(void)
{ {
int i; int i;
unsigned long flags;
if (cpoint_count < 1 || recur_count < 1) if (cpoint_count < 1 || recur_count < 1)
return -EINVAL; return -EINVAL;
spin_lock_irqsave(&count_lock, flags);
count = cpoint_count; count = cpoint_count;
spin_unlock_irqrestore(&count_lock, flags);
/* No special parameters */ /* No special parameters */
if (!cpoint_type && !cpoint_name) if (!cpoint_type && !cpoint_name)
@ -349,6 +353,9 @@ static void lkdtm_do_action(enum ctype which)
static void lkdtm_handler(void) static void lkdtm_handler(void)
{ {
unsigned long flags;
spin_lock_irqsave(&count_lock, flags);
count--; count--;
printk(KERN_INFO "lkdtm: Crash point %s of type %s hit, trigger in %d rounds\n", printk(KERN_INFO "lkdtm: Crash point %s of type %s hit, trigger in %d rounds\n",
cp_name_to_str(cpoint), cp_type_to_str(cptype), count); cp_name_to_str(cpoint), cp_type_to_str(cptype), count);
@ -357,6 +364,7 @@ static void lkdtm_handler(void)
lkdtm_do_action(cptype); lkdtm_do_action(cptype);
count = cpoint_count; count = cpoint_count;
} }
spin_unlock_irqrestore(&count_lock, flags);
} }
static int lkdtm_register_cpoint(enum cname which) static int lkdtm_register_cpoint(enum cname which)

View File

@ -317,7 +317,8 @@ EXPORT_SYMBOL_GPL(pti_request_masterchannel);
* a master, channel ID address * a master, channel ID address
* used to write to PTI HW. * used to write to PTI HW.
* *
* @mc: master, channel apeture ID address to be released. * @mc: master, channel apeture ID address to be released. This
* will de-allocate the structure via kfree().
*/ */
void pti_release_masterchannel(struct pti_masterchannel *mc) void pti_release_masterchannel(struct pti_masterchannel *mc)
{ {
@ -475,8 +476,10 @@ static int pti_tty_install(struct tty_driver *driver, struct tty_struct *tty)
else else
pti_tty_data->mc = pti_request_masterchannel(2); pti_tty_data->mc = pti_request_masterchannel(2);
if (pti_tty_data->mc == NULL) if (pti_tty_data->mc == NULL) {
kfree(pti_tty_data);
return -ENXIO; return -ENXIO;
}
tty->driver_data = pti_tty_data; tty->driver_data = pti_tty_data;
} }
@ -495,7 +498,7 @@ static void pti_tty_cleanup(struct tty_struct *tty)
if (pti_tty_data == NULL) if (pti_tty_data == NULL)
return; return;
pti_release_masterchannel(pti_tty_data->mc); pti_release_masterchannel(pti_tty_data->mc);
kfree(tty->driver_data); kfree(pti_tty_data);
tty->driver_data = NULL; tty->driver_data = NULL;
} }
@ -581,7 +584,7 @@ static int pti_char_open(struct inode *inode, struct file *filp)
static int pti_char_release(struct inode *inode, struct file *filp) static int pti_char_release(struct inode *inode, struct file *filp)
{ {
pti_release_masterchannel(filp->private_data); pti_release_masterchannel(filp->private_data);
kfree(filp->private_data); filp->private_data = NULL;
return 0; return 0;
} }

View File

@ -605,7 +605,7 @@ long st_unregister(struct st_proto_s *proto)
pr_debug("%s: %d ", __func__, proto->chnl_id); pr_debug("%s: %d ", __func__, proto->chnl_id);
st_kim_ref(&st_gdata, 0); st_kim_ref(&st_gdata, 0);
if (proto->chnl_id >= ST_MAX_CHANNELS) { if (!st_gdata || proto->chnl_id >= ST_MAX_CHANNELS) {
pr_err(" chnl_id %d not supported", proto->chnl_id); pr_err(" chnl_id %d not supported", proto->chnl_id);
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
} }

View File

@ -245,9 +245,9 @@ void skip_change_remote_baud(unsigned char **ptr, long *len)
pr_err("invalid action after change remote baud command"); pr_err("invalid action after change remote baud command");
} else { } else {
*ptr = *ptr + sizeof(struct bts_action) + *ptr = *ptr + sizeof(struct bts_action) +
((struct bts_action *)nxt_action)->size; ((struct bts_action *)cur_action)->size;
*len = *len - (sizeof(struct bts_action) + *len = *len - (sizeof(struct bts_action) +
((struct bts_action *)nxt_action)->size); ((struct bts_action *)cur_action)->size);
/* warn user on not commenting these in firmware */ /* warn user on not commenting these in firmware */
pr_warn("skipping the wait event of change remote baud"); pr_warn("skipping the wait event of change remote baud");
} }
@ -604,6 +604,10 @@ void st_kim_ref(struct st_data_s **core_data, int id)
struct kim_data_s *kim_gdata; struct kim_data_s *kim_gdata;
/* get kim_gdata reference from platform device */ /* get kim_gdata reference from platform device */
pdev = st_get_plat_device(id); pdev = st_get_plat_device(id);
if (!pdev) {
*core_data = NULL;
return;
}
kim_gdata = dev_get_drvdata(&pdev->dev); kim_gdata = dev_get_drvdata(&pdev->dev);
*core_data = kim_gdata->core_data; *core_data = kim_gdata->core_data;
} }

View File

@ -1024,7 +1024,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
INIT_LIST_HEAD(&md->part); INIT_LIST_HEAD(&md->part);
md->usage = 1; md->usage = 1;
ret = mmc_init_queue(&md->queue, card, &md->lock); ret = mmc_init_queue(&md->queue, card, &md->lock, subname);
if (ret) if (ret)
goto err_putdisk; goto err_putdisk;
@ -1297,6 +1297,9 @@ static void mmc_blk_remove(struct mmc_card *card)
struct mmc_blk_data *md = mmc_get_drvdata(card); struct mmc_blk_data *md = mmc_get_drvdata(card);
mmc_blk_remove_parts(card, md); mmc_blk_remove_parts(card, md);
mmc_claim_host(card->host);
mmc_blk_part_switch(card, md);
mmc_release_host(card->host);
mmc_blk_remove_req(md); mmc_blk_remove_req(md);
mmc_set_drvdata(card, NULL); mmc_set_drvdata(card, NULL);
} }

View File

@ -106,10 +106,12 @@ static void mmc_request(struct request_queue *q)
* @mq: mmc queue * @mq: mmc queue
* @card: mmc card to attach this queue * @card: mmc card to attach this queue
* @lock: queue lock * @lock: queue lock
* @subname: partition subname
* *
* Initialise a MMC card request queue. * Initialise a MMC card request queue.
*/ */
int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock) int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card,
spinlock_t *lock, const char *subname)
{ {
struct mmc_host *host = card->host; struct mmc_host *host = card->host;
u64 limit = BLK_BOUNCE_HIGH; u64 limit = BLK_BOUNCE_HIGH;
@ -133,12 +135,7 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
mq->queue->limits.max_discard_sectors = UINT_MAX; mq->queue->limits.max_discard_sectors = UINT_MAX;
if (card->erased_byte == 0) if (card->erased_byte == 0)
mq->queue->limits.discard_zeroes_data = 1; mq->queue->limits.discard_zeroes_data = 1;
if (!mmc_can_trim(card) && is_power_of_2(card->erase_size)) { mq->queue->limits.discard_granularity = card->pref_erase << 9;
mq->queue->limits.discard_granularity =
card->erase_size << 9;
mq->queue->limits.discard_alignment =
card->erase_size << 9;
}
if (mmc_can_secure_erase_trim(card)) if (mmc_can_secure_erase_trim(card))
queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD,
mq->queue); mq->queue);
@ -209,8 +206,8 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
sema_init(&mq->thread_sem, 1); sema_init(&mq->thread_sem, 1);
mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd/%d", mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd/%d%s",
host->index); host->index, subname ? subname : "");
if (IS_ERR(mq->thread)) { if (IS_ERR(mq->thread)) {
ret = PTR_ERR(mq->thread); ret = PTR_ERR(mq->thread);

View File

@ -19,7 +19,8 @@ struct mmc_queue {
unsigned int bounce_sg_len; unsigned int bounce_sg_len;
}; };
extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *); extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
const char *);
extern void mmc_cleanup_queue(struct mmc_queue *); extern void mmc_cleanup_queue(struct mmc_queue *);
extern void mmc_queue_suspend(struct mmc_queue *); extern void mmc_queue_suspend(struct mmc_queue *);
extern void mmc_queue_resume(struct mmc_queue *); extern void mmc_queue_resume(struct mmc_queue *);

View File

@ -1245,7 +1245,7 @@ static unsigned int mmc_mmc_erase_timeout(struct mmc_card *card,
*/ */
timeout_clks <<= 1; timeout_clks <<= 1;
timeout_us += (timeout_clks * 1000) / timeout_us += (timeout_clks * 1000) /
(card->host->ios.clock / 1000); (mmc_host_clk_rate(card->host) / 1000);
erase_timeout = timeout_us / 1000; erase_timeout = timeout_us / 1000;

View File

@ -691,15 +691,54 @@ static int mmc_sdio_resume(struct mmc_host *host)
static int mmc_sdio_power_restore(struct mmc_host *host) static int mmc_sdio_power_restore(struct mmc_host *host)
{ {
int ret; int ret;
u32 ocr;
BUG_ON(!host); BUG_ON(!host);
BUG_ON(!host->card); BUG_ON(!host->card);
mmc_claim_host(host); mmc_claim_host(host);
/*
* Reset the card by performing the same steps that are taken by
* mmc_rescan_try_freq() and mmc_attach_sdio() during a "normal" probe.
*
* sdio_reset() is technically not needed. Having just powered up the
* hardware, it should already be in reset state. However, some
* platforms (such as SD8686 on OLPC) do not instantly cut power,
* meaning that a reset is required when restoring power soon after
* powering off. It is harmless in other cases.
*
* The CMD5 reset (mmc_send_io_op_cond()), according to the SDIO spec,
* is not necessary for non-removable cards. However, it is required
* for OLPC SD8686 (which expects a [CMD5,5,3,7] init sequence), and
* harmless in other situations.
*
* With these steps taken, mmc_select_voltage() is also required to
* restore the correct voltage setting of the card.
*/
sdio_reset(host);
mmc_go_idle(host);
mmc_send_if_cond(host, host->ocr_avail);
ret = mmc_send_io_op_cond(host, 0, &ocr);
if (ret)
goto out;
if (host->ocr_avail_sdio)
host->ocr_avail = host->ocr_avail_sdio;
host->ocr = mmc_select_voltage(host, ocr & ~0x7F);
if (!host->ocr) {
ret = -EINVAL;
goto out;
}
ret = mmc_sdio_init_card(host, host->ocr, host->card, ret = mmc_sdio_init_card(host, host->ocr, host->card,
mmc_card_keep_power(host)); mmc_card_keep_power(host));
if (!ret && host->sdio_irqs) if (!ret && host->sdio_irqs)
mmc_signal_sdio_irq(host); mmc_signal_sdio_irq(host);
out:
mmc_release_host(host); mmc_release_host(host);
return ret; return ret;

View File

@ -189,7 +189,7 @@ static int sdio_bus_remove(struct device *dev)
/* Then undo the runtime PM settings in sdio_bus_probe() */ /* Then undo the runtime PM settings in sdio_bus_probe() */
if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD) if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
pm_runtime_put_noidle(dev); pm_runtime_put_sync(dev);
out: out:
return ret; return ret;

View File

@ -25,6 +25,11 @@
#include <linux/mmc/core.h> #include <linux/mmc/core.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
/* For archs that don't support NO_IRQ (such as mips), provide a dummy value */
#ifndef NO_IRQ
#define NO_IRQ 0
#endif
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
enum { enum {

View File

@ -429,7 +429,6 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
return -EINVAL; return -EINVAL;
} }
} }
mmc_slot(host).ocr_mask = mmc_regulator_get_ocrmask(reg);
/* Allow an aux regulator */ /* Allow an aux regulator */
reg = regulator_get(host->dev, "vmmc_aux"); reg = regulator_get(host->dev, "vmmc_aux");
@ -962,7 +961,8 @@ static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
spin_unlock(&host->irq_lock); spin_unlock(&host->irq_lock);
if (host->use_dma && dma_ch != -1) { if (host->use_dma && dma_ch != -1) {
dma_unmap_sg(mmc_dev(host->mmc), host->data->sg, host->dma_len, dma_unmap_sg(mmc_dev(host->mmc), host->data->sg,
host->data->sg_len,
omap_hsmmc_get_dma_dir(host, host->data)); omap_hsmmc_get_dma_dir(host, host->data));
omap_free_dma(dma_ch); omap_free_dma(dma_ch);
} }
@ -1346,7 +1346,7 @@ static void omap_hsmmc_dma_cb(int lch, u16 ch_status, void *cb_data)
return; return;
} }
dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->dma_len, dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
omap_hsmmc_get_dma_dir(host, data)); omap_hsmmc_get_dma_dir(host, data));
req_in_progress = host->req_in_progress; req_in_progress = host->req_in_progress;

View File

@ -92,7 +92,7 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev)
mmc_data->ocr_mask = p->tmio_ocr_mask; mmc_data->ocr_mask = p->tmio_ocr_mask;
mmc_data->capabilities |= p->tmio_caps; mmc_data->capabilities |= p->tmio_caps;
if (p->dma_slave_tx >= 0 && p->dma_slave_rx >= 0) { if (p->dma_slave_tx > 0 && p->dma_slave_rx > 0) {
priv->param_tx.slave_id = p->dma_slave_tx; priv->param_tx.slave_id = p->dma_slave_tx;
priv->param_rx.slave_id = p->dma_slave_rx; priv->param_rx.slave_id = p->dma_slave_rx;
priv->dma_priv.chan_priv_tx = &priv->param_tx; priv->dma_priv.chan_priv_tx = &priv->param_tx;
@ -165,13 +165,14 @@ static int sh_mobile_sdhi_remove(struct platform_device *pdev)
p->pdata = NULL; p->pdata = NULL;
tmio_mmc_host_remove(host);
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
irq = platform_get_irq(pdev, i); irq = platform_get_irq(pdev, i);
if (irq >= 0) if (irq >= 0)
free_irq(irq, host); free_irq(irq, host);
} }
tmio_mmc_host_remove(host);
clk_disable(priv->clk); clk_disable(priv->clk);
clk_put(priv->clk); clk_put(priv->clk);
kfree(priv); kfree(priv);

View File

@ -824,8 +824,8 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc)
struct tmio_mmc_host *host = mmc_priv(mmc); struct tmio_mmc_host *host = mmc_priv(mmc);
struct tmio_mmc_data *pdata = host->pdata; struct tmio_mmc_data *pdata = host->pdata;
return ((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) || return !((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) ||
!(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT)); (sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT));
} }
static int tmio_mmc_get_cd(struct mmc_host *mmc) static int tmio_mmc_get_cd(struct mmc_host *mmc)

View File

@ -2096,7 +2096,7 @@ static struct mmc_host_ops vub300_mmc_ops = {
static int vub300_probe(struct usb_interface *interface, static int vub300_probe(struct usb_interface *interface,
const struct usb_device_id *id) const struct usb_device_id *id)
{ /* NOT irq */ { /* NOT irq */
struct vub300_mmc_host *vub300 = NULL; struct vub300_mmc_host *vub300;
struct usb_host_interface *iface_desc; struct usb_host_interface *iface_desc;
struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface));
int i; int i;
@ -2118,23 +2118,20 @@ static int vub300_probe(struct usb_interface *interface,
command_out_urb = usb_alloc_urb(0, GFP_KERNEL); command_out_urb = usb_alloc_urb(0, GFP_KERNEL);
if (!command_out_urb) { if (!command_out_urb) {
retval = -ENOMEM; retval = -ENOMEM;
dev_err(&vub300->udev->dev, dev_err(&udev->dev, "not enough memory for command_out_urb\n");
"not enough memory for the command_out_urb\n");
goto error0; goto error0;
} }
command_res_urb = usb_alloc_urb(0, GFP_KERNEL); command_res_urb = usb_alloc_urb(0, GFP_KERNEL);
if (!command_res_urb) { if (!command_res_urb) {
retval = -ENOMEM; retval = -ENOMEM;
dev_err(&vub300->udev->dev, dev_err(&udev->dev, "not enough memory for command_res_urb\n");
"not enough memory for the command_res_urb\n");
goto error1; goto error1;
} }
/* this also allocates memory for our VUB300 mmc host device */ /* this also allocates memory for our VUB300 mmc host device */
mmc = mmc_alloc_host(sizeof(struct vub300_mmc_host), &udev->dev); mmc = mmc_alloc_host(sizeof(struct vub300_mmc_host), &udev->dev);
if (!mmc) { if (!mmc) {
retval = -ENOMEM; retval = -ENOMEM;
dev_err(&vub300->udev->dev, dev_err(&udev->dev, "not enough memory for the mmc_host\n");
"not enough memory for the mmc_host\n");
goto error4; goto error4;
} }
/* MMC core transfer sizes tunable parameters */ /* MMC core transfer sizes tunable parameters */

View File

@ -624,7 +624,7 @@ static int pci_pm_prepare(struct device *dev)
* system from the sleep state, we'll have to prevent it from signaling * system from the sleep state, we'll have to prevent it from signaling
* wake-up. * wake-up.
*/ */
pm_runtime_resume(dev); pm_runtime_get_sync(dev);
if (drv && drv->pm && drv->pm->prepare) if (drv && drv->pm && drv->pm->prepare)
error = drv->pm->prepare(dev); error = drv->pm->prepare(dev);
@ -638,6 +638,8 @@ static void pci_pm_complete(struct device *dev)
if (drv && drv->pm && drv->pm->complete) if (drv && drv->pm && drv->pm->complete)
drv->pm->complete(dev); drv->pm->complete(dev);
pm_runtime_put_sync(dev);
} }
#else /* !CONFIG_PM_SLEEP */ #else /* !CONFIG_PM_SLEEP */

View File

@ -3284,7 +3284,7 @@ static int pci_set_vga_state_arch(struct pci_dev *dev, bool decode,
* @dev: the PCI device * @dev: the PCI device
* @decode: true = enable decoding, false = disable decoding * @decode: true = enable decoding, false = disable decoding
* @command_bits: PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY * @command_bits: PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY
* @change_bridge_flags: traverse ancestors and change bridges * @flags: traverse ancestors and change bridges
* CHANGE_BRIDGE_ONLY / CHANGE_BRIDGE * CHANGE_BRIDGE_ONLY / CHANGE_BRIDGE
*/ */
int pci_set_vga_state(struct pci_dev *dev, bool decode, int pci_set_vga_state(struct pci_dev *dev, bool decode,

View File

@ -168,7 +168,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN; res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
if (type == pci_bar_io) { if (type == pci_bar_io) {
l &= PCI_BASE_ADDRESS_IO_MASK; l &= PCI_BASE_ADDRESS_IO_MASK;
mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT; mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT;
} else { } else {
l &= PCI_BASE_ADDRESS_MEM_MASK; l &= PCI_BASE_ADDRESS_MEM_MASK;
mask = (u32)PCI_BASE_ADDRESS_MEM_MASK; mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;

View File

@ -2761,6 +2761,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
} }
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
#endif /*CONFIG_MMC_RICOH_MMC*/ #endif /*CONFIG_MMC_RICOH_MMC*/
#if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP) #if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP)

View File

@ -149,6 +149,7 @@ static const struct i2c_device_id ds1307_id[] = {
{ "ds1340", ds_1340 }, { "ds1340", ds_1340 },
{ "ds3231", ds_3231 }, { "ds3231", ds_3231 },
{ "m41t00", m41t00 }, { "m41t00", m41t00 },
{ "pt7c4338", ds_1307 },
{ "rx8025", rx_8025 }, { "rx8025", rx_8025 },
{ } { }
}; };

View File

@ -78,7 +78,6 @@ struct vt8500_rtc {
void __iomem *regbase; void __iomem *regbase;
struct resource *res; struct resource *res;
int irq_alarm; int irq_alarm;
int irq_hz;
struct rtc_device *rtc; struct rtc_device *rtc;
spinlock_t lock; /* Protects this structure */ spinlock_t lock; /* Protects this structure */
}; };
@ -100,10 +99,6 @@ static irqreturn_t vt8500_rtc_irq(int irq, void *dev_id)
if (isr & 1) if (isr & 1)
events |= RTC_AF | RTC_IRQF; events |= RTC_AF | RTC_IRQF;
/* Only second/minute interrupts are supported */
if (isr & 2)
events |= RTC_UF | RTC_IRQF;
rtc_update_irq(vt8500_rtc->rtc, 1, events); rtc_update_irq(vt8500_rtc->rtc, 1, events);
return IRQ_HANDLED; return IRQ_HANDLED;
@ -199,27 +194,12 @@ static int vt8500_alarm_irq_enable(struct device *dev, unsigned int enabled)
return 0; return 0;
} }
static int vt8500_update_irq_enable(struct device *dev, unsigned int enabled)
{
struct vt8500_rtc *vt8500_rtc = dev_get_drvdata(dev);
unsigned long tmp = readl(vt8500_rtc->regbase + VT8500_RTC_CR);
if (enabled)
tmp |= VT8500_RTC_CR_SM_SEC | VT8500_RTC_CR_SM_ENABLE;
else
tmp &= ~VT8500_RTC_CR_SM_ENABLE;
writel(tmp, vt8500_rtc->regbase + VT8500_RTC_CR);
return 0;
}
static const struct rtc_class_ops vt8500_rtc_ops = { static const struct rtc_class_ops vt8500_rtc_ops = {
.read_time = vt8500_rtc_read_time, .read_time = vt8500_rtc_read_time,
.set_time = vt8500_rtc_set_time, .set_time = vt8500_rtc_set_time,
.read_alarm = vt8500_rtc_read_alarm, .read_alarm = vt8500_rtc_read_alarm,
.set_alarm = vt8500_rtc_set_alarm, .set_alarm = vt8500_rtc_set_alarm,
.alarm_irq_enable = vt8500_alarm_irq_enable, .alarm_irq_enable = vt8500_alarm_irq_enable,
.update_irq_enable = vt8500_update_irq_enable,
}; };
static int __devinit vt8500_rtc_probe(struct platform_device *pdev) static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
@ -248,13 +228,6 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
goto err_free; goto err_free;
} }
vt8500_rtc->irq_hz = platform_get_irq(pdev, 1);
if (vt8500_rtc->irq_hz < 0) {
dev_err(&pdev->dev, "No 1Hz IRQ resource defined\n");
ret = -ENXIO;
goto err_free;
}
vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start, vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start,
resource_size(vt8500_rtc->res), resource_size(vt8500_rtc->res),
"vt8500-rtc"); "vt8500-rtc");
@ -272,9 +245,8 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
goto err_release; goto err_release;
} }
/* Enable the second/minute interrupt generation and enable RTC */ /* Enable RTC and set it to 24-hour mode */
writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H,
| VT8500_RTC_CR_SM_ENABLE | VT8500_RTC_CR_SM_SEC,
vt8500_rtc->regbase + VT8500_RTC_CR); vt8500_rtc->regbase + VT8500_RTC_CR);
vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev,
@ -286,26 +258,16 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
goto err_unmap; goto err_unmap;
} }
ret = request_irq(vt8500_rtc->irq_hz, vt8500_rtc_irq, 0,
"rtc 1Hz", vt8500_rtc);
if (ret < 0) {
dev_err(&pdev->dev, "can't get irq %i, err %d\n",
vt8500_rtc->irq_hz, ret);
goto err_unreg;
}
ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0, ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0,
"rtc alarm", vt8500_rtc); "rtc alarm", vt8500_rtc);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "can't get irq %i, err %d\n", dev_err(&pdev->dev, "can't get irq %i, err %d\n",
vt8500_rtc->irq_alarm, ret); vt8500_rtc->irq_alarm, ret);
goto err_free_hz; goto err_unreg;
} }
return 0; return 0;
err_free_hz:
free_irq(vt8500_rtc->irq_hz, vt8500_rtc);
err_unreg: err_unreg:
rtc_device_unregister(vt8500_rtc->rtc); rtc_device_unregister(vt8500_rtc->rtc);
err_unmap: err_unmap:
@ -323,7 +285,6 @@ static int __devexit vt8500_rtc_remove(struct platform_device *pdev)
struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev); struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev);
free_irq(vt8500_rtc->irq_alarm, vt8500_rtc); free_irq(vt8500_rtc->irq_alarm, vt8500_rtc);
free_irq(vt8500_rtc->irq_hz, vt8500_rtc);
rtc_device_unregister(vt8500_rtc->rtc); rtc_device_unregister(vt8500_rtc->rtc);

View File

@ -7,6 +7,7 @@ config BRCMSMAC
default n default n
depends on PCI depends on PCI
depends on WLAN && MAC80211 depends on WLAN && MAC80211
depends on X86 || MIPS
select BRCMUTIL select BRCMUTIL
select FW_LOADER select FW_LOADER
select CRC_CCITT select CRC_CCITT
@ -20,6 +21,7 @@ config BRCMFMAC
default n default n
depends on MMC depends on MMC
depends on WLAN && CFG80211 depends on WLAN && CFG80211
depends on X86 || MIPS
select BRCMUTIL select BRCMUTIL
select FW_LOADER select FW_LOADER
select WIRELESS_EXT select WIRELESS_EXT

View File

@ -2,6 +2,7 @@ config COMEDI
tristate "Data acquisition support (comedi)" tristate "Data acquisition support (comedi)"
default N default N
depends on m depends on m
depends on BROKEN || FRV || M32R || MN10300 || SUPERH || TILE || X86
---help--- ---help---
Enable support a wide range of data acquisition devices Enable support a wide range of data acquisition devices
for Linux. for Linux.
@ -160,6 +161,7 @@ config COMEDI_PCL730
config COMEDI_PCL812 config COMEDI_PCL812
tristate "Advantech PCL-812/813 and ADlink ACL-8112/8113/8113/8216" tristate "Advantech PCL-812/813 and ADlink ACL-8112/8113/8113/8216"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for Advantech PCL-812/PG, PCL-813/B, ADLink Enable support for Advantech PCL-812/PG, PCL-813/B, ADLink
@ -171,6 +173,7 @@ config COMEDI_PCL812
config COMEDI_PCL816 config COMEDI_PCL816
tristate "Advantech PCL-814 and PCL-816 ISA card support" tristate "Advantech PCL-814 and PCL-816 ISA card support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for Advantech PCL-814 and PCL-816 ISA cards Enable support for Advantech PCL-814 and PCL-816 ISA cards
@ -180,6 +183,7 @@ config COMEDI_PCL816
config COMEDI_PCL818 config COMEDI_PCL818
tristate "Advantech PCL-718 and PCL-818 ISA card support" tristate "Advantech PCL-718 and PCL-818 ISA card support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for Advantech PCL-818 ISA cards Enable support for Advantech PCL-818 ISA cards
@ -269,6 +273,7 @@ config COMEDI_DAS800
config COMEDI_DAS1800 config COMEDI_DAS1800
tristate "DAS1800 and compatible ISA card support" tristate "DAS1800 and compatible ISA card support"
depends on VIRT_TO_BUS
select COMEDI_FC select COMEDI_FC
default N default N
---help--- ---help---
@ -340,6 +345,7 @@ config COMEDI_DT2817
config COMEDI_DT282X config COMEDI_DT282X
tristate "Data Translation DT2821 series and DT-EZ ISA card support" tristate "Data Translation DT2821 series and DT-EZ ISA card support"
select COMEDI_FC select COMEDI_FC
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for Data Translation DT2821 series including DT-EZ Enable support for Data Translation DT2821 series including DT-EZ
@ -419,6 +425,7 @@ config COMEDI_ADQ12B
config COMEDI_NI_AT_A2150 config COMEDI_NI_AT_A2150
tristate "NI AT-A2150 ISA card support" tristate "NI AT-A2150 ISA card support"
depends on COMEDI_NI_COMMON depends on COMEDI_NI_COMMON
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for National Instruments AT-A2150 cards Enable support for National Instruments AT-A2150 cards
@ -536,6 +543,7 @@ if COMEDI_PCI_DRIVERS && PCI
config COMEDI_ADDI_APCI_035 config COMEDI_ADDI_APCI_035
tristate "ADDI-DATA APCI_035 support" tristate "ADDI-DATA APCI_035 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_035 cards Enable support for ADDI-DATA APCI_035 cards
@ -545,6 +553,7 @@ config COMEDI_ADDI_APCI_035
config COMEDI_ADDI_APCI_1032 config COMEDI_ADDI_APCI_1032
tristate "ADDI-DATA APCI_1032 support" tristate "ADDI-DATA APCI_1032 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_1032 cards Enable support for ADDI-DATA APCI_1032 cards
@ -554,6 +563,7 @@ config COMEDI_ADDI_APCI_1032
config COMEDI_ADDI_APCI_1500 config COMEDI_ADDI_APCI_1500
tristate "ADDI-DATA APCI_1500 support" tristate "ADDI-DATA APCI_1500 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_1500 cards Enable support for ADDI-DATA APCI_1500 cards
@ -563,6 +573,7 @@ config COMEDI_ADDI_APCI_1500
config COMEDI_ADDI_APCI_1516 config COMEDI_ADDI_APCI_1516
tristate "ADDI-DATA APCI_1516 support" tristate "ADDI-DATA APCI_1516 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_1516 cards Enable support for ADDI-DATA APCI_1516 cards
@ -572,6 +583,7 @@ config COMEDI_ADDI_APCI_1516
config COMEDI_ADDI_APCI_1564 config COMEDI_ADDI_APCI_1564
tristate "ADDI-DATA APCI_1564 support" tristate "ADDI-DATA APCI_1564 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_1564 cards Enable support for ADDI-DATA APCI_1564 cards
@ -581,6 +593,7 @@ config COMEDI_ADDI_APCI_1564
config COMEDI_ADDI_APCI_16XX config COMEDI_ADDI_APCI_16XX
tristate "ADDI-DATA APCI_16xx support" tristate "ADDI-DATA APCI_16xx support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_16xx cards Enable support for ADDI-DATA APCI_16xx cards
@ -590,6 +603,7 @@ config COMEDI_ADDI_APCI_16XX
config COMEDI_ADDI_APCI_2016 config COMEDI_ADDI_APCI_2016
tristate "ADDI-DATA APCI_2016 support" tristate "ADDI-DATA APCI_2016 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_2016 cards Enable support for ADDI-DATA APCI_2016 cards
@ -599,6 +613,7 @@ config COMEDI_ADDI_APCI_2016
config COMEDI_ADDI_APCI_2032 config COMEDI_ADDI_APCI_2032
tristate "ADDI-DATA APCI_2032 support" tristate "ADDI-DATA APCI_2032 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_2032 cards Enable support for ADDI-DATA APCI_2032 cards
@ -608,6 +623,7 @@ config COMEDI_ADDI_APCI_2032
config COMEDI_ADDI_APCI_2200 config COMEDI_ADDI_APCI_2200
tristate "ADDI-DATA APCI_2200 support" tristate "ADDI-DATA APCI_2200 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_2200 cards Enable support for ADDI-DATA APCI_2200 cards
@ -617,6 +633,7 @@ config COMEDI_ADDI_APCI_2200
config COMEDI_ADDI_APCI_3001 config COMEDI_ADDI_APCI_3001
tristate "ADDI-DATA APCI_3001 support" tristate "ADDI-DATA APCI_3001 support"
depends on VIRT_TO_BUS
select COMEDI_FC select COMEDI_FC
default N default N
---help--- ---help---
@ -627,6 +644,7 @@ config COMEDI_ADDI_APCI_3001
config COMEDI_ADDI_APCI_3120 config COMEDI_ADDI_APCI_3120
tristate "ADDI-DATA APCI_3520 support" tristate "ADDI-DATA APCI_3520 support"
depends on VIRT_TO_BUS
select COMEDI_FC select COMEDI_FC
default N default N
---help--- ---help---
@ -637,6 +655,7 @@ config COMEDI_ADDI_APCI_3120
config COMEDI_ADDI_APCI_3501 config COMEDI_ADDI_APCI_3501
tristate "ADDI-DATA APCI_3501 support" tristate "ADDI-DATA APCI_3501 support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_3501 cards Enable support for ADDI-DATA APCI_3501 cards
@ -646,6 +665,7 @@ config COMEDI_ADDI_APCI_3501
config COMEDI_ADDI_APCI_3XXX config COMEDI_ADDI_APCI_3XXX
tristate "ADDI-DATA APCI_3xxx support" tristate "ADDI-DATA APCI_3xxx support"
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADDI-DATA APCI_3xxx cards Enable support for ADDI-DATA APCI_3xxx cards
@ -712,6 +732,7 @@ config COMEDI_ADL_PCI9111
config COMEDI_ADL_PCI9118 config COMEDI_ADL_PCI9118
tristate "ADLink PCI-9118DG, PCI-9118HG, PCI-9118HR support" tristate "ADLink PCI-9118DG, PCI-9118HG, PCI-9118HR support"
select COMEDI_FC select COMEDI_FC
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for ADlink PCI-9118DG, PCI-9118HG, PCI-9118HR cards Enable support for ADlink PCI-9118DG, PCI-9118HG, PCI-9118HR cards
@ -1287,6 +1308,7 @@ config COMEDI_NI_LABPC
depends on COMEDI_MITE depends on COMEDI_MITE
select COMEDI_8255 select COMEDI_8255
select COMEDI_FC select COMEDI_FC
depends on VIRT_TO_BUS
default N default N
---help--- ---help---
Enable support for National Instruments Lab-PC and compatibles Enable support for National Instruments Lab-PC and compatibles

View File

@ -4,7 +4,7 @@
menuconfig IIO menuconfig IIO
tristate "Industrial I/O support" tristate "Industrial I/O support"
depends on !S390 depends on GENERIC_HARDIRQS
help help
The industrial I/O subsystem provides a unified framework for The industrial I/O subsystem provides a unified framework for
drivers for many different types of embedded sensors using a drivers for many different types of embedded sensors using a

View File

@ -84,7 +84,6 @@ struct adis16204_state {
int adis16204_set_irq(struct iio_dev *indio_dev, bool enable); int adis16204_set_irq(struct iio_dev *indio_dev, bool enable);
#ifdef CONFIG_IIO_RING_BUFFER
enum adis16204_scan { enum adis16204_scan {
ADIS16204_SCAN_SUPPLY, ADIS16204_SCAN_SUPPLY,
ADIS16204_SCAN_ACC_X, ADIS16204_SCAN_ACC_X,
@ -93,6 +92,7 @@ enum adis16204_scan {
ADIS16204_SCAN_TEMP, ADIS16204_SCAN_TEMP,
}; };
#ifdef CONFIG_IIO_RING_BUFFER
void adis16204_remove_trigger(struct iio_dev *indio_dev); void adis16204_remove_trigger(struct iio_dev *indio_dev);
int adis16204_probe_trigger(struct iio_dev *indio_dev); int adis16204_probe_trigger(struct iio_dev *indio_dev);

View File

@ -121,8 +121,6 @@ struct adis16209_state {
int adis16209_set_irq(struct iio_dev *indio_dev, bool enable); int adis16209_set_irq(struct iio_dev *indio_dev, bool enable);
#ifdef CONFIG_IIO_RING_BUFFER
#define ADIS16209_SCAN_SUPPLY 0 #define ADIS16209_SCAN_SUPPLY 0
#define ADIS16209_SCAN_ACC_X 1 #define ADIS16209_SCAN_ACC_X 1
#define ADIS16209_SCAN_ACC_Y 2 #define ADIS16209_SCAN_ACC_Y 2
@ -132,6 +130,8 @@ int adis16209_set_irq(struct iio_dev *indio_dev, bool enable);
#define ADIS16209_SCAN_INCLI_Y 6 #define ADIS16209_SCAN_INCLI_Y 6
#define ADIS16209_SCAN_ROT 7 #define ADIS16209_SCAN_ROT 7
#ifdef CONFIG_IIO_RING_BUFFER
void adis16209_remove_trigger(struct iio_dev *indio_dev); void adis16209_remove_trigger(struct iio_dev *indio_dev);
int adis16209_probe_trigger(struct iio_dev *indio_dev); int adis16209_probe_trigger(struct iio_dev *indio_dev);

View File

@ -104,7 +104,6 @@ struct adis16260_state {
int adis16260_set_irq(struct iio_dev *indio_dev, bool enable); int adis16260_set_irq(struct iio_dev *indio_dev, bool enable);
#ifdef CONFIG_IIO_RING_BUFFER
/* At the moment triggers are only used for ring buffer /* At the moment triggers are only used for ring buffer
* filling. This may change! * filling. This may change!
*/ */
@ -115,6 +114,7 @@ int adis16260_set_irq(struct iio_dev *indio_dev, bool enable);
#define ADIS16260_SCAN_TEMP 3 #define ADIS16260_SCAN_TEMP 3
#define ADIS16260_SCAN_ANGL 4 #define ADIS16260_SCAN_ANGL 4
#ifdef CONFIG_IIO_RING_BUFFER
void adis16260_remove_trigger(struct iio_dev *indio_dev); void adis16260_remove_trigger(struct iio_dev *indio_dev);
int adis16260_probe_trigger(struct iio_dev *indio_dev); int adis16260_probe_trigger(struct iio_dev *indio_dev);

View File

@ -158,7 +158,6 @@ struct adis16400_state {
int adis16400_set_irq(struct iio_dev *indio_dev, bool enable); int adis16400_set_irq(struct iio_dev *indio_dev, bool enable);
#ifdef CONFIG_IIO_RING_BUFFER
/* At the moment triggers are only used for ring buffer /* At the moment triggers are only used for ring buffer
* filling. This may change! * filling. This may change!
*/ */
@ -182,6 +181,7 @@ int adis16400_set_irq(struct iio_dev *indio_dev, bool enable);
#define ADIS16300_SCAN_INCLI_X 12 #define ADIS16300_SCAN_INCLI_X 12
#define ADIS16300_SCAN_INCLI_Y 13 #define ADIS16300_SCAN_INCLI_Y 13
#ifdef CONFIG_IIO_RING_BUFFER
void adis16400_remove_trigger(struct iio_dev *indio_dev); void adis16400_remove_trigger(struct iio_dev *indio_dev);
int adis16400_probe_trigger(struct iio_dev *indio_dev); int adis16400_probe_trigger(struct iio_dev *indio_dev);

View File

@ -189,7 +189,7 @@ int mei_hw_init(struct mei_device *dev)
mutex_lock(&dev->device_lock); mutex_lock(&dev->device_lock);
} }
if (!err && !dev->recvd_msg) { if (err <= 0 && !dev->recvd_msg) {
dev->mei_state = MEI_DISABLED; dev->mei_state = MEI_DISABLED;
dev_dbg(&dev->pdev->dev, dev_dbg(&dev->pdev->dev,
"wait_event_interruptible_timeout failed" "wait_event_interruptible_timeout failed"

View File

@ -169,10 +169,15 @@ int mei_wd_stop(struct mei_device *dev, bool preserve)
ret = wait_event_interruptible_timeout(dev->wait_stop_wd, ret = wait_event_interruptible_timeout(dev->wait_stop_wd,
dev->wd_stopped, 10 * HZ); dev->wd_stopped, 10 * HZ);
mutex_lock(&dev->device_lock); mutex_lock(&dev->device_lock);
if (!dev->wd_stopped) if (dev->wd_stopped) {
dev_dbg(&dev->pdev->dev, "stop wd failed to complete.\n"); dev_dbg(&dev->pdev->dev, "stop wd complete ret=%d.\n", ret);
else ret = 0;
dev_dbg(&dev->pdev->dev, "stop wd complete.\n"); } else {
if (!ret)
ret = -ETIMEDOUT;
dev_warn(&dev->pdev->dev,
"stop wd failed to complete ret=%d.\n", ret);
}
if (preserve) if (preserve)
dev->wd_timeout = wd_timeout; dev->wd_timeout = wd_timeout;

View File

@ -386,7 +386,7 @@ static int tcm_loop_device_reset(struct scsi_cmnd *sc)
*/ */
se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, (void *)tl_tmr, se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, (void *)tl_tmr,
TMR_LUN_RESET); TMR_LUN_RESET);
if (!se_cmd->se_tmr_req) if (IS_ERR(se_cmd->se_tmr_req))
goto release; goto release;
/* /*
* Locate the underlying TCM struct se_lun from sc->device->lun * Locate the underlying TCM struct se_lun from sc->device->lun
@ -1017,6 +1017,7 @@ static int tcm_loop_make_nexus(
struct se_portal_group *se_tpg; struct se_portal_group *se_tpg;
struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
struct tcm_loop_nexus *tl_nexus; struct tcm_loop_nexus *tl_nexus;
int ret = -ENOMEM;
if (tl_tpg->tl_hba->tl_nexus) { if (tl_tpg->tl_hba->tl_nexus) {
printk(KERN_INFO "tl_tpg->tl_hba->tl_nexus already exists\n"); printk(KERN_INFO "tl_tpg->tl_hba->tl_nexus already exists\n");
@ -1033,8 +1034,10 @@ static int tcm_loop_make_nexus(
* Initialize the struct se_session pointer * Initialize the struct se_session pointer
*/ */
tl_nexus->se_sess = transport_init_session(); tl_nexus->se_sess = transport_init_session();
if (!tl_nexus->se_sess) if (IS_ERR(tl_nexus->se_sess)) {
ret = PTR_ERR(tl_nexus->se_sess);
goto out; goto out;
}
/* /*
* Since we are running in 'demo mode' this call with generate a * Since we are running in 'demo mode' this call with generate a
* struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI * struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI
@ -1060,7 +1063,7 @@ static int tcm_loop_make_nexus(
out: out:
kfree(tl_nexus); kfree(tl_nexus);
return -ENOMEM; return ret;
} }
static int tcm_loop_drop_nexus( static int tcm_loop_drop_nexus(
@ -1140,7 +1143,7 @@ static ssize_t tcm_loop_tpg_store_nexus(
* the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call * the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call
* tcm_loop_make_nexus() * tcm_loop_make_nexus()
*/ */
if (strlen(page) > TL_WWN_ADDR_LEN) { if (strlen(page) >= TL_WWN_ADDR_LEN) {
printk(KERN_ERR "Emulated NAA Sas Address: %s, exceeds" printk(KERN_ERR "Emulated NAA Sas Address: %s, exceeds"
" max: %d\n", page, TL_WWN_ADDR_LEN); " max: %d\n", page, TL_WWN_ADDR_LEN);
return -EINVAL; return -EINVAL;
@ -1321,7 +1324,7 @@ struct se_wwn *tcm_loop_make_scsi_hba(
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
check_len: check_len:
if (strlen(name) > TL_WWN_ADDR_LEN) { if (strlen(name) >= TL_WWN_ADDR_LEN) {
printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds" printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds"
" max: %d\n", name, tcm_loop_dump_proto_id(tl_hba), " max: %d\n", name, tcm_loop_dump_proto_id(tl_hba),
TL_WWN_ADDR_LEN); TL_WWN_ADDR_LEN);

View File

@ -304,7 +304,7 @@ struct target_fabric_configfs *target_fabric_configfs_init(
printk(KERN_ERR "Unable to locate passed fabric name\n"); printk(KERN_ERR "Unable to locate passed fabric name\n");
return NULL; return NULL;
} }
if (strlen(name) > TARGET_FABRIC_NAME_SIZE) { if (strlen(name) >= TARGET_FABRIC_NAME_SIZE) {
printk(KERN_ERR "Passed name: %s exceeds TARGET_FABRIC" printk(KERN_ERR "Passed name: %s exceeds TARGET_FABRIC"
"_NAME_SIZE\n", name); "_NAME_SIZE\n", name);
return NULL; return NULL;
@ -312,7 +312,7 @@ struct target_fabric_configfs *target_fabric_configfs_init(
tf = kzalloc(sizeof(struct target_fabric_configfs), GFP_KERNEL); tf = kzalloc(sizeof(struct target_fabric_configfs), GFP_KERNEL);
if (!(tf)) if (!(tf))
return ERR_PTR(-ENOMEM); return NULL;
INIT_LIST_HEAD(&tf->tf_list); INIT_LIST_HEAD(&tf->tf_list);
atomic_set(&tf->tf_access_cnt, 0); atomic_set(&tf->tf_access_cnt, 0);
@ -851,7 +851,7 @@ static ssize_t target_core_dev_wwn_store_attr_vpd_unit_serial(
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if ((strlen(page) + 1) > INQUIRY_VPD_SERIAL_LEN) { if (strlen(page) >= INQUIRY_VPD_SERIAL_LEN) {
printk(KERN_ERR "Emulated VPD Unit Serial exceeds" printk(KERN_ERR "Emulated VPD Unit Serial exceeds"
" INQUIRY_VPD_SERIAL_LEN: %d\n", INQUIRY_VPD_SERIAL_LEN); " INQUIRY_VPD_SERIAL_LEN: %d\n", INQUIRY_VPD_SERIAL_LEN);
return -EOVERFLOW; return -EOVERFLOW;
@ -917,7 +917,7 @@ static ssize_t target_core_dev_wwn_show_attr_vpd_protocol_identifier(
transport_dump_vpd_proto_id(vpd, buf, VPD_TMP_BUF_SIZE); transport_dump_vpd_proto_id(vpd, buf, VPD_TMP_BUF_SIZE);
if ((len + strlen(buf) > PAGE_SIZE)) if ((len + strlen(buf) >= PAGE_SIZE))
break; break;
len += sprintf(page+len, "%s", buf); len += sprintf(page+len, "%s", buf);
@ -962,19 +962,19 @@ static ssize_t target_core_dev_wwn_show_attr_##_name( \
\ \
memset(buf, 0, VPD_TMP_BUF_SIZE); \ memset(buf, 0, VPD_TMP_BUF_SIZE); \
transport_dump_vpd_assoc(vpd, buf, VPD_TMP_BUF_SIZE); \ transport_dump_vpd_assoc(vpd, buf, VPD_TMP_BUF_SIZE); \
if ((len + strlen(buf) > PAGE_SIZE)) \ if ((len + strlen(buf) >= PAGE_SIZE)) \
break; \ break; \
len += sprintf(page+len, "%s", buf); \ len += sprintf(page+len, "%s", buf); \
\ \
memset(buf, 0, VPD_TMP_BUF_SIZE); \ memset(buf, 0, VPD_TMP_BUF_SIZE); \
transport_dump_vpd_ident_type(vpd, buf, VPD_TMP_BUF_SIZE); \ transport_dump_vpd_ident_type(vpd, buf, VPD_TMP_BUF_SIZE); \
if ((len + strlen(buf) > PAGE_SIZE)) \ if ((len + strlen(buf) >= PAGE_SIZE)) \
break; \ break; \
len += sprintf(page+len, "%s", buf); \ len += sprintf(page+len, "%s", buf); \
\ \
memset(buf, 0, VPD_TMP_BUF_SIZE); \ memset(buf, 0, VPD_TMP_BUF_SIZE); \
transport_dump_vpd_ident(vpd, buf, VPD_TMP_BUF_SIZE); \ transport_dump_vpd_ident(vpd, buf, VPD_TMP_BUF_SIZE); \
if ((len + strlen(buf) > PAGE_SIZE)) \ if ((len + strlen(buf) >= PAGE_SIZE)) \
break; \ break; \
len += sprintf(page+len, "%s", buf); \ len += sprintf(page+len, "%s", buf); \
} \ } \
@ -1299,7 +1299,7 @@ static ssize_t target_core_dev_pr_show_attr_res_pr_registered_i_pts(
&i_buf[0] : "", pr_reg->pr_res_key, &i_buf[0] : "", pr_reg->pr_res_key,
pr_reg->pr_res_generation); pr_reg->pr_res_generation);
if ((len + strlen(buf) > PAGE_SIZE)) if ((len + strlen(buf) >= PAGE_SIZE))
break; break;
len += sprintf(page+len, "%s", buf); len += sprintf(page+len, "%s", buf);
@ -1496,7 +1496,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
if (strlen(i_port) > PR_APTPL_MAX_IPORT_LEN) { if (strlen(i_port) >= PR_APTPL_MAX_IPORT_LEN) {
printk(KERN_ERR "APTPL metadata initiator_node=" printk(KERN_ERR "APTPL metadata initiator_node="
" exceeds PR_APTPL_MAX_IPORT_LEN: %d\n", " exceeds PR_APTPL_MAX_IPORT_LEN: %d\n",
PR_APTPL_MAX_IPORT_LEN); PR_APTPL_MAX_IPORT_LEN);
@ -1510,7 +1510,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
if (strlen(isid) > PR_REG_ISID_LEN) { if (strlen(isid) >= PR_REG_ISID_LEN) {
printk(KERN_ERR "APTPL metadata initiator_isid" printk(KERN_ERR "APTPL metadata initiator_isid"
"= exceeds PR_REG_ISID_LEN: %d\n", "= exceeds PR_REG_ISID_LEN: %d\n",
PR_REG_ISID_LEN); PR_REG_ISID_LEN);
@ -1571,7 +1571,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
if (strlen(t_port) > PR_APTPL_MAX_TPORT_LEN) { if (strlen(t_port) >= PR_APTPL_MAX_TPORT_LEN) {
printk(KERN_ERR "APTPL metadata target_node=" printk(KERN_ERR "APTPL metadata target_node="
" exceeds PR_APTPL_MAX_TPORT_LEN: %d\n", " exceeds PR_APTPL_MAX_TPORT_LEN: %d\n",
PR_APTPL_MAX_TPORT_LEN); PR_APTPL_MAX_TPORT_LEN);
@ -3052,7 +3052,7 @@ static struct config_group *target_core_call_addhbatotarget(
int ret; int ret;
memset(buf, 0, TARGET_CORE_NAME_MAX_LEN); memset(buf, 0, TARGET_CORE_NAME_MAX_LEN);
if (strlen(name) > TARGET_CORE_NAME_MAX_LEN) { if (strlen(name) >= TARGET_CORE_NAME_MAX_LEN) {
printk(KERN_ERR "Passed *name strlen(): %d exceeds" printk(KERN_ERR "Passed *name strlen(): %d exceeds"
" TARGET_CORE_NAME_MAX_LEN: %d\n", (int)strlen(name), " TARGET_CORE_NAME_MAX_LEN: %d\n", (int)strlen(name),
TARGET_CORE_NAME_MAX_LEN); TARGET_CORE_NAME_MAX_LEN);

View File

@ -192,7 +192,7 @@ int transport_get_lun_for_tmr(
&SE_NODE_ACL(se_sess)->device_list[unpacked_lun]; &SE_NODE_ACL(se_sess)->device_list[unpacked_lun];
if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) { if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) {
se_lun = se_cmd->se_lun = se_tmr->tmr_lun = deve->se_lun; se_lun = se_cmd->se_lun = se_tmr->tmr_lun = deve->se_lun;
dev = se_tmr->tmr_dev = se_lun->lun_se_dev; dev = se_lun->lun_se_dev;
se_cmd->pr_res_key = deve->pr_res_key; se_cmd->pr_res_key = deve->pr_res_key;
se_cmd->orig_fe_lun = unpacked_lun; se_cmd->orig_fe_lun = unpacked_lun;
se_cmd->se_orig_obj_ptr = SE_LUN(se_cmd)->lun_se_dev; se_cmd->se_orig_obj_ptr = SE_LUN(se_cmd)->lun_se_dev;
@ -216,6 +216,7 @@ int transport_get_lun_for_tmr(
se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
return -1; return -1;
} }
se_tmr->tmr_dev = dev;
spin_lock(&dev->se_tmr_lock); spin_lock(&dev->se_tmr_lock);
list_add_tail(&se_tmr->tmr_list, &dev->dev_tmr_list); list_add_tail(&se_tmr->tmr_list, &dev->dev_tmr_list);
@ -1430,7 +1431,7 @@ struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
struct se_lun_acl *lacl; struct se_lun_acl *lacl;
struct se_node_acl *nacl; struct se_node_acl *nacl;
if (strlen(initiatorname) > TRANSPORT_IQN_LEN) { if (strlen(initiatorname) >= TRANSPORT_IQN_LEN) {
printk(KERN_ERR "%s InitiatorName exceeds maximum size.\n", printk(KERN_ERR "%s InitiatorName exceeds maximum size.\n",
TPG_TFO(tpg)->get_fabric_name()); TPG_TFO(tpg)->get_fabric_name());
*ret = -EOVERFLOW; *ret = -EOVERFLOW;

View File

@ -1916,7 +1916,7 @@ static int __core_scsi3_update_aptpl_buf(
pr_reg->pr_res_mapped_lun); pr_reg->pr_res_mapped_lun);
} }
if ((len + strlen(tmp) > pr_aptpl_buf_len)) { if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
printk(KERN_ERR "Unable to update renaming" printk(KERN_ERR "Unable to update renaming"
" APTPL metadata\n"); " APTPL metadata\n");
spin_unlock(&T10_RES(su_dev)->registration_lock); spin_unlock(&T10_RES(su_dev)->registration_lock);
@ -1934,7 +1934,7 @@ static int __core_scsi3_update_aptpl_buf(
TPG_TFO(tpg)->tpg_get_tag(tpg), TPG_TFO(tpg)->tpg_get_tag(tpg),
lun->lun_sep->sep_rtpi, lun->unpacked_lun, reg_count); lun->lun_sep->sep_rtpi, lun->unpacked_lun, reg_count);
if ((len + strlen(tmp) > pr_aptpl_buf_len)) { if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
printk(KERN_ERR "Unable to update renaming" printk(KERN_ERR "Unable to update renaming"
" APTPL metadata\n"); " APTPL metadata\n");
spin_unlock(&T10_RES(su_dev)->registration_lock); spin_unlock(&T10_RES(su_dev)->registration_lock);
@ -1986,7 +1986,7 @@ static int __core_scsi3_write_aptpl_to_file(
memset(iov, 0, sizeof(struct iovec)); memset(iov, 0, sizeof(struct iovec));
memset(path, 0, 512); memset(path, 0, 512);
if (strlen(&wwn->unit_serial[0]) > 512) { if (strlen(&wwn->unit_serial[0]) >= 512) {
printk(KERN_ERR "WWN value for struct se_device does not fit" printk(KERN_ERR "WWN value for struct se_device does not fit"
" into path buffer\n"); " into path buffer\n");
return -1; return -1;

View File

@ -75,10 +75,16 @@ void core_tmr_release_req(
{ {
struct se_device *dev = tmr->tmr_dev; struct se_device *dev = tmr->tmr_dev;
if (!dev) {
kmem_cache_free(se_tmr_req_cache, tmr);
return;
}
spin_lock(&dev->se_tmr_lock); spin_lock(&dev->se_tmr_lock);
list_del(&tmr->tmr_list); list_del(&tmr->tmr_list);
kmem_cache_free(se_tmr_req_cache, tmr);
spin_unlock(&dev->se_tmr_lock); spin_unlock(&dev->se_tmr_lock);
kmem_cache_free(se_tmr_req_cache, tmr);
} }
static void core_tmr_handle_tas_abort( static void core_tmr_handle_tas_abort(

View File

@ -536,13 +536,13 @@ EXPORT_SYMBOL(transport_register_session);
void transport_deregister_session_configfs(struct se_session *se_sess) void transport_deregister_session_configfs(struct se_session *se_sess)
{ {
struct se_node_acl *se_nacl; struct se_node_acl *se_nacl;
unsigned long flags;
/* /*
* Used by struct se_node_acl's under ConfigFS to locate active struct se_session * Used by struct se_node_acl's under ConfigFS to locate active struct se_session
*/ */
se_nacl = se_sess->se_node_acl; se_nacl = se_sess->se_node_acl;
if ((se_nacl)) { if ((se_nacl)) {
spin_lock_irq(&se_nacl->nacl_sess_lock); spin_lock_irqsave(&se_nacl->nacl_sess_lock, flags);
list_del(&se_sess->sess_acl_list); list_del(&se_sess->sess_acl_list);
/* /*
* If the session list is empty, then clear the pointer. * If the session list is empty, then clear the pointer.
@ -556,7 +556,7 @@ void transport_deregister_session_configfs(struct se_session *se_sess)
se_nacl->acl_sess_list.prev, se_nacl->acl_sess_list.prev,
struct se_session, sess_acl_list); struct se_session, sess_acl_list);
} }
spin_unlock_irq(&se_nacl->nacl_sess_lock); spin_unlock_irqrestore(&se_nacl->nacl_sess_lock, flags);
} }
} }
EXPORT_SYMBOL(transport_deregister_session_configfs); EXPORT_SYMBOL(transport_deregister_session_configfs);

Some files were not shown because too many files have changed in this diff Show More