forked from Minki/linux
Merge branch 'drm-intel-fixes' into drm-intel-next
This commit is contained in:
commit
8eb2c0ee67
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
12
MAINTAINERS
12
MAINTAINERS
@ -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*
|
||||||
|
|
||||||
|
2
Makefile
2
Makefile
@ -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*
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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__ */
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Interrupt handling. Preserves r7, r8, r9
|
* Interrupt handling. Preserves r7, r8, r9
|
||||||
*/
|
*/
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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 = {
|
||||||
|
@ -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"
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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[];
|
||||||
|
@ -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)
|
||||||
|
6
arch/um/include/asm/percpu.h
Normal file
6
arch/um/include/asm/percpu.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef __UM_PERCPU_H
|
||||||
|
#define __UM_PERCPU_H
|
||||||
|
|
||||||
|
#include <asm-generic/percpu.h>
|
||||||
|
|
||||||
|
#endif /* __UM_PERCPU_H */
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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],
|
||||||
|
@ -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]);
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
{ }
|
{ }
|
||||||
|
@ -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);
|
||||||
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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) },
|
||||||
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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");
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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 *);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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 */
|
||||||
|
@ -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 */
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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(
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user