mirror of
https://github.com/hardkernel/linux.git
synced 2026-04-15 01:50:40 +09:00
Merge tag 'v3.10.39' into linux-linaro-lsk
This is the 3.10.39 stable release
This commit is contained in:
@@ -55,6 +55,7 @@ zc3xx 0458:700f Genius VideoCam Web V2
|
||||
sonixj 0458:7025 Genius Eye 311Q
|
||||
sn9c20x 0458:7029 Genius Look 320s
|
||||
sonixj 0458:702e Genius Slim 310 NB
|
||||
sn9c20x 0458:7045 Genius Look 1320 V2
|
||||
sn9c20x 0458:704a Genius Slim 1320
|
||||
sn9c20x 0458:704c Genius i-Look 1321
|
||||
sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650)
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 37
|
||||
SUBLEVEL = 39
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
#size-cells = <0>;
|
||||
compatible = "marvell,orion-mdio";
|
||||
reg = <0x72004 0x4>;
|
||||
clocks = <&gateclk 4>;
|
||||
};
|
||||
|
||||
ethernet@70000 {
|
||||
|
||||
@@ -263,6 +263,7 @@
|
||||
regulator-name = "vdd_g3d";
|
||||
regulator-min-microvolt = <1000000>;
|
||||
regulator-max-microvolt = <1000000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
op_mode = <1>;
|
||||
};
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
/* Select the best insn combination to perform the */ \
|
||||
/* actual __m * __n / (__p << 64) operation. */ \
|
||||
if (!__c) { \
|
||||
asm ( "umull %Q0, %R0, %1, %Q2\n\t" \
|
||||
asm ( "umull %Q0, %R0, %Q1, %Q2\n\t" \
|
||||
"mov %Q0, #0" \
|
||||
: "=&r" (__res) \
|
||||
: "r" (__m), "r" (__n) \
|
||||
|
||||
@@ -3,11 +3,6 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#if defined(CONFIG_CPU_USE_DOMAINS) && defined(CONFIG_SMP)
|
||||
/* ARM doesn't provide unprivileged exclusive memory accessors */
|
||||
#include <asm-generic/futex.h>
|
||||
#else
|
||||
|
||||
#include <linux/futex.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/errno.h>
|
||||
@@ -164,6 +159,5 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* !(CPU_USE_DOMAINS && SMP) */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_ARM_FUTEX_H */
|
||||
|
||||
@@ -130,16 +130,16 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)
|
||||
*/
|
||||
extern void __iomem *__arm_ioremap_pfn_caller(unsigned long, unsigned long,
|
||||
size_t, unsigned int, void *);
|
||||
extern void __iomem *__arm_ioremap_caller(unsigned long, size_t, unsigned int,
|
||||
extern void __iomem *__arm_ioremap_caller(phys_addr_t, size_t, unsigned int,
|
||||
void *);
|
||||
|
||||
extern void __iomem *__arm_ioremap_pfn(unsigned long, unsigned long, size_t, unsigned int);
|
||||
extern void __iomem *__arm_ioremap(unsigned long, size_t, unsigned int);
|
||||
extern void __iomem *__arm_ioremap_exec(unsigned long, size_t, bool cached);
|
||||
extern void __iomem *__arm_ioremap(phys_addr_t, size_t, unsigned int);
|
||||
extern void __iomem *__arm_ioremap_exec(phys_addr_t, size_t, bool cached);
|
||||
extern void __iounmap(volatile void __iomem *addr);
|
||||
extern void __arm_iounmap(volatile void __iomem *addr);
|
||||
|
||||
extern void __iomem * (*arch_ioremap_caller)(unsigned long, size_t,
|
||||
extern void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t,
|
||||
unsigned int, void *);
|
||||
extern void (*arch_iounmap)(volatile void __iomem *);
|
||||
|
||||
|
||||
@@ -140,6 +140,7 @@
|
||||
#define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 0x0c) << 2) /* 1100 */
|
||||
#define L_PTE_MT_DEV_WC (_AT(pteval_t, 0x09) << 2) /* 1001 */
|
||||
#define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */
|
||||
#define L_PTE_MT_VECTORS (_AT(pteval_t, 0x0f) << 2) /* 1111 */
|
||||
#define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
@@ -48,6 +48,5 @@
|
||||
*/
|
||||
#define __IGNORE_fadvise64_64
|
||||
#define __IGNORE_migrate_pages
|
||||
#define __IGNORE_kcmp
|
||||
|
||||
#endif /* __ASM_ARM_UNISTD_H */
|
||||
|
||||
@@ -169,3 +169,10 @@ void machine_kexec(struct kimage *image)
|
||||
|
||||
soft_restart(reboot_code_buffer_phys);
|
||||
}
|
||||
|
||||
void arch_crash_save_vmcoreinfo(void)
|
||||
{
|
||||
#ifdef CONFIG_ARM_LPAE
|
||||
VMCOREINFO_CONFIG(ARM_LPAE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ static void __init ebsa110_map_io(void)
|
||||
iotable_init(ebsa110_io_desc, ARRAY_SIZE(ebsa110_io_desc));
|
||||
}
|
||||
|
||||
static void __iomem *ebsa110_ioremap_caller(unsigned long cookie, size_t size,
|
||||
static void __iomem *ebsa110_ioremap_caller(phys_addr_t cookie, size_t size,
|
||||
unsigned int flags, void *caller)
|
||||
{
|
||||
return (void __iomem *)cookie;
|
||||
|
||||
@@ -65,7 +65,7 @@ static void imx3_idle(void)
|
||||
: "=r" (reg));
|
||||
}
|
||||
|
||||
static void __iomem *imx3_ioremap_caller(unsigned long phys_addr, size_t size,
|
||||
static void __iomem *imx3_ioremap_caller(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype, void *caller)
|
||||
{
|
||||
if (mtype == MT_DEVICE) {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "pci.h"
|
||||
|
||||
static void __iomem *__iop13xx_ioremap_caller(unsigned long cookie,
|
||||
static void __iomem *__iop13xx_ioremap_caller(phys_addr_t cookie,
|
||||
size_t size, unsigned int mtype, void *caller)
|
||||
{
|
||||
void __iomem * retval;
|
||||
|
||||
@@ -559,7 +559,7 @@ void ixp4xx_restart(char mode, const char *cmd)
|
||||
* fallback to the default.
|
||||
*/
|
||||
|
||||
static void __iomem *ixp4xx_ioremap_caller(unsigned long addr, size_t size,
|
||||
static void __iomem *ixp4xx_ioremap_caller(phys_addr_t addr, size_t size,
|
||||
unsigned int mtype, void *caller)
|
||||
{
|
||||
if (!is_pci_memory(addr))
|
||||
|
||||
@@ -23,7 +23,7 @@ extern void msm_map_msm8x60_io(void);
|
||||
extern void msm_map_msm8960_io(void);
|
||||
extern void msm_map_qsd8x50_io(void);
|
||||
|
||||
extern void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size,
|
||||
extern void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype, void *caller);
|
||||
|
||||
extern struct smp_operations msm_smp_ops;
|
||||
|
||||
@@ -172,7 +172,7 @@ void __init msm_map_msm7x30_io(void)
|
||||
}
|
||||
#endif /* CONFIG_ARCH_MSM7X30 */
|
||||
|
||||
void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size,
|
||||
void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype, void *caller)
|
||||
{
|
||||
if (mtype == MT_DEVICE) {
|
||||
|
||||
@@ -222,6 +222,7 @@ void __init ti81xx_init_irq(void)
|
||||
static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs)
|
||||
{
|
||||
u32 irqnr;
|
||||
int handled_irq = 0;
|
||||
|
||||
do {
|
||||
irqnr = readl_relaxed(base_addr + 0x98);
|
||||
@@ -249,8 +250,15 @@ out:
|
||||
if (irqnr) {
|
||||
irqnr = irq_find_mapping(domain, irqnr);
|
||||
handle_IRQ(irqnr, regs);
|
||||
handled_irq = 1;
|
||||
}
|
||||
} while (irqnr);
|
||||
|
||||
/* If an irq is masked or deasserted while active, we will
|
||||
* keep ending up here with no irq handled. So remove it from
|
||||
* the INTC with an ack.*/
|
||||
if (!handled_irq)
|
||||
omap_ack_irq(NULL);
|
||||
}
|
||||
|
||||
asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs)
|
||||
|
||||
@@ -1955,7 +1955,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = {
|
||||
static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
|
||||
.name = "usb_host_hs",
|
||||
.class = &omap3xxx_usb_host_hs_hwmod_class,
|
||||
.clkdm_name = "l3_init_clkdm",
|
||||
.clkdm_name = "usbhost_clkdm",
|
||||
.mpu_irqs = omap3xxx_usb_host_hs_irqs,
|
||||
.main_clk = "usbhost_48m_fck",
|
||||
.prcm = {
|
||||
@@ -2040,7 +2040,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = {
|
||||
static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = {
|
||||
.name = "usb_tll_hs",
|
||||
.class = &omap3xxx_usb_tll_hs_hwmod_class,
|
||||
.clkdm_name = "l3_init_clkdm",
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.mpu_irqs = omap3xxx_usb_tll_hs_irqs,
|
||||
.main_clk = "usbtll_fck",
|
||||
.prcm = {
|
||||
|
||||
@@ -103,7 +103,7 @@ static inline void enable_omap3630_toggle_l2_on_restore(void) { }
|
||||
|
||||
#define PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD (1 << 0)
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP4)
|
||||
#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4)
|
||||
extern u16 pm44xx_errata;
|
||||
#define IS_PM44XX_ERRATUM(id) (pm44xx_errata & (id))
|
||||
#else
|
||||
|
||||
@@ -436,7 +436,6 @@ config CPU_32v5
|
||||
|
||||
config CPU_32v6
|
||||
bool
|
||||
select CPU_USE_DOMAINS if CPU_V6 && MMU
|
||||
select TLS_REG_EMUL if !CPU_32v6K && !MMU
|
||||
|
||||
config CPU_32v6K
|
||||
@@ -651,7 +650,7 @@ config ARM_VIRT_EXT
|
||||
|
||||
config SWP_EMULATE
|
||||
bool "Emulate SWP/SWPB instructions"
|
||||
depends on !CPU_USE_DOMAINS && CPU_V7
|
||||
depends on CPU_V7
|
||||
default y if SMP
|
||||
select HAVE_PROC_CPU if PROC_FS
|
||||
help
|
||||
|
||||
@@ -331,10 +331,10 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
|
||||
return (void __iomem *) (offset + addr);
|
||||
}
|
||||
|
||||
void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size,
|
||||
void __iomem *__arm_ioremap_caller(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype, void *caller)
|
||||
{
|
||||
unsigned long last_addr;
|
||||
phys_addr_t last_addr;
|
||||
unsigned long offset = phys_addr & ~PAGE_MASK;
|
||||
unsigned long pfn = __phys_to_pfn(phys_addr);
|
||||
|
||||
@@ -367,12 +367,12 @@ __arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_ioremap_pfn);
|
||||
|
||||
void __iomem * (*arch_ioremap_caller)(unsigned long, size_t,
|
||||
void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t,
|
||||
unsigned int, void *) =
|
||||
__arm_ioremap_caller;
|
||||
|
||||
void __iomem *
|
||||
__arm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype)
|
||||
__arm_ioremap(phys_addr_t phys_addr, size_t size, unsigned int mtype)
|
||||
{
|
||||
return arch_ioremap_caller(phys_addr, size, mtype,
|
||||
__builtin_return_address(0));
|
||||
@@ -387,7 +387,7 @@ EXPORT_SYMBOL(__arm_ioremap);
|
||||
* CONFIG_GENERIC_ALLOCATOR for allocating external memory.
|
||||
*/
|
||||
void __iomem *
|
||||
__arm_ioremap_exec(unsigned long phys_addr, size_t size, bool cached)
|
||||
__arm_ioremap_exec(phys_addr_t phys_addr, size_t size, bool cached)
|
||||
{
|
||||
unsigned int mtype;
|
||||
|
||||
|
||||
@@ -458,6 +458,16 @@ static void __init build_mem_type_table(void)
|
||||
s2_pgprot = cp->pte_s2;
|
||||
hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte;
|
||||
|
||||
/*
|
||||
* We don't use domains on ARMv6 (since this causes problems with
|
||||
* v6/v7 kernels), so we must use a separate memory type for user
|
||||
* r/o, kernel r/w to map the vectors page.
|
||||
*/
|
||||
#ifndef CONFIG_ARM_LPAE
|
||||
if (cpu_arch == CPU_ARCH_ARMv6)
|
||||
vecs_pgprot |= L_PTE_MT_VECTORS;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ARMv6 and above have extended page tables.
|
||||
*/
|
||||
|
||||
@@ -87,16 +87,16 @@ void __iomem *__arm_ioremap_pfn_caller(unsigned long pfn, unsigned long offset,
|
||||
return __arm_ioremap_pfn(pfn, offset, size, mtype);
|
||||
}
|
||||
|
||||
void __iomem *__arm_ioremap(unsigned long phys_addr, size_t size,
|
||||
void __iomem *__arm_ioremap(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype)
|
||||
{
|
||||
return (void __iomem *)phys_addr;
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_ioremap);
|
||||
|
||||
void __iomem * (*arch_ioremap_caller)(unsigned long, size_t, unsigned int, void *);
|
||||
void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, unsigned int, void *);
|
||||
|
||||
void __iomem *__arm_ioremap_caller(unsigned long phys_addr, size_t size,
|
||||
void __iomem *__arm_ioremap_caller(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype, void *caller)
|
||||
{
|
||||
return __arm_ioremap(phys_addr, size, mtype);
|
||||
|
||||
@@ -112,13 +112,9 @@
|
||||
* 100x 1 0 1 r/o no acc
|
||||
* 10x0 1 0 1 r/o no acc
|
||||
* 1011 0 0 1 r/w no acc
|
||||
* 110x 0 1 0 r/w r/o
|
||||
* 11x0 0 1 0 r/w r/o
|
||||
* 1111 0 1 1 r/w r/w
|
||||
*
|
||||
* If !CONFIG_CPU_USE_DOMAINS, the following permissions are changed:
|
||||
* 110x 1 1 1 r/o r/o
|
||||
* 11x0 1 1 1 r/o r/o
|
||||
* 1111 0 1 1 r/w r/w
|
||||
*/
|
||||
.macro armv6_mt_table pfx
|
||||
\pfx\()_mt_table:
|
||||
@@ -137,7 +133,7 @@
|
||||
.long PTE_EXT_TEX(2) @ L_PTE_MT_DEV_NONSHARED
|
||||
.long 0x00 @ unused
|
||||
.long 0x00 @ unused
|
||||
.long 0x00 @ unused
|
||||
.long PTE_CACHEABLE | PTE_BUFFERABLE | PTE_EXT_APX @ L_PTE_MT_VECTORS
|
||||
.endm
|
||||
|
||||
.macro armv6_set_pte_ext pfx
|
||||
@@ -158,24 +154,21 @@
|
||||
|
||||
tst r1, #L_PTE_USER
|
||||
orrne r3, r3, #PTE_EXT_AP1
|
||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||
@ allow kernel read/write access to read-only user pages
|
||||
tstne r3, #PTE_EXT_APX
|
||||
bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0
|
||||
#endif
|
||||
|
||||
@ user read-only -> kernel read-only
|
||||
bicne r3, r3, #PTE_EXT_AP0
|
||||
|
||||
tst r1, #L_PTE_XN
|
||||
orrne r3, r3, #PTE_EXT_XN
|
||||
|
||||
orr r3, r3, r2
|
||||
eor r3, r3, r2
|
||||
|
||||
tst r1, #L_PTE_YOUNG
|
||||
tstne r1, #L_PTE_PRESENT
|
||||
moveq r3, #0
|
||||
#ifndef CONFIG_CPU_USE_DOMAINS
|
||||
tstne r1, #L_PTE_NONE
|
||||
movne r3, #0
|
||||
#endif
|
||||
|
||||
str r3, [r0]
|
||||
mcr p15, 0, r0, c7, c10, 1 @ flush_pte
|
||||
|
||||
@@ -90,21 +90,14 @@ ENTRY(cpu_v7_set_pte_ext)
|
||||
|
||||
tst r1, #L_PTE_USER
|
||||
orrne r3, r3, #PTE_EXT_AP1
|
||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||
@ allow kernel read/write access to read-only user pages
|
||||
tstne r3, #PTE_EXT_APX
|
||||
bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0
|
||||
#endif
|
||||
|
||||
tst r1, #L_PTE_XN
|
||||
orrne r3, r3, #PTE_EXT_XN
|
||||
|
||||
tst r1, #L_PTE_YOUNG
|
||||
tstne r1, #L_PTE_VALID
|
||||
#ifndef CONFIG_CPU_USE_DOMAINS
|
||||
eorne r1, r1, #L_PTE_NONE
|
||||
tstne r1, #L_PTE_NONE
|
||||
#endif
|
||||
moveq r3, #0
|
||||
|
||||
ARM( str r3, [r0, #2048]! )
|
||||
|
||||
@@ -193,7 +193,7 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
if (pte_valid_user(pte)) {
|
||||
if (pte_exec(pte))
|
||||
if (!pte_special(pte) && pte_exec(pte))
|
||||
__sync_icache_dcache(pte, addr);
|
||||
if (pte_dirty(pte) && pte_write(pte))
|
||||
pte_val(pte) &= ~PTE_RDONLY;
|
||||
@@ -280,11 +280,11 @@ static inline int has_transparent_hugepage(void)
|
||||
* Mark the prot value as uncacheable and unbufferable.
|
||||
*/
|
||||
#define pgprot_noncached(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE))
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE) | PTE_PXN | PTE_UXN)
|
||||
#define pgprot_writecombine(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC))
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
|
||||
#define pgprot_dmacoherent(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC))
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
|
||||
#define __HAVE_PHYS_MEM_ACCESS_PROT
|
||||
struct file;
|
||||
extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||
|
||||
@@ -219,7 +219,7 @@ extern void ccw_device_get_id(struct ccw_device *, struct ccw_dev_id *);
|
||||
#define to_ccwdev(n) container_of(n, struct ccw_device, dev)
|
||||
#define to_ccwdrv(n) container_of(n, struct ccw_driver, driver)
|
||||
|
||||
extern struct ccw_device *ccw_device_probe_console(void);
|
||||
extern struct ccw_device *ccw_device_probe_console(struct ccw_driver *);
|
||||
extern void ccw_device_wait_idle(struct ccw_device *);
|
||||
extern int ccw_device_force_console(struct ccw_device *);
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ static int print_trace_stack(void *data, char *name)
|
||||
*/
|
||||
static void print_trace_address(void *data, unsigned long addr, int reliable)
|
||||
{
|
||||
printk(data);
|
||||
printk("%s", (char *)data);
|
||||
printk_address(addr, reliable);
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ config SPARC
|
||||
select RTC_DRV_M48T59
|
||||
select HAVE_DMA_ATTRS
|
||||
select HAVE_DMA_API_DEBUG
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_ARCH_JUMP_LABEL if SPARC64
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
|
||||
@@ -262,8 +262,8 @@ extern unsigned long __must_check __clear_user(void __user *, unsigned long);
|
||||
extern __must_check long strlen_user(const char __user *str);
|
||||
extern __must_check long strnlen_user(const char __user *str, long n);
|
||||
|
||||
#define __copy_to_user_inatomic ___copy_to_user
|
||||
#define __copy_from_user_inatomic ___copy_from_user
|
||||
#define __copy_to_user_inatomic __copy_to_user
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
|
||||
struct pt_regs;
|
||||
extern unsigned long compute_effective_address(struct pt_regs *,
|
||||
|
||||
@@ -399,8 +399,8 @@ static void apb_fake_ranges(struct pci_dev *dev,
|
||||
apb_calc_first_last(map, &first, &last);
|
||||
res = bus->resource[1];
|
||||
res->flags = IORESOURCE_MEM;
|
||||
region.start = (first << 21);
|
||||
region.end = (last << 21) + ((1 << 21) - 1);
|
||||
region.start = (first << 29);
|
||||
region.end = (last << 29) + ((1 << 29) - 1);
|
||||
pcibios_bus_to_resource(dev, res, ®ion);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,9 +57,12 @@ void arch_cpu_idle(void)
|
||||
{
|
||||
if (tlb_type != hypervisor) {
|
||||
touch_nmi_watchdog();
|
||||
local_irq_enable();
|
||||
} else {
|
||||
unsigned long pstate;
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
/* The sun4v sleeping code requires that we have PSTATE.IE cleared over
|
||||
* the cpu sleep hypervisor call.
|
||||
*/
|
||||
@@ -81,7 +84,6 @@ void arch_cpu_idle(void)
|
||||
: "=&r" (pstate)
|
||||
: "i" (PSTATE_IE));
|
||||
}
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
||||
@@ -189,7 +189,8 @@ linux_sparc_syscall32:
|
||||
mov %i0, %l5 ! IEU1
|
||||
5: call %l7 ! CTI Group brk forced
|
||||
srl %i5, 0, %o5 ! IEU1
|
||||
ba,a,pt %xcc, 3f
|
||||
ba,pt %xcc, 3f
|
||||
sra %o0, 0, %o0
|
||||
|
||||
/* Linux native system calls enter here... */
|
||||
.align 32
|
||||
@@ -217,7 +218,6 @@ linux_sparc_syscall:
|
||||
3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
||||
ret_sys_call:
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
|
||||
sra %o0, 0, %o0
|
||||
mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
|
||||
sllx %g2, 32, %g2
|
||||
|
||||
|
||||
@@ -865,6 +865,9 @@ fail:
|
||||
* Because the x86 boot code expects to be passed a boot_params we
|
||||
* need to create one ourselves (usually the bootloader would create
|
||||
* one for us).
|
||||
*
|
||||
* The caller is responsible for filling out ->code32_start in the
|
||||
* returned boot_params.
|
||||
*/
|
||||
struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table)
|
||||
{
|
||||
@@ -921,8 +924,6 @@ struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table)
|
||||
hdr->vid_mode = 0xffff;
|
||||
hdr->boot_flag = 0xAA55;
|
||||
|
||||
hdr->code32_start = (__u64)(unsigned long)image->image_base;
|
||||
|
||||
hdr->type_of_loader = 0x21;
|
||||
|
||||
/* Convert unicode cmdline to ascii */
|
||||
|
||||
@@ -50,6 +50,13 @@ ENTRY(efi_pe_entry)
|
||||
pushl %eax
|
||||
pushl %esi
|
||||
pushl %ecx
|
||||
|
||||
call reloc
|
||||
reloc:
|
||||
popl %ecx
|
||||
subl reloc, %ecx
|
||||
movl %ecx, BP_code32_start(%eax)
|
||||
|
||||
sub $0x4, %esp
|
||||
|
||||
ENTRY(efi_stub_entry)
|
||||
@@ -63,12 +70,7 @@ ENTRY(efi_stub_entry)
|
||||
hlt
|
||||
jmp 1b
|
||||
2:
|
||||
call 3f
|
||||
3:
|
||||
popl %eax
|
||||
subl $3b, %eax
|
||||
subl BP_pref_address(%esi), %eax
|
||||
add BP_code32_start(%esi), %eax
|
||||
movl BP_code32_start(%esi), %eax
|
||||
leal preferred_addr(%eax), %eax
|
||||
jmp *%eax
|
||||
|
||||
|
||||
@@ -217,6 +217,8 @@ ENTRY(efi_pe_entry)
|
||||
cmpq $0,%rax
|
||||
je 1f
|
||||
mov %rax, %rdx
|
||||
leaq startup_32(%rip), %rax
|
||||
movl %eax, BP_code32_start(%rdx)
|
||||
popq %rsi
|
||||
popq %rdi
|
||||
|
||||
@@ -230,12 +232,7 @@ ENTRY(efi_stub_entry)
|
||||
hlt
|
||||
jmp 1b
|
||||
2:
|
||||
call 3f
|
||||
3:
|
||||
popq %rax
|
||||
subq $3b, %rax
|
||||
subq BP_pref_address(%rsi), %rax
|
||||
add BP_code32_start(%esi), %eax
|
||||
movl BP_code32_start(%esi), %eax
|
||||
leaq preferred_addr(%rax), %rax
|
||||
jmp *%rax
|
||||
|
||||
|
||||
@@ -202,18 +202,15 @@ static void __init intel_remapping_check(int num, int slot, int func)
|
||||
revision = read_pci_config_byte(num, slot, func, PCI_REVISION_ID);
|
||||
|
||||
/*
|
||||
* Revision 13 of all triggering devices id in this quirk have
|
||||
* a problem draining interrupts when irq remapping is enabled,
|
||||
* and should be flagged as broken. Additionally revisions 0x12
|
||||
* and 0x22 of device id 0x3405 has this problem.
|
||||
* Revision <= 13 of all triggering devices id in this quirk
|
||||
* have a problem draining interrupts when irq remapping is
|
||||
* enabled, and should be flagged as broken. Additionally
|
||||
* revision 0x22 of device id 0x3405 has this problem.
|
||||
*/
|
||||
if (revision == 0x13)
|
||||
if (revision <= 0x13)
|
||||
set_irq_remapping_broken();
|
||||
else if ((device == 0x3405) &&
|
||||
((revision == 0x12) ||
|
||||
(revision == 0x22)))
|
||||
else if (device == 0x3405 && revision == 0x22)
|
||||
set_irq_remapping_broken();
|
||||
|
||||
}
|
||||
|
||||
#define QFLAG_APPLY_ONCE 0x1
|
||||
|
||||
@@ -659,8 +659,8 @@ ftrace_modify_code(unsigned long ip, unsigned const char *old_code,
|
||||
ret = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
run_sync();
|
||||
out:
|
||||
run_sync();
|
||||
return ret;
|
||||
|
||||
fail_update:
|
||||
|
||||
@@ -229,6 +229,17 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* On x86-64 we do not support 16-bit segments due to
|
||||
* IRET leaking the high bits of the kernel stack address.
|
||||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
if (!ldt_info.seg_32bit) {
|
||||
error = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
#endif
|
||||
|
||||
fill_ldt(&ldt, &ldt_info);
|
||||
if (oldmode)
|
||||
ldt.avl = 0;
|
||||
|
||||
@@ -4040,6 +4040,7 @@ skip_create_disk:
|
||||
blk_queue_max_hw_sectors(dd->queue, 0xffff);
|
||||
blk_queue_max_segment_size(dd->queue, 0x400000);
|
||||
blk_queue_io_min(dd->queue, 4096);
|
||||
blk_queue_bounce_limit(dd->queue, dd->pdev->dma_mask);
|
||||
|
||||
/*
|
||||
* write back cache is not supported in the device. FUA depends on
|
||||
|
||||
@@ -352,7 +352,7 @@ static inline void write_all_bytes(struct si_sm_data *bt)
|
||||
|
||||
static inline int read_all_bytes(struct si_sm_data *bt)
|
||||
{
|
||||
unsigned char i;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* length is "framing info", minimum = 4: NetFn, Seq, Cmd, cCode.
|
||||
|
||||
@@ -119,7 +119,8 @@ static ssize_t iio_scan_el_show(struct device *dev,
|
||||
int ret;
|
||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
||||
|
||||
ret = test_bit(to_iio_dev_attr(attr)->address,
|
||||
/* Ensure ret is 0 or 1. */
|
||||
ret = !!test_bit(to_iio_dev_attr(attr)->address,
|
||||
indio_dev->buffer->scan_mask);
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
@@ -762,7 +763,8 @@ int iio_scan_mask_query(struct iio_dev *indio_dev,
|
||||
if (!buffer->scan_mask)
|
||||
return 0;
|
||||
|
||||
return test_bit(bit, buffer->scan_mask);
|
||||
/* Ensure return value is 0 or 1. */
|
||||
return !!test_bit(bit, buffer->scan_mask);
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(iio_scan_mask_query);
|
||||
|
||||
|
||||
@@ -283,6 +283,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector,
|
||||
(my_cq->galpas.user.fw_handle & (PAGE_SIZE - 1));
|
||||
if (ib_copy_to_udata(udata, &resp, sizeof(resp))) {
|
||||
ehca_err(device, "Copy to udata failed.");
|
||||
cq = ERR_PTR(-EFAULT);
|
||||
goto create_cq_exit4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,7 +326,7 @@ static ssize_t ipath_diagpkt_write(struct file *fp,
|
||||
size_t count, loff_t *off)
|
||||
{
|
||||
u32 __iomem *piobuf;
|
||||
u32 plen, clen, pbufn;
|
||||
u32 plen, pbufn, maxlen_reserve;
|
||||
struct ipath_diag_pkt odp;
|
||||
struct ipath_diag_xpkt dp;
|
||||
u32 *tmpbuf = NULL;
|
||||
@@ -335,51 +335,29 @@ static ssize_t ipath_diagpkt_write(struct file *fp,
|
||||
u64 val;
|
||||
u32 l_state, lt_state; /* LinkState, LinkTrainingState */
|
||||
|
||||
if (count < sizeof(odp)) {
|
||||
ret = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
if (count == sizeof(dp)) {
|
||||
if (copy_from_user(&dp, data, sizeof(dp))) {
|
||||
ret = -EFAULT;
|
||||
goto bail;
|
||||
}
|
||||
} else if (copy_from_user(&odp, data, sizeof(odp))) {
|
||||
ret = -EFAULT;
|
||||
} else if (count == sizeof(odp)) {
|
||||
if (copy_from_user(&odp, data, sizeof(odp))) {
|
||||
ret = -EFAULT;
|
||||
goto bail;
|
||||
}
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Due to padding/alignment issues (lessened with new struct)
|
||||
* the old and new structs are the same length. We need to
|
||||
* disambiguate them, which we can do because odp.len has never
|
||||
* been less than the total of LRH+BTH+DETH so far, while
|
||||
* dp.unit (same offset) unit is unlikely to get that high.
|
||||
* Similarly, dp.data, the pointer to user at the same offset
|
||||
* as odp.unit, is almost certainly at least one (512byte)page
|
||||
* "above" NULL. The if-block below can be omitted if compatibility
|
||||
* between a new driver and older diagnostic code is unimportant.
|
||||
* compatibility the other direction (new diags, old driver) is
|
||||
* handled in the diagnostic code, with a warning.
|
||||
*/
|
||||
if (dp.unit >= 20 && dp.data < 512) {
|
||||
/* very probable version mismatch. Fix it up */
|
||||
memcpy(&odp, &dp, sizeof(odp));
|
||||
/* We got a legacy dp, copy elements to dp */
|
||||
dp.unit = odp.unit;
|
||||
dp.data = odp.data;
|
||||
dp.len = odp.len;
|
||||
dp.pbc_wd = 0; /* Indicate we need to compute PBC wd */
|
||||
}
|
||||
|
||||
/* send count must be an exact number of dwords */
|
||||
if (dp.len & 3) {
|
||||
ret = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
clen = dp.len >> 2;
|
||||
plen = dp.len >> 2;
|
||||
|
||||
dd = ipath_lookup(dp.unit);
|
||||
if (!dd || !(dd->ipath_flags & IPATH_PRESENT) ||
|
||||
@@ -422,16 +400,22 @@ static ssize_t ipath_diagpkt_write(struct file *fp,
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* need total length before first word written */
|
||||
/* +1 word is for the qword padding */
|
||||
/*
|
||||
* need total length before first word written, plus 2 Dwords. One Dword
|
||||
* is for padding so we get the full user data when not aligned on
|
||||
* a word boundary. The other Dword is to make sure we have room for the
|
||||
* ICRC which gets tacked on later.
|
||||
*/
|
||||
maxlen_reserve = 2 * sizeof(u32);
|
||||
if (dp.len > dd->ipath_ibmaxlen - maxlen_reserve) {
|
||||
ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n",
|
||||
dp.len, dd->ipath_ibmaxlen);
|
||||
ret = -EINVAL;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
plen = sizeof(u32) + dp.len;
|
||||
|
||||
if ((plen + 4) > dd->ipath_ibmaxlen) {
|
||||
ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n",
|
||||
plen - 4, dd->ipath_ibmaxlen);
|
||||
ret = -EINVAL;
|
||||
goto bail; /* before writing pbc */
|
||||
}
|
||||
tmpbuf = vmalloc(plen);
|
||||
if (!tmpbuf) {
|
||||
dev_info(&dd->pcidev->dev, "Unable to allocate tmp buffer, "
|
||||
@@ -473,11 +457,11 @@ static ssize_t ipath_diagpkt_write(struct file *fp,
|
||||
*/
|
||||
if (dd->ipath_flags & IPATH_PIO_FLUSH_WC) {
|
||||
ipath_flush_wc();
|
||||
__iowrite32_copy(piobuf + 2, tmpbuf, clen - 1);
|
||||
__iowrite32_copy(piobuf + 2, tmpbuf, plen - 1);
|
||||
ipath_flush_wc();
|
||||
__raw_writel(tmpbuf[clen - 1], piobuf + clen + 1);
|
||||
__raw_writel(tmpbuf[plen - 1], piobuf + plen + 1);
|
||||
} else
|
||||
__iowrite32_copy(piobuf + 2, tmpbuf, clen);
|
||||
__iowrite32_copy(piobuf + 2, tmpbuf, plen);
|
||||
|
||||
ipath_flush_wc();
|
||||
|
||||
|
||||
@@ -695,6 +695,7 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries,
|
||||
|
||||
if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) {
|
||||
mthca_free_cq(to_mdev(ibdev), cq);
|
||||
err = -EFAULT;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
|
||||
@@ -1186,7 +1186,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
|
||||
nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
|
||||
kfree(nesqp->allocated_buffer);
|
||||
nes_debug(NES_DBG_QP, "ib_copy_from_udata() Failed \n");
|
||||
return NULL;
|
||||
return ERR_PTR(-EFAULT);
|
||||
}
|
||||
if (req.user_wqe_buffers) {
|
||||
virt_wqs = 1;
|
||||
|
||||
@@ -1078,6 +1078,7 @@ static void srpt_unmap_sg_to_ib_sge(struct srpt_rdma_ch *ch,
|
||||
static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,
|
||||
struct srpt_send_ioctx *ioctx)
|
||||
{
|
||||
struct ib_device *dev = ch->sport->sdev->device;
|
||||
struct se_cmd *cmd;
|
||||
struct scatterlist *sg, *sg_orig;
|
||||
int sg_cnt;
|
||||
@@ -1124,7 +1125,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,
|
||||
|
||||
db = ioctx->rbufs;
|
||||
tsize = cmd->data_length;
|
||||
dma_len = sg_dma_len(&sg[0]);
|
||||
dma_len = ib_sg_dma_len(dev, &sg[0]);
|
||||
riu = ioctx->rdma_ius;
|
||||
|
||||
/*
|
||||
@@ -1155,7 +1156,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,
|
||||
++j;
|
||||
if (j < count) {
|
||||
sg = sg_next(sg);
|
||||
dma_len = sg_dma_len(sg);
|
||||
dma_len = ib_sg_dma_len(
|
||||
dev, sg);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -1192,8 +1194,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,
|
||||
tsize = cmd->data_length;
|
||||
riu = ioctx->rdma_ius;
|
||||
sg = sg_orig;
|
||||
dma_len = sg_dma_len(&sg[0]);
|
||||
dma_addr = sg_dma_address(&sg[0]);
|
||||
dma_len = ib_sg_dma_len(dev, &sg[0]);
|
||||
dma_addr = ib_sg_dma_address(dev, &sg[0]);
|
||||
|
||||
/* this second loop is really mapped sg_addres to rdma_iu->ib_sge */
|
||||
for (i = 0, j = 0;
|
||||
@@ -1216,8 +1218,10 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch,
|
||||
++j;
|
||||
if (j < count) {
|
||||
sg = sg_next(sg);
|
||||
dma_len = sg_dma_len(sg);
|
||||
dma_addr = sg_dma_address(sg);
|
||||
dma_len = ib_sg_dma_len(
|
||||
dev, sg);
|
||||
dma_addr = ib_sg_dma_address(
|
||||
dev, sg);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -712,6 +712,22 @@ static int m88rs2000_get_frontend(struct dvb_frontend *fe)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_get_tune_settings(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_tune_settings *tune)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
|
||||
if (c->symbol_rate > 3000000)
|
||||
tune->min_delay_ms = 2000;
|
||||
else
|
||||
tune->min_delay_ms = 3000;
|
||||
|
||||
tune->step_size = c->symbol_rate / 16000;
|
||||
tune->max_drift = c->symbol_rate / 2000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88rs2000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||
{
|
||||
struct m88rs2000_state *state = fe->demodulator_priv;
|
||||
@@ -743,7 +759,7 @@ static struct dvb_frontend_ops m88rs2000_ops = {
|
||||
.symbol_rate_tolerance = 500, /* ppm */
|
||||
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
|
||||
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
|
||||
FE_CAN_QPSK |
|
||||
FE_CAN_QPSK | FE_CAN_INVERSION_AUTO |
|
||||
FE_CAN_FEC_AUTO
|
||||
},
|
||||
|
||||
@@ -763,6 +779,7 @@ static struct dvb_frontend_ops m88rs2000_ops = {
|
||||
|
||||
.set_frontend = m88rs2000_set_frontend,
|
||||
.get_frontend = m88rs2000_get_frontend,
|
||||
.get_tune_settings = m88rs2000_get_tune_settings,
|
||||
};
|
||||
|
||||
struct dvb_frontend *m88rs2000_attach(const struct m88rs2000_config *config,
|
||||
|
||||
@@ -8045,8 +8045,8 @@ int saa7134_board_init2(struct saa7134_dev *dev)
|
||||
break;
|
||||
} /* switch() */
|
||||
|
||||
/* initialize tuner */
|
||||
if (TUNER_ABSENT != dev->tuner_type) {
|
||||
/* initialize tuner (don't do this when resuming) */
|
||||
if (!dev->insuspend && TUNER_ABSENT != dev->tuner_type) {
|
||||
int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
|
||||
|
||||
/* Note: radio tuner address is always filled in,
|
||||
|
||||
@@ -1079,6 +1079,7 @@ static void preview_config_input_format(struct isp_prev_device *prev,
|
||||
*/
|
||||
static void preview_config_input_size(struct isp_prev_device *prev, u32 active)
|
||||
{
|
||||
const struct v4l2_mbus_framefmt *format = &prev->formats[PREV_PAD_SINK];
|
||||
struct isp_device *isp = to_isp_device(prev);
|
||||
unsigned int sph = prev->crop.left;
|
||||
unsigned int eph = prev->crop.left + prev->crop.width - 1;
|
||||
@@ -1086,6 +1087,14 @@ static void preview_config_input_size(struct isp_prev_device *prev, u32 active)
|
||||
unsigned int elv = prev->crop.top + prev->crop.height - 1;
|
||||
u32 features;
|
||||
|
||||
if (format->code != V4L2_MBUS_FMT_Y8_1X8 &&
|
||||
format->code != V4L2_MBUS_FMT_Y10_1X10) {
|
||||
sph -= 2;
|
||||
eph += 2;
|
||||
slv -= 2;
|
||||
elv += 2;
|
||||
}
|
||||
|
||||
features = (prev->params.params[0].features & active)
|
||||
| (prev->params.params[1].features & ~active);
|
||||
|
||||
|
||||
@@ -673,7 +673,8 @@ static void pctv_520e_init(struct em28xx *dev)
|
||||
static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct em28xx *dev = fe->dvb->priv;
|
||||
struct em28xx_i2c_bus *i2c_bus = fe->dvb->priv;
|
||||
struct em28xx *dev = i2c_bus->dev;
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
struct em28xx_dvb *dvb = dev->dvb;
|
||||
int ret;
|
||||
|
||||
@@ -2394,6 +2394,7 @@ static const struct usb_device_id device_table[] = {
|
||||
{USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)},
|
||||
{USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)},
|
||||
{USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)},
|
||||
{USB_DEVICE(0x0458, 0x7045), SN9C20X(MT9M112, 0x5d, LED_REVERSE)},
|
||||
{USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)},
|
||||
{USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)},
|
||||
{USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)},
|
||||
|
||||
@@ -1846,7 +1846,25 @@ int uvc_video_enable(struct uvc_streaming *stream, int enable)
|
||||
|
||||
if (!enable) {
|
||||
uvc_uninit_video(stream, 1);
|
||||
usb_set_interface(stream->dev->udev, stream->intfnum, 0);
|
||||
if (stream->intf->num_altsetting > 1) {
|
||||
usb_set_interface(stream->dev->udev,
|
||||
stream->intfnum, 0);
|
||||
} else {
|
||||
/* UVC doesn't specify how to inform a bulk-based device
|
||||
* when the video stream is stopped. Windows sends a
|
||||
* CLEAR_FEATURE(HALT) request to the video streaming
|
||||
* bulk endpoint, mimic the same behaviour.
|
||||
*/
|
||||
unsigned int epnum = stream->header.bEndpointAddress
|
||||
& USB_ENDPOINT_NUMBER_MASK;
|
||||
unsigned int dir = stream->header.bEndpointAddress
|
||||
& USB_ENDPOINT_DIR_MASK;
|
||||
unsigned int pipe;
|
||||
|
||||
pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir;
|
||||
usb_clear_halt(stream->dev->udev, pipe);
|
||||
}
|
||||
|
||||
uvc_queue_enable(&stream->queue, 0);
|
||||
uvc_video_clock_cleanup(stream);
|
||||
return 0;
|
||||
|
||||
@@ -787,8 +787,8 @@ static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde
|
||||
#define VIDIOC_DQBUF32 _IOWR('V', 17, struct v4l2_buffer32)
|
||||
#define VIDIOC_ENUMSTD32 _IOWR('V', 25, struct v4l2_standard32)
|
||||
#define VIDIOC_ENUMINPUT32 _IOWR('V', 26, struct v4l2_input32)
|
||||
#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 63, struct v4l2_subdev_edid32)
|
||||
#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 64, struct v4l2_subdev_edid32)
|
||||
#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 40, struct v4l2_subdev_edid32)
|
||||
#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 41, struct v4l2_subdev_edid32)
|
||||
#define VIDIOC_TRY_FMT32 _IOWR('V', 64, struct v4l2_format32)
|
||||
#define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32)
|
||||
#define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32)
|
||||
|
||||
@@ -1179,12 +1179,18 @@ static int pm860x_probe(struct i2c_client *client,
|
||||
chip->companion_addr = pdata->companion_addr;
|
||||
chip->companion = i2c_new_dummy(chip->client->adapter,
|
||||
chip->companion_addr);
|
||||
if (!chip->companion) {
|
||||
dev_err(&client->dev,
|
||||
"Failed to allocate I2C companion device\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
chip->regmap_companion = regmap_init_i2c(chip->companion,
|
||||
&pm860x_regmap_config);
|
||||
if (IS_ERR(chip->regmap_companion)) {
|
||||
ret = PTR_ERR(chip->regmap_companion);
|
||||
dev_err(&chip->companion->dev,
|
||||
"Failed to allocate register map: %d\n", ret);
|
||||
i2c_unregister_device(chip->companion);
|
||||
return ret;
|
||||
}
|
||||
i2c_set_clientdata(chip->companion, chip);
|
||||
|
||||
@@ -121,6 +121,10 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
|
||||
dev_info(max77686->dev, "device found\n");
|
||||
|
||||
max77686->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC);
|
||||
if (!max77686->rtc) {
|
||||
dev_err(max77686->dev, "Failed to allocate I2C device for RTC\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(max77686->rtc, max77686);
|
||||
|
||||
max77686_irq_init(max77686);
|
||||
|
||||
@@ -149,9 +149,18 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
|
||||
dev_info(max77693->dev, "device ID: 0x%x\n", reg_data);
|
||||
|
||||
max77693->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC);
|
||||
if (!max77693->muic) {
|
||||
dev_err(max77693->dev, "Failed to allocate I2C device for MUIC\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(max77693->muic, max77693);
|
||||
|
||||
max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC);
|
||||
if (!max77693->haptic) {
|
||||
dev_err(max77693->dev, "Failed to allocate I2C device for Haptic\n");
|
||||
ret = -ENODEV;
|
||||
goto err_i2c_haptic;
|
||||
}
|
||||
i2c_set_clientdata(max77693->haptic, max77693);
|
||||
|
||||
/*
|
||||
@@ -187,8 +196,9 @@ err_mfd:
|
||||
max77693_irq_exit(max77693);
|
||||
err_irq:
|
||||
err_regmap_muic:
|
||||
i2c_unregister_device(max77693->muic);
|
||||
i2c_unregister_device(max77693->haptic);
|
||||
err_i2c_haptic:
|
||||
i2c_unregister_device(max77693->muic);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -180,9 +180,18 @@ static int max8925_probe(struct i2c_client *client,
|
||||
mutex_init(&chip->io_lock);
|
||||
|
||||
chip->rtc = i2c_new_dummy(chip->i2c->adapter, RTC_I2C_ADDR);
|
||||
if (!chip->rtc) {
|
||||
dev_err(chip->dev, "Failed to allocate I2C device for RTC\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(chip->rtc, chip);
|
||||
|
||||
chip->adc = i2c_new_dummy(chip->i2c->adapter, ADC_I2C_ADDR);
|
||||
if (!chip->adc) {
|
||||
dev_err(chip->dev, "Failed to allocate I2C device for ADC\n");
|
||||
i2c_unregister_device(chip->rtc);
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(chip->adc, chip);
|
||||
|
||||
device_init_wakeup(&client->dev, 1);
|
||||
|
||||
@@ -218,10 +218,26 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
|
||||
mutex_init(&max8997->iolock);
|
||||
|
||||
max8997->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC);
|
||||
if (!max8997->rtc) {
|
||||
dev_err(max8997->dev, "Failed to allocate I2C device for RTC\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(max8997->rtc, max8997);
|
||||
|
||||
max8997->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC);
|
||||
if (!max8997->haptic) {
|
||||
dev_err(max8997->dev, "Failed to allocate I2C device for Haptic\n");
|
||||
ret = -ENODEV;
|
||||
goto err_i2c_haptic;
|
||||
}
|
||||
i2c_set_clientdata(max8997->haptic, max8997);
|
||||
|
||||
max8997->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC);
|
||||
if (!max8997->muic) {
|
||||
dev_err(max8997->dev, "Failed to allocate I2C device for MUIC\n");
|
||||
ret = -ENODEV;
|
||||
goto err_i2c_muic;
|
||||
}
|
||||
i2c_set_clientdata(max8997->muic, max8997);
|
||||
|
||||
pm_runtime_set_active(max8997->dev);
|
||||
@@ -248,7 +264,9 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
|
||||
err_mfd:
|
||||
mfd_remove_devices(max8997->dev);
|
||||
i2c_unregister_device(max8997->muic);
|
||||
err_i2c_muic:
|
||||
i2c_unregister_device(max8997->haptic);
|
||||
err_i2c_haptic:
|
||||
i2c_unregister_device(max8997->rtc);
|
||||
err:
|
||||
kfree(max8997);
|
||||
|
||||
@@ -152,6 +152,10 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
|
||||
mutex_init(&max8998->iolock);
|
||||
|
||||
max8998->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR);
|
||||
if (!max8998->rtc) {
|
||||
dev_err(&i2c->dev, "Failed to allocate I2C device for RTC\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(max8998->rtc, max8998);
|
||||
|
||||
max8998_irq_init(max8998);
|
||||
|
||||
@@ -199,6 +199,10 @@ static int sec_pmic_probe(struct i2c_client *i2c,
|
||||
}
|
||||
|
||||
sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR);
|
||||
if (!sec_pmic->rtc) {
|
||||
dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c_set_clientdata(sec_pmic->rtc, sec_pmic);
|
||||
|
||||
if (pdata && pdata->cfg_pmic_irq)
|
||||
|
||||
@@ -254,8 +254,10 @@ static int tps65910_irq_init(struct tps65910 *tps65910, int irq,
|
||||
ret = regmap_add_irq_chip(tps65910->regmap, tps65910->chip_irq,
|
||||
IRQF_ONESHOT, pdata->irq_base,
|
||||
tps6591x_irqs_chip, &tps65910->irq_data);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
dev_warn(tps65910->dev, "Failed to add irq_chip %d\n", ret);
|
||||
tps65910->chip_irq = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -115,6 +115,11 @@
|
||||
#define MEI_DEV_ID_LPT_HR 0x8CBA /* Lynx Point H Refresh */
|
||||
|
||||
#define MEI_DEV_ID_WPT_LP 0x9CBA /* Wildcat Point LP */
|
||||
|
||||
/* Host Firmware Status Registers in PCI Config Space */
|
||||
#define PCI_CFG_HFS_1 0x40
|
||||
#define PCI_CFG_HFS_2 0x48
|
||||
|
||||
/*
|
||||
* MEI HW Section
|
||||
*/
|
||||
|
||||
@@ -105,15 +105,31 @@ static bool mei_me_quirk_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
u32 reg;
|
||||
if (ent->device == MEI_DEV_ID_PBG_1) {
|
||||
pci_read_config_dword(pdev, 0x48, ®);
|
||||
/* make sure that bit 9 is up and bit 10 is down */
|
||||
if ((reg & 0x600) == 0x200) {
|
||||
dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n");
|
||||
return false;
|
||||
}
|
||||
/* Cougar Point || Patsburg */
|
||||
if (ent->device == MEI_DEV_ID_CPT_1 ||
|
||||
ent->device == MEI_DEV_ID_PBG_1) {
|
||||
pci_read_config_dword(pdev, PCI_CFG_HFS_2, ®);
|
||||
/* make sure that bit 9 (NM) is up and bit 10 (DM) is down */
|
||||
if ((reg & 0x600) == 0x200)
|
||||
goto no_mei;
|
||||
}
|
||||
|
||||
/* Lynx Point */
|
||||
if (ent->device == MEI_DEV_ID_LPT_H ||
|
||||
ent->device == MEI_DEV_ID_LPT_W ||
|
||||
ent->device == MEI_DEV_ID_LPT_HR) {
|
||||
/* Read ME FW Status check for SPS Firmware */
|
||||
pci_read_config_dword(pdev, PCI_CFG_HFS_1, ®);
|
||||
/* if bits [19:16] = 15, running SPS Firmware */
|
||||
if ((reg & 0xf0000) == 0xf0000)
|
||||
goto no_mei;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
no_mei:
|
||||
dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n");
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* mei_probe - Device Initialization Routine
|
||||
|
||||
@@ -922,7 +922,7 @@ static int __init con3215_init(void)
|
||||
raw3215_freelist = req;
|
||||
}
|
||||
|
||||
cdev = ccw_device_probe_console();
|
||||
cdev = ccw_device_probe_console(&raw3215_ccw_driver);
|
||||
if (IS_ERR(cdev))
|
||||
return -ENODEV;
|
||||
|
||||
|
||||
@@ -576,7 +576,6 @@ static struct console con3270 = {
|
||||
static int __init
|
||||
con3270_init(void)
|
||||
{
|
||||
struct ccw_device *cdev;
|
||||
struct raw3270 *rp;
|
||||
void *cbuf;
|
||||
int i;
|
||||
@@ -591,10 +590,7 @@ con3270_init(void)
|
||||
cpcmd("TERM AUTOCR OFF", NULL, 0, NULL);
|
||||
}
|
||||
|
||||
cdev = ccw_device_probe_console();
|
||||
if (IS_ERR(cdev))
|
||||
return -ENODEV;
|
||||
rp = raw3270_setup_console(cdev);
|
||||
rp = raw3270_setup_console();
|
||||
if (IS_ERR(rp))
|
||||
return PTR_ERR(rp);
|
||||
|
||||
|
||||
@@ -776,16 +776,24 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TN3270_CONSOLE
|
||||
/* Tentative definition - see below for actual definition. */
|
||||
static struct ccw_driver raw3270_ccw_driver;
|
||||
|
||||
/*
|
||||
* Setup 3270 device configured as console.
|
||||
*/
|
||||
struct raw3270 __init *raw3270_setup_console(struct ccw_device *cdev)
|
||||
struct raw3270 __init *raw3270_setup_console(void)
|
||||
{
|
||||
struct ccw_device *cdev;
|
||||
unsigned long flags;
|
||||
struct raw3270 *rp;
|
||||
char *ascebc;
|
||||
int rc;
|
||||
|
||||
cdev = ccw_device_probe_console(&raw3270_ccw_driver);
|
||||
if (IS_ERR(cdev))
|
||||
return ERR_CAST(cdev);
|
||||
|
||||
rp = kzalloc(sizeof(struct raw3270), GFP_KERNEL | GFP_DMA);
|
||||
ascebc = kzalloc(256, GFP_KERNEL);
|
||||
rc = raw3270_setup_device(cdev, rp, ascebc);
|
||||
|
||||
@@ -190,7 +190,7 @@ raw3270_put_view(struct raw3270_view *view)
|
||||
wake_up(&raw3270_wait_queue);
|
||||
}
|
||||
|
||||
struct raw3270 *raw3270_setup_console(struct ccw_device *cdev);
|
||||
struct raw3270 *raw3270_setup_console(void);
|
||||
void raw3270_wait_cons_dev(struct raw3270 *);
|
||||
|
||||
/* Notifier for device addition/removal */
|
||||
|
||||
@@ -1610,7 +1610,7 @@ out_unlock:
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct ccw_device *ccw_device_probe_console(void)
|
||||
struct ccw_device *ccw_device_probe_console(struct ccw_driver *drv)
|
||||
{
|
||||
struct io_subchannel_private *io_priv;
|
||||
struct ccw_device *cdev;
|
||||
@@ -1632,6 +1632,7 @@ struct ccw_device *ccw_device_probe_console(void)
|
||||
kfree(io_priv);
|
||||
return cdev;
|
||||
}
|
||||
cdev->drv = drv;
|
||||
set_io_private(sch, io_priv);
|
||||
ret = ccw_device_console_enable(cdev, sch);
|
||||
if (ret) {
|
||||
|
||||
@@ -2501,16 +2501,15 @@ static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb,
|
||||
static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
|
||||
{
|
||||
uint32_t cdb_phyaddr, cdb_phyaddr_hi32;
|
||||
dma_addr_t dma_coherent_handle;
|
||||
|
||||
/*
|
||||
********************************************************************
|
||||
** here we need to tell iop 331 our freeccb.HighPart
|
||||
** if freeccb.HighPart is not zero
|
||||
********************************************************************
|
||||
*/
|
||||
dma_coherent_handle = acb->dma_coherent_handle;
|
||||
cdb_phyaddr = (uint32_t)(dma_coherent_handle);
|
||||
cdb_phyaddr_hi32 = (uint32_t)((cdb_phyaddr >> 16) >> 16);
|
||||
cdb_phyaddr = lower_32_bits(acb->dma_coherent_handle);
|
||||
cdb_phyaddr_hi32 = upper_32_bits(acb->dma_coherent_handle);
|
||||
acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32;
|
||||
/*
|
||||
***********************************************************************
|
||||
|
||||
@@ -2553,7 +2553,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ha->flags.enable_64bit_addressing ? "enable" :
|
||||
"disable");
|
||||
ret = qla2x00_mem_alloc(ha, req_length, rsp_length, &req, &rsp);
|
||||
if (!ret) {
|
||||
if (ret) {
|
||||
ql_log_pci(ql_log_fatal, pdev, 0x0031,
|
||||
"Failed to allocate memory for adapter, aborting.\n");
|
||||
|
||||
@@ -3458,10 +3458,10 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
||||
else {
|
||||
qla2x00_set_reserved_loop_ids(ha);
|
||||
ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0123,
|
||||
"loop_id_map=%p. \n", ha->loop_id_map);
|
||||
"loop_id_map=%p.\n", ha->loop_id_map);
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
fail_async_pd:
|
||||
dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma);
|
||||
|
||||
@@ -59,6 +59,7 @@ Configuration Options: not applicable, uses PCI auto config
|
||||
#include "../comedidev.h"
|
||||
|
||||
#include "8255.h"
|
||||
#include "mite.h"
|
||||
|
||||
enum pci_8255_boardid {
|
||||
BOARD_ADLINK_PCI7224,
|
||||
@@ -82,6 +83,7 @@ struct pci_8255_boardinfo {
|
||||
const char *name;
|
||||
int dio_badr;
|
||||
int n_8255;
|
||||
unsigned int has_mite:1;
|
||||
};
|
||||
|
||||
static const struct pci_8255_boardinfo pci_8255_boards[] = {
|
||||
@@ -129,36 +131,43 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = {
|
||||
.name = "ni_pci-dio-96",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 4,
|
||||
.has_mite = 1,
|
||||
},
|
||||
[BOARD_NI_PCIDIO96B] = {
|
||||
.name = "ni_pci-dio-96b",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 4,
|
||||
.has_mite = 1,
|
||||
},
|
||||
[BOARD_NI_PXI6508] = {
|
||||
.name = "ni_pxi-6508",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 4,
|
||||
.has_mite = 1,
|
||||
},
|
||||
[BOARD_NI_PCI6503] = {
|
||||
.name = "ni_pci-6503",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 1,
|
||||
.has_mite = 1,
|
||||
},
|
||||
[BOARD_NI_PCI6503B] = {
|
||||
.name = "ni_pci-6503b",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 1,
|
||||
.has_mite = 1,
|
||||
},
|
||||
[BOARD_NI_PCI6503X] = {
|
||||
.name = "ni_pci-6503x",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 1,
|
||||
.has_mite = 1,
|
||||
},
|
||||
[BOARD_NI_PXI_6503] = {
|
||||
.name = "ni_pxi-6503",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 1,
|
||||
.has_mite = 1,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -166,6 +175,25 @@ struct pci_8255_private {
|
||||
void __iomem *mmio_base;
|
||||
};
|
||||
|
||||
static int pci_8255_mite_init(struct pci_dev *pcidev)
|
||||
{
|
||||
void __iomem *mite_base;
|
||||
u32 main_phys_addr;
|
||||
|
||||
/* ioremap the MITE registers (BAR 0) temporarily */
|
||||
mite_base = pci_ioremap_bar(pcidev, 0);
|
||||
if (!mite_base)
|
||||
return -ENOMEM;
|
||||
|
||||
/* set data window to main registers (BAR 1) */
|
||||
main_phys_addr = pci_resource_start(pcidev, 1);
|
||||
writel(main_phys_addr | WENAB, mite_base + MITE_IODWBSR);
|
||||
|
||||
/* finished with MITE registers */
|
||||
iounmap(mite_base);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pci_8255_mmio(int dir, int port, int data, unsigned long iobase)
|
||||
{
|
||||
void __iomem *mmio_base = (void __iomem *)iobase;
|
||||
@@ -205,6 +233,12 @@ static int pci_8255_auto_attach(struct comedi_device *dev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (board->has_mite) {
|
||||
ret = pci_8255_mite_init(pcidev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
is_mmio = (pci_resource_flags(pcidev, board->dio_badr) &
|
||||
IORESOURCE_MEM) != 0;
|
||||
if (is_mmio) {
|
||||
|
||||
@@ -254,7 +254,7 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter,
|
||||
struct sta_info *psta;
|
||||
struct sta_priv *pstapriv;
|
||||
union recv_frame *prtnframe;
|
||||
u16 ether_type = 0;
|
||||
u16 ether_type;
|
||||
|
||||
pstapriv = &adapter->stapriv;
|
||||
ptr = get_recvframe_data(precv_frame);
|
||||
@@ -263,15 +263,14 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter,
|
||||
psta = r8712_get_stainfo(pstapriv, psta_addr);
|
||||
auth_alg = adapter->securitypriv.AuthAlgrthm;
|
||||
if (auth_alg == 2) {
|
||||
/* get ether_type */
|
||||
ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE;
|
||||
memcpy(ðer_type, ptr, 2);
|
||||
ether_type = ntohs((unsigned short)ether_type);
|
||||
|
||||
if ((psta != NULL) && (psta->ieee8021x_blocked)) {
|
||||
/* blocked
|
||||
* only accept EAPOL frame */
|
||||
prtnframe = precv_frame;
|
||||
/*get ether_type */
|
||||
ptr = ptr + pfhdr->attrib.hdrlen +
|
||||
pfhdr->attrib.iv_len + LLC_HEADER_SIZE;
|
||||
memcpy(ðer_type, ptr, 2);
|
||||
ether_type = ntohs((unsigned short)ether_type);
|
||||
if (ether_type == 0x888e)
|
||||
prtnframe = precv_frame;
|
||||
else {
|
||||
|
||||
@@ -725,7 +725,7 @@ static int qt_startup(struct usb_serial *serial)
|
||||
goto startup_error;
|
||||
}
|
||||
|
||||
switch (serial->dev->descriptor.idProduct) {
|
||||
switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
|
||||
case QUATECH_DSU100:
|
||||
case QUATECH_QSU100:
|
||||
case QUATECH_ESU100A:
|
||||
|
||||
@@ -2454,6 +2454,7 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn)
|
||||
{
|
||||
struct iscsi_cmd *cmd;
|
||||
struct iscsi_conn *conn_p;
|
||||
bool found = false;
|
||||
|
||||
/*
|
||||
* Only send a Asynchronous Message on connections whos network
|
||||
@@ -2462,11 +2463,12 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn)
|
||||
list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) {
|
||||
if (conn_p->conn_state == TARG_CONN_STATE_LOGGED_IN) {
|
||||
iscsit_inc_conn_usage_count(conn_p);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!conn_p)
|
||||
if (!found)
|
||||
return;
|
||||
|
||||
cmd = iscsit_allocate_cmd(conn_p, GFP_ATOMIC);
|
||||
|
||||
@@ -68,6 +68,7 @@ static struct ft_tport *ft_tport_create(struct fc_lport *lport)
|
||||
|
||||
if (tport) {
|
||||
tport->tpg = tpg;
|
||||
tpg->tport = tport;
|
||||
return tport;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/tty_flip.h>
|
||||
@@ -70,6 +71,9 @@ static struct task_struct *hvc_task;
|
||||
/* Picks up late kicks after list walk but before schedule() */
|
||||
static int hvc_kicked;
|
||||
|
||||
/* hvc_init is triggered from hvc_alloc, i.e. only when actually used */
|
||||
static atomic_t hvc_needs_init __read_mostly = ATOMIC_INIT(-1);
|
||||
|
||||
static int hvc_init(void);
|
||||
|
||||
#ifdef CONFIG_MAGIC_SYSRQ
|
||||
@@ -842,7 +846,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
|
||||
int i;
|
||||
|
||||
/* We wait until a driver actually comes along */
|
||||
if (!hvc_driver) {
|
||||
if (atomic_inc_not_zero(&hvc_needs_init)) {
|
||||
int err = hvc_init();
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
@@ -1267,12 +1267,13 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
|
||||
*
|
||||
* Locking: None
|
||||
*/
|
||||
static void tty_line_name(struct tty_driver *driver, int index, char *p)
|
||||
static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)
|
||||
{
|
||||
if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
|
||||
strcpy(p, driver->name);
|
||||
return sprintf(p, "%s", driver->name);
|
||||
else
|
||||
sprintf(p, "%s%d", driver->name, index + driver->name_base);
|
||||
return sprintf(p, "%s%d", driver->name,
|
||||
index + driver->name_base);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3538,9 +3539,19 @@ static ssize_t show_cons_active(struct device *dev,
|
||||
if (i >= ARRAY_SIZE(cs))
|
||||
break;
|
||||
}
|
||||
while (i--)
|
||||
count += sprintf(buf + count, "%s%d%c",
|
||||
cs[i]->name, cs[i]->index, i ? ' ':'\n');
|
||||
while (i--) {
|
||||
int index = cs[i]->index;
|
||||
struct tty_driver *drv = cs[i]->device(cs[i], &index);
|
||||
|
||||
/* don't resolve tty0 as some programs depend on it */
|
||||
if (drv && (cs[i]->index > 0 || drv->major != TTY_MAJOR))
|
||||
count += tty_line_name(drv, index, buf + count);
|
||||
else
|
||||
count += sprintf(buf + count, "%s%d",
|
||||
cs[i]->name, cs[i]->index);
|
||||
|
||||
count += sprintf(buf + count, "%c", i ? ' ':'\n');
|
||||
}
|
||||
console_unlock();
|
||||
|
||||
return count;
|
||||
|
||||
@@ -953,8 +953,7 @@ EXPORT_SYMBOL_GPL(usb_deregister);
|
||||
* it doesn't support pre_reset/post_reset/reset_resume or
|
||||
* because it doesn't support suspend/resume.
|
||||
*
|
||||
* The caller must hold @intf's device's lock, but not its pm_mutex
|
||||
* and not @intf->dev.sem.
|
||||
* The caller must hold @intf's device's lock, but not @intf's lock.
|
||||
*/
|
||||
void usb_forced_unbind_intf(struct usb_interface *intf)
|
||||
{
|
||||
@@ -967,16 +966,37 @@ void usb_forced_unbind_intf(struct usb_interface *intf)
|
||||
intf->needs_binding = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unbind drivers for @udev's marked interfaces. These interfaces have
|
||||
* the needs_binding flag set, for example by usb_resume_interface().
|
||||
*
|
||||
* The caller must hold @udev's device lock.
|
||||
*/
|
||||
static void unbind_marked_interfaces(struct usb_device *udev)
|
||||
{
|
||||
struct usb_host_config *config;
|
||||
int i;
|
||||
struct usb_interface *intf;
|
||||
|
||||
config = udev->actconfig;
|
||||
if (config) {
|
||||
for (i = 0; i < config->desc.bNumInterfaces; ++i) {
|
||||
intf = config->interface[i];
|
||||
if (intf->dev.driver && intf->needs_binding)
|
||||
usb_forced_unbind_intf(intf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Delayed forced unbinding of a USB interface driver and scan
|
||||
* for rebinding.
|
||||
*
|
||||
* The caller must hold @intf's device's lock, but not its pm_mutex
|
||||
* and not @intf->dev.sem.
|
||||
* The caller must hold @intf's device's lock, but not @intf's lock.
|
||||
*
|
||||
* Note: Rebinds will be skipped if a system sleep transition is in
|
||||
* progress and the PM "complete" callback hasn't occurred yet.
|
||||
*/
|
||||
void usb_rebind_intf(struct usb_interface *intf)
|
||||
static void usb_rebind_intf(struct usb_interface *intf)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -993,6 +1013,41 @@ void usb_rebind_intf(struct usb_interface *intf)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Rebind drivers to @udev's marked interfaces. These interfaces have
|
||||
* the needs_binding flag set.
|
||||
*
|
||||
* The caller must hold @udev's device lock.
|
||||
*/
|
||||
static void rebind_marked_interfaces(struct usb_device *udev)
|
||||
{
|
||||
struct usb_host_config *config;
|
||||
int i;
|
||||
struct usb_interface *intf;
|
||||
|
||||
config = udev->actconfig;
|
||||
if (config) {
|
||||
for (i = 0; i < config->desc.bNumInterfaces; ++i) {
|
||||
intf = config->interface[i];
|
||||
if (intf->needs_binding)
|
||||
usb_rebind_intf(intf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Unbind all of @udev's marked interfaces and then rebind all of them.
|
||||
* This ordering is necessary because some drivers claim several interfaces
|
||||
* when they are first probed.
|
||||
*
|
||||
* The caller must hold @udev's device lock.
|
||||
*/
|
||||
void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev)
|
||||
{
|
||||
unbind_marked_interfaces(udev);
|
||||
rebind_marked_interfaces(udev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
/* Unbind drivers for @udev's interfaces that don't support suspend/resume
|
||||
@@ -1022,43 +1077,6 @@ static void unbind_no_pm_drivers_interfaces(struct usb_device *udev)
|
||||
}
|
||||
}
|
||||
|
||||
/* Unbind drivers for @udev's interfaces that failed to support reset-resume.
|
||||
* These interfaces have the needs_binding flag set by usb_resume_interface().
|
||||
*
|
||||
* The caller must hold @udev's device lock.
|
||||
*/
|
||||
static void unbind_no_reset_resume_drivers_interfaces(struct usb_device *udev)
|
||||
{
|
||||
struct usb_host_config *config;
|
||||
int i;
|
||||
struct usb_interface *intf;
|
||||
|
||||
config = udev->actconfig;
|
||||
if (config) {
|
||||
for (i = 0; i < config->desc.bNumInterfaces; ++i) {
|
||||
intf = config->interface[i];
|
||||
if (intf->dev.driver && intf->needs_binding)
|
||||
usb_forced_unbind_intf(intf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void do_rebind_interfaces(struct usb_device *udev)
|
||||
{
|
||||
struct usb_host_config *config;
|
||||
int i;
|
||||
struct usb_interface *intf;
|
||||
|
||||
config = udev->actconfig;
|
||||
if (config) {
|
||||
for (i = 0; i < config->desc.bNumInterfaces; ++i) {
|
||||
intf = config->interface[i];
|
||||
if (intf->needs_binding)
|
||||
usb_rebind_intf(intf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int usb_suspend_device(struct usb_device *udev, pm_message_t msg)
|
||||
{
|
||||
struct usb_device_driver *udriver;
|
||||
@@ -1379,7 +1397,7 @@ int usb_resume_complete(struct device *dev)
|
||||
* whose needs_binding flag is set
|
||||
*/
|
||||
if (udev->state != USB_STATE_NOTATTACHED)
|
||||
do_rebind_interfaces(udev);
|
||||
rebind_marked_interfaces(udev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1401,7 +1419,7 @@ int usb_resume(struct device *dev, pm_message_t msg)
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_set_active(dev);
|
||||
pm_runtime_enable(dev);
|
||||
unbind_no_reset_resume_drivers_interfaces(udev);
|
||||
unbind_marked_interfaces(udev);
|
||||
}
|
||||
|
||||
/* Avoid PM error messages for devices disconnected while suspended
|
||||
|
||||
@@ -75,7 +75,7 @@ static void for_each_companion(struct pci_dev *pdev, struct usb_hcd *hcd,
|
||||
PCI_SLOT(companion->devfn) != slot)
|
||||
continue;
|
||||
companion_hcd = pci_get_drvdata(companion);
|
||||
if (!companion_hcd)
|
||||
if (!companion_hcd || !companion_hcd->self.root_hub)
|
||||
continue;
|
||||
fn(pdev, hcd, companion, companion_hcd);
|
||||
}
|
||||
|
||||
@@ -5252,10 +5252,11 @@ int usb_reset_device(struct usb_device *udev)
|
||||
else if (cintf->condition ==
|
||||
USB_INTERFACE_BOUND)
|
||||
rebind = 1;
|
||||
if (rebind)
|
||||
cintf->needs_binding = 1;
|
||||
}
|
||||
if (ret == 0 && rebind)
|
||||
usb_rebind_intf(cintf);
|
||||
}
|
||||
usb_unbind_and_rebind_marked_interfaces(udev);
|
||||
}
|
||||
|
||||
usb_autosuspend_device(udev);
|
||||
|
||||
@@ -55,7 +55,7 @@ extern int usb_match_one_id_intf(struct usb_device *dev,
|
||||
extern int usb_match_device(struct usb_device *dev,
|
||||
const struct usb_device_id *id);
|
||||
extern void usb_forced_unbind_intf(struct usb_interface *intf);
|
||||
extern void usb_rebind_intf(struct usb_interface *intf);
|
||||
extern void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev);
|
||||
|
||||
extern int usb_hub_claim_port(struct usb_device *hdev, unsigned port,
|
||||
struct dev_state *owner);
|
||||
|
||||
@@ -836,15 +836,15 @@ struct dwc3_event_depevt {
|
||||
* 12 - VndrDevTstRcved
|
||||
* @reserved15_12: Reserved, not used
|
||||
* @event_info: Information about this event
|
||||
* @reserved31_24: Reserved, not used
|
||||
* @reserved31_25: Reserved, not used
|
||||
*/
|
||||
struct dwc3_event_devt {
|
||||
u32 one_bit:1;
|
||||
u32 device_event:7;
|
||||
u32 type:4;
|
||||
u32 reserved15_12:4;
|
||||
u32 event_info:8;
|
||||
u32 reserved31_24:8;
|
||||
u32 event_info:9;
|
||||
u32 reserved31_25:7;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1614,7 +1614,7 @@ static struct se_wwn *usbg_make_tport(
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
tport->tport_wwpn = wwpn;
|
||||
snprintf(tport->tport_name, sizeof(tport->tport_name), wnn_name);
|
||||
snprintf(tport->tport_name, sizeof(tport->tport_name), "%s", wnn_name);
|
||||
return &tport->tport_wwn;
|
||||
}
|
||||
|
||||
|
||||
@@ -280,7 +280,7 @@ static int __init zero_bind(struct usb_composite_dev *cdev)
|
||||
ss_opts->isoc_interval = gzero_options.isoc_interval;
|
||||
ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket;
|
||||
ss_opts->isoc_mult = gzero_options.isoc_mult;
|
||||
ss_opts->isoc_maxburst = gzero_options.isoc_maxpacket;
|
||||
ss_opts->isoc_maxburst = gzero_options.isoc_maxburst;
|
||||
ss_opts->bulk_buflen = gzero_options.bulk_buflen;
|
||||
|
||||
func_ss = usb_get_function(func_inst_ss);
|
||||
|
||||
@@ -114,9 +114,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
}
|
||||
if (pdev->vendor == PCI_VENDOR_ID_RENESAS &&
|
||||
pdev->device == 0x0015 &&
|
||||
pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG &&
|
||||
pdev->subsystem_device == 0xc0cd)
|
||||
pdev->device == 0x0015)
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
if (pdev->vendor == PCI_VENDOR_ID_VIA)
|
||||
xhci->quirks |= XHCI_RESET_ON_RESUME;
|
||||
@@ -161,6 +159,10 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
struct usb_hcd *hcd;
|
||||
|
||||
driver = (struct hc_driver *)id->driver_data;
|
||||
|
||||
/* Prevent runtime suspending between USB-2 and USB-3 initialization */
|
||||
pm_runtime_get_noresume(&dev->dev);
|
||||
|
||||
/* Register the USB 2.0 roothub.
|
||||
* FIXME: USB core must know to register the USB 2.0 roothub first.
|
||||
* This is sort of silly, because we could just set the HCD driver flags
|
||||
@@ -170,7 +172,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
retval = usb_hcd_pci_probe(dev, id);
|
||||
|
||||
if (retval)
|
||||
return retval;
|
||||
goto put_runtime_pm;
|
||||
|
||||
/* USB 2.0 roothub is stored in the PCI device now. */
|
||||
hcd = dev_get_drvdata(&dev->dev);
|
||||
@@ -199,12 +201,17 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
if (xhci->quirks & XHCI_LPM_SUPPORT)
|
||||
hcd_to_bus(xhci->shared_hcd)->root_hub->lpm_capable = 1;
|
||||
|
||||
/* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */
|
||||
pm_runtime_put_noidle(&dev->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
put_usb3_hcd:
|
||||
usb_put_hcd(xhci->shared_hcd);
|
||||
dealloc_usb2_hcd:
|
||||
usb_hcd_pci_remove(dev);
|
||||
put_runtime_pm:
|
||||
pm_runtime_put_noidle(&dev->dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -394,16 +394,16 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)
|
||||
|
||||
#else
|
||||
|
||||
static int xhci_try_enable_msi(struct usb_hcd *hcd)
|
||||
static inline int xhci_try_enable_msi(struct usb_hcd *hcd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void xhci_cleanup_msix(struct xhci_hcd *xhci)
|
||||
static inline void xhci_cleanup_msix(struct xhci_hcd *xhci)
|
||||
{
|
||||
}
|
||||
|
||||
static void xhci_msix_sync_irqs(struct xhci_hcd *xhci)
|
||||
static inline void xhci_msix_sync_irqs(struct xhci_hcd *xhci)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -440,7 +440,6 @@ void musb_hnp_stop(struct musb *musb)
|
||||
static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
|
||||
u8 devctl)
|
||||
{
|
||||
struct usb_otg *otg = musb->xceiv->otg;
|
||||
irqreturn_t handled = IRQ_NONE;
|
||||
|
||||
dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl,
|
||||
@@ -655,7 +654,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
|
||||
break;
|
||||
case OTG_STATE_B_PERIPHERAL:
|
||||
musb_g_suspend(musb);
|
||||
musb->is_active = otg->gadget->b_hnp_enable;
|
||||
musb->is_active = musb->g.b_hnp_enable;
|
||||
if (musb->is_active) {
|
||||
musb->xceiv->state = OTG_STATE_B_WAIT_ACON;
|
||||
dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n");
|
||||
@@ -671,7 +670,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
|
||||
break;
|
||||
case OTG_STATE_A_HOST:
|
||||
musb->xceiv->state = OTG_STATE_A_SUSPEND;
|
||||
musb->is_active = otg->host->b_hnp_enable;
|
||||
musb->is_active = musb_to_hcd(musb)->self.b_hnp_enable;
|
||||
break;
|
||||
case OTG_STATE_B_HOST:
|
||||
/* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */
|
||||
|
||||
@@ -47,6 +47,8 @@ struct ulpi_info {
|
||||
static struct ulpi_info ulpi_ids[] = {
|
||||
ULPI_INFO(ULPI_ID(0x04cc, 0x1504), "NXP ISP1504"),
|
||||
ULPI_INFO(ULPI_ID(0x0424, 0x0006), "SMSC USB331x"),
|
||||
ULPI_INFO(ULPI_ID(0x0424, 0x0007), "SMSC USB3320"),
|
||||
ULPI_INFO(ULPI_ID(0x0451, 0x1507), "TI TUSB1210"),
|
||||
};
|
||||
|
||||
static int ulpi_set_otg_flags(struct usb_phy *phy)
|
||||
|
||||
@@ -82,6 +82,9 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) },
|
||||
{ USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) },
|
||||
{ USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
|
||||
{ USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
|
||||
|
||||
@@ -121,8 +121,11 @@
|
||||
#define SUPERIAL_VENDOR_ID 0x5372
|
||||
#define SUPERIAL_PRODUCT_ID 0x2303
|
||||
|
||||
/* Hewlett-Packard LD220-HP POS Pole Display */
|
||||
/* Hewlett-Packard POS Pole Displays */
|
||||
#define HP_VENDOR_ID 0x03f0
|
||||
#define HP_LD960_PRODUCT_ID 0x0b39
|
||||
#define HP_LCM220_PRODUCT_ID 0x3139
|
||||
#define HP_LCM960_PRODUCT_ID 0x3239
|
||||
#define HP_LD220_PRODUCT_ID 0x3524
|
||||
|
||||
/* Cressi Edy (diving computer) PC interface */
|
||||
|
||||
@@ -54,28 +54,29 @@ static void w1_send_slave(struct w1_master *dev, u64 rn)
|
||||
struct w1_netlink_msg *hdr = (struct w1_netlink_msg *)(msg + 1);
|
||||
struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)(hdr + 1);
|
||||
int avail;
|
||||
u64 *data;
|
||||
|
||||
/* update kernel slave list */
|
||||
w1_slave_found(dev, rn);
|
||||
|
||||
avail = dev->priv_size - cmd->len;
|
||||
|
||||
if (avail > 8) {
|
||||
u64 *data = (void *)(cmd + 1) + cmd->len;
|
||||
if (avail < 8) {
|
||||
msg->ack++;
|
||||
cn_netlink_send(msg, 0, GFP_KERNEL);
|
||||
|
||||
*data = rn;
|
||||
cmd->len += 8;
|
||||
hdr->len += 8;
|
||||
msg->len += 8;
|
||||
return;
|
||||
msg->len = sizeof(struct w1_netlink_msg) +
|
||||
sizeof(struct w1_netlink_cmd);
|
||||
hdr->len = sizeof(struct w1_netlink_cmd);
|
||||
cmd->len = 0;
|
||||
}
|
||||
|
||||
msg->ack++;
|
||||
cn_netlink_send(msg, 0, GFP_KERNEL);
|
||||
data = (void *)(cmd + 1) + cmd->len;
|
||||
|
||||
msg->len = sizeof(struct w1_netlink_msg) + sizeof(struct w1_netlink_cmd);
|
||||
hdr->len = sizeof(struct w1_netlink_cmd);
|
||||
cmd->len = 0;
|
||||
*data = rn;
|
||||
cmd->len += 8;
|
||||
hdr->len += 8;
|
||||
msg->len += 8;
|
||||
}
|
||||
|
||||
static int w1_process_search_command(struct w1_master *dev, struct cn_msg *msg,
|
||||
|
||||
@@ -3161,6 +3161,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
|
||||
/* send down all the barriers */
|
||||
head = &info->fs_devices->devices;
|
||||
list_for_each_entry_rcu(dev, head, dev_list) {
|
||||
if (dev->missing)
|
||||
continue;
|
||||
if (!dev->bdev) {
|
||||
errors_send++;
|
||||
continue;
|
||||
@@ -3175,6 +3177,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
|
||||
|
||||
/* wait for all the barriers */
|
||||
list_for_each_entry_rcu(dev, head, dev_list) {
|
||||
if (dev->missing)
|
||||
continue;
|
||||
if (!dev->bdev) {
|
||||
errors_wait++;
|
||||
continue;
|
||||
|
||||
@@ -2511,6 +2511,27 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
|
||||
ex_ee_block = le32_to_cpu(ex->ee_block);
|
||||
ex_ee_len = ext4_ext_get_actual_len(ex);
|
||||
|
||||
/*
|
||||
* If we're starting with an extent other than the last one in the
|
||||
* node, we need to see if it shares a cluster with the extent to
|
||||
* the right (towards the end of the file). If its leftmost cluster
|
||||
* is this extent's rightmost cluster and it is not cluster aligned,
|
||||
* we'll mark it as a partial that is not to be deallocated.
|
||||
*/
|
||||
|
||||
if (ex != EXT_LAST_EXTENT(eh)) {
|
||||
ext4_fsblk_t current_pblk, right_pblk;
|
||||
long long current_cluster, right_cluster;
|
||||
|
||||
current_pblk = ext4_ext_pblock(ex) + ex_ee_len - 1;
|
||||
current_cluster = (long long)EXT4_B2C(sbi, current_pblk);
|
||||
right_pblk = ext4_ext_pblock(ex + 1);
|
||||
right_cluster = (long long)EXT4_B2C(sbi, right_pblk);
|
||||
if (current_cluster == right_cluster &&
|
||||
EXT4_PBLK_COFF(sbi, right_pblk))
|
||||
*partial_cluster = -right_cluster;
|
||||
}
|
||||
|
||||
trace_ext4_ext_rm_leaf(inode, start, ex, *partial_cluster);
|
||||
|
||||
while (ex >= EXT_FIRST_EXTENT(eh) &&
|
||||
@@ -4032,7 +4053,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
|
||||
struct ext4_extent newex, *ex, *ex2;
|
||||
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
||||
ext4_fsblk_t newblock = 0;
|
||||
int free_on_err = 0, err = 0, depth;
|
||||
int free_on_err = 0, err = 0, depth, ret;
|
||||
unsigned int allocated = 0, offset = 0;
|
||||
unsigned int allocated_clusters = 0;
|
||||
struct ext4_allocation_request ar;
|
||||
@@ -4093,9 +4114,13 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
|
||||
if (!ext4_ext_is_uninitialized(ex))
|
||||
goto out;
|
||||
|
||||
allocated = ext4_ext_handle_uninitialized_extents(
|
||||
ret = ext4_ext_handle_uninitialized_extents(
|
||||
handle, inode, map, path, flags,
|
||||
allocated, newblock);
|
||||
if (ret < 0)
|
||||
err = ret;
|
||||
else
|
||||
allocated = ret;
|
||||
goto out3;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ ext4_unaligned_aio(struct inode *inode, const struct iovec *iov,
|
||||
size_t count = iov_length(iov, nr_segs);
|
||||
loff_t final_size = pos + count;
|
||||
|
||||
if (pos >= inode->i_size)
|
||||
if (pos >= i_size_read(inode))
|
||||
return 0;
|
||||
|
||||
if ((pos & blockmask) || (final_size & blockmask))
|
||||
|
||||
@@ -517,8 +517,8 @@ static void ext4_xattr_update_super_block(handle_t *handle,
|
||||
}
|
||||
|
||||
/*
|
||||
* Release the xattr block BH: If the reference count is > 1, decrement
|
||||
* it; otherwise free the block.
|
||||
* Release the xattr block BH: If the reference count is > 1, decrement it;
|
||||
* otherwise free the block.
|
||||
*/
|
||||
static void
|
||||
ext4_xattr_release_block(handle_t *handle, struct inode *inode,
|
||||
@@ -538,16 +538,31 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode,
|
||||
if (ce)
|
||||
mb_cache_entry_free(ce);
|
||||
get_bh(bh);
|
||||
unlock_buffer(bh);
|
||||
ext4_free_blocks(handle, inode, bh, 0, 1,
|
||||
EXT4_FREE_BLOCKS_METADATA |
|
||||
EXT4_FREE_BLOCKS_FORGET);
|
||||
unlock_buffer(bh);
|
||||
} else {
|
||||
le32_add_cpu(&BHDR(bh)->h_refcount, -1);
|
||||
if (ce)
|
||||
mb_cache_entry_release(ce);
|
||||
/*
|
||||
* Beware of this ugliness: Releasing of xattr block references
|
||||
* from different inodes can race and so we have to protect
|
||||
* from a race where someone else frees the block (and releases
|
||||
* its journal_head) before we are done dirtying the buffer. In
|
||||
* nojournal mode this race is harmless and we actually cannot
|
||||
* call ext4_handle_dirty_xattr_block() with locked buffer as
|
||||
* that function can call sync_dirty_buffer() so for that case
|
||||
* we handle the dirtying after unlocking the buffer.
|
||||
*/
|
||||
if (ext4_handle_valid(handle))
|
||||
error = ext4_handle_dirty_xattr_block(handle, inode,
|
||||
bh);
|
||||
unlock_buffer(bh);
|
||||
error = ext4_handle_dirty_xattr_block(handle, inode, bh);
|
||||
if (!ext4_handle_valid(handle))
|
||||
error = ext4_handle_dirty_xattr_block(handle, inode,
|
||||
bh);
|
||||
if (IS_SYNC(inode))
|
||||
ext4_handle_sync(handle);
|
||||
dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1));
|
||||
|
||||
@@ -87,16 +87,29 @@ static inline struct inode *wb_inode(struct list_head *head)
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/writeback.h>
|
||||
|
||||
static void bdi_wakeup_thread(struct backing_dev_info *bdi)
|
||||
{
|
||||
spin_lock_bh(&bdi->wb_lock);
|
||||
if (test_bit(BDI_registered, &bdi->state))
|
||||
mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);
|
||||
spin_unlock_bh(&bdi->wb_lock);
|
||||
}
|
||||
|
||||
static void bdi_queue_work(struct backing_dev_info *bdi,
|
||||
struct wb_writeback_work *work)
|
||||
{
|
||||
trace_writeback_queue(bdi, work);
|
||||
|
||||
spin_lock_bh(&bdi->wb_lock);
|
||||
if (!test_bit(BDI_registered, &bdi->state)) {
|
||||
if (work->done)
|
||||
complete(work->done);
|
||||
goto out_unlock;
|
||||
}
|
||||
list_add_tail(&work->list, &bdi->work_list);
|
||||
spin_unlock_bh(&bdi->wb_lock);
|
||||
|
||||
mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);
|
||||
out_unlock:
|
||||
spin_unlock_bh(&bdi->wb_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -112,7 +125,7 @@ __bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages,
|
||||
work = kzalloc(sizeof(*work), GFP_ATOMIC);
|
||||
if (!work) {
|
||||
trace_writeback_nowork(bdi);
|
||||
mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);
|
||||
bdi_wakeup_thread(bdi);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -159,7 +172,7 @@ void bdi_start_background_writeback(struct backing_dev_info *bdi)
|
||||
* writeback as soon as there is no other work to do.
|
||||
*/
|
||||
trace_writeback_wake_background(bdi);
|
||||
mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);
|
||||
bdi_wakeup_thread(bdi);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1016,7 +1029,7 @@ void bdi_writeback_workfn(struct work_struct *work)
|
||||
current->flags |= PF_SWAPWRITE;
|
||||
|
||||
if (likely(!current_is_workqueue_rescuer() ||
|
||||
list_empty(&bdi->bdi_list))) {
|
||||
!test_bit(BDI_registered, &bdi->state))) {
|
||||
/*
|
||||
* The normal path. Keep writing back @bdi until its
|
||||
* work_list is empty. Note that this path is also taken
|
||||
@@ -1038,10 +1051,10 @@ void bdi_writeback_workfn(struct work_struct *work)
|
||||
trace_writeback_pages_written(pages_written);
|
||||
}
|
||||
|
||||
if (!list_empty(&bdi->work_list) ||
|
||||
(wb_has_dirty_io(wb) && dirty_writeback_interval))
|
||||
queue_delayed_work(bdi_wq, &wb->dwork,
|
||||
msecs_to_jiffies(dirty_writeback_interval * 10));
|
||||
if (!list_empty(&bdi->work_list))
|
||||
mod_delayed_work(bdi_wq, &wb->dwork, 0);
|
||||
else if (wb_has_dirty_io(wb) && dirty_writeback_interval)
|
||||
bdi_wakeup_thread_delayed(bdi);
|
||||
|
||||
current->flags &= ~PF_SWAPWRITE;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ static int jffs2_rtime_compress(unsigned char *data_in,
|
||||
unsigned char *cpage_out,
|
||||
uint32_t *sourcelen, uint32_t *dstlen)
|
||||
{
|
||||
short positions[256];
|
||||
unsigned short positions[256];
|
||||
int outpos = 0;
|
||||
int pos=0;
|
||||
|
||||
@@ -74,7 +74,7 @@ static int jffs2_rtime_decompress(unsigned char *data_in,
|
||||
unsigned char *cpage_out,
|
||||
uint32_t srclen, uint32_t destlen)
|
||||
{
|
||||
short positions[256];
|
||||
unsigned short positions[256];
|
||||
int outpos = 0;
|
||||
int pos=0;
|
||||
|
||||
|
||||
@@ -231,7 +231,7 @@ struct jffs2_tmp_dnode_info
|
||||
uint32_t version;
|
||||
uint32_t data_crc;
|
||||
uint32_t partial_crc;
|
||||
uint16_t csize;
|
||||
uint32_t csize;
|
||||
uint16_t overlapped;
|
||||
};
|
||||
|
||||
|
||||
@@ -179,6 +179,7 @@ int jffs2_reserve_space(struct jffs2_sb_info *c, uint32_t minsize,
|
||||
spin_unlock(&c->erase_completion_lock);
|
||||
|
||||
schedule();
|
||||
remove_wait_queue(&c->erase_wait, &wait);
|
||||
} else
|
||||
spin_unlock(&c->erase_completion_lock);
|
||||
} else if (ret)
|
||||
@@ -211,20 +212,25 @@ out:
|
||||
int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize,
|
||||
uint32_t *len, uint32_t sumsize)
|
||||
{
|
||||
int ret = -EAGAIN;
|
||||
int ret;
|
||||
minsize = PAD(minsize);
|
||||
|
||||
jffs2_dbg(1, "%s(): Requested 0x%x bytes\n", __func__, minsize);
|
||||
|
||||
spin_lock(&c->erase_completion_lock);
|
||||
while(ret == -EAGAIN) {
|
||||
while (true) {
|
||||
spin_lock(&c->erase_completion_lock);
|
||||
ret = jffs2_do_reserve_space(c, minsize, len, sumsize);
|
||||
if (ret) {
|
||||
jffs2_dbg(1, "%s(): looping, ret is %d\n",
|
||||
__func__, ret);
|
||||
}
|
||||
spin_unlock(&c->erase_completion_lock);
|
||||
|
||||
if (ret == -EAGAIN)
|
||||
cond_resched();
|
||||
else
|
||||
break;
|
||||
}
|
||||
spin_unlock(&c->erase_completion_lock);
|
||||
if (!ret)
|
||||
ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user