mirror of
https://github.com/torvalds/linux.git
synced 2024-12-16 08:02:17 +00:00
Merge branch 'master' into gfs2
This commit is contained in:
commit
0bc0748dfb
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 18
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME=Crazed Snow-Weasel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
|
@ -28,6 +28,7 @@ obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
|
||||
|
||||
# S3C2412 support
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412-irq.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412-clock.o
|
||||
|
||||
#
|
||||
|
@ -8,16 +8,6 @@
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 24-Aug-2004 BJD Start of generic S3C24XX support
|
||||
* 18-Oct-2004 BJD Moved board struct into this file
|
||||
* 04-Jan-2005 BJD New uart initialisation
|
||||
* 10-Jan-2005 BJD Moved generic init here, specific to cpu headers
|
||||
* 14-Jan-2005 BJD Added s3c24xx_init_clocks() call
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_{VA,SZ} to S3C24XX_{VA,SZ} & IODESC_ENT
|
||||
* 14-Mar-2005 BJD Updated for __iomem
|
||||
* 15-Jan-2006 LCVR Updated S3C2410_PA_##x to new S3C24XX_PA_##x macro
|
||||
*/
|
||||
|
||||
/* todo - fix when rmk changes iodescs to use `void __iomem *` */
|
||||
|
@ -1,22 +1,14 @@
|
||||
/* linux/arch/arm/mach-s3c2410/devs.c
|
||||
*
|
||||
* Copyright (c) 2004 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* Base S3C2410 platform device definitions
|
||||
* Base S3C24XX platform device definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 15-Jan-2006 LCVR Using S3C24XX_PA_##x macro for common S3C24XX devices
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_{VA,SZ} to S3C24XX_{VA,SZ}
|
||||
* 10-Feb-2005 BJD Added camera from guillaume.gourat@nexvision.tv
|
||||
* 29-Aug-2004 BJD Added timers 0 through 3
|
||||
* 29-Aug-2004 BJD Changed index of devices we only have one of to -1
|
||||
* 21-Aug-2004 BJD Added IRQ_TICK to RTC resources
|
||||
* 18-Aug-2004 BJD Created initial version
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -86,7 +86,7 @@ unsigned long s3c_irqwake_intmask = 0xffffffffL;
|
||||
unsigned long s3c_irqwake_eintallow = 0x0000fff0L;
|
||||
unsigned long s3c_irqwake_eintmask = 0xffffffffL;
|
||||
|
||||
static int
|
||||
int
|
||||
s3c_irq_wake(unsigned int irqno, unsigned int state)
|
||||
{
|
||||
unsigned long irqbit = 1 << (irqno - IRQ_EINT0);
|
||||
@ -260,7 +260,7 @@ s3c_irqext_unmask(unsigned int irqno)
|
||||
s3c_irq_unmask((irqno <= (IRQ_EINT7 - EXTINT_OFF)) ? IRQ_EINT4t7 : IRQ_EINT8t23);
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
s3c_irqext_type(unsigned int irq, unsigned int type)
|
||||
{
|
||||
void __iomem *extint_reg;
|
||||
|
@ -97,3 +97,8 @@ s3c_irqsub_ack(unsigned int irqno, unsigned int parentmask, unsigned int group)
|
||||
__raw_writel(parentmask, S3C2410_INTPND);
|
||||
}
|
||||
}
|
||||
|
||||
/* exported for use in arch/arm/mach-s3c2410 */
|
||||
|
||||
extern int s3c_irq_wake(unsigned int irqno, unsigned int state);
|
||||
extern int s3c_irqext_type(unsigned int irq, unsigned int type);
|
||||
|
@ -8,31 +8,6 @@
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 14-Sep-2004 BJD USB power control
|
||||
* 20-Aug-2004 BJD Added s3c2410_board struct
|
||||
* 18-Aug-2004 BJD Added platform devices from default set
|
||||
* 16-May-2003 BJD Created initial version
|
||||
* 16-Aug-2003 BJD Fixed header files and copyright, added URL
|
||||
* 05-Sep-2003 BJD Moved to v2.6 kernel
|
||||
* 06-Jan-2003 BJD Updates for <arch/map.h>
|
||||
* 18-Jan-2003 BJD Added serial port configuration
|
||||
* 05-Oct-2004 BJD Power management code
|
||||
* 04-Nov-2004 BJD Updated serial port clocks
|
||||
* 04-Jan-2005 BJD New uart init call
|
||||
* 10-Jan-2005 BJD Removed include of s3c2410.h
|
||||
* 14-Jan-2005 BJD Add support for muitlple NAND devices
|
||||
* 03-Mar-2005 BJD Ensured that bast-cpld.h is included
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
||||
* 14-Mar-2005 BJD Updated for __iomem changes
|
||||
* 22-Jun-2005 BJD Added DM9000 platform information
|
||||
* 28-Jun-2005 BJD Moved pm functionality out to common code
|
||||
* 17-Jul-2005 BJD Changed to platform device for SuperIO 16550s
|
||||
* 25-Jul-2005 BJD Removed ASIX static mappings
|
||||
* 27-Jul-2005 BJD Ensure maximum frequency of i2c bus
|
||||
* 20-Sep-2005 BJD Added static to non-exported items
|
||||
* 26-Oct-2005 BJD Added FB platform data
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -9,23 +9,6 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 16-May-2003 BJD Created initial version
|
||||
* 16-Aug-2003 BJD Fixed header files and copyright, added URL
|
||||
* 05-Sep-2003 BJD Moved to v2.6 kernel
|
||||
* 06-Jan-2003 BJD Updates for <arch/map.h>
|
||||
* 18-Jan-2003 BJD Added serial port configuration
|
||||
* 17-Feb-2003 BJD Copied to mach-ipaq.c
|
||||
* 21-Aug-2004 BJD Added struct s3c2410_board
|
||||
* 04-Sep-2004 BJD Changed uart init, renamed ipaq_ -> h1940_
|
||||
* 18-Oct-2004 BJD Updated new board structure name
|
||||
* 04-Nov-2004 BJD Change for new serial clock
|
||||
* 04-Jan-2005 BJD Updated uart init call
|
||||
* 10-Jan-2005 BJD Removed include of s3c2410.h
|
||||
* 14-Jan-2005 BJD Added clock init
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
||||
* 20-Sep-2005 BJD Added static to non-exported items
|
||||
* 26-Oct-2005 BJD Changed name of fb init call
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -9,15 +9,6 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 16-Sep-2004 BJD Copied from mach-h1940.c
|
||||
* 25-Oct-2004 BJD Updates for 2.6.10-rc1
|
||||
* 10-Jan-2005 BJD Removed include of s3c2410.h s3c2440.h
|
||||
* 14-Jan-2005 BJD Added new clock init
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
||||
* 14-Mar-2005 BJD Fixed __iomem warnings
|
||||
* 20-Sep-2005 BJD Added static to non-exported items
|
||||
* 31-Oct-2005 BJD Added LCD setup for framebuffer
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -27,10 +27,6 @@
|
||||
* derived from linux/arch/arm/mach-s3c2410/mach-bast.c, written by
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
||||
* 20-Sep-2005 BJD Added static to non-exported items
|
||||
* 01-Apr-2006 BJD Moved init code to common smdk
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -112,7 +112,20 @@ static void __init smdk2413_machine_init(void)
|
||||
smdk_machine_init();
|
||||
}
|
||||
|
||||
MACHINE_START(S3C2413, "SMDK2413")
|
||||
MACHINE_START(S3C2413, "S3C2413")
|
||||
/* Maintainer: Ben Dooks <ben@fluff.org> */
|
||||
.phys_io = S3C2410_PA_UART,
|
||||
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
|
||||
.boot_params = S3C2410_SDRAM_PA + 0x100,
|
||||
|
||||
.fixup = smdk2413_fixup,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.map_io = smdk2413_map_io,
|
||||
.init_machine = smdk2413_machine_init,
|
||||
.timer = &s3c24xx_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(SMDK2413, "SMDK2413")
|
||||
/* Maintainer: Ben Dooks <ben@fluff.org> */
|
||||
.phys_io = S3C2410_PA_UART,
|
||||
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
|
||||
|
@ -10,25 +10,6 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 14-Sep-2004 BJD USB Power control
|
||||
* 04-Sep-2004 BJD Added new uart init, and io init
|
||||
* 21-Aug-2004 BJD Added struct s3c2410_board
|
||||
* 06-Aug-2004 BJD Fixed call to time initialisation
|
||||
* 05-Apr-2004 BJD Copied to make mach-vr1000.c
|
||||
* 18-Oct-2004 BJD Updated board struct
|
||||
* 04-Nov-2004 BJD Clock and serial configuration update
|
||||
*
|
||||
* 04-Jan-2005 BJD Updated uart init call
|
||||
* 10-Jan-2005 BJD Removed include of s3c2410.h
|
||||
* 14-Jan-2005 BJD Added clock init
|
||||
* 15-Jan-2005 BJD Add serial port device definition
|
||||
* 20-Jan-2005 BJD Use UPF_IOREMAP for ports
|
||||
* 10-Feb-2005 BJD Added power-off capability
|
||||
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
||||
* 14-Mar-2006 BJD void __iomem fixes
|
||||
* 22-Jun-2006 BJD Added DM9000 platform information
|
||||
* 20-Sep-2005 BJD Added static to non-exported items
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -17,10 +17,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Changelog
|
||||
* 15-Jan-2006 LCVR Splitted from gpio.c, adding support for the S3C2400
|
||||
*/
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -9,14 +9,6 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Modifications:
|
||||
* 18-Aug-2004 BJD Created initial version
|
||||
* 20-Aug-2004 BJD Added s3c2410_board struct
|
||||
* 04-Sep-2004 BJD Added s3c2410_init_uarts() call
|
||||
* 17-Oct-2004 BJD Moved board out to cpu
|
||||
* 04-Jan-2005 BJD Changed uart init
|
||||
* 10-Jan-2005 BJD Removed timer to cpu.h, moved 2410 specific bits here
|
||||
* 14-Jan-2005 BJD Added s3c2410_init_clocks call
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2410
|
||||
|
130
arch/arm/mach-s3c2410/s3c2412-irq.c
Normal file
130
arch/arm/mach-s3c2410/s3c2412-irq.c
Normal file
@ -0,0 +1,130 @@
|
||||
/* linux/arch/arm/mach-s3c2412/s3c2412-irq.c
|
||||
*
|
||||
* Copyright (c) 2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/sysdev.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <asm/arch/regs-irq.h>
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
#include "cpu.h"
|
||||
#include "irq.h"
|
||||
|
||||
/* the s3c2412 changes the behaviour of IRQ_EINT0 through IRQ_EINT3 by
|
||||
* having them turn up in both the INT* and the EINT* registers. Whilst
|
||||
* both show the status, they both now need to be acked when the IRQs
|
||||
* go off.
|
||||
*/
|
||||
|
||||
static void
|
||||
s3c2412_irq_mask(unsigned int irqno)
|
||||
{
|
||||
unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask | bitval, S3C2410_INTMSK);
|
||||
|
||||
mask = __raw_readl(S3C2412_EINTMASK);
|
||||
__raw_writel(mask | bitval, S3C2412_EINTMASK);
|
||||
}
|
||||
|
||||
static inline void
|
||||
s3c2412_irq_ack(unsigned int irqno)
|
||||
{
|
||||
unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
|
||||
|
||||
__raw_writel(bitval, S3C2412_EINTPEND);
|
||||
__raw_writel(bitval, S3C2410_SRCPND);
|
||||
__raw_writel(bitval, S3C2410_INTPND);
|
||||
}
|
||||
|
||||
static inline void
|
||||
s3c2412_irq_maskack(unsigned int irqno)
|
||||
{
|
||||
unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask|bitval, S3C2410_INTMSK);
|
||||
|
||||
mask = __raw_readl(S3C2412_EINTMASK);
|
||||
__raw_writel(mask | bitval, S3C2412_EINTMASK);
|
||||
|
||||
__raw_writel(bitval, S3C2412_EINTPEND);
|
||||
__raw_writel(bitval, S3C2410_SRCPND);
|
||||
__raw_writel(bitval, S3C2410_INTPND);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c2412_irq_unmask(unsigned int irqno)
|
||||
{
|
||||
unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2412_EINTMASK);
|
||||
__raw_writel(mask & ~bitval, S3C2412_EINTMASK);
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask & ~bitval, S3C2410_INTMSK);
|
||||
}
|
||||
|
||||
static struct irqchip s3c2412_irq_eint0t4 = {
|
||||
.ack = s3c2412_irq_ack,
|
||||
.mask = s3c2412_irq_mask,
|
||||
.unmask = s3c2412_irq_unmask,
|
||||
.set_wake = s3c_irq_wake,
|
||||
.set_type = s3c_irqext_type,
|
||||
};
|
||||
|
||||
static int s3c2412_irq_add(struct sys_device *sysdev)
|
||||
{
|
||||
unsigned int irqno;
|
||||
|
||||
for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
|
||||
set_irq_chip(irqno, &s3c2412_irq_eint0t4);
|
||||
set_irq_handler(irqno, do_edge_IRQ);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver s3c2412_irq_driver = {
|
||||
.add = s3c2412_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2412_irq_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_irq_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2412_irq_init);
|
@ -17,9 +17,6 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Changelog:
|
||||
* 25-Jul-2005 BJD Split from irq.c
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
|
@ -17,9 +17,6 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Changelog:
|
||||
* 25-Jul-2005 BJD Split from irq.c
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
@ -122,21 +119,24 @@ static int s3c244x_irq_add(struct sys_device *sysdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver s3c244x_irq_driver = {
|
||||
static struct sysdev_driver s3c2440_irq_driver = {
|
||||
.add = s3c244x_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2440_irq_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2440_sysclass, &s3c244x_irq_driver);
|
||||
return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_irq_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2440_irq_init);
|
||||
|
||||
static struct sysdev_driver s3c2442_irq_driver = {
|
||||
.add = s3c244x_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2442_irq_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2442_sysclass, &s3c244x_irq_driver);
|
||||
return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_irq_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2442_irq_init);
|
||||
|
@ -480,7 +480,7 @@ __arm926_proc_info:
|
||||
b __arm926_setup
|
||||
.long cpu_arch_name
|
||||
.long cpu_elf_name
|
||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA
|
||||
.long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_VFP|HWCAP_EDSP|HWCAP_JAVA
|
||||
.long cpu_arm926_name
|
||||
.long arm926_processor_functions
|
||||
.long v4wbi_tlb_fns
|
||||
|
@ -29,6 +29,10 @@ config GENERIC_HARDIRQS
|
||||
bool
|
||||
default n
|
||||
|
||||
config GENERIC_TIME
|
||||
bool
|
||||
default y
|
||||
|
||||
config TIME_LOW_RES
|
||||
bool
|
||||
default y
|
||||
|
@ -32,8 +32,6 @@
|
||||
|
||||
#define TICK_SIZE (tick_nsec / 1000)
|
||||
|
||||
extern unsigned long wall_jiffies;
|
||||
|
||||
unsigned long __nongprelbss __clkin_clock_speed_HZ;
|
||||
unsigned long __nongprelbss __ext_bus_clock_speed_HZ;
|
||||
unsigned long __nongprelbss __res_bus_clock_speed_HZ;
|
||||
@ -144,85 +142,6 @@ void time_init(void)
|
||||
time_divisor_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* This version of gettimeofday has near microsecond resolution.
|
||||
*/
|
||||
void do_gettimeofday(struct timeval *tv)
|
||||
{
|
||||
unsigned long seq;
|
||||
unsigned long usec, sec;
|
||||
unsigned long max_ntp_tick;
|
||||
|
||||
do {
|
||||
unsigned long lost;
|
||||
|
||||
seq = read_seqbegin(&xtime_lock);
|
||||
|
||||
usec = 0;
|
||||
lost = jiffies - wall_jiffies;
|
||||
|
||||
/*
|
||||
* If time_adjust is negative then NTP is slowing the clock
|
||||
* so make sure not to go into next possible interval.
|
||||
* Better to lose some accuracy than have time go backwards..
|
||||
*/
|
||||
if (unlikely(time_adjust < 0)) {
|
||||
max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
|
||||
usec = min(usec, max_ntp_tick);
|
||||
|
||||
if (lost)
|
||||
usec += lost * max_ntp_tick;
|
||||
}
|
||||
else if (unlikely(lost))
|
||||
usec += lost * (USEC_PER_SEC / HZ);
|
||||
|
||||
sec = xtime.tv_sec;
|
||||
usec += (xtime.tv_nsec / 1000);
|
||||
} while (read_seqretry(&xtime_lock, seq));
|
||||
|
||||
while (usec >= 1000000) {
|
||||
usec -= 1000000;
|
||||
sec++;
|
||||
}
|
||||
|
||||
tv->tv_sec = sec;
|
||||
tv->tv_usec = usec;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(do_gettimeofday);
|
||||
|
||||
int do_settimeofday(struct timespec *tv)
|
||||
{
|
||||
time_t wtm_sec, sec = tv->tv_sec;
|
||||
long wtm_nsec, nsec = tv->tv_nsec;
|
||||
|
||||
if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
|
||||
return -EINVAL;
|
||||
|
||||
write_seqlock_irq(&xtime_lock);
|
||||
/*
|
||||
* This is revolting. We need to set "xtime" correctly. However, the
|
||||
* value in this location is the value at the most recent update of
|
||||
* wall time. Discover what correction gettimeofday() would have
|
||||
* made, and then undo it!
|
||||
*/
|
||||
nsec -= 0 * NSEC_PER_USEC;
|
||||
nsec -= (jiffies - wall_jiffies) * TICK_NSEC;
|
||||
|
||||
wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
|
||||
wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
|
||||
|
||||
set_normalized_timespec(&xtime, sec, nsec);
|
||||
set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
|
||||
|
||||
ntp_clear();
|
||||
write_sequnlock_irq(&xtime_lock);
|
||||
clock_was_set();
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(do_settimeofday);
|
||||
|
||||
/*
|
||||
* Scheduler clock - returns current time in nanosec units.
|
||||
*/
|
||||
|
@ -39,7 +39,6 @@ obj-$(CONFIG_VM86) += vm86.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_HPET_TIMER) += hpet.o
|
||||
obj-$(CONFIG_K8_NB) += k8.o
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
|
@ -1,23 +0,0 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/audit.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
static unsigned dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static int __init audit_classes_init(void)
|
||||
{
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(audit_classes_init);
|
@ -75,6 +75,10 @@ config DMA_IS_NORMAL
|
||||
depends on IA64_SGI_SN2
|
||||
default y
|
||||
|
||||
config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
choice
|
||||
prompt "System type"
|
||||
default IA64_GENERIC
|
||||
|
@ -9,3 +9,29 @@ unsigned ia32_chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ia32_write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ia32_read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int ia32_classify_syscall(unsigned syscall)
|
||||
{
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -8,19 +8,54 @@ static unsigned dir_class[] = {
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_IA32_SUPPORT
|
||||
extern int ia32_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_I386)
|
||||
return ia32_classify_syscall(syscall);
|
||||
#endif
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init audit_classes_init(void)
|
||||
{
|
||||
#ifdef CONFIG_IA32_SUPPORT
|
||||
extern __u32 ia32_dir_class[];
|
||||
extern __u32 ia32_write_class[];
|
||||
extern __u32 ia32_read_class[];
|
||||
extern __u32 ia32_chattr_class[];
|
||||
audit_register_class(AUDIT_CLASS_WRITE_32, ia32_write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ_32, ia32_read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
|
||||
#endif
|
||||
audit_register_class(AUDIT_CLASS_WRITE, write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ, read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
|
||||
return 0;
|
||||
|
@ -1605,8 +1605,8 @@ sys_call_table:
|
||||
data8 sys_ni_syscall // 1295 reserved for ppoll
|
||||
data8 sys_unshare
|
||||
data8 sys_splice
|
||||
data8 sys_set_robust_list
|
||||
data8 sys_get_robust_list
|
||||
data8 sys_ni_syscall // reserved for set_robust_list
|
||||
data8 sys_ni_syscall // reserved for get_robust_list
|
||||
data8 sys_sync_file_range // 1300
|
||||
data8 sys_tee
|
||||
data8 sys_vmsplice
|
||||
|
@ -197,6 +197,11 @@ start_ap:
|
||||
;;
|
||||
srlz.i
|
||||
;;
|
||||
{
|
||||
flushrs // must be first insn in group
|
||||
srlz.i
|
||||
}
|
||||
;;
|
||||
/*
|
||||
* Save the region registers, predicate before they get clobbered
|
||||
*/
|
||||
|
@ -4936,13 +4936,15 @@ abort_locked:
|
||||
if (likely(ctx)) {
|
||||
DPRINT(("context unlocked\n"));
|
||||
UNPROTECT_CTX(ctx, flags);
|
||||
fput(file);
|
||||
}
|
||||
|
||||
/* copy argument back to user, if needed */
|
||||
if (call_made && PFM_CMD_RW_ARG(cmd) && copy_to_user(arg, args_k, base_sz*count)) ret = -EFAULT;
|
||||
|
||||
error_args:
|
||||
if (file)
|
||||
fput(file);
|
||||
|
||||
kfree(args_k);
|
||||
|
||||
DPRINT(("cmd=%s ret=%ld\n", PFM_CMD_NAME(cmd), ret));
|
||||
|
@ -163,10 +163,25 @@ sys_pipe (void)
|
||||
return retval;
|
||||
}
|
||||
|
||||
int ia64_mmap_check(unsigned long addr, unsigned long len,
|
||||
unsigned long flags)
|
||||
{
|
||||
unsigned long roff;
|
||||
|
||||
/*
|
||||
* Don't permit mappings into unmapped space, the virtual page table
|
||||
* of a region, or across a region boundary. Note: RGN_MAP_LIMIT is
|
||||
* equal to 2^n-PAGE_SIZE (for some integer n <= 61) and len > 0.
|
||||
*/
|
||||
roff = REGION_OFFSET(addr);
|
||||
if ((len > RGN_MAP_LIMIT) || (roff > (RGN_MAP_LIMIT - len)))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff)
|
||||
{
|
||||
unsigned long roff;
|
||||
struct file *file = NULL;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
@ -188,17 +203,6 @@ do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, un
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't permit mappings into unmapped space, the virtual page table of a region,
|
||||
* or across a region boundary. Note: RGN_MAP_LIMIT is equal to 2^n-PAGE_SIZE
|
||||
* (for some integer n <= 61) and len > 0.
|
||||
*/
|
||||
roff = REGION_OFFSET(addr);
|
||||
if ((len > RGN_MAP_LIMIT) || (roff > (RGN_MAP_LIMIT - len))) {
|
||||
addr = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
@ -565,7 +565,7 @@ static void __init sn_init_pdas(char **cmdline_p)
|
||||
* Also sets up a few fields in the nodepda. Also known as
|
||||
* platform_cpu_init() by the ia64 machvec code.
|
||||
*/
|
||||
void __init sn_cpu_init(void)
|
||||
void __cpuinit sn_cpu_init(void)
|
||||
{
|
||||
int cpuid;
|
||||
int cpuphyid;
|
||||
|
@ -95,6 +95,10 @@ config GENERIC_TBSYNC
|
||||
default y if PPC32 && SMP
|
||||
default n
|
||||
|
||||
config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
config DEFAULT_UIMAGE
|
||||
bool
|
||||
help
|
||||
|
@ -70,6 +70,8 @@ obj-$(CONFIG_PCI) += $(pci64-y) $(pci32-y)
|
||||
kexec-$(CONFIG_PPC64) := machine_kexec_64.o
|
||||
kexec-$(CONFIG_PPC32) := machine_kexec_32.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o crash.o $(kexec-y)
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
obj64-$(CONFIG_AUDIT) += compat_audit.o
|
||||
|
||||
ifeq ($(CONFIG_PPC_ISERIES),y)
|
||||
$(obj)/head_64.o: $(obj)/lparmap.s
|
||||
|
66
arch/powerpc/kernel/audit.c
Normal file
66
arch/powerpc/kernel/audit.c
Normal file
@ -0,0 +1,66 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/audit.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
static unsigned dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_PPC64
|
||||
extern int ppc32_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_PPC)
|
||||
return ppc32_classify_syscall(syscall);
|
||||
#endif
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init audit_classes_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PPC64
|
||||
extern __u32 ppc32_dir_class[];
|
||||
extern __u32 ppc32_write_class[];
|
||||
extern __u32 ppc32_read_class[];
|
||||
extern __u32 ppc32_chattr_class[];
|
||||
audit_register_class(AUDIT_CLASS_WRITE_32, ppc32_write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ_32, ppc32_read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ppc32_dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR_32, ppc32_chattr_class);
|
||||
#endif
|
||||
audit_register_class(AUDIT_CLASS_WRITE, write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ, read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(audit_classes_init);
|
38
arch/powerpc/kernel/compat_audit.c
Normal file
38
arch/powerpc/kernel/compat_audit.c
Normal file
@ -0,0 +1,38 @@
|
||||
#undef __powerpc64__
|
||||
#include <asm/unistd.h>
|
||||
|
||||
unsigned ppc32_dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ppc32_chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ppc32_write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ppc32_read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int ppc32_classify_syscall(unsigned syscall)
|
||||
{
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
@ -118,6 +118,10 @@ config SYSVIPC_COMPAT
|
||||
depends on COMPAT && SYSVIPC
|
||||
default y
|
||||
|
||||
config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
comment "Code generation options"
|
||||
|
||||
choice
|
||||
|
@ -16,9 +16,11 @@ extra-y += head.o init_task.o vmlinux.lds
|
||||
obj-$(CONFIG_MODULES) += s390_ksyms.o module.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
compat-obj-$(CONFIG_AUDIT) += compat_audit.o
|
||||
obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o \
|
||||
compat_wrapper.o compat_exec_domain.o \
|
||||
binfmt_elf32.o
|
||||
binfmt_elf32.o $(compat-obj-y)
|
||||
|
||||
obj-$(CONFIG_VIRT_TIMER) += vtime.o
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
|
66
arch/s390/kernel/audit.c
Normal file
66
arch/s390/kernel/audit.c
Normal file
@ -0,0 +1,66 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/audit.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
static unsigned dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
extern int s390_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_S390)
|
||||
return s390_classify_syscall(syscall);
|
||||
#endif
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init audit_classes_init(void)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
extern __u32 s390_dir_class[];
|
||||
extern __u32 s390_write_class[];
|
||||
extern __u32 s390_read_class[];
|
||||
extern __u32 s390_chattr_class[];
|
||||
audit_register_class(AUDIT_CLASS_WRITE_32, s390_write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ_32, s390_read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE_32, s390_dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR_32, s390_chattr_class);
|
||||
#endif
|
||||
audit_register_class(AUDIT_CLASS_WRITE, write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ, read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(audit_classes_init);
|
38
arch/s390/kernel/compat_audit.c
Normal file
38
arch/s390/kernel/compat_audit.c
Normal file
@ -0,0 +1,38 @@
|
||||
#undef __s390x__
|
||||
#include <asm/unistd.h>
|
||||
|
||||
unsigned s390_dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned s390_chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned s390_write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned s390_read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int s390_classify_syscall(unsigned syscall)
|
||||
{
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
@ -26,7 +26,6 @@ LDFLAGS += -EB -mshelf32_linux
|
||||
endif
|
||||
|
||||
# No requirements for endianess support from AFLAGS, 'as' always run through gcc
|
||||
AFLAGS += -m5 -isa=sh64 -traditional
|
||||
CFLAGS += $(cpu-y)
|
||||
|
||||
LDFLAGS_vmlinux += --defsym phys_stext=_stext-$(CONFIG_CACHED_MEMORY_OFFSET) \
|
||||
|
@ -355,6 +355,9 @@ void machine_power_off(void)
|
||||
enter_deep_standby();
|
||||
}
|
||||
|
||||
void (*pm_power_off)(void) = machine_power_off;
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
void show_regs(struct pt_regs * regs)
|
||||
{
|
||||
unsigned long long ah, al, bh, bl, ch, cl;
|
||||
|
@ -112,8 +112,10 @@ struct resource io_resources[] = {
|
||||
};
|
||||
|
||||
struct resource kram_resources[] = {
|
||||
{ "Kernel code", 0, 0 }, /* These must be last in the array */
|
||||
{ "Kernel data", 0, 0 } /* These must be last in the array */
|
||||
/* These must be last in the array */
|
||||
{ .name = "Kernel code", .start = 0, .end = 0 },
|
||||
/* These must be last in the array */
|
||||
{ .name = "Kernel data", .start = 0, .end = 0 }
|
||||
};
|
||||
|
||||
struct resource xram_resources[] = {
|
||||
|
@ -449,7 +449,9 @@ ioremap_proc_info(char *buf, char **start, off_t fpos, int length, int *eof,
|
||||
if (p + 32 >= e) /* Better than nothing */
|
||||
break;
|
||||
if ((nm = r->name) == 0) nm = "???";
|
||||
p += sprintf(p, "%08lx-%08lx: %s\n", r->start, r->end, nm);
|
||||
p += sprintf(p, "%08lx-%08lx: %s\n",
|
||||
(unsigned long)r->start,
|
||||
(unsigned long)r->end, nm);
|
||||
}
|
||||
|
||||
return p-buf;
|
||||
|
@ -219,6 +219,21 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags)
|
||||
{
|
||||
if (ARCH_SUN4C_SUN4 &&
|
||||
(len > 0x20000000 ||
|
||||
((flags & MAP_FIXED) &&
|
||||
addr < 0xe0000000 && addr + len > 0x20000000)))
|
||||
return -EINVAL;
|
||||
|
||||
/* See asm-sparc/uaccess.h */
|
||||
if (len > TASK_SIZE - PAGE_SIZE || addr + len > TASK_SIZE - PAGE_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Linux version of mmap */
|
||||
static unsigned long do_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
@ -233,25 +248,13 @@ static unsigned long do_mmap2(unsigned long addr, unsigned long len,
|
||||
goto out;
|
||||
}
|
||||
|
||||
retval = -EINVAL;
|
||||
len = PAGE_ALIGN(len);
|
||||
if (ARCH_SUN4C_SUN4 &&
|
||||
(len > 0x20000000 ||
|
||||
((flags & MAP_FIXED) &&
|
||||
addr < 0xe0000000 && addr + len > 0x20000000)))
|
||||
goto out_putf;
|
||||
|
||||
/* See asm-sparc/uaccess.h */
|
||||
if (len > TASK_SIZE - PAGE_SIZE || addr + len > TASK_SIZE - PAGE_SIZE)
|
||||
goto out_putf;
|
||||
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
out_putf:
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
|
@ -34,6 +34,10 @@ config ARCH_MAY_HAVE_PC_FDC
|
||||
bool
|
||||
default y
|
||||
|
||||
config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
choice
|
||||
prompt "Kernel page size"
|
||||
default SPARC64_PAGE_SIZE_8KB
|
||||
|
@ -25,6 +25,9 @@ obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
|
||||
obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
obj-$(CONFIG_AUDIT)$(CONFIG_SPARC32_COMPAT) += compat_audit.o
|
||||
obj-y += $(obj-yy)
|
||||
|
||||
ifdef CONFIG_SUNOS_EMUL
|
||||
obj-y += sys_sunos32.o sunos_ioctl32.o
|
||||
|
66
arch/sparc64/kernel/audit.c
Normal file
66
arch/sparc64/kernel/audit.c
Normal file
@ -0,0 +1,66 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/audit.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
static unsigned dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_SPARC32_COMPAT
|
||||
extern int sparc32_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_SPARC)
|
||||
return sparc32_classify_syscall(syscall);
|
||||
#endif
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init audit_classes_init(void)
|
||||
{
|
||||
#ifdef CONFIG_SPARC32_COMPAT
|
||||
extern __u32 sparc32_dir_class[];
|
||||
extern __u32 sparc32_write_class[];
|
||||
extern __u32 sparc32_read_class[];
|
||||
extern __u32 sparc32_chattr_class[];
|
||||
audit_register_class(AUDIT_CLASS_WRITE_32, sparc32_write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ_32, sparc32_read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE_32, sparc32_dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR_32, sparc32_chattr_class);
|
||||
#endif
|
||||
audit_register_class(AUDIT_CLASS_WRITE, write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ, read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(audit_classes_init);
|
37
arch/sparc64/kernel/compat_audit.c
Normal file
37
arch/sparc64/kernel/compat_audit.c
Normal file
@ -0,0 +1,37 @@
|
||||
#include <asm-sparc/unistd.h>
|
||||
|
||||
unsigned sparc32_dir_class[] = {
|
||||
#include <asm-generic/audit_dir_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned sparc32_chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned sparc32_write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned sparc32_read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int sparc32_classify_syscall(unsigned syscall)
|
||||
{
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
@ -548,6 +548,26 @@ asmlinkage long sparc64_personality(unsigned long personality)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int sparc64_mmap_check(unsigned long addr, unsigned long len,
|
||||
unsigned long flags)
|
||||
{
|
||||
if (test_thread_flag(TIF_32BIT)) {
|
||||
if (len >= STACK_TOP32)
|
||||
return -EINVAL;
|
||||
|
||||
if ((flags & MAP_FIXED) && addr > STACK_TOP32 - len)
|
||||
return -EINVAL;
|
||||
} else {
|
||||
if (len >= VA_EXCLUDE_START)
|
||||
return -EINVAL;
|
||||
|
||||
if ((flags & MAP_FIXED) && invalid_64bit_range(addr, len))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Linux version of mmap */
|
||||
asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
@ -563,27 +583,11 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
|
||||
}
|
||||
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
||||
len = PAGE_ALIGN(len);
|
||||
retval = -EINVAL;
|
||||
|
||||
if (test_thread_flag(TIF_32BIT)) {
|
||||
if (len >= STACK_TOP32)
|
||||
goto out_putf;
|
||||
|
||||
if ((flags & MAP_FIXED) && addr > STACK_TOP32 - len)
|
||||
goto out_putf;
|
||||
} else {
|
||||
if (len >= VA_EXCLUDE_START)
|
||||
goto out_putf;
|
||||
|
||||
if ((flags & MAP_FIXED) && invalid_64bit_range(addr, len))
|
||||
goto out_putf;
|
||||
}
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
retval = do_mmap(file, addr, len, prot, flags, off);
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
out_putf:
|
||||
if (file)
|
||||
fput(file);
|
||||
out:
|
||||
|
@ -85,6 +85,10 @@ config DMI
|
||||
bool
|
||||
default y
|
||||
|
||||
config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
source "init/Kconfig"
|
||||
|
||||
|
||||
|
@ -9,3 +9,29 @@ unsigned ia32_chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ia32_write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
unsigned ia32_read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int ia32_classify_syscall(unsigned syscall)
|
||||
{
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_socketcall:
|
||||
return 4;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -8,19 +8,54 @@ static unsigned dir_class[] = {
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned read_class[] = {
|
||||
#include <asm-generic/audit_read.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned write_class[] = {
|
||||
#include <asm-generic/audit_write.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
static unsigned chattr_class[] = {
|
||||
#include <asm-generic/audit_change_attr.h>
|
||||
~0U
|
||||
};
|
||||
|
||||
int audit_classify_syscall(int abi, unsigned syscall)
|
||||
{
|
||||
#ifdef CONFIG_IA32_EMULATION
|
||||
extern int ia32_classify_syscall(unsigned);
|
||||
if (abi == AUDIT_ARCH_I386)
|
||||
return ia32_classify_syscall(syscall);
|
||||
#endif
|
||||
switch(syscall) {
|
||||
case __NR_open:
|
||||
return 2;
|
||||
case __NR_openat:
|
||||
return 3;
|
||||
case __NR_execve:
|
||||
return 5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init audit_classes_init(void)
|
||||
{
|
||||
#ifdef CONFIG_IA32_EMULATION
|
||||
extern __u32 ia32_dir_class[];
|
||||
extern __u32 ia32_write_class[];
|
||||
extern __u32 ia32_read_class[];
|
||||
extern __u32 ia32_chattr_class[];
|
||||
audit_register_class(AUDIT_CLASS_WRITE_32, ia32_write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ_32, ia32_read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE_32, ia32_dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR_32, ia32_chattr_class);
|
||||
#endif
|
||||
audit_register_class(AUDIT_CLASS_WRITE, write_class);
|
||||
audit_register_class(AUDIT_CLASS_READ, read_class);
|
||||
audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
|
||||
audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
|
||||
return 0;
|
||||
|
@ -376,6 +376,8 @@ static int proc_ide_read_media
|
||||
break;
|
||||
case ide_floppy:media = "floppy\n";
|
||||
break;
|
||||
case ide_optical:media = "optical\n";
|
||||
break;
|
||||
default: media = "UNKNOWN\n";
|
||||
break;
|
||||
}
|
||||
|
@ -425,12 +425,12 @@ static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_devi
|
||||
return d->init_setup(dev, d);
|
||||
}
|
||||
|
||||
static const struct pci_device_id aec62xx_pci_tbl[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP850UF), 0 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860), 1 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860R), 2 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865), 3 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865R), 4 },
|
||||
static struct pci_device_id aec62xx_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP850UF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||
{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
|
||||
{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP860R, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
|
||||
{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
|
||||
{ PCI_VENDOR_ID_ARTOP, PCI_DEVICE_ID_ARTOP_ATP865R, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
|
||||
{ 0, },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, aec62xx_pci_tbl);
|
||||
|
@ -649,11 +649,11 @@ static int __devinit svwks_init_one(struct pci_dev *dev, const struct pci_device
|
||||
}
|
||||
|
||||
static struct pci_device_id svwks_pci_tbl[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE), 0},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE), 1},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE), 2},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2), 3},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE), 4},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3},
|
||||
{ PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4},
|
||||
{ 0, },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, svwks_pci_tbl);
|
||||
|
@ -1082,10 +1082,10 @@ static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_devi
|
||||
}
|
||||
|
||||
static struct pci_device_id siimage_pci_tbl[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680), 0},
|
||||
{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
#ifdef CONFIG_BLK_DEV_IDE_SATA
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112), 1},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA), 2},
|
||||
{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},
|
||||
{ PCI_VENDOR_ID_CMD, PCI_DEVICE_ID_SII_1210SA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2},
|
||||
#endif
|
||||
{ 0, },
|
||||
};
|
||||
|
@ -86,6 +86,8 @@ static const struct {
|
||||
u8 chipset_family;
|
||||
u8 flags;
|
||||
} SiSHostChipInfo[] = {
|
||||
{ "SiS968", PCI_DEVICE_ID_SI_968, ATA_133 },
|
||||
{ "SiS966", PCI_DEVICE_ID_SI_966, ATA_133 },
|
||||
{ "SiS965", PCI_DEVICE_ID_SI_965, ATA_133 },
|
||||
{ "SiS745", PCI_DEVICE_ID_SI_745, ATA_100 },
|
||||
{ "SiS735", PCI_DEVICE_ID_SI_735, ATA_100 },
|
||||
|
@ -53,7 +53,7 @@ config VIDEO_V4L1_COMPAT
|
||||
If you are unsure as to whether this is required, answer Y.
|
||||
|
||||
config VIDEO_V4L2
|
||||
tristate
|
||||
bool
|
||||
default y
|
||||
|
||||
source "drivers/media/video/Kconfig"
|
||||
|
@ -1190,6 +1190,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
|
||||
}
|
||||
return err;
|
||||
}
|
||||
#ifdef CONFIG_VIDEO_V4L1_COMPAT
|
||||
case VIDIOCGMBUF:
|
||||
{
|
||||
struct video_mbuf *mbuf = arg;
|
||||
@ -1218,6 +1219,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
|
||||
mutex_unlock(&q->lock);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
return v4l_compat_translate_ioctl(inode,file,cmd,arg,
|
||||
saa7146_video_do_ioctl);
|
||||
|
@ -1,6 +1,7 @@
|
||||
config DVB_B2C2_FLEXCOP
|
||||
tristate "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters"
|
||||
depends on DVB_CORE && I2C
|
||||
select DVB_PLL
|
||||
select DVB_STV0299
|
||||
select DVB_MT352
|
||||
select DVB_MT312
|
||||
|
@ -1,6 +1,7 @@
|
||||
config DVB_BT8XX
|
||||
tristate "BT8xx based PCI cards"
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_BT848
|
||||
select DVB_PLL
|
||||
select DVB_MT352
|
||||
select DVB_SP887X
|
||||
select DVB_NXT6000
|
||||
|
@ -2,6 +2,7 @@ config DVB_USB
|
||||
tristate "Support for various USB DVB devices"
|
||||
depends on DVB_CORE && USB && I2C
|
||||
select FW_LOADER
|
||||
select DVB_PLL
|
||||
help
|
||||
By enabling this you will be able to choose the various supported
|
||||
USB1.1 and USB2.0 DVB devices.
|
||||
|
@ -6,43 +6,43 @@ comment "DVB-S (satellite) frontends"
|
||||
|
||||
config DVB_STV0299
|
||||
tristate "ST STV0299 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_CX24110
|
||||
tristate "Conexant CX24110 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_CX24123
|
||||
tristate "Conexant CX24123 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_TDA8083
|
||||
tristate "Philips TDA8083 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_MT312
|
||||
tristate "Zarlink VP310/MT312 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_VES1X93
|
||||
tristate "VLSI VES1893 or VES1993 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_S5H1420
|
||||
tristate "Samsung S5H1420 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-S tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
@ -51,7 +51,7 @@ comment "DVB-T (terrestrial) frontends"
|
||||
|
||||
config DVB_SP8870
|
||||
tristate "Spase sp8870 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
@ -63,7 +63,7 @@ config DVB_SP8870
|
||||
|
||||
config DVB_SP887X
|
||||
tristate "Spase sp887x based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
@ -75,25 +75,25 @@ config DVB_SP887X
|
||||
|
||||
config DVB_CX22700
|
||||
tristate "Conexant CX22700 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_CX22702
|
||||
tristate "Conexant cx22702 demodulator (OFDM)"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_L64781
|
||||
tristate "LSI L64781"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_TDA1004X
|
||||
tristate "Philips TDA10045H/TDA10046H based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
@ -106,32 +106,32 @@ config DVB_TDA1004X
|
||||
|
||||
config DVB_NXT6000
|
||||
tristate "NxtWave Communications NXT6000 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_MT352
|
||||
tristate "Zarlink MT352 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_ZL10353
|
||||
tristate "Zarlink ZL10353 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_DIB3000MB
|
||||
tristate "DiBcom 3000M-B"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Designed for mobile usage. Say Y when you want
|
||||
to support this frontend.
|
||||
|
||||
config DVB_DIB3000MC
|
||||
tristate "DiBcom 3000P/M-C"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-T tuner module. Designed for mobile usage. Say Y when you want
|
||||
to support this frontend.
|
||||
@ -141,19 +141,19 @@ comment "DVB-C (cable) frontends"
|
||||
|
||||
config DVB_VES1820
|
||||
tristate "VLSI VES1820 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-C tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_TDA10021
|
||||
tristate "Philips TDA10021 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-C tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
config DVB_STV0297
|
||||
tristate "ST STV0297 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
A DVB-C tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
@ -162,7 +162,7 @@ comment "ATSC (North American/Korean Terrestrial/Cable DTV) frontends"
|
||||
|
||||
config DVB_NXT200X
|
||||
tristate "NxtWave Communications NXT2002/NXT2004 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
|
||||
@ -176,7 +176,7 @@ config DVB_NXT200X
|
||||
|
||||
config DVB_OR51211
|
||||
tristate "Oren OR51211 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
An ATSC 8VSB tuner module. Say Y when you want to support this frontend.
|
||||
@ -188,7 +188,7 @@ config DVB_OR51211
|
||||
|
||||
config DVB_OR51132
|
||||
tristate "Oren OR51132 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
|
||||
@ -203,7 +203,7 @@ config DVB_OR51132
|
||||
|
||||
config DVB_BCM3510
|
||||
tristate "Broadcom BCM3510"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
select FW_LOADER
|
||||
help
|
||||
An ATSC 8VSB/16VSB and QAM64/256 tuner module. Say Y when you want to
|
||||
@ -211,7 +211,7 @@ config DVB_BCM3510
|
||||
|
||||
config DVB_LGDT330X
|
||||
tristate "LG Electronics LGDT3302/LGDT3303 based"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
|
||||
to support this frontend.
|
||||
@ -220,15 +220,19 @@ config DVB_LGDT330X
|
||||
comment "Miscellaneous devices"
|
||||
depends on DVB_CORE
|
||||
|
||||
config DVB_PLL
|
||||
tristate
|
||||
depends on DVB_CORE && I2C
|
||||
|
||||
config DVB_LNBP21
|
||||
tristate "LNBP21 SEC controller"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
An SEC control chip.
|
||||
|
||||
config DVB_ISL6421
|
||||
tristate "ISL6421 SEC controller"
|
||||
depends on DVB_CORE
|
||||
depends on DVB_CORE && I2C
|
||||
help
|
||||
An SEC control chip.
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
|
||||
|
||||
obj-$(CONFIG_DVB_CORE) += dvb-pll.o
|
||||
obj-$(CONFIG_DVB_PLL) += dvb-pll.o
|
||||
obj-$(CONFIG_DVB_STV0299) += stv0299.o
|
||||
obj-$(CONFIG_DVB_SP8870) += sp8870.o
|
||||
obj-$(CONFIG_DVB_CX22700) += cx22700.o
|
||||
|
@ -2,6 +2,7 @@ config DVB_PLUTO2
|
||||
tristate "Pluto2 cards"
|
||||
depends on DVB_CORE && PCI && I2C
|
||||
select I2C_ALGOBIT
|
||||
select DVB_PLL
|
||||
select DVB_TDA1004X
|
||||
help
|
||||
Support for PCI cards based on the Pluto2 FPGA like the Satelco
|
||||
|
@ -3,6 +3,7 @@ config DVB_AV7110
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
|
||||
select FW_LOADER
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_PLL
|
||||
select DVB_VES1820
|
||||
select DVB_VES1X93
|
||||
select DVB_STV0299
|
||||
@ -61,6 +62,7 @@ config DVB_BUDGET
|
||||
tristate "Budget cards"
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
|
||||
select VIDEO_SAA7146
|
||||
select DVB_PLL
|
||||
select DVB_STV0299
|
||||
select DVB_VES1X93
|
||||
select DVB_VES1820
|
||||
@ -83,6 +85,7 @@ config DVB_BUDGET_CI
|
||||
tristate "Budget cards with onboard CI connector"
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
|
||||
select VIDEO_SAA7146
|
||||
select DVB_PLL
|
||||
select DVB_STV0297
|
||||
select DVB_STV0299
|
||||
select DVB_TDA1004X
|
||||
@ -104,6 +107,7 @@ config DVB_BUDGET_AV
|
||||
tristate "Budget cards with analog video inputs"
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_PLL
|
||||
select DVB_STV0299
|
||||
select DVB_TDA1004X
|
||||
select DVB_TDA10021
|
||||
@ -122,6 +126,7 @@ config DVB_BUDGET_PATCH
|
||||
tristate "AV7110 cards with Budget Patch"
|
||||
depends on DVB_CORE && DVB_BUDGET && VIDEO_V4L1
|
||||
select DVB_AV7110
|
||||
select DVB_PLL
|
||||
select DVB_STV0299
|
||||
select DVB_VES1X93
|
||||
select DVB_TDA8083
|
||||
|
@ -1,6 +1,7 @@
|
||||
config DVB_TTUSB_BUDGET
|
||||
tristate "Technotrend/Hauppauge Nova-USB devices"
|
||||
depends on DVB_CORE && USB
|
||||
depends on DVB_CORE && USB && I2C
|
||||
select DVB_PLL
|
||||
select DVB_CX22700
|
||||
select DVB_TDA1004X
|
||||
select DVB_VES1820
|
||||
|
@ -260,7 +260,7 @@ source "drivers/media/video/saa7134/Kconfig"
|
||||
|
||||
config VIDEO_MXB
|
||||
tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
|
||||
depends on PCI && VIDEO_V4L1
|
||||
depends on PCI && VIDEO_V4L1 && I2C
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_TUNER
|
||||
---help---
|
||||
@ -272,7 +272,7 @@ config VIDEO_MXB
|
||||
|
||||
config VIDEO_DPC
|
||||
tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
|
||||
depends on PCI && VIDEO_V4L1
|
||||
depends on PCI && VIDEO_V4L1 && I2C
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
@ -287,7 +287,7 @@ config VIDEO_DPC
|
||||
|
||||
config VIDEO_HEXIUM_ORION
|
||||
tristate "Hexium HV-PCI6 and Orion frame grabber"
|
||||
depends on PCI && VIDEO_V4L1
|
||||
depends on PCI && VIDEO_V4L1 && I2C
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
@ -299,7 +299,7 @@ config VIDEO_HEXIUM_ORION
|
||||
|
||||
config VIDEO_HEXIUM_GEMINI
|
||||
tristate "Hexium Gemini frame grabber"
|
||||
depends on PCI && VIDEO_V4L1
|
||||
depends on PCI && VIDEO_V4L1 && I2C
|
||||
select VIDEO_SAA7146_VV
|
||||
select VIDEO_V4L2
|
||||
---help---
|
||||
|
@ -303,6 +303,7 @@ int bttv_input_init(struct bttv *btv)
|
||||
ir->mask_keyup = 0x010000;
|
||||
ir->polling = 50; // ms
|
||||
break;
|
||||
case BTTV_BOARD_PV_M4900:
|
||||
case BTTV_BOARD_PV_BT878P_9B:
|
||||
case BTTV_BOARD_PV_BT878P_PLUS:
|
||||
ir_codes = ir_codes_pixelview;
|
||||
|
@ -51,6 +51,7 @@ config VIDEO_CX88_DVB
|
||||
tristate "DVB/ATSC Support for cx2388x based TV cards"
|
||||
depends on VIDEO_CX88 && DVB_CORE
|
||||
select VIDEO_BUF_DVB
|
||||
select DVB_PLL
|
||||
---help---
|
||||
This adds support for DVB/ATSC cards based on the
|
||||
Conexant 2388x chip.
|
||||
|
@ -40,6 +40,7 @@ config VIDEO_SAA7134_DVB
|
||||
depends on VIDEO_SAA7134 && DVB_CORE
|
||||
select VIDEO_BUF_DVB
|
||||
select FW_LOADER
|
||||
select DVB_PLL
|
||||
---help---
|
||||
This adds support for DVB cards based on the
|
||||
Philips saa7134 chip.
|
||||
|
@ -926,11 +926,17 @@ static struct tuner_params tuner_lg_tdvs_h06xf_params[] = {
|
||||
|
||||
/* ------------ TUNER_YMEC_TVF66T5_B_DFF - Philips PAL ------------ */
|
||||
|
||||
static struct tuner_range tuner_ymec_tvf66t5_b_dff_pal_ranges[] = {
|
||||
{ 16 * 160.25 /*MHz*/, 0x8e, 0x01, },
|
||||
{ 16 * 464.25 /*MHz*/, 0x8e, 0x02, },
|
||||
{ 16 * 999.99 , 0x8e, 0x08, },
|
||||
};
|
||||
|
||||
static struct tuner_params tuner_ymec_tvf66t5_b_dff_params[] = {
|
||||
{
|
||||
.type = TUNER_PARAM_TYPE_PAL,
|
||||
.ranges = tuner_tena_9533_di_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_tena_9533_di_pal_ranges),
|
||||
.ranges = tuner_ymec_tvf66t5_b_dff_pal_ranges,
|
||||
.count = ARRAY_SIZE(tuner_ymec_tvf66t5_b_dff_pal_ranges),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -267,7 +267,7 @@ struct zoran_v4l_settings {
|
||||
};
|
||||
|
||||
/* whoops, this one is undeclared if !v4l2 */
|
||||
#ifndef HAVE_V4L2
|
||||
#ifndef CONFIG_VIDEO_V4L2
|
||||
struct v4l2_jpegcompression {
|
||||
int quality;
|
||||
int APPn;
|
||||
|
@ -86,7 +86,7 @@
|
||||
#include "zoran_device.h"
|
||||
#include "zoran_card.h"
|
||||
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
/* we declare some card type definitions here, they mean
|
||||
* the same as the v4l1 ZORAN_VID_TYPE above, except it's v4l2 */
|
||||
#define ZORAN_V4L2_VID_FLAGS ( \
|
||||
@ -103,7 +103,7 @@ const struct zoran_format zoran_formats[] = {
|
||||
{
|
||||
.name = "15-bit RGB",
|
||||
.palette = VIDEO_PALETTE_RGB555,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
.fourcc = V4L2_PIX_FMT_RGB555,
|
||||
#else
|
||||
@ -117,7 +117,7 @@ const struct zoran_format zoran_formats[] = {
|
||||
}, {
|
||||
.name = "16-bit RGB",
|
||||
.palette = VIDEO_PALETTE_RGB565,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
.fourcc = V4L2_PIX_FMT_RGB565,
|
||||
#else
|
||||
@ -131,7 +131,7 @@ const struct zoran_format zoran_formats[] = {
|
||||
}, {
|
||||
.name = "24-bit RGB",
|
||||
.palette = VIDEO_PALETTE_RGB24,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
.fourcc = V4L2_PIX_FMT_BGR24,
|
||||
#else
|
||||
@ -145,7 +145,7 @@ const struct zoran_format zoran_formats[] = {
|
||||
}, {
|
||||
.name = "32-bit RGB",
|
||||
.palette = VIDEO_PALETTE_RGB32,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
.fourcc = V4L2_PIX_FMT_BGR32,
|
||||
#else
|
||||
@ -159,7 +159,7 @@ const struct zoran_format zoran_formats[] = {
|
||||
}, {
|
||||
.name = "4:2:2, packed, YUYV",
|
||||
.palette = VIDEO_PALETTE_YUV422,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
.fourcc = V4L2_PIX_FMT_YUYV,
|
||||
.colorspace = V4L2_COLORSPACE_SMPTE170M,
|
||||
#endif
|
||||
@ -169,7 +169,7 @@ const struct zoran_format zoran_formats[] = {
|
||||
}, {
|
||||
.name = "Hardware-encoded Motion-JPEG",
|
||||
.palette = -1,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
.fourcc = V4L2_PIX_FMT_MJPEG,
|
||||
.colorspace = V4L2_COLORSPACE_SMPTE170M,
|
||||
#endif
|
||||
@ -210,7 +210,7 @@ static int lock_norm = 0; /* 1=Don't change TV standard (norm) */
|
||||
module_param(lock_norm, int, 0);
|
||||
MODULE_PARM_DESC(lock_norm, "Users can't change norm");
|
||||
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
/* small helper function for calculating buffersizes for v4l2
|
||||
* we calculate the nearest higher power-of-two, which
|
||||
* will be the recommended buffersize */
|
||||
@ -1761,7 +1761,7 @@ setup_overlay (struct file *file,
|
||||
return wait_grab_pending(zr);
|
||||
}
|
||||
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
/* get the status of a buffer in the clients buffer queue */
|
||||
static int
|
||||
zoran_v4l2_buffer_status (struct file *file,
|
||||
@ -2676,7 +2676,7 @@ zoran_do_ioctl (struct inode *inode,
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
|
||||
/* The new video4linux2 capture interface - much nicer than video4linux1, since
|
||||
* it allows for integrating the JPEG capturing calls inside standard v4l2
|
||||
@ -4689,7 +4689,7 @@ static struct file_operations zoran_fops = {
|
||||
struct video_device zoran_template __devinitdata = {
|
||||
.name = ZORAN_NAME,
|
||||
.type = ZORAN_VID_TYPE,
|
||||
#ifdef HAVE_V4L2
|
||||
#ifdef CONFIG_VIDEO_V4L2
|
||||
.type2 = ZORAN_V4L2_VID_FLAGS,
|
||||
#endif
|
||||
.hardware = ZORAN_HARDWARE,
|
||||
|
@ -91,6 +91,8 @@ struct imxmci_host {
|
||||
int dma_allocated;
|
||||
|
||||
unsigned char actual_bus_width;
|
||||
|
||||
int prev_cmd_code;
|
||||
};
|
||||
|
||||
#define IMXMCI_PEND_IRQ_b 0
|
||||
@ -248,16 +250,14 @@ static void imxmci_setup_data(struct imxmci_host *host, struct mmc_data *data)
|
||||
* partial FIFO fills and reads. The length has to be rounded up to burst size multiple.
|
||||
* This is required for SCR read at least.
|
||||
*/
|
||||
if (datasz < 64) {
|
||||
if (datasz < 512) {
|
||||
host->dma_size = datasz;
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
host->dma_dir = DMA_FROM_DEVICE;
|
||||
|
||||
/* Hack to enable read SCR */
|
||||
if(datasz < 16) {
|
||||
MMC_NOB = 1;
|
||||
MMC_BLK_LEN = 16;
|
||||
}
|
||||
MMC_NOB = 1;
|
||||
MMC_BLK_LEN = 512;
|
||||
} else {
|
||||
host->dma_dir = DMA_TO_DEVICE;
|
||||
}
|
||||
@ -409,6 +409,9 @@ static void imxmci_finish_request(struct imxmci_host *host, struct mmc_request *
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
|
||||
if(req && req->cmd)
|
||||
host->prev_cmd_code = req->cmd->opcode;
|
||||
|
||||
host->req = NULL;
|
||||
host->cmd = NULL;
|
||||
host->data = NULL;
|
||||
@ -553,7 +556,6 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat)
|
||||
{
|
||||
int i;
|
||||
int burst_len;
|
||||
int flush_len;
|
||||
int trans_done = 0;
|
||||
unsigned int stat = *pstat;
|
||||
|
||||
@ -566,44 +568,43 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat)
|
||||
dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data running STATUS = 0x%x\n",
|
||||
stat);
|
||||
|
||||
udelay(20); /* required for clocks < 8MHz*/
|
||||
|
||||
if(host->dma_dir == DMA_FROM_DEVICE) {
|
||||
imxmci_busy_wait_for_status(host, &stat,
|
||||
STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE,
|
||||
20, "imxmci_cpu_driven_data read");
|
||||
50, "imxmci_cpu_driven_data read");
|
||||
|
||||
while((stat & (STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE)) &&
|
||||
(host->data_cnt < host->dma_size)) {
|
||||
if(burst_len >= host->dma_size - host->data_cnt) {
|
||||
flush_len = burst_len;
|
||||
burst_len = host->dma_size - host->data_cnt;
|
||||
flush_len -= burst_len;
|
||||
host->data_cnt = host->dma_size;
|
||||
trans_done = 1;
|
||||
} else {
|
||||
flush_len = 0;
|
||||
host->data_cnt += burst_len;
|
||||
}
|
||||
(host->data_cnt < 512)) {
|
||||
|
||||
udelay(20); /* required for clocks < 8MHz*/
|
||||
|
||||
for(i = burst_len; i>=2 ; i-=2) {
|
||||
*(host->data_ptr++) = MMC_BUFFER_ACCESS;
|
||||
udelay(20); /* required for clocks < 8MHz*/
|
||||
u16 data;
|
||||
data = MMC_BUFFER_ACCESS;
|
||||
udelay(10); /* required for clocks < 8MHz*/
|
||||
if(host->data_cnt+2 <= host->dma_size) {
|
||||
*(host->data_ptr++) = data;
|
||||
} else {
|
||||
if(host->data_cnt < host->dma_size)
|
||||
*(u8*)(host->data_ptr) = data;
|
||||
}
|
||||
host->data_cnt += 2;
|
||||
}
|
||||
|
||||
if(i == 1)
|
||||
*(u8*)(host->data_ptr) = MMC_BUFFER_ACCESS;
|
||||
|
||||
stat = MMC_STATUS;
|
||||
|
||||
/* Flush extra bytes from FIFO */
|
||||
while(flush_len && !(stat & STATUS_DATA_TRANS_DONE)){
|
||||
i = MMC_BUFFER_ACCESS;
|
||||
stat = MMC_STATUS;
|
||||
stat &= ~STATUS_CRC_READ_ERR; /* Stupid but required there */
|
||||
}
|
||||
|
||||
dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data read burst %d STATUS = 0x%x\n",
|
||||
burst_len, stat);
|
||||
dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data read %d burst %d STATUS = 0x%x\n",
|
||||
host->data_cnt, burst_len, stat);
|
||||
}
|
||||
|
||||
if((stat & STATUS_DATA_TRANS_DONE) && (host->data_cnt >= 512))
|
||||
trans_done = 1;
|
||||
|
||||
if(host->dma_size & 0x1ff)
|
||||
stat &= ~STATUS_CRC_READ_ERR;
|
||||
|
||||
} else {
|
||||
imxmci_busy_wait_for_status(host, &stat,
|
||||
STATUS_APPL_BUFF_FE,
|
||||
@ -692,8 +693,8 @@ static void imxmci_tasklet_fnc(unsigned long data)
|
||||
what, stat, MMC_INT_MASK);
|
||||
dev_err(mmc_dev(host->mmc), "CMD_DAT_CONT = 0x%04x, MMC_BLK_LEN = 0x%04x, MMC_NOB = 0x%04x, DMA_CCR = 0x%08x\n",
|
||||
MMC_CMD_DAT_CONT, MMC_BLK_LEN, MMC_NOB, CCR(host->dma));
|
||||
dev_err(mmc_dev(host->mmc), "CMD%d, bus %d-bit, dma_size = 0x%x\n",
|
||||
host->cmd?host->cmd->opcode:0, 1<<host->actual_bus_width, host->dma_size);
|
||||
dev_err(mmc_dev(host->mmc), "CMD%d, prevCMD%d, bus %d-bit, dma_size = 0x%x\n",
|
||||
host->cmd?host->cmd->opcode:0, host->prev_cmd_code, 1<<host->actual_bus_width, host->dma_size);
|
||||
}
|
||||
|
||||
if(!host->present || timeout)
|
||||
|
@ -247,6 +247,55 @@ int mmc_wait_for_app_cmd(struct mmc_host *host, unsigned int rca,
|
||||
|
||||
EXPORT_SYMBOL(mmc_wait_for_app_cmd);
|
||||
|
||||
/**
|
||||
* mmc_set_data_timeout - set the timeout for a data command
|
||||
* @data: data phase for command
|
||||
* @card: the MMC card associated with the data transfer
|
||||
* @write: flag to differentiate reads from writes
|
||||
*/
|
||||
void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card,
|
||||
int write)
|
||||
{
|
||||
unsigned int mult;
|
||||
|
||||
/*
|
||||
* SD cards use a 100 multiplier rather than 10
|
||||
*/
|
||||
mult = mmc_card_sd(card) ? 100 : 10;
|
||||
|
||||
/*
|
||||
* Scale up the multiplier (and therefore the timeout) by
|
||||
* the r2w factor for writes.
|
||||
*/
|
||||
if (write)
|
||||
mult <<= card->csd.r2w_factor;
|
||||
|
||||
data->timeout_ns = card->csd.tacc_ns * mult;
|
||||
data->timeout_clks = card->csd.tacc_clks * mult;
|
||||
|
||||
/*
|
||||
* SD cards also have an upper limit on the timeout.
|
||||
*/
|
||||
if (mmc_card_sd(card)) {
|
||||
unsigned int timeout_us, limit_us;
|
||||
|
||||
timeout_us = data->timeout_ns / 1000;
|
||||
timeout_us += data->timeout_clks * 1000 /
|
||||
(card->host->ios.clock / 1000);
|
||||
|
||||
if (write)
|
||||
limit_us = 250000;
|
||||
else
|
||||
limit_us = 100000;
|
||||
|
||||
if (timeout_us > limit_us) {
|
||||
data->timeout_ns = limit_us * 1000;
|
||||
data->timeout_clks = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mmc_set_data_timeout);
|
||||
|
||||
static int mmc_select_card(struct mmc_host *host, struct mmc_card *card);
|
||||
|
||||
/**
|
||||
@ -908,11 +957,9 @@ static void mmc_read_scrs(struct mmc_host *host)
|
||||
{
|
||||
int err;
|
||||
struct mmc_card *card;
|
||||
|
||||
struct mmc_request mrq;
|
||||
struct mmc_command cmd;
|
||||
struct mmc_data data;
|
||||
|
||||
struct scatterlist sg;
|
||||
|
||||
list_for_each_entry(card, &host->cards, node) {
|
||||
@ -947,8 +994,8 @@ static void mmc_read_scrs(struct mmc_host *host)
|
||||
|
||||
memset(&data, 0, sizeof(struct mmc_data));
|
||||
|
||||
data.timeout_ns = card->csd.tacc_ns * 10;
|
||||
data.timeout_clks = card->csd.tacc_clks * 10;
|
||||
mmc_set_data_timeout(&data, card, 0);
|
||||
|
||||
data.blksz_bits = 3;
|
||||
data.blksz = 1 << 3;
|
||||
data.blocks = 1;
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/protocol.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
@ -171,8 +172,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||
|
||||
brq.cmd.arg = req->sector << 9;
|
||||
brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
|
||||
brq.data.timeout_ns = card->csd.tacc_ns * 10;
|
||||
brq.data.timeout_clks = card->csd.tacc_clks * 10;
|
||||
brq.data.blksz_bits = md->block_bits;
|
||||
brq.data.blksz = 1 << md->block_bits;
|
||||
brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
|
||||
@ -180,6 +179,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||
brq.stop.arg = 0;
|
||||
brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
|
||||
|
||||
mmc_set_data_timeout(&brq.data, card, rq_data_dir(req) != READ);
|
||||
|
||||
if (rq_data_dir(req) == READ) {
|
||||
brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
|
||||
brq.data.flags |= MMC_DATA_READ;
|
||||
@ -187,12 +188,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||
brq.cmd.opcode = MMC_WRITE_BLOCK;
|
||||
brq.data.flags |= MMC_DATA_WRITE;
|
||||
brq.data.blocks = 1;
|
||||
|
||||
/*
|
||||
* Scale up the timeout by the r2w factor
|
||||
*/
|
||||
brq.data.timeout_ns <<= card->csd.r2w_factor;
|
||||
brq.data.timeout_clks <<= card->csd.r2w_factor;
|
||||
}
|
||||
|
||||
if (brq.data.blocks > 1) {
|
||||
@ -324,52 +319,11 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
|
||||
md->read_only = mmc_blk_readonly(card);
|
||||
|
||||
/*
|
||||
* Figure out a workable block size. MMC cards have:
|
||||
* - two block sizes, one for read and one for write.
|
||||
* - may support partial reads and/or writes
|
||||
* (allows block sizes smaller than specified)
|
||||
* Both SD and MMC specifications state (although a bit
|
||||
* unclearly in the MMC case) that a block size of 512
|
||||
* bytes must always be supported by the card.
|
||||
*/
|
||||
md->block_bits = card->csd.read_blkbits;
|
||||
if (card->csd.write_blkbits != card->csd.read_blkbits) {
|
||||
if (card->csd.write_blkbits < card->csd.read_blkbits &&
|
||||
card->csd.read_partial) {
|
||||
/*
|
||||
* write block size is smaller than read block
|
||||
* size, but we support partial reads, so choose
|
||||
* the smaller write block size.
|
||||
*/
|
||||
md->block_bits = card->csd.write_blkbits;
|
||||
} else if (card->csd.write_blkbits > card->csd.read_blkbits &&
|
||||
card->csd.write_partial) {
|
||||
/*
|
||||
* read block size is smaller than write block
|
||||
* size, but we support partial writes. Use read
|
||||
* block size.
|
||||
*/
|
||||
} else {
|
||||
/*
|
||||
* We don't support this configuration for writes.
|
||||
*/
|
||||
printk(KERN_ERR "%s: unable to select block size for "
|
||||
"writing (rb%u wb%u rp%u wp%u)\n",
|
||||
mmc_card_id(card),
|
||||
1 << card->csd.read_blkbits,
|
||||
1 << card->csd.write_blkbits,
|
||||
card->csd.read_partial,
|
||||
card->csd.write_partial);
|
||||
md->read_only = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Refuse to allow block sizes smaller than 512 bytes.
|
||||
*/
|
||||
if (md->block_bits < 9) {
|
||||
printk(KERN_ERR "%s: unable to support block size %u\n",
|
||||
mmc_card_id(card), 1 << md->block_bits);
|
||||
ret = -EINVAL;
|
||||
goto err_kfree;
|
||||
}
|
||||
md->block_bits = 9;
|
||||
|
||||
md->disk = alloc_disk(1 << MMC_SHIFT);
|
||||
if (md->disk == NULL) {
|
||||
|
@ -2393,7 +2393,7 @@ config MYRI10GE
|
||||
you will need a newer firmware image.
|
||||
You may get this image or more information, at:
|
||||
|
||||
<http://www.myri.com/Myri-10G/>
|
||||
<http://www.myri.com/scs/download-Myri10GE.html>
|
||||
|
||||
To compile this driver as a module, choose M here and read
|
||||
<file:Documentation/networking/net-modules.txt>. The module
|
||||
|
@ -377,8 +377,8 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db)
|
||||
kfree(db->data_req);
|
||||
}
|
||||
|
||||
if (db->addr_res != NULL) {
|
||||
release_resource(db->addr_res);
|
||||
if (db->addr_req != NULL) {
|
||||
release_resource(db->addr_req);
|
||||
kfree(db->addr_req);
|
||||
}
|
||||
}
|
||||
|
@ -123,7 +123,8 @@ enum {
|
||||
ich6_sata = 4,
|
||||
ich6_sata_ahci = 5,
|
||||
ich6m_sata_ahci = 6,
|
||||
ich8_sata_ahci = 7,
|
||||
ich7m_sata_ahci = 7,
|
||||
ich8_sata_ahci = 8,
|
||||
|
||||
/* constants for mapping table */
|
||||
P0 = 0, /* port 0 */
|
||||
@ -188,7 +189,7 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
||||
/* 82801GB/GR/GH (ICH7, identical to ICH6) */
|
||||
{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
|
||||
/* 2801GBM/GHM (ICH7M, identical to ICH6M) */
|
||||
{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
|
||||
{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7m_sata_ahci },
|
||||
/* Enterprise Southbridge 2 (where's the datasheet?) */
|
||||
{ 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
|
||||
/* SATA Controller 1 IDE (ICH8, no datasheet yet) */
|
||||
@ -336,6 +337,24 @@ static const struct piix_map_db ich6m_map_db = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct piix_map_db ich7m_map_db = {
|
||||
.mask = 0x3,
|
||||
.port_enable = 0x5,
|
||||
.present_shift = 4,
|
||||
|
||||
/* Map 01b isn't specified in the doc but some notebooks use
|
||||
* it anyway. ATM, the only case spotted carries subsystem ID
|
||||
* 1025:0107. This is the only difference from ich6m.
|
||||
*/
|
||||
.map = {
|
||||
/* PM PS SM SS MAP */
|
||||
{ P0, P2, RV, RV }, /* 00b */
|
||||
{ IDE, IDE, P1, P3 }, /* 01b */
|
||||
{ P0, P2, IDE, IDE }, /* 10b */
|
||||
{ RV, RV, RV, RV },
|
||||
},
|
||||
};
|
||||
|
||||
static const struct piix_map_db ich8_map_db = {
|
||||
.mask = 0x3,
|
||||
.port_enable = 0x3,
|
||||
@ -355,6 +374,7 @@ static const struct piix_map_db *piix_map_db_table[] = {
|
||||
[ich6_sata] = &ich6_map_db,
|
||||
[ich6_sata_ahci] = &ich6_map_db,
|
||||
[ich6m_sata_ahci] = &ich6m_map_db,
|
||||
[ich7m_sata_ahci] = &ich7m_map_db,
|
||||
[ich8_sata_ahci] = &ich8_map_db,
|
||||
};
|
||||
|
||||
@ -444,6 +464,18 @@ static struct ata_port_info piix_port_info[] = {
|
||||
.port_ops = &piix_sata_ops,
|
||||
},
|
||||
|
||||
/* ich7m_sata_ahci */
|
||||
{
|
||||
.sht = &piix_sht,
|
||||
.host_flags = ATA_FLAG_SATA |
|
||||
PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
|
||||
PIIX_FLAG_AHCI,
|
||||
.pio_mask = 0x1f, /* pio0-4 */
|
||||
.mwdma_mask = 0x07, /* mwdma0-2 */
|
||||
.udma_mask = 0x7f, /* udma0-6 */
|
||||
.port_ops = &piix_sata_ops,
|
||||
},
|
||||
|
||||
/* ich8_sata_ahci */
|
||||
{
|
||||
.sht = &piix_sht,
|
||||
|
@ -1961,8 +1961,7 @@ comreset_retry:
|
||||
timeout = jiffies + msecs_to_jiffies(200);
|
||||
do {
|
||||
sata_scr_read(ap, SCR_STATUS, &sstatus);
|
||||
sstatus &= 0x3;
|
||||
if ((sstatus == 3) || (sstatus == 0))
|
||||
if (((sstatus & 0x3) == 3) || ((sstatus & 0x3) == 0))
|
||||
break;
|
||||
|
||||
__msleep(1, can_sleep);
|
||||
|
@ -77,6 +77,7 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
|
||||
static void vt6420_error_handler(struct ata_port *ap);
|
||||
|
||||
static const struct pci_device_id svia_pci_tbl[] = {
|
||||
{ 0x1106, 0x0591, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
|
||||
{ 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
|
||||
{ 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
|
||||
|
||||
|
@ -1579,7 +1579,7 @@ static int __init serial_console_setup(struct console *co, char *options)
|
||||
h8300_sci_enable(port, sci_enable);
|
||||
#endif
|
||||
#elif defined(CONFIG_SUPERH64)
|
||||
port->uartclk = current_cpu_info.module_clock * 16;
|
||||
port->uartclk = current_cpu_data.module_clock * 16;
|
||||
#else
|
||||
{
|
||||
struct clk *clk = clk_get("module_clk");
|
||||
@ -1720,7 +1720,7 @@ static int __init sci_init(void)
|
||||
#if defined(__H8300H__) || defined(__H8300S__)
|
||||
sciport->port.uartclk = CONFIG_CPU_CLOCK;
|
||||
#elif defined(CONFIG_SUPERH64)
|
||||
sciport->port.uartclk = current_cpu_info.module_clock * 16;
|
||||
sciport->port.uartclk = current_cpu_data.module_clock * 16;
|
||||
#else
|
||||
struct clk *clk = clk_get("module_clk");
|
||||
sciport->port.uartclk = clk_get_rate(clk) * 16;
|
||||
|
@ -1444,7 +1444,7 @@ void hid_init_reports(struct hid_device *hid)
|
||||
#define USB_DEVICE_ID_GTCO_402 0x0402
|
||||
#define USB_DEVICE_ID_GTCO_403 0x0403
|
||||
#define USB_DEVICE_ID_GTCO_404 0x0404
|
||||
#define USB_DEVICE_ID_GTCO_404 0x0405
|
||||
#define USB_DEVICE_ID_GTCO_405 0x0405
|
||||
#define USB_DEVICE_ID_GTCO_500 0x0500
|
||||
#define USB_DEVICE_ID_GTCO_501 0x0501
|
||||
#define USB_DEVICE_ID_GTCO_502 0x0502
|
||||
@ -1657,7 +1657,7 @@ static const struct hid_blacklist {
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE },
|
||||
{ USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
|
||||
|
@ -286,7 +286,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
|
||||
static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
||||
{
|
||||
*x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
|
||||
*x = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
|
||||
*y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
|
||||
*press = ((pkt[2] & 0x1F) << 7) | (pkt[5] & 0x7F);
|
||||
*touch = ~pkt[7] & 0x20;
|
||||
|
||||
|
@ -810,12 +810,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
|
||||
if (yld == NULL)
|
||||
return err;
|
||||
|
||||
if (yld->urb_irq) {
|
||||
usb_kill_urb(yld->urb_irq);
|
||||
usb_free_urb(yld->urb_irq);
|
||||
}
|
||||
if (yld->urb_ctl)
|
||||
usb_free_urb(yld->urb_ctl);
|
||||
usb_kill_urb(yld->urb_irq); /* parameter validation in core/urb */
|
||||
usb_kill_urb(yld->urb_ctl); /* parameter validation in core/urb */
|
||||
|
||||
if (yld->idev) {
|
||||
if (err)
|
||||
input_free_device(yld->idev);
|
||||
@ -831,6 +828,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
|
||||
if (yld->irq_data)
|
||||
usb_buffer_free(yld->udev, USB_PKT_LEN,
|
||||
yld->irq_data, yld->irq_dma);
|
||||
|
||||
usb_free_urb(yld->urb_irq); /* parameter validation in core/urb */
|
||||
usb_free_urb(yld->urb_ctl); /* parameter validation in core/urb */
|
||||
kfree(yld);
|
||||
return err;
|
||||
}
|
||||
|
@ -3435,6 +3435,8 @@ static void sisusb_disconnect(struct usb_interface *intf)
|
||||
|
||||
static struct usb_device_id sisusb_table [] = {
|
||||
{ USB_DEVICE(0x0711, 0x0900) },
|
||||
{ USB_DEVICE(0x0711, 0x0901) },
|
||||
{ USB_DEVICE(0x0711, 0x0902) },
|
||||
{ USB_DEVICE(0x182d, 0x021c) },
|
||||
{ USB_DEVICE(0x182d, 0x0269) },
|
||||
{ }
|
||||
|
@ -506,6 +506,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) },
|
||||
{ USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_GAMMA_SCOUT_PID) },
|
||||
{ }, /* Optional parameter entry */
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
@ -467,6 +467,11 @@
|
||||
#define TESTO_VID 0x128D
|
||||
#define TESTO_USB_INTERFACE_PID 0x0001
|
||||
|
||||
/*
|
||||
* Gamma Scout (http://gamma-scout.com/). Submitted by rsc@runtux.com.
|
||||
*/
|
||||
#define FTDI_GAMMA_SCOUT_PID 0xD678 /* Gamma Scout online */
|
||||
|
||||
/* Commands */
|
||||
#define FTDI_SIO_RESET 0 /* Reset the port */
|
||||
#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
|
||||
|
@ -464,8 +464,10 @@ static int serial_read_proc (char *page, char **start, off_t off, int count, int
|
||||
length += sprintf (page+length, " path:%s", tmp);
|
||||
|
||||
length += sprintf (page+length, "\n");
|
||||
if ((length + begin) > (off + count))
|
||||
if ((length + begin) > (off + count)) {
|
||||
usb_serial_put(serial);
|
||||
goto done;
|
||||
}
|
||||
if ((length + begin) < off) {
|
||||
begin += length;
|
||||
length = 0;
|
||||
|
@ -82,7 +82,6 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
|
||||
if(*ptmp_inode == NULL)
|
||||
return rc;
|
||||
rc = 1;
|
||||
d_instantiate(tmp_dentry, *ptmp_inode);
|
||||
}
|
||||
} else {
|
||||
tmp_dentry = d_alloc(file->f_dentry, qstring);
|
||||
@ -99,9 +98,7 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
|
||||
tmp_dentry->d_op = &cifs_dentry_ops;
|
||||
if(*ptmp_inode == NULL)
|
||||
return rc;
|
||||
rc = 1;
|
||||
d_instantiate(tmp_dentry, *ptmp_inode);
|
||||
d_rehash(tmp_dentry);
|
||||
rc = 2;
|
||||
}
|
||||
|
||||
tmp_dentry->d_time = jiffies;
|
||||
@ -870,6 +867,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
|
||||
pfindEntry, &obj_type, rc);
|
||||
else
|
||||
fill_in_inode(tmp_inode, 1 /* NT */, pfindEntry, &obj_type, rc);
|
||||
|
||||
if(rc) /* new inode - needs to be tied to dentry */ {
|
||||
d_instantiate(tmp_dentry, tmp_inode);
|
||||
if(rc == 2)
|
||||
d_rehash(tmp_dentry);
|
||||
}
|
||||
|
||||
|
||||
rc = filldir(direntry,qstring.name,qstring.len,file->f_pos,
|
||||
|
@ -1009,11 +1009,14 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
|
||||
buffer_trace_init(&dummy.b_history);
|
||||
err = ext3_get_blocks_handle(handle, inode, block, 1,
|
||||
&dummy, create, 1);
|
||||
if (err == 1) {
|
||||
/*
|
||||
* ext3_get_blocks_handle() returns number of blocks
|
||||
* mapped. 0 in case of a HOLE.
|
||||
*/
|
||||
if (err > 0) {
|
||||
if (err > 1)
|
||||
WARN_ON(1);
|
||||
err = 0;
|
||||
} else if (err >= 0) {
|
||||
WARN_ON(1);
|
||||
err = -EIO;
|
||||
}
|
||||
*errp = err;
|
||||
if (!err && buffer_mapped(&dummy)) {
|
||||
|
@ -100,25 +100,6 @@ static inline int put_dreq(struct nfs_direct_req *dreq)
|
||||
return atomic_dec_and_test(&dreq->io_count);
|
||||
}
|
||||
|
||||
/*
|
||||
* "size" is never larger than rsize or wsize.
|
||||
*/
|
||||
static inline int nfs_direct_count_pages(unsigned long user_addr, size_t size)
|
||||
{
|
||||
int page_count;
|
||||
|
||||
page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
page_count -= user_addr >> PAGE_SHIFT;
|
||||
BUG_ON(page_count < 0);
|
||||
|
||||
return page_count;
|
||||
}
|
||||
|
||||
static inline unsigned int nfs_max_pages(unsigned int size)
|
||||
{
|
||||
return (size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs_direct_IO - NFS address space operation for direct I/O
|
||||
* @rw: direction (read or write)
|
||||
@ -276,28 +257,24 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned lo
|
||||
struct nfs_open_context *ctx = dreq->ctx;
|
||||
struct inode *inode = ctx->dentry->d_inode;
|
||||
size_t rsize = NFS_SERVER(inode)->rsize;
|
||||
unsigned int rpages = nfs_max_pages(rsize);
|
||||
unsigned int pgbase;
|
||||
int result;
|
||||
ssize_t started = 0;
|
||||
|
||||
get_dreq(dreq);
|
||||
|
||||
pgbase = user_addr & ~PAGE_MASK;
|
||||
do {
|
||||
struct nfs_read_data *data;
|
||||
size_t bytes;
|
||||
|
||||
pgbase = user_addr & ~PAGE_MASK;
|
||||
bytes = min(rsize,count);
|
||||
|
||||
result = -ENOMEM;
|
||||
data = nfs_readdata_alloc(rpages);
|
||||
data = nfs_readdata_alloc(pgbase + bytes);
|
||||
if (unlikely(!data))
|
||||
break;
|
||||
|
||||
bytes = rsize;
|
||||
if (count < rsize)
|
||||
bytes = count;
|
||||
|
||||
data->npages = nfs_direct_count_pages(user_addr, bytes);
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
result = get_user_pages(current, current->mm, user_addr,
|
||||
data->npages, 1, 0, data->pagevec, NULL);
|
||||
@ -344,8 +321,10 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned lo
|
||||
started += bytes;
|
||||
user_addr += bytes;
|
||||
pos += bytes;
|
||||
/* FIXME: Remove this unnecessary math from final patch */
|
||||
pgbase += bytes;
|
||||
pgbase &= ~PAGE_MASK;
|
||||
BUG_ON(pgbase != (user_addr & ~PAGE_MASK));
|
||||
|
||||
count -= bytes;
|
||||
} while (count != 0);
|
||||
@ -524,7 +503,7 @@ static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode
|
||||
|
||||
static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
|
||||
{
|
||||
dreq->commit_data = nfs_commit_alloc(0);
|
||||
dreq->commit_data = nfs_commit_alloc();
|
||||
if (dreq->commit_data != NULL)
|
||||
dreq->commit_data->req = (struct nfs_page *) dreq;
|
||||
}
|
||||
@ -605,28 +584,24 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned l
|
||||
struct nfs_open_context *ctx = dreq->ctx;
|
||||
struct inode *inode = ctx->dentry->d_inode;
|
||||
size_t wsize = NFS_SERVER(inode)->wsize;
|
||||
unsigned int wpages = nfs_max_pages(wsize);
|
||||
unsigned int pgbase;
|
||||
int result;
|
||||
ssize_t started = 0;
|
||||
|
||||
get_dreq(dreq);
|
||||
|
||||
pgbase = user_addr & ~PAGE_MASK;
|
||||
do {
|
||||
struct nfs_write_data *data;
|
||||
size_t bytes;
|
||||
|
||||
pgbase = user_addr & ~PAGE_MASK;
|
||||
bytes = min(wsize,count);
|
||||
|
||||
result = -ENOMEM;
|
||||
data = nfs_writedata_alloc(wpages);
|
||||
data = nfs_writedata_alloc(pgbase + bytes);
|
||||
if (unlikely(!data))
|
||||
break;
|
||||
|
||||
bytes = wsize;
|
||||
if (count < wsize)
|
||||
bytes = count;
|
||||
|
||||
data->npages = nfs_direct_count_pages(user_addr, bytes);
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
result = get_user_pages(current, current->mm, user_addr,
|
||||
data->npages, 0, 0, data->pagevec, NULL);
|
||||
@ -676,8 +651,11 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned l
|
||||
started += bytes;
|
||||
user_addr += bytes;
|
||||
pos += bytes;
|
||||
|
||||
/* FIXME: Remove this useless math from the final patch */
|
||||
pgbase += bytes;
|
||||
pgbase &= ~PAGE_MASK;
|
||||
BUG_ON(pgbase != (user_addr & ~PAGE_MASK));
|
||||
|
||||
count -= bytes;
|
||||
} while (count != 0);
|
||||
|
@ -43,13 +43,15 @@ static mempool_t *nfs_rdata_mempool;
|
||||
|
||||
#define MIN_POOL_READ (32)
|
||||
|
||||
struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
|
||||
struct nfs_read_data *nfs_readdata_alloc(size_t len)
|
||||
{
|
||||
unsigned int pagecount = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, SLAB_NOFS);
|
||||
|
||||
if (p) {
|
||||
memset(p, 0, sizeof(*p));
|
||||
INIT_LIST_HEAD(&p->pages);
|
||||
p->npages = pagecount;
|
||||
if (pagecount <= ARRAY_SIZE(p->page_array))
|
||||
p->pagevec = p->page_array;
|
||||
else {
|
||||
@ -140,7 +142,7 @@ static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode,
|
||||
int result;
|
||||
struct nfs_read_data *rdata;
|
||||
|
||||
rdata = nfs_readdata_alloc(1);
|
||||
rdata = nfs_readdata_alloc(count);
|
||||
if (!rdata)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -336,25 +338,25 @@ static int nfs_pagein_multi(struct list_head *head, struct inode *inode)
|
||||
struct nfs_page *req = nfs_list_entry(head->next);
|
||||
struct page *page = req->wb_page;
|
||||
struct nfs_read_data *data;
|
||||
unsigned int rsize = NFS_SERVER(inode)->rsize;
|
||||
unsigned int nbytes, offset;
|
||||
size_t rsize = NFS_SERVER(inode)->rsize, nbytes;
|
||||
unsigned int offset;
|
||||
int requests = 0;
|
||||
LIST_HEAD(list);
|
||||
|
||||
nfs_list_remove_request(req);
|
||||
|
||||
nbytes = req->wb_bytes;
|
||||
for(;;) {
|
||||
data = nfs_readdata_alloc(1);
|
||||
do {
|
||||
size_t len = min(nbytes,rsize);
|
||||
|
||||
data = nfs_readdata_alloc(len);
|
||||
if (!data)
|
||||
goto out_bad;
|
||||
INIT_LIST_HEAD(&data->pages);
|
||||
list_add(&data->pages, &list);
|
||||
requests++;
|
||||
if (nbytes <= rsize)
|
||||
break;
|
||||
nbytes -= rsize;
|
||||
}
|
||||
nbytes -= len;
|
||||
} while(nbytes != 0);
|
||||
atomic_set(&req->wb_complete, requests);
|
||||
|
||||
ClearPageError(page);
|
||||
@ -402,7 +404,7 @@ static int nfs_pagein_one(struct list_head *head, struct inode *inode)
|
||||
if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE)
|
||||
return nfs_pagein_multi(head, inode);
|
||||
|
||||
data = nfs_readdata_alloc(NFS_SERVER(inode)->rpages);
|
||||
data = nfs_readdata_alloc(NFS_SERVER(inode)->rsize);
|
||||
if (!data)
|
||||
goto out_bad;
|
||||
|
||||
|
@ -90,22 +90,13 @@ static mempool_t *nfs_commit_mempool;
|
||||
|
||||
static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion);
|
||||
|
||||
struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount)
|
||||
struct nfs_write_data *nfs_commit_alloc(void)
|
||||
{
|
||||
struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, SLAB_NOFS);
|
||||
|
||||
if (p) {
|
||||
memset(p, 0, sizeof(*p));
|
||||
INIT_LIST_HEAD(&p->pages);
|
||||
if (pagecount <= ARRAY_SIZE(p->page_array))
|
||||
p->pagevec = p->page_array;
|
||||
else {
|
||||
p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
|
||||
if (!p->pagevec) {
|
||||
mempool_free(p, nfs_commit_mempool);
|
||||
p = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
@ -117,13 +108,15 @@ void nfs_commit_free(struct nfs_write_data *p)
|
||||
mempool_free(p, nfs_commit_mempool);
|
||||
}
|
||||
|
||||
struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
|
||||
struct nfs_write_data *nfs_writedata_alloc(size_t len)
|
||||
{
|
||||
unsigned int pagecount = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, SLAB_NOFS);
|
||||
|
||||
if (p) {
|
||||
memset(p, 0, sizeof(*p));
|
||||
INIT_LIST_HEAD(&p->pages);
|
||||
p->npages = pagecount;
|
||||
if (pagecount <= ARRAY_SIZE(p->page_array))
|
||||
p->pagevec = p->page_array;
|
||||
else {
|
||||
@ -208,7 +201,7 @@ static int nfs_writepage_sync(struct nfs_open_context *ctx, struct inode *inode,
|
||||
int result, written = 0;
|
||||
struct nfs_write_data *wdata;
|
||||
|
||||
wdata = nfs_writedata_alloc(1);
|
||||
wdata = nfs_writedata_alloc(wsize);
|
||||
if (!wdata)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -999,24 +992,24 @@ static int nfs_flush_multi(struct inode *inode, struct list_head *head, int how)
|
||||
struct nfs_page *req = nfs_list_entry(head->next);
|
||||
struct page *page = req->wb_page;
|
||||
struct nfs_write_data *data;
|
||||
unsigned int wsize = NFS_SERVER(inode)->wsize;
|
||||
unsigned int nbytes, offset;
|
||||
size_t wsize = NFS_SERVER(inode)->wsize, nbytes;
|
||||
unsigned int offset;
|
||||
int requests = 0;
|
||||
LIST_HEAD(list);
|
||||
|
||||
nfs_list_remove_request(req);
|
||||
|
||||
nbytes = req->wb_bytes;
|
||||
for (;;) {
|
||||
data = nfs_writedata_alloc(1);
|
||||
do {
|
||||
size_t len = min(nbytes, wsize);
|
||||
|
||||
data = nfs_writedata_alloc(len);
|
||||
if (!data)
|
||||
goto out_bad;
|
||||
list_add(&data->pages, &list);
|
||||
requests++;
|
||||
if (nbytes <= wsize)
|
||||
break;
|
||||
nbytes -= wsize;
|
||||
}
|
||||
nbytes -= len;
|
||||
} while (nbytes != 0);
|
||||
atomic_set(&req->wb_complete, requests);
|
||||
|
||||
ClearPageError(page);
|
||||
@ -1070,7 +1063,7 @@ static int nfs_flush_one(struct inode *inode, struct list_head *head, int how)
|
||||
struct nfs_write_data *data;
|
||||
unsigned int count;
|
||||
|
||||
data = nfs_writedata_alloc(NFS_SERVER(inode)->wpages);
|
||||
data = nfs_writedata_alloc(NFS_SERVER(inode)->wsize);
|
||||
if (!data)
|
||||
goto out_bad;
|
||||
|
||||
@ -1378,7 +1371,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how)
|
||||
struct nfs_write_data *data;
|
||||
struct nfs_page *req;
|
||||
|
||||
data = nfs_commit_alloc(NFS_SERVER(inode)->wpages);
|
||||
data = nfs_commit_alloc();
|
||||
|
||||
if (!data)
|
||||
goto out_bad;
|
||||
|
@ -49,6 +49,7 @@ DEFINE_SPINLOCK(sb_lock);
|
||||
|
||||
/**
|
||||
* alloc_super - create new superblock
|
||||
* @type: filesystem type superblock should belong to
|
||||
*
|
||||
* Allocates and initializes a new &struct super_block. alloc_super()
|
||||
* returns a pointer new superblock or %NULL if allocation had failed.
|
||||
|
@ -1390,11 +1390,19 @@ xfs_vm_direct_IO(
|
||||
|
||||
iocb->private = xfs_alloc_ioend(inode, IOMAP_UNWRITTEN);
|
||||
|
||||
ret = blockdev_direct_IO_own_locking(rw, iocb, inode,
|
||||
iomap.iomap_target->bt_bdev,
|
||||
iov, offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
xfs_end_io_direct);
|
||||
if (rw == WRITE) {
|
||||
ret = blockdev_direct_IO_own_locking(rw, iocb, inode,
|
||||
iomap.iomap_target->bt_bdev,
|
||||
iov, offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
xfs_end_io_direct);
|
||||
} else {
|
||||
ret = blockdev_direct_IO_no_locking(rw, iocb, inode,
|
||||
iomap.iomap_target->bt_bdev,
|
||||
iov, offset, nr_segs,
|
||||
xfs_get_blocks_direct,
|
||||
xfs_end_io_direct);
|
||||
}
|
||||
|
||||
if (unlikely(ret <= 0 && iocb->private))
|
||||
xfs_destroy_ioend(iocb->private);
|
||||
|
@ -264,7 +264,9 @@ xfs_read(
|
||||
dmflags, &locktype);
|
||||
if (ret) {
|
||||
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
||||
goto unlock_mutex;
|
||||
if (unlikely(ioflags & IO_ISDIRECT))
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@ -272,6 +274,9 @@ xfs_read(
|
||||
bhv_vop_flushinval_pages(vp, ctooff(offtoct(*offset)),
|
||||
-1, FI_REMAPF_LOCKED);
|
||||
|
||||
if (unlikely(ioflags & IO_ISDIRECT))
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore,
|
||||
(void *)iovp, segs, *offset, ioflags);
|
||||
ret = __generic_file_aio_read(iocb, iovp, segs, offset);
|
||||
@ -281,10 +286,6 @@ xfs_read(
|
||||
XFS_STATS_ADD(xs_read_bytes, ret);
|
||||
|
||||
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
|
||||
|
||||
unlock_mutex:
|
||||
if (unlikely(ioflags & IO_ISDIRECT))
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -390,6 +391,8 @@ xfs_splice_write(
|
||||
xfs_inode_t *ip = XFS_BHVTOI(bdp);
|
||||
xfs_mount_t *mp = ip->i_mount;
|
||||
ssize_t ret;
|
||||
struct inode *inode = outfilp->f_mapping->host;
|
||||
xfs_fsize_t isize;
|
||||
|
||||
XFS_STATS_INC(xs_write_calls);
|
||||
if (XFS_FORCED_SHUTDOWN(ip->i_mount))
|
||||
@ -416,6 +419,20 @@ xfs_splice_write(
|
||||
if (ret > 0)
|
||||
XFS_STATS_ADD(xs_write_bytes, ret);
|
||||
|
||||
isize = i_size_read(inode);
|
||||
if (unlikely(ret < 0 && ret != -EFAULT && *ppos > isize))
|
||||
*ppos = isize;
|
||||
|
||||
if (*ppos > ip->i_d.di_size) {
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
if (*ppos > ip->i_d.di_size) {
|
||||
ip->i_d.di_size = *ppos;
|
||||
i_size_write(inode, *ppos);
|
||||
ip->i_update_core = 1;
|
||||
ip->i_update_size = 1;
|
||||
}
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
}
|
||||
xfs_iunlock(ip, XFS_IOLOCK_EXCL);
|
||||
return ret;
|
||||
}
|
||||
|
@ -203,7 +203,7 @@ xfs_qm_statvfs(
|
||||
if (error || !vnode)
|
||||
return error;
|
||||
|
||||
mp = XFS_BHVTOM(bhv);
|
||||
mp = xfs_vfstom(bhvtovfs(bhv));
|
||||
ip = xfs_vtoi(vnode);
|
||||
|
||||
if (!(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user