dect
/
linux-2.6
Archived
13
0
Fork 0

Merge commit 'origin/master' into next

This commit is contained in:
Benjamin Herrenschmidt 2009-11-24 17:16:30 +11:00
commit 1e43bee9c7
237 changed files with 2255 additions and 1580 deletions

View File

@ -20,15 +20,16 @@ Lots of code taken from ext3 and other projects.
Authors in alphabetical order: Authors in alphabetical order:
Joel Becker <joel.becker@oracle.com> Joel Becker <joel.becker@oracle.com>
Zach Brown <zach.brown@oracle.com> Zach Brown <zach.brown@oracle.com>
Mark Fasheh <mark.fasheh@oracle.com> Mark Fasheh <mfasheh@suse.com>
Kurt Hackel <kurt.hackel@oracle.com> Kurt Hackel <kurt.hackel@oracle.com>
Tao Ma <tao.ma@oracle.com>
Sunil Mushran <sunil.mushran@oracle.com> Sunil Mushran <sunil.mushran@oracle.com>
Manish Singh <manish.singh@oracle.com> Manish Singh <manish.singh@oracle.com>
Tiger Yang <tiger.yang@oracle.com>
Caveats Caveats
======= =======
Features which OCFS2 does not support yet: Features which OCFS2 does not support yet:
- quotas
- Directory change notification (F_NOTIFY) - Directory change notification (F_NOTIFY)
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease) - Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
@ -70,7 +71,6 @@ commit=nrsec (*) Ocfs2 can be told to sync all its data and metadata
performance. performance.
localalloc=8(*) Allows custom localalloc size in MB. If the value is too localalloc=8(*) Allows custom localalloc size in MB. If the value is too
large, the fs will silently revert it to the default. large, the fs will silently revert it to the default.
Localalloc is not enabled for local mounts.
localflocks This disables cluster aware flock. localflocks This disables cluster aware flock.
inode64 Indicates that Ocfs2 is allowed to create inodes at inode64 Indicates that Ocfs2 is allowed to create inodes at
any location in the filesystem, including those which any location in the filesystem, including those which

View File

@ -218,7 +218,7 @@ static void fatal(const char *x, ...)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
int checked_open(const char *pathname, int flags) static int checked_open(const char *pathname, int flags)
{ {
int fd = open(pathname, flags); int fd = open(pathname, flags);

View File

@ -182,7 +182,7 @@ M: Ron Minnich <rminnich@sandia.gov>
M: Latchesar Ionkov <lucho@ionkov.net> M: Latchesar Ionkov <lucho@ionkov.net>
L: v9fs-developer@lists.sourceforge.net L: v9fs-developer@lists.sourceforge.net
W: http://swik.net/v9fs W: http://swik.net/v9fs
T: git git://git.kernel.org/pub/scm/linux/kernel/ericvh/v9fs.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git
S: Maintained S: Maintained
F: Documentation/filesystems/9p.txt F: Documentation/filesystems/9p.txt
F: fs/9p/ F: fs/9p/
@ -906,7 +906,6 @@ M: Karol Kozimor <sziwan@users.sourceforge.net>
L: acpi4asus-user@lists.sourceforge.net L: acpi4asus-user@lists.sourceforge.net
W: http://acpi4asus.sf.net W: http://acpi4asus.sf.net
S: Maintained S: Maintained
F: arch/x86/kernel/acpi/boot.c
F: drivers/platform/x86/asus_acpi.c F: drivers/platform/x86/asus_acpi.c
ASUS ASB100 HARDWARE MONITOR DRIVER ASUS ASB100 HARDWARE MONITOR DRIVER
@ -1245,11 +1244,10 @@ S: Supported
F: drivers/net/tg3.* F: drivers/net/tg3.*
BROCADE BFA FC SCSI DRIVER BROCADE BFA FC SCSI DRIVER
P: Jing Huang M: Jing Huang <huangj@brocade.com>
M: huangj@brocade.com L: linux-scsi@vger.kernel.org
L: linux-scsi@vger.kernel.org S: Supported
S: Supported F: drivers/scsi/bfa/
F: drivers/scsi/bfa/
BSG (block layer generic sg v4 driver) BSG (block layer generic sg v4 driver)
M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
@ -2825,7 +2823,7 @@ F: drivers/infiniband/hw/ipath/
IPMI SUBSYSTEM IPMI SUBSYSTEM
M: Corey Minyard <minyard@acm.org> M: Corey Minyard <minyard@acm.org>
L: openipmi-developer@lists.sourceforge.net L: openipmi-developer@lists.sourceforge.net (moderated for non-subscribers)
W: http://openipmi.sourceforge.net/ W: http://openipmi.sourceforge.net/
S: Supported S: Supported
F: Documentation/IPMI.txt F: Documentation/IPMI.txt
@ -3086,9 +3084,13 @@ F: kernel/kgdb.c
KMEMCHECK KMEMCHECK
M: Vegard Nossum <vegardno@ifi.uio.no> M: Vegard Nossum <vegardno@ifi.uio.no>
P Pekka Enberg M: Pekka Enberg <penberg@cs.helsinki.fi>
M: penberg@cs.helsinki.fi
S: Maintained S: Maintained
F: Documentation/kmemcheck.txt
F: arch/x86/include/asm/kmemcheck.h
F: arch/x86/mm/kmemcheck/
F: include/linux/kmemcheck.h
F: mm/kmemcheck.c
KMEMLEAK KMEMLEAK
M: Catalin Marinas <catalin.marinas@arm.com> M: Catalin Marinas <catalin.marinas@arm.com>
@ -3618,7 +3620,7 @@ L: netfilter@vger.kernel.org
L: coreteam@netfilter.org L: coreteam@netfilter.org
W: http://www.netfilter.org/ W: http://www.netfilter.org/
W: http://www.iptables.org/ W: http://www.iptables.org/
T: git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git
S: Supported S: Supported
F: include/linux/netfilter* F: include/linux/netfilter*
F: include/linux/netfilter/ F: include/linux/netfilter/
@ -4330,6 +4332,8 @@ F: drivers/video/aty/aty128fb.c
RALINK RT2X00 WIRELESS LAN DRIVER RALINK RT2X00 WIRELESS LAN DRIVER
P: rt2x00 project P: rt2x00 project
M: Ivo van Doorn <IvDoorn@gmail.com>
M: Gertjan van Wingerde <gwingerde@gmail.com>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
L: users@rt2x00.serialmonkey.com (moderated for non-subscribers) L: users@rt2x00.serialmonkey.com (moderated for non-subscribers)
W: http://rt2x00.serialmonkey.com/ W: http://rt2x00.serialmonkey.com/
@ -4417,7 +4421,7 @@ RFKILL
M: Johannes Berg <johannes@sipsolutions.net> M: Johannes Berg <johannes@sipsolutions.net>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
S: Maintained S: Maintained
F Documentation/rfkill.txt F: Documentation/rfkill.txt
F: net/rfkill/ F: net/rfkill/
RISCOM8 DRIVER RISCOM8 DRIVER
@ -4637,7 +4641,7 @@ F: drivers/mmc/host/sdhci-s3c.c
SECURITY SUBSYSTEM SECURITY SUBSYSTEM
M: James Morris <jmorris@namei.org> M: James Morris <jmorris@namei.org>
L: linux-security-module@vger.kernel.org (suggested Cc:) L: linux-security-module@vger.kernel.org (suggested Cc:)
T: git git://www.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git
W: http://security.wiki.kernel.org/ W: http://security.wiki.kernel.org/
S: Supported S: Supported
F: security/ F: security/
@ -4673,12 +4677,11 @@ F: include/linux/ata.h
F: include/linux/libata.h F: include/linux/libata.h
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
P: Jayamohan Kallickal M: Jayamohan Kallickal <jayamohank@serverengines.com>
M: jayamohank@serverengines.com L: linux-scsi@vger.kernel.org
L: linux-scsi@vger.kernel.org W: http://www.serverengines.com
W: http://www.serverengines.com S: Supported
S: Supported F: drivers/scsi/be2iscsi/
F: drivers/scsi/be2iscsi/
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
M: Sathya Perla <sathyap@serverengines.com> M: Sathya Perla <sathyap@serverengines.com>
@ -5684,11 +5687,11 @@ F: drivers/vlynq/vlynq.c
F: include/linux/vlynq.h F: include/linux/vlynq.h
VMWARE VMXNET3 ETHERNET DRIVER VMWARE VMXNET3 ETHERNET DRIVER
M: Shreyas Bhatewara <sbhatewara@vmware.com> M: Shreyas Bhatewara <sbhatewara@vmware.com>
M: VMware, Inc. <pv-drivers@vmware.com> M: "VMware, Inc." <pv-drivers@vmware.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/vmxnet3/ F: drivers/net/vmxnet3/
VOLTAGE AND CURRENT REGULATOR FRAMEWORK VOLTAGE AND CURRENT REGULATOR FRAMEWORK
M: Liam Girdwood <lrg@slimlogic.co.uk> M: Liam Girdwood <lrg@slimlogic.co.uk>

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 32 SUBLEVEL = 32
EXTRAVERSION = -rc6 EXTRAVERSION = -rc8
NAME = Man-Eating Seals of Antiquity NAME = Man-Eating Seals of Antiquity
# *DOCUMENTATION* # *DOCUMENTATION*
@ -221,7 +221,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
HOSTCC = gcc HOSTCC = gcc
HOSTCXX = g++ HOSTCXX = g++
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
HOSTCXXFLAGS = -O2 HOSTCXXFLAGS = -O2
# Decide whether to build built-in, modular, or both. # Decide whether to build built-in, modular, or both.

View File

@ -35,7 +35,7 @@
const char * prog_name; const char * prog_name;
void static void
usage (void) usage (void)
{ {
fprintf(stderr, fprintf(stderr,

View File

@ -26,8 +26,6 @@
#define F_GETOWN 6 /* for sockets. */ #define F_GETOWN 6 /* for sockets. */
#define F_SETSIG 10 /* for sockets. */ #define F_SETSIG 10 /* for sockets. */
#define F_GETSIG 11 /* for sockets. */ #define F_GETSIG 11 /* for sockets. */
#define F_SETOWN_EX 12
#define F_GETOWN_EX 13
/* for posix fcntl() and lockf() */ /* for posix fcntl() and lockf() */
#define F_RDLCK 1 #define F_RDLCK 1

View File

@ -50,12 +50,12 @@ struct thread_info {
register struct thread_info *__current_thread_info __asm__("$8"); register struct thread_info *__current_thread_info __asm__("$8");
#define current_thread_info() __current_thread_info #define current_thread_info() __current_thread_info
#endif /* __ASSEMBLY__ */
/* Thread information allocation. */ /* Thread information allocation. */
#define THREAD_SIZE_ORDER 1 #define THREAD_SIZE_ORDER 1
#define THREAD_SIZE (2*PAGE_SIZE) #define THREAD_SIZE (2*PAGE_SIZE)
#endif /* __ASSEMBLY__ */
#define PREEMPT_ACTIVE 0x40000000 #define PREEMPT_ACTIVE 0x40000000
/* /*

View File

@ -55,10 +55,10 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_EMBEDDED is not set CONFIG_EMBEDDED=y
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y # CONFIG_KALLSYMS is not set
# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
@ -224,7 +224,7 @@ CONFIG_CPU_CP15_MMU=y
# #
# Processor Features # Processor Features
# #
# CONFIG_ARM_THUMB is not set CONFIG_ARM_THUMB=y
# CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_ICACHE_DISABLE is not set
# CONFIG_CPU_DCACHE_DISABLE is not set # CONFIG_CPU_DCACHE_DISABLE is not set
CONFIG_CPU_DCACHE_WRITETHROUGH=y CONFIG_CPU_DCACHE_WRITETHROUGH=y
@ -248,7 +248,7 @@ CONFIG_CPU_DCACHE_WRITETHROUGH=y
# CONFIG_HIGH_RES_TIMERS is not set # CONFIG_HIGH_RES_TIMERS is not set
CONFIG_PREEMPT=y CONFIG_PREEMPT=y
CONFIG_HZ=100 CONFIG_HZ=100
# CONFIG_AEABI is not set CONFIG_AEABI=y
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y CONFIG_FLATMEM_MANUAL=y
@ -299,7 +299,9 @@ CONFIG_BINFMT_ELF=y
# #
# Power management options # Power management options
# #
# CONFIG_PM is not set CONFIG_PM=y
# CONFIG_SUSPEND is not set
CONFIG_PM_RUNTIME=y
# #
# Networking # Networking
@ -670,7 +672,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set # CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_EVBUG is not set
# #
@ -784,6 +786,7 @@ CONFIG_I2C_OMAP=y
# #
# CONFIG_SPI is not set # CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set # CONFIG_SPI_MASTER is not set
CONFIG_GPIO_SYSFS=y
# #
# Dallas's 1-wire bus # Dallas's 1-wire bus
@ -820,6 +823,7 @@ CONFIG_LEDS_AMS_DELTA=y
CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
# #
# Multimedia devices # Multimedia devices
@ -896,7 +900,13 @@ CONFIG_LOGO_LINUX_CLUT224=y
# #
# Sound # Sound
# #
# CONFIG_SOUND is not set CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_SOC=y
CONFIG_SND_OMAP_SOC=y
CONFIG_SND_OMAP_SOC_AMS_DELTA=y
# #
# HID Devices # HID Devices

View File

@ -611,7 +611,7 @@ CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_GPIO is not set CONFIG_KEYBOARD_GPIO=y
CONFIG_INPUT_MOUSE=y CONFIG_INPUT_MOUSE=y
# CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_PS2 is not set
# CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_SERIAL is not set
@ -634,7 +634,8 @@ CONFIG_TOUCHSCREEN_ADS7846=y
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_INPUT_MISC is not set CONFIG_INPUT_MISC=y
CONFIG_INPUT_TWL4030_PWRBUTTON=y
# #
# Hardware I/O ports # Hardware I/O ports
@ -834,7 +835,29 @@ CONFIG_DAB=y
# #
# CONFIG_VGA_CONSOLE is not set # CONFIG_VGA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE=y
# CONFIG_SOUND is not set CONFIG_SOUND=y
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_JACK=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DRIVERS=y
CONFIG_SND_USB=y
CONFIG_SND_SOC=y
CONFIG_SND_OMAP_SOC=y
CONFIG_SND_OMAP_SOC_MCBSP=y
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=y
CONFIG_SND_SOC_I2C_AND_SPI=y
CONFIG_SND_SOC_TWL4030=y
CONFIG_HID_SUPPORT=y CONFIG_HID_SUPPORT=y
CONFIG_HID=y CONFIG_HID=y
# CONFIG_HID_DEBUG is not set # CONFIG_HID_DEBUG is not set
@ -1020,7 +1043,13 @@ CONFIG_MMC_BLOCK_BOUNCE=y
# CONFIG_MMC_SPI is not set # CONFIG_MMC_SPI is not set
# CONFIG_MEMSTICK is not set # CONFIG_MEMSTICK is not set
# CONFIG_ACCESSIBILITY is not set # CONFIG_ACCESSIBILITY is not set
# CONFIG_NEW_LEDS is not set CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_GPIO_PLATFORM=y
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_RTC_LIB=y CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS=y
@ -1084,9 +1113,12 @@ CONFIG_RTC_DRV_TWL4030=y
# on-CPU RTC drivers # on-CPU RTC drivers
# #
# CONFIG_DMADEVICES is not set # CONFIG_DMADEVICES is not set
# CONFIG_REGULATOR is not set
# CONFIG_UIO is not set # CONFIG_UIO is not set
CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_TWL4030=y
# #
# File systems # File systems
# #
@ -1407,3 +1439,10 @@ CONFIG_PLIST=y
CONFIG_HAS_IOMEM=y CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y CONFIG_HAS_DMA=y
# added by hand for now
CONFIG_KEYBOARD_TWL4030=y
CONFIG_USB_OTG_UTILS=y
CONFIG_TWL4030_USB=y
CONFIG_MMC_OMAP_HS=y

View File

@ -1703,7 +1703,14 @@ CONFIG_RTC_DRV_TWL4030=y
# on-CPU RTC drivers # on-CPU RTC drivers
# #
# CONFIG_DMADEVICES is not set # CONFIG_DMADEVICES is not set
# CONFIG_REGULATOR is not set CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
# CONFIG_REGULATOR_BQ24022 is not set
# CONFIG_REGULATOR_MAX1586 is not set
CONFIG_REGULATOR_TWL4030=y
# CONFIG_UIO is not set # CONFIG_UIO is not set
# CONFIG_STAGING is not set # CONFIG_STAGING is not set

View File

@ -289,13 +289,6 @@ config MACH_NEOCORE926
help help
Select this if you are using the Adeneo Neocore 926 board. Select this if you are using the Adeneo Neocore 926 board.
config MACH_AT91SAM9G20EK_2MMC
bool "Atmel AT91SAM9G20-EK Evaluation Kit modified for 2 MMC Slots"
depends on ARCH_AT91SAM9G20
help
Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
Rev A or B modified for 2 MMC Slots.
endif endif
# ---------------------------------------------------------- # ----------------------------------------------------------
@ -322,7 +315,16 @@ config MACH_AT91SAM9G20EK
bool "Atmel AT91SAM9G20-EK Evaluation Kit" bool "Atmel AT91SAM9G20-EK Evaluation Kit"
depends on ARCH_AT91SAM9G20 depends on ARCH_AT91SAM9G20
help help
Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit. Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit
that embeds only one SD/MMC slot.
config MACH_AT91SAM9G20EK_2MMC
bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots"
depends on ARCH_AT91SAM9G20
help
Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
with 2 SD/MMC Slots. This is the case for AT91SAM9G20-EK rev. C and
onwards.
config MACH_CPU9G20 config MACH_CPU9G20
bool "Eukrea CPU9G20 board" bool "Eukrea CPU9G20 board"
@ -392,7 +394,7 @@ config MTD_AT91_DATAFLASH_CARD
config MTD_NAND_ATMEL_BUSWIDTH_16 config MTD_NAND_ATMEL_BUSWIDTH_16
bool "Enable 16-bit data bus interface to NAND flash" bool "Enable 16-bit data bus interface to NAND flash"
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91SAM9G45EKES || MACH_AT91CAP9ADK) depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91SAM9G20EK_2MMC || MACH_AT91SAM9G45EKES || MACH_AT91CAP9ADK)
help help
On AT91SAM926x boards both types of NAND flash can be present On AT91SAM926x boards both types of NAND flash can be present
(8 and 16 bit data bus width). (8 and 16 bit data bus width).

View File

@ -90,7 +90,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
* SPI devices. * SPI devices.
*/ */
static struct spi_board_info ek_spi_devices[] = { static struct spi_board_info ek_spi_devices[] = {
#if !defined(CONFIG_MMC_ATMELMCI) #if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91))
{ /* DataFlash chip */ { /* DataFlash chip */
.modalias = "mtd_dataflash", .modalias = "mtd_dataflash",
.chip_select = 1, .chip_select = 1,
@ -113,7 +113,7 @@ static struct spi_board_info ek_spi_devices[] = {
* MACB Ethernet device * MACB Ethernet device
*/ */
static struct at91_eth_data __initdata ek_macb_data = { static struct at91_eth_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PC12, .phy_irq_pin = AT91_PIN_PB0,
.is_rmii = 1, .is_rmii = 1,
}; };
@ -194,24 +194,27 @@ static void __init ek_add_device_nand(void)
/* /*
* MCI (SD/MMC) * MCI (SD/MMC)
* det_pin and wp_pin are not connected * wp_pin is not connected
*/ */
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
static struct mci_platform_data __initdata ek_mmc_data = { static struct mci_platform_data __initdata ek_mmc_data = {
.slot[0] = { .slot[0] = {
.bus_width = 4, .bus_width = 4,
.detect_pin = -ENODEV, .detect_pin = AT91_PIN_PC2,
.wp_pin = -ENODEV, .wp_pin = -ENODEV,
}, },
.slot[1] = { .slot[1] = {
.bus_width = 4, .bus_width = 4,
.detect_pin = -ENODEV, .detect_pin = AT91_PIN_PC9,
.wp_pin = -ENODEV, .wp_pin = -ENODEV,
}, },
}; };
#else #else
static struct amci_platform_data __initdata ek_mmc_data = { static struct at91_mmc_data __initdata ek_mmc_data = {
.slot_b = 1, /* Only one slot so use slot B */
.wire4 = 1,
.det_pin = AT91_PIN_PC9,
}; };
#endif #endif
@ -221,13 +224,13 @@ static struct amci_platform_data __initdata ek_mmc_data = {
static struct gpio_led ek_leds[] = { static struct gpio_led ek_leds[] = {
{ /* "bottom" led, green, userled1 to be defined */ { /* "bottom" led, green, userled1 to be defined */
.name = "ds5", .name = "ds5",
.gpio = AT91_PIN_PB12, .gpio = AT91_PIN_PB8,
.active_low = 1, .active_low = 1,
.default_trigger = "none", .default_trigger = "none",
}, },
{ /* "power" led, yellow */ { /* "power" led, yellow */
.name = "ds1", .name = "ds1",
.gpio = AT91_PIN_PB13, .gpio = AT91_PIN_PB9,
.default_trigger = "heartbeat", .default_trigger = "heartbeat",
} }
}; };
@ -254,7 +257,11 @@ static void __init ek_board_init(void)
/* Ethernet */ /* Ethernet */
at91_add_device_eth(&ek_macb_data); at91_add_device_eth(&ek_macb_data);
/* MMC */ /* MMC */
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
at91_add_device_mci(0, &ek_mmc_data); at91_add_device_mci(0, &ek_mmc_data);
#else
at91_add_device_mmc(0, &ek_mmc_data);
#endif
/* I2C */ /* I2C */
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
/* LEDs */ /* LEDs */

View File

@ -915,6 +915,14 @@ void __init kirkwood_init(void)
kirkwood_uart0_data[0].uartclk = kirkwood_tclk; kirkwood_uart0_data[0].uartclk = kirkwood_tclk;
kirkwood_uart1_data[0].uartclk = kirkwood_tclk; kirkwood_uart1_data[0].uartclk = kirkwood_tclk;
/*
* Disable propagation of mbus errors to the CPU local bus,
* as this causes mbus errors (which can occur for example
* for PCI aborts) to throw CPU aborts, which we're not set
* up to deal with.
*/
writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
kirkwood_setup_cpu_mbus(); kirkwood_setup_cpu_mbus();
#ifdef CONFIG_CACHE_FEROCEON_L2 #ifdef CONFIG_CACHE_FEROCEON_L2

View File

@ -13,6 +13,9 @@
#include <mach/kirkwood.h> #include <mach/kirkwood.h>
#define CPU_CONFIG (BRIDGE_VIRT_BASE | 0x0100)
#define CPU_CONFIG_ERROR_PROP 0x00000004
#define CPU_CONTROL (BRIDGE_VIRT_BASE | 0x0104) #define CPU_CONTROL (BRIDGE_VIRT_BASE | 0x0104)
#define CPU_RESET 0x00000002 #define CPU_RESET 0x00000002

View File

@ -160,7 +160,7 @@
#define MMC1_WP_MMC1_WP MFP_CFG_DRV(MMC1_WP, AF0, MEDIUM) #define MMC1_WP_MMC1_WP MFP_CFG_DRV(MMC1_WP, AF0, MEDIUM)
/* PWM */ /* PWM */
#define GPIO27 PWM3 AF2 MFP_CFG(GPIO27, AF2) #define GPIO27_PWM3_AF2 MFP_CFG(GPIO27, AF2)
#define GPIO51_PWM2_OUT MFP_CFG(GPIO51, AF2) #define GPIO51_PWM2_OUT MFP_CFG(GPIO51, AF2)
#define GPIO117_PWM1_OUT MFP_CFG(GPIO117, AF2) #define GPIO117_PWM1_OUT MFP_CFG(GPIO117, AF2)
#define GPIO118_PWM2_OUT MFP_CFG(GPIO118, AF2) #define GPIO118_PWM2_OUT MFP_CFG(GPIO118, AF2)

View File

@ -162,7 +162,7 @@ static int beagle_twl_gpio_setup(struct device *dev,
/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */ /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR");
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1); gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;

View File

@ -134,50 +134,50 @@ static void __init pandora_keys_gpio_init(void)
} }
static int board_keymap[] = { static int board_keymap[] = {
/* col, row, code */ /* row, col, code */
KEY(0, 0, KEY_9), KEY(0, 0, KEY_9),
KEY(0, 1, KEY_0), KEY(0, 1, KEY_8),
KEY(0, 2, KEY_BACKSPACE), KEY(0, 2, KEY_I),
KEY(0, 3, KEY_O), KEY(0, 3, KEY_J),
KEY(0, 4, KEY_P), KEY(0, 4, KEY_N),
KEY(0, 5, KEY_K), KEY(0, 5, KEY_M),
KEY(0, 6, KEY_L), KEY(1, 0, KEY_0),
KEY(0, 7, KEY_ENTER),
KEY(1, 0, KEY_8),
KEY(1, 1, KEY_7), KEY(1, 1, KEY_7),
KEY(1, 2, KEY_6), KEY(1, 2, KEY_U),
KEY(1, 3, KEY_5), KEY(1, 3, KEY_H),
KEY(1, 4, KEY_4), KEY(1, 4, KEY_B),
KEY(1, 5, KEY_3), KEY(1, 5, KEY_SPACE),
KEY(1, 6, KEY_2), KEY(2, 0, KEY_BACKSPACE),
KEY(1, 7, KEY_1), KEY(2, 1, KEY_6),
KEY(2, 0, KEY_I),
KEY(2, 1, KEY_U),
KEY(2, 2, KEY_Y), KEY(2, 2, KEY_Y),
KEY(2, 3, KEY_T), KEY(2, 3, KEY_G),
KEY(2, 4, KEY_R), KEY(2, 4, KEY_V),
KEY(2, 5, KEY_E), KEY(2, 5, KEY_FN),
KEY(2, 6, KEY_W), KEY(3, 0, KEY_O),
KEY(2, 7, KEY_Q), KEY(3, 1, KEY_5),
KEY(3, 0, KEY_J), KEY(3, 2, KEY_T),
KEY(3, 1, KEY_H),
KEY(3, 2, KEY_G),
KEY(3, 3, KEY_F), KEY(3, 3, KEY_F),
KEY(3, 4, KEY_D), KEY(3, 4, KEY_C),
KEY(3, 5, KEY_S), KEY(4, 0, KEY_P),
KEY(3, 6, KEY_A), KEY(4, 1, KEY_4),
KEY(3, 7, KEY_LEFTSHIFT), KEY(4, 2, KEY_R),
KEY(4, 0, KEY_N), KEY(4, 3, KEY_D),
KEY(4, 1, KEY_B),
KEY(4, 2, KEY_V),
KEY(4, 3, KEY_C),
KEY(4, 4, KEY_X), KEY(4, 4, KEY_X),
KEY(4, 5, KEY_Z), KEY(5, 0, KEY_K),
KEY(4, 6, KEY_DOT), KEY(5, 1, KEY_3),
KEY(4, 7, KEY_COMMA), KEY(5, 2, KEY_E),
KEY(5, 0, KEY_M), KEY(5, 3, KEY_S),
KEY(5, 1, KEY_SPACE), KEY(5, 4, KEY_Z),
KEY(5, 2, KEY_FN), KEY(6, 0, KEY_L),
KEY(6, 1, KEY_2),
KEY(6, 2, KEY_W),
KEY(6, 3, KEY_A),
KEY(6, 4, KEY_DOT),
KEY(7, 0, KEY_ENTER),
KEY(7, 1, KEY_1),
KEY(7, 2, KEY_Q),
KEY(7, 3, KEY_LEFTSHIFT),
KEY(7, 4, KEY_COMMA),
}; };
static struct matrix_keymap_data board_map_data = { static struct matrix_keymap_data board_map_data = {

View File

@ -30,57 +30,56 @@
/* Zoom2 has Qwerty keyboard*/ /* Zoom2 has Qwerty keyboard*/
static int board_keymap[] = { static int board_keymap[] = {
KEY(0, 0, KEY_E), KEY(0, 0, KEY_E),
KEY(1, 0, KEY_R), KEY(0, 1, KEY_R),
KEY(2, 0, KEY_T), KEY(0, 2, KEY_T),
KEY(3, 0, KEY_HOME), KEY(0, 3, KEY_HOME),
KEY(6, 0, KEY_I), KEY(0, 6, KEY_I),
KEY(7, 0, KEY_LEFTSHIFT), KEY(0, 7, KEY_LEFTSHIFT),
KEY(0, 1, KEY_D), KEY(1, 0, KEY_D),
KEY(1, 1, KEY_F), KEY(1, 1, KEY_F),
KEY(2, 1, KEY_G), KEY(1, 2, KEY_G),
KEY(3, 1, KEY_SEND), KEY(1, 3, KEY_SEND),
KEY(6, 1, KEY_K), KEY(1, 6, KEY_K),
KEY(7, 1, KEY_ENTER), KEY(1, 7, KEY_ENTER),
KEY(0, 2, KEY_X), KEY(2, 0, KEY_X),
KEY(1, 2, KEY_C), KEY(2, 1, KEY_C),
KEY(2, 2, KEY_V), KEY(2, 2, KEY_V),
KEY(3, 2, KEY_END), KEY(2, 3, KEY_END),
KEY(6, 2, KEY_DOT), KEY(2, 6, KEY_DOT),
KEY(7, 2, KEY_CAPSLOCK), KEY(2, 7, KEY_CAPSLOCK),
KEY(0, 3, KEY_Z), KEY(3, 0, KEY_Z),
KEY(1, 3, KEY_KPPLUS), KEY(3, 1, KEY_KPPLUS),
KEY(2, 3, KEY_B), KEY(3, 2, KEY_B),
KEY(3, 3, KEY_F1), KEY(3, 3, KEY_F1),
KEY(6, 3, KEY_O), KEY(3, 6, KEY_O),
KEY(7, 3, KEY_SPACE), KEY(3, 7, KEY_SPACE),
KEY(0, 4, KEY_W), KEY(4, 0, KEY_W),
KEY(1, 4, KEY_Y), KEY(4, 1, KEY_Y),
KEY(2, 4, KEY_U), KEY(4, 2, KEY_U),
KEY(3, 4, KEY_F2), KEY(4, 3, KEY_F2),
KEY(4, 4, KEY_VOLUMEUP), KEY(4, 4, KEY_VOLUMEUP),
KEY(6, 4, KEY_L), KEY(4, 6, KEY_L),
KEY(7, 4, KEY_LEFT), KEY(4, 7, KEY_LEFT),
KEY(0, 5, KEY_S), KEY(5, 0, KEY_S),
KEY(1, 5, KEY_H), KEY(5, 1, KEY_H),
KEY(2, 5, KEY_J), KEY(5, 2, KEY_J),
KEY(3, 5, KEY_F3), KEY(5, 3, KEY_F3),
KEY(5, 5, KEY_VOLUMEDOWN), KEY(5, 5, KEY_VOLUMEDOWN),
KEY(6, 5, KEY_M), KEY(5, 6, KEY_M),
KEY(4, 5, KEY_ENTER), KEY(5, 7, KEY_ENTER),
KEY(7, 5, KEY_RIGHT), KEY(6, 0, KEY_Q),
KEY(0, 6, KEY_Q), KEY(6, 1, KEY_A),
KEY(1, 6, KEY_A), KEY(6, 2, KEY_N),
KEY(2, 6, KEY_N), KEY(6, 3, KEY_BACKSPACE),
KEY(3, 6, KEY_BACKSPACE),
KEY(6, 6, KEY_P), KEY(6, 6, KEY_P),
KEY(7, 6, KEY_UP),
KEY(6, 7, KEY_SELECT), KEY(6, 7, KEY_SELECT),
KEY(7, 7, KEY_DOWN), KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
KEY(0, 7, KEY_PROG1), /*MACRO 1 <User defined> */ KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
KEY(1, 7, KEY_PROG2), /*MACRO 2 <User defined> */ KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
KEY(2, 7, KEY_PROG3), /*MACRO 3 <User defined> */ KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
KEY(3, 7, KEY_PROG4), /*MACRO 4 <User defined> */ KEY(7, 5, KEY_RIGHT),
0 KEY(7, 6, KEY_UP),
KEY(7, 7, KEY_DOWN)
}; };
static struct matrix_keymap_data board_map_data = { static struct matrix_keymap_data board_map_data = {

View File

@ -473,7 +473,7 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n)
unsigned long fint; unsigned long fint;
u16 f = 0; u16 f = 0;
fint = clk->dpll_data->clk_ref->rate / (n + 1); fint = clk->dpll_data->clk_ref->rate / n;
pr_debug("clock: fint is %lu\n", fint); pr_debug("clock: fint is %lu\n", fint);

View File

@ -489,9 +489,9 @@ static struct clk core_ck = {
static struct clk dpll3_m2x2_ck = { static struct clk dpll3_m2x2_ck = {
.name = "dpll3_m2x2_ck", .name = "dpll3_m2x2_ck",
.ops = &clkops_null, .ops = &clkops_null,
.parent = &dpll3_x2_ck, .parent = &dpll3_m2_ck,
.clkdm_name = "dpll3_clkdm", .clkdm_name = "dpll3_clkdm",
.recalc = &followparent_recalc, .recalc = &omap3_clkoutx2_recalc,
}; };
/* The PWRDN bit is apparently only available on 3430ES2 and above */ /* The PWRDN bit is apparently only available on 3430ES2 and above */

View File

@ -366,7 +366,7 @@ int gpmc_cs_request(int cs, unsigned long size, unsigned long *base)
if (r < 0) if (r < 0)
goto out; goto out;
gpmc_cs_enable_mem(cs, res->start, res->end - res->start + 1); gpmc_cs_enable_mem(cs, res->start, resource_size(res));
*base = res->start; *base = res->start;
gpmc_cs_set_reserved(cs, 1); gpmc_cs_set_reserved(cs, 1);
out: out:
@ -378,7 +378,7 @@ EXPORT_SYMBOL(gpmc_cs_request);
void gpmc_cs_free(int cs) void gpmc_cs_free(int cs)
{ {
spin_lock(&gpmc_mem_lock); spin_lock(&gpmc_mem_lock);
if (cs >= GPMC_CS_NUM || !gpmc_cs_reserved(cs)) { if (cs >= GPMC_CS_NUM || cs < 0 || !gpmc_cs_reserved(cs)) {
printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs);
BUG(); BUG();
spin_unlock(&gpmc_mem_lock); spin_unlock(&gpmc_mem_lock);

View File

@ -300,7 +300,7 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "invalid mem resource\n"); dev_err(&pdev->dev, "invalid mem resource\n");
return -ENODEV; return -ENODEV;
} }
mbox_base = ioremap(res->start, res->end - res->start); mbox_base = ioremap(res->start, resource_size(res));
if (!mbox_base) if (!mbox_base)
return -ENOMEM; return -ENOMEM;

View File

@ -27,6 +27,7 @@
#include <mach/colibri.h> #include <mach/colibri.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/audio.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
@ -145,7 +146,8 @@ static void __init colibri_pxa320_init_lcd(void)
static inline void colibri_pxa320_init_lcd(void) {} static inline void colibri_pxa320_init_lcd(void) {}
#endif #endif
#if defined(SND_AC97_CODEC) || defined(SND_AC97_CODEC_MODULE) #if defined(CONFIG_SND_AC97_CODEC) || \
defined(CONFIG_SND_AC97_CODEC_MODULE)
static mfp_cfg_t colibri_pxa320_ac97_pin_config[] __initdata = { static mfp_cfg_t colibri_pxa320_ac97_pin_config[] __initdata = {
GPIO34_AC97_SYSCLK, GPIO34_AC97_SYSCLK,
GPIO35_AC97_SDATA_IN_0, GPIO35_AC97_SDATA_IN_0,

View File

@ -604,7 +604,7 @@ static struct platform_device gpio_vbus = {
static const struct ads7846_platform_data tsc2046_info = { static const struct ads7846_platform_data tsc2046_info = {
.model = 7846, .model = 7846,
.vref_delay_usecs = 100, .vref_delay_usecs = 100,
.pressure_max = 512, .pressure_max = 1024,
.debounce_max = 10, .debounce_max = 10,
.debounce_tol = 3, .debounce_tol = 3,
.debounce_rep = 1, .debounce_rep = 1,

View File

@ -46,5 +46,6 @@
beq 1001f beq 1001f
bic \irqstat, \irqstat, #0x80000000 bic \irqstat, \irqstat, #0x80000000
mov \irqnr, \irqstat, lsr #16 mov \irqnr, \irqstat, lsr #16
add \irqnr, \irqnr, #(PXA_IRQ(0))
1001: 1001:
.endm .endm

View File

@ -408,7 +408,7 @@ static struct platform_device keypad_device = {
}; };
static struct platform_device rtc_device = { static struct platform_device rtc_device = {
.name = "rtc0", .name = "rtc-coh901331",
.id = -1, .id = -1,
.num_resources = ARRAY_SIZE(rtc_resources), .num_resources = ARRAY_SIZE(rtc_resources),
.resource = rtc_resources, .resource = rtc_resources,

View File

@ -127,7 +127,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy)
} }
/* FIXME: what's the actual transition time? */ /* FIXME: what's the actual transition time? */
policy->cpuinfo.transition_latency = 10 * 1000 * 1000; policy->cpuinfo.transition_latency = 300 * 1000;
return 0; return 0;
} }

View File

@ -691,13 +691,16 @@ static inline void disable_lnk(int lch)
static inline void omap2_enable_irq_lch(int lch) static inline void omap2_enable_irq_lch(int lch)
{ {
u32 val; u32 val;
unsigned long flags;
if (!cpu_class_is_omap2()) if (!cpu_class_is_omap2())
return; return;
spin_lock_irqsave(&dma_chan_lock, flags);
val = dma_read(IRQENABLE_L0); val = dma_read(IRQENABLE_L0);
val |= 1 << lch; val |= 1 << lch;
dma_write(val, IRQENABLE_L0); dma_write(val, IRQENABLE_L0);
spin_unlock_irqrestore(&dma_chan_lock, flags);
} }
int omap_request_dma(int dev_id, const char *dev_name, int omap_request_dma(int dev_id, const char *dev_name,
@ -799,10 +802,13 @@ void omap_free_dma(int lch)
if (cpu_class_is_omap2()) { if (cpu_class_is_omap2()) {
u32 val; u32 val;
spin_lock_irqsave(&dma_chan_lock, flags);
/* Disable interrupts */ /* Disable interrupts */
val = dma_read(IRQENABLE_L0); val = dma_read(IRQENABLE_L0);
val &= ~(1 << lch); val &= ~(1 << lch);
dma_write(val, IRQENABLE_L0); dma_write(val, IRQENABLE_L0);
spin_unlock_irqrestore(&dma_chan_lock, flags);
/* Clear the CSR register and IRQ status register */ /* Clear the CSR register and IRQ status register */
dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(lch)); dma_write(OMAP2_DMA_CSR_CLEAR_MASK, CSR(lch));
@ -1108,6 +1114,14 @@ int omap_dma_running(void)
{ {
int lch; int lch;
/*
* On OMAP1510, internal LCD controller will start the transfer
* when it gets enabled, so assume DMA running if LCD enabled.
*/
if (cpu_is_omap1510())
if (omap_readw(0xfffec000 + 0x00) & (1 << 0))
return 1;
/* Check if LCD DMA is running */ /* Check if LCD DMA is running */
if (cpu_is_omap16xx()) if (cpu_is_omap16xx())
if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN) if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN)

View File

@ -373,7 +373,7 @@ static inline int gpio_valid(int gpio)
static int check_gpio(int gpio) static int check_gpio(int gpio)
{ {
if (unlikely(gpio_valid(gpio)) < 0) { if (unlikely(gpio_valid(gpio) < 0)) {
printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio); printk(KERN_ERR "omap-gpio: invalid GPIO %d\n", gpio);
dump_stack(); dump_stack();
return -1; return -1;

View File

@ -16,7 +16,7 @@
#ifndef __ASM_PLAT_MFP_H #ifndef __ASM_PLAT_MFP_H
#define __ASM_PLAT_MFP_H #define __ASM_PLAT_MFP_H
#define mfp_to_gpio(m) ((m) % 128) #define mfp_to_gpio(m) ((m) % 256)
/* list of all the configurable MFP pins */ /* list of all the configurable MFP pins */
enum { enum {

View File

@ -207,7 +207,7 @@ unsigned long mfp_read(int mfp)
{ {
unsigned long val, flags; unsigned long val, flags;
BUG_ON(mfp >= MFP_PIN_MAX); BUG_ON(mfp < 0 || mfp >= MFP_PIN_MAX);
spin_lock_irqsave(&mfp_spin_lock, flags); spin_lock_irqsave(&mfp_spin_lock, flags);
val = mfpr_readl(mfp_table[mfp].mfpr_off); val = mfpr_readl(mfp_table[mfp].mfpr_off);
@ -220,7 +220,7 @@ void mfp_write(int mfp, unsigned long val)
{ {
unsigned long flags; unsigned long flags;
BUG_ON(mfp >= MFP_PIN_MAX); BUG_ON(mfp < 0 || mfp >= MFP_PIN_MAX);
spin_lock_irqsave(&mfp_spin_lock, flags); spin_lock_irqsave(&mfp_spin_lock, flags);
mfpr_writel(mfp_table[mfp].mfpr_off, val); mfpr_writel(mfp_table[mfp].mfpr_off, val);

View File

@ -1,6 +1,7 @@
config MIPS config MIPS
bool bool
default y default y
select HAVE_GENERIC_DMA_COHERENT
select HAVE_IDE select HAVE_IDE
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_ARCH_KGDB select HAVE_ARCH_KGDB

View File

@ -100,7 +100,7 @@ static __init void prom_init_console(void)
static __init void prom_init_cmdline(void) static __init void prom_init_cmdline(void)
{ {
char buf[CL_SIZE]; static char buf[CL_SIZE] __initdata;
/* Get the kernel command line from CFE */ /* Get the kernel command line from CFE */
if (cfe_getenv("LINUX_CMDLINE", buf, CL_SIZE) >= 0) { if (cfe_getenv("LINUX_CMDLINE", buf, CL_SIZE) >= 0) {

View File

@ -1,7 +1,7 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.29-rc7 # Linux kernel version: 2.6.32-rc6
# Wed Mar 4 23:08:06 2009 # Sun Nov 8 22:59:47 2009
# #
CONFIG_MIPS=y CONFIG_MIPS=y
@ -9,16 +9,18 @@ CONFIG_MIPS=y
# Machine selection # Machine selection
# #
# CONFIG_MACH_ALCHEMY is not set # CONFIG_MACH_ALCHEMY is not set
# CONFIG_AR7 is not set
# CONFIG_BASLER_EXCITE is not set # CONFIG_BASLER_EXCITE is not set
# CONFIG_BCM47XX is not set # CONFIG_BCM47XX is not set
# CONFIG_BCM63XX is not set
# CONFIG_MIPS_COBALT is not set # CONFIG_MIPS_COBALT is not set
# CONFIG_MACH_DECSTATION is not set # CONFIG_MACH_DECSTATION is not set
# CONFIG_MACH_JAZZ is not set # CONFIG_MACH_JAZZ is not set
# CONFIG_LASAT is not set # CONFIG_LASAT is not set
# CONFIG_LEMOTE_FULONG is not set # CONFIG_MACH_LOONGSON is not set
# CONFIG_MIPS_MALTA is not set # CONFIG_MIPS_MALTA is not set
# CONFIG_MIPS_SIM is not set # CONFIG_MIPS_SIM is not set
# CONFIG_MACH_EMMA is not set # CONFIG_NEC_MARKEINS is not set
# CONFIG_MACH_VR41XX is not set # CONFIG_MACH_VR41XX is not set
# CONFIG_NXP_STB220 is not set # CONFIG_NXP_STB220 is not set
# CONFIG_NXP_STB225 is not set # CONFIG_NXP_STB225 is not set
@ -45,6 +47,7 @@ CONFIG_MACH_TX49XX=y
# CONFIG_WR_PPMC is not set # CONFIG_WR_PPMC is not set
# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set # CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set # CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
CONFIG_MACH_TXX9=y CONFIG_MACH_TXX9=y
CONFIG_TOSHIBA_RBTX4927=y CONFIG_TOSHIBA_RBTX4927=y
CONFIG_TOSHIBA_RBTX4938=y CONFIG_TOSHIBA_RBTX4938=y
@ -86,7 +89,6 @@ CONFIG_DMA_NONCOHERENT=y
CONFIG_DMA_NEED_PCI_MAP_STATE=y CONFIG_DMA_NEED_PCI_MAP_STATE=y
CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK=y
CONFIG_SYS_HAS_EARLY_PRINTK=y CONFIG_SYS_HAS_EARLY_PRINTK=y
# CONFIG_HOTPLUG_CPU is not set
# CONFIG_NO_IOPORT is not set # CONFIG_NO_IOPORT is not set
CONFIG_GENERIC_GPIO=y CONFIG_GENERIC_GPIO=y
CONFIG_CPU_BIG_ENDIAN=y CONFIG_CPU_BIG_ENDIAN=y
@ -101,7 +103,7 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
# #
# CPU selection # CPU selection
# #
# CONFIG_CPU_LOONGSON2 is not set # CONFIG_CPU_LOONGSON2E is not set
# CONFIG_CPU_MIPS32_R1 is not set # CONFIG_CPU_MIPS32_R1 is not set
# CONFIG_CPU_MIPS32_R2 is not set # CONFIG_CPU_MIPS32_R2 is not set
# CONFIG_CPU_MIPS64_R1 is not set # CONFIG_CPU_MIPS64_R1 is not set
@ -137,6 +139,7 @@ CONFIG_32BIT=y
CONFIG_PAGE_SIZE_4KB=y CONFIG_PAGE_SIZE_4KB=y
# CONFIG_PAGE_SIZE_8KB is not set # CONFIG_PAGE_SIZE_8KB is not set
# CONFIG_PAGE_SIZE_16KB is not set # CONFIG_PAGE_SIZE_16KB is not set
# CONFIG_PAGE_SIZE_32KB is not set
# CONFIG_PAGE_SIZE_64KB is not set # CONFIG_PAGE_SIZE_64KB is not set
CONFIG_CPU_HAS_PREFETCH=y CONFIG_CPU_HAS_PREFETCH=y
CONFIG_MIPS_MT_DISABLED=y CONFIG_MIPS_MT_DISABLED=y
@ -154,7 +157,10 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_PHYS_ADDR_T_64BIT is not set # CONFIG_PHYS_ADDR_T_64BIT is not set
CONFIG_ZONE_DMA_FLAG=0 CONFIG_ZONE_DMA_FLAG=0
CONFIG_VIRT_TO_BUS=y CONFIG_VIRT_TO_BUS=y
CONFIG_UNEVICTABLE_LRU=y CONFIG_HAVE_MLOCK=y
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
# CONFIG_KSM is not set
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_TICK_ONESHOT=y CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
@ -175,6 +181,7 @@ CONFIG_PREEMPT_NONE=y
CONFIG_LOCKDEP_SUPPORT=y CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_CONSTRUCTORS=y
# #
# General setup # General setup
@ -194,11 +201,12 @@ CONFIG_SYSVIPC_SYSCTL=y
# #
# RCU Subsystem # RCU Subsystem
# #
CONFIG_CLASSIC_RCU=y CONFIG_TREE_RCU=y
# CONFIG_TREE_RCU is not set # CONFIG_TREE_PREEMPT_RCU is not set
# CONFIG_PREEMPT_RCU is not set # CONFIG_RCU_TRACE is not set
CONFIG_RCU_FANOUT=32
# CONFIG_RCU_FANOUT_EXACT is not set
# CONFIG_TREE_RCU_TRACE is not set # CONFIG_TREE_RCU_TRACE is not set
# CONFIG_PREEMPT_RCU_TRACE is not set
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=14 CONFIG_LOG_BUF_SHIFT=14
@ -209,8 +217,12 @@ CONFIG_SYSFS_DEPRECATED_V2=y
# CONFIG_NAMESPACES is not set # CONFIG_NAMESPACES is not set
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
@ -220,25 +232,35 @@ CONFIG_PRINTK=y
CONFIG_BUG=y CONFIG_BUG=y
CONFIG_ELF_CORE=y CONFIG_ELF_CORE=y
# CONFIG_PCSPKR_PLATFORM is not set # CONFIG_PCSPKR_PLATFORM is not set
CONFIG_COMPAT_BRK=y
CONFIG_BASE_FULL=y CONFIG_BASE_FULL=y
# CONFIG_FUTEX is not set CONFIG_FUTEX=y
CONFIG_ANON_INODES=y
# CONFIG_EPOLL is not set # CONFIG_EPOLL is not set
CONFIG_SIGNALFD=y CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y CONFIG_TIMERFD=y
CONFIG_EVENTFD=y CONFIG_EVENTFD=y
CONFIG_SHMEM=y CONFIG_SHMEM=y
CONFIG_AIO=y CONFIG_AIO=y
#
# Kernel Performance Events And Counters
#
CONFIG_VM_EVENT_COUNTERS=y CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PCI_QUIRKS=y CONFIG_PCI_QUIRKS=y
CONFIG_COMPAT_BRK=y
CONFIG_SLAB=y CONFIG_SLAB=y
# CONFIG_SLUB is not set # CONFIG_SLUB is not set
# CONFIG_SLOB is not set # CONFIG_SLOB is not set
# CONFIG_PROFILING is not set # CONFIG_PROFILING is not set
CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_OPROFILE=y
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
# CONFIG_SLOW_WORK is not set
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
CONFIG_SLABINFO=y CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
CONFIG_MODULES=y CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not set # CONFIG_MODULE_FORCE_LOAD is not set
@ -246,8 +268,8 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_BLOCK=y CONFIG_BLOCK=y
# CONFIG_LBD is not set # CONFIG_LBDAF is not set
# CONFIG_BLK_DEV_IO_TRACE is not set # CONFIG_BLK_DEV_BSG is not set
# CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_INTEGRITY is not set
# #
@ -274,6 +296,7 @@ CONFIG_PCI_DOMAINS=y
# CONFIG_ARCH_SUPPORTS_MSI is not set # CONFIG_ARCH_SUPPORTS_MSI is not set
# CONFIG_PCI_LEGACY is not set # CONFIG_PCI_LEGACY is not set
# CONFIG_PCI_STUB is not set # CONFIG_PCI_STUB is not set
# CONFIG_PCI_IOV is not set
CONFIG_MMU=y CONFIG_MMU=y
# #
@ -288,6 +311,7 @@ CONFIG_TRAD_SIGNALS=y
# #
# Power management options # Power management options
# #
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y
# CONFIG_PM is not set # CONFIG_PM is not set
CONFIG_NET=y CONFIG_NET=y
@ -295,7 +319,6 @@ CONFIG_NET=y
# #
# Networking options # Networking options
# #
CONFIG_COMPAT_NET_DEV_OPS=y
CONFIG_PACKET=y CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set # CONFIG_PACKET_MMAP is not set
CONFIG_UNIX=y CONFIG_UNIX=y
@ -311,6 +334,7 @@ CONFIG_IP_PNP=y
# CONFIG_NET_IPIP is not set # CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set # CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set # CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_SYN_COOKIES is not set # CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set # CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set # CONFIG_INET_ESP is not set
@ -336,6 +360,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_LLC2 is not set # CONFIG_LLC2 is not set
# CONFIG_IPX is not set # CONFIG_IPX is not set
# CONFIG_ATALK is not set # CONFIG_ATALK is not set
# CONFIG_PHONET is not set
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# CONFIG_DCB is not set # CONFIG_DCB is not set
@ -347,7 +372,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_CAN is not set # CONFIG_CAN is not set
# CONFIG_IRDA is not set # CONFIG_IRDA is not set
# CONFIG_BT is not set # CONFIG_BT is not set
# CONFIG_PHONET is not set
# CONFIG_WIRELESS is not set # CONFIG_WIRELESS is not set
# CONFIG_WIMAX is not set # CONFIG_WIMAX is not set
# CONFIG_RFKILL is not set # CONFIG_RFKILL is not set
@ -365,9 +389,9 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_CONNECTOR is not set # CONFIG_CONNECTOR is not set
CONFIG_MTD=y CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set # CONFIG_MTD_DEBUG is not set
# CONFIG_MTD_TESTS is not set
# CONFIG_MTD_CONCAT is not set # CONFIG_MTD_CONCAT is not set
CONFIG_MTD_PARTITIONS=y CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_TESTS is not set
# CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set
CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_CMDLINE_PARTS=y
# CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_AR7_PARTS is not set
@ -376,9 +400,9 @@ CONFIG_MTD_CMDLINE_PARTS=y
# User Modules And Translation Layers # User Modules And Translation Layers
# #
CONFIG_MTD_CHAR=y CONFIG_MTD_CHAR=y
# CONFIG_MTD_BLKDEVS is not set CONFIG_MTD_BLKDEVS=m
# CONFIG_MTD_BLOCK is not set CONFIG_MTD_BLOCK=m
# CONFIG_MTD_BLOCK_RO is not set CONFIG_MTD_BLOCK_RO=m
# CONFIG_FTL is not set # CONFIG_FTL is not set
# CONFIG_NFTL is not set # CONFIG_NFTL is not set
# CONFIG_INFTL is not set # CONFIG_INFTL is not set
@ -414,16 +438,20 @@ CONFIG_MTD_CFI_UTIL=y
# #
# Mapping drivers for chip access # Mapping drivers for chip access
# #
# CONFIG_MTD_COMPLEX_MAPPINGS is not set CONFIG_MTD_COMPLEX_MAPPINGS=y
CONFIG_MTD_PHYSMAP=y CONFIG_MTD_PHYSMAP=y
# CONFIG_MTD_PHYSMAP_COMPAT is not set # CONFIG_MTD_PHYSMAP_COMPAT is not set
# CONFIG_MTD_PCI is not set
# CONFIG_MTD_GPIO_ADDR is not set
# CONFIG_MTD_INTEL_VR_NOR is not set # CONFIG_MTD_INTEL_VR_NOR is not set
CONFIG_MTD_RBTX4939=y
# CONFIG_MTD_PLATRAM is not set # CONFIG_MTD_PLATRAM is not set
# #
# Self-contained MTD device drivers # Self-contained MTD device drivers
# #
# CONFIG_MTD_PMC551 is not set # CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SST25L is not set
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
@ -435,7 +463,15 @@ CONFIG_MTD_PHYSMAP=y
# CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOC2001PLUS is not set # CONFIG_MTD_DOC2001PLUS is not set
# CONFIG_MTD_NAND is not set CONFIG_MTD_NAND=m
# CONFIG_MTD_NAND_VERIFY_WRITE is not set
# CONFIG_MTD_NAND_ECC_SMC is not set
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=m
# CONFIG_MTD_NAND_CAFE is not set
# CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set
CONFIG_MTD_NAND_TXX9NDFMC=m
# CONFIG_MTD_ONENAND is not set # CONFIG_MTD_ONENAND is not set
# #
@ -471,6 +507,7 @@ CONFIG_IDE=y
# #
# Please see Documentation/ide/ide.txt for help/info on IDE drives # Please see Documentation/ide/ide.txt for help/info on IDE drives
# #
CONFIG_IDE_XFER_MODE=y
CONFIG_IDE_TIMINGS=y CONFIG_IDE_TIMINGS=y
# CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_IDE_SATA is not set
CONFIG_IDE_GD=y CONFIG_IDE_GD=y
@ -534,8 +571,13 @@ CONFIG_BLK_DEV_IDEDMA=y
# #
# #
# A new alternative FireWire stack is available with EXPERIMENTAL=y # You can enable one or both FireWire driver stacks.
# #
#
# See the help texts for more information.
#
# CONFIG_FIREWIRE is not set
# CONFIG_IEEE1394 is not set # CONFIG_IEEE1394 is not set
# CONFIG_I2O is not set # CONFIG_I2O is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
@ -574,6 +616,8 @@ CONFIG_MII=y
# CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_3COM is not set
CONFIG_SMC91X=y CONFIG_SMC91X=y
# CONFIG_DM9000 is not set # CONFIG_DM9000 is not set
# CONFIG_ETHOC is not set
# CONFIG_DNET is not set
# CONFIG_NET_TULIP is not set # CONFIG_NET_TULIP is not set
# CONFIG_HP100 is not set # CONFIG_HP100 is not set
CONFIG_NE2000=y CONFIG_NE2000=y
@ -602,18 +646,15 @@ CONFIG_TC35815=y
# CONFIG_SMSC9420 is not set # CONFIG_SMSC9420 is not set
# CONFIG_SUNDANCE is not set # CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set # CONFIG_TLAN is not set
# CONFIG_KS8842 is not set
# CONFIG_KS8851 is not set
# CONFIG_KS8851_MLL is not set
# CONFIG_VIA_RHINE is not set # CONFIG_VIA_RHINE is not set
# CONFIG_ATL2 is not set # CONFIG_ATL2 is not set
# CONFIG_NETDEV_1000 is not set # CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set # CONFIG_NETDEV_10000 is not set
# CONFIG_TR is not set # CONFIG_TR is not set
# CONFIG_WLAN is not set
#
# Wireless LAN
#
# CONFIG_WLAN_PRE80211 is not set
# CONFIG_WLAN_80211 is not set
# CONFIG_IWLWIFI_LEDS is not set
# #
# Enable WiMAX (Networking options) to see the WiMAX drivers # Enable WiMAX (Networking options) to see the WiMAX drivers
@ -653,6 +694,7 @@ CONFIG_DEVKMEM=y
# #
# Non-8250 serial port support # Non-8250 serial port support
# #
# CONFIG_SERIAL_MAX3100 is not set
CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_TXX9=y CONFIG_SERIAL_TXX9=y
@ -666,7 +708,9 @@ CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_IPMI_HANDLER is not set # CONFIG_IPMI_HANDLER is not set
# CONFIG_HW_RANDOM is not set CONFIG_HW_RANDOM=m
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
CONFIG_HW_RANDOM_TX4939=m
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
# CONFIG_RAW_DRIVER is not set # CONFIG_RAW_DRIVER is not set
@ -686,6 +730,10 @@ CONFIG_SPI_TXX9=y
# SPI Protocol Masters # SPI Protocol Masters
# #
# CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_TLE62X0 is not set
#
# PPS support
#
CONFIG_ARCH_REQUIRE_GPIOLIB=y CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_GPIOLIB=y CONFIG_GPIOLIB=y
@ -701,17 +749,22 @@ CONFIG_GPIOLIB=y
# PCI GPIO expanders: # PCI GPIO expanders:
# #
# CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_BT8XX is not set
# CONFIG_GPIO_LANGWELL is not set
# #
# SPI GPIO expanders: # SPI GPIO expanders:
# #
# CONFIG_GPIO_MAX7301 is not set # CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MCP23S08 is not set # CONFIG_GPIO_MCP23S08 is not set
# CONFIG_GPIO_MC33880 is not set
#
# AC97 GPIO expanders:
#
# CONFIG_W1 is not set # CONFIG_W1 is not set
# CONFIG_POWER_SUPPLY is not set # CONFIG_POWER_SUPPLY is not set
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
# CONFIG_THERMAL is not set # CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set # CONFIG_WATCHDOG_NOWAYOUT is not set
@ -740,28 +793,17 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_MFD_CORE is not set # CONFIG_MFD_CORE is not set
# CONFIG_MFD_SM501 is not set # CONFIG_MFD_SM501 is not set
# CONFIG_HTC_PASIC3 is not set # CONFIG_HTC_PASIC3 is not set
# CONFIG_UCB1400_CORE is not set
# CONFIG_MFD_TMIO is not set # CONFIG_MFD_TMIO is not set
# CONFIG_MFD_MC13783 is not set
# CONFIG_EZX_PCAP is not set
# CONFIG_REGULATOR is not set # CONFIG_REGULATOR is not set
# CONFIG_MEDIA_SUPPORT is not set
#
# Multimedia devices
#
#
# Multimedia core support
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_VIDEO_MEDIA is not set
#
# Multimedia drivers
#
# CONFIG_DAB is not set
# #
# Graphics support # Graphics support
# #
# CONFIG_VGA_ARB is not set
# CONFIG_DRM is not set # CONFIG_DRM is not set
# CONFIG_VGASTATE is not set # CONFIG_VGASTATE is not set
# CONFIG_VIDEO_OUTPUT_CONTROL is not set # CONFIG_VIDEO_OUTPUT_CONTROL is not set
@ -772,7 +814,42 @@ CONFIG_SSB_POSSIBLE=y
# Display device support # Display device support
# #
# CONFIG_DISPLAY_SUPPORT is not set # CONFIG_DISPLAY_SUPPORT is not set
# CONFIG_SOUND is not set CONFIG_SOUND=m
# CONFIG_SOUND_OSS_CORE is not set
CONFIG_SND=m
CONFIG_SND_TIMER=m
CONFIG_SND_PCM=m
# CONFIG_SND_SEQUENCER is not set
# CONFIG_SND_MIXER_OSS is not set
# CONFIG_SND_PCM_OSS is not set
# CONFIG_SND_HRTIMER is not set
# CONFIG_SND_DYNAMIC_MINORS is not set
# CONFIG_SND_SUPPORT_OLD_API is not set
# CONFIG_SND_VERBOSE_PROCFS is not set
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
CONFIG_SND_VMASTER=y
# CONFIG_SND_RAWMIDI_SEQ is not set
# CONFIG_SND_OPL3_LIB_SEQ is not set
# CONFIG_SND_OPL4_LIB_SEQ is not set
# CONFIG_SND_SBAWE_SEQ is not set
# CONFIG_SND_EMU10K1_SEQ is not set
CONFIG_SND_AC97_CODEC=m
# CONFIG_SND_DRIVERS is not set
# CONFIG_SND_PCI is not set
# CONFIG_SND_SPI is not set
# CONFIG_SND_MIPS is not set
CONFIG_SND_SOC=m
CONFIG_SND_SOC_AC97_BUS=y
CONFIG_SND_SOC_TXX9ACLC=m
CONFIG_HAS_TXX9_ACLC=y
CONFIG_SND_SOC_TXX9ACLC_AC97=m
CONFIG_SND_SOC_TXX9ACLC_GENERIC=m
CONFIG_SND_SOC_I2C_AND_SPI=m
# CONFIG_SND_SOC_ALL_CODECS is not set
CONFIG_SND_SOC_AC97_CODEC=m
# CONFIG_SOUND_PRIME is not set
CONFIG_AC97_BUS=m
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
# CONFIG_MMC is not set # CONFIG_MMC is not set
# CONFIG_MEMSTICK is not set # CONFIG_MEMSTICK is not set
@ -783,6 +860,8 @@ CONFIG_LEDS_CLASS=y
# LED drivers # LED drivers
# #
CONFIG_LEDS_GPIO=y CONFIG_LEDS_GPIO=y
CONFIG_LEDS_GPIO_PLATFORM=y
# CONFIG_LEDS_DAC124S085 is not set
# #
# LED Triggers # LED Triggers
@ -792,7 +871,12 @@ CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_IDE_DISK=y CONFIG_LEDS_TRIGGER_IDE_DISK=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y
# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
# CONFIG_LEDS_TRIGGER_GPIO is not set
# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
#
# iptables trigger is under Netfilter config (LED target)
#
# CONFIG_ACCESSIBILITY is not set # CONFIG_ACCESSIBILITY is not set
# CONFIG_INFINIBAND is not set # CONFIG_INFINIBAND is not set
CONFIG_RTC_LIB=y CONFIG_RTC_LIB=y
@ -820,6 +904,7 @@ CONFIG_RTC_INTF_DEV_UIE_EMUL=y
# CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_R9701 is not set
CONFIG_RTC_DRV_RS5C348=y CONFIG_RTC_DRV_RS5C348=y
# CONFIG_RTC_DRV_DS3234 is not set # CONFIG_RTC_DRV_DS3234 is not set
# CONFIG_RTC_DRV_PCF2123 is not set
# #
# Platform RTC drivers # Platform RTC drivers
@ -840,8 +925,26 @@ CONFIG_RTC_DRV_DS1742=y
# on-CPU RTC drivers # on-CPU RTC drivers
# #
CONFIG_RTC_DRV_TX4939=y CONFIG_RTC_DRV_TX4939=y
# CONFIG_DMADEVICES is not set CONFIG_DMADEVICES=y
#
# DMA Devices
#
CONFIG_TXX9_DMAC=m
CONFIG_DMA_ENGINE=y
#
# DMA Clients
#
# CONFIG_NET_DMA is not set
# CONFIG_ASYNC_TX_DMA is not set
# CONFIG_DMATEST is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set # CONFIG_UIO is not set
#
# TI VLYNQ
#
# CONFIG_STAGING is not set # CONFIG_STAGING is not set
# #
@ -853,9 +956,10 @@ CONFIG_RTC_DRV_TX4939=y
# CONFIG_REISERFS_FS is not set # CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set # CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y
CONFIG_FILE_LOCKING=y
# CONFIG_XFS_FS is not set # CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not set # CONFIG_OCFS2_FS is not set
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set
CONFIG_INOTIFY=y CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y CONFIG_INOTIFY_USER=y
@ -865,6 +969,10 @@ CONFIG_INOTIFY_USER=y
# CONFIG_FUSE_FS is not set # CONFIG_FUSE_FS is not set
CONFIG_GENERIC_ACL=y CONFIG_GENERIC_ACL=y
#
# Caches
#
# #
# CD-ROM/DVD Filesystems # CD-ROM/DVD Filesystems
# #
@ -890,7 +998,27 @@ CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_POSIX_ACL=y
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
# CONFIG_CONFIGFS_FS is not set # CONFIG_CONFIGFS_FS is not set
# CONFIG_MISC_FILESYSTEMS is not set CONFIG_MISC_FILESYSTEMS=y
# CONFIG_HFSPLUS_FS is not set
CONFIG_JFFS2_FS=m
CONFIG_JFFS2_FS_DEBUG=0
CONFIG_JFFS2_FS_WRITEBUFFER=y
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
CONFIG_JFFS2_ZLIB=y
# CONFIG_JFFS2_LZO is not set
CONFIG_JFFS2_RTIME=y
# CONFIG_JFFS2_RUBIN is not set
# CONFIG_CRAMFS is not set
# CONFIG_SQUASHFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
CONFIG_NFS_V3=y CONFIG_NFS_V3=y
@ -922,6 +1050,7 @@ CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
# CONFIG_MAGIC_SYSRQ is not set # CONFIG_MAGIC_SYSRQ is not set
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_UNUSED_SYMBOLS is not set # CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set # CONFIG_HEADERS_CHECK is not set
@ -929,11 +1058,9 @@ CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_MEMORY_INIT is not set
# CONFIG_RCU_CPU_STALL_DETECTOR is not set # CONFIG_RCU_CPU_STALL_DETECTOR is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_TRACING_SUPPORT=y
# # CONFIG_FTRACE is not set
# Tracers # CONFIG_DYNAMIC_DEBUG is not set
#
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
# CONFIG_SAMPLES is not set # CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y CONFIG_HAVE_ARCH_KGDB=y
CONFIG_CMDLINE="" CONFIG_CMDLINE=""
@ -946,6 +1073,7 @@ CONFIG_CMDLINE=""
# CONFIG_SECURITYFS is not set # CONFIG_SECURITYFS is not set
# CONFIG_SECURITY_FILE_CAPABILITIES is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set
# CONFIG_CRYPTO is not set # CONFIG_CRYPTO is not set
# CONFIG_BINARY_PRINTF is not set
# #
# Library routines # Library routines
@ -959,6 +1087,10 @@ CONFIG_GENERIC_FIND_LAST_BIT=y
CONFIG_CRC32=y CONFIG_CRC32=y
# CONFIG_CRC7 is not set # CONFIG_CRC7 is not set
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_DECOMPRESS_GZIP=y
CONFIG_HAS_IOMEM=y CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y CONFIG_HAS_DMA=y
CONFIG_NLATTR=y

View File

@ -3,6 +3,7 @@
#include <asm/scatterlist.h> #include <asm/scatterlist.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm-generic/dma-coherent.h>
void *dma_alloc_noncoherent(struct device *dev, size_t size, void *dma_alloc_noncoherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flag); dma_addr_t *dma_handle, gfp_t flag);
@ -73,14 +74,4 @@ extern int dma_is_consistent(struct device *dev, dma_addr_t dma_addr);
extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size, extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
enum dma_data_direction direction); enum dma_data_direction direction);
#if 0
#define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
extern int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
dma_addr_t device_addr, size_t size, int flags);
extern void dma_release_declared_memory(struct device *dev);
extern void * dma_mark_declared_memory_occupied(struct device *dev,
dma_addr_t device_addr, size_t size);
#endif
#endif /* _ASM_DMA_MAPPING_H */ #endif /* _ASM_DMA_MAPPING_H */

View File

@ -173,11 +173,12 @@ void smtc_distribute_timer(int vpe)
unsigned int mtflags; unsigned int mtflags;
int cpu; int cpu;
struct clock_event_device *cd; struct clock_event_device *cd;
unsigned long nextstamp = 0L; unsigned long nextstamp;
unsigned long reference; unsigned long reference;
repeat: repeat:
nextstamp = 0L;
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
/* /*
* Find virtual CPUs within the current VPE who have * Find virtual CPUs within the current VPE who have

View File

@ -163,33 +163,34 @@ static int isBranchInstr(mips_instruction * i)
/* /*
* In the Linux kernel, we support selection of FPR format on the * In the Linux kernel, we support selection of FPR format on the
* basis of the Status.FR bit. This does imply that, if a full 32 * basis of the Status.FR bit. If an FPU is not present, the FR bit
* FPRs are desired, there needs to be a flip-flop that can be written * is hardwired to zero, which would imply a 32-bit FPU even for
* to one at that bit position. In any case, O32 MIPS ABI uses * 64-bit CPUs. For 64-bit kernels with no FPU we use TIF_32BIT_REGS
* only the even FPRs (Status.FR = 0). * as a proxy for the FR bit so that a 64-bit FPU is emulated. In any
* case, for a 32-bit kernel which uses the O32 MIPS ABI, only the
* even FPRs are used (Status.FR = 0).
*/ */
static inline int cop1_64bit(struct pt_regs *xcp)
#define CP0_STATUS_FR_SUPPORT {
if (cpu_has_fpu)
#ifdef CP0_STATUS_FR_SUPPORT return xcp->cp0_status & ST0_FR;
#define FR_BIT ST0_FR #ifdef CONFIG_64BIT
return !test_thread_flag(TIF_32BIT_REGS);
#else #else
#define FR_BIT 0 return 0;
#endif #endif
}
#define SIFROMREG(si, x) ((si) = \ #define SIFROMREG(si, x) ((si) = cop1_64bit(xcp) || !(x & 1) ? \
(xcp->cp0_status & FR_BIT) || !(x & 1) ? \ (int)ctx->fpr[x] : (int)(ctx->fpr[x & ~1] >> 32))
(int)ctx->fpr[x] : \
(int)(ctx->fpr[x & ~1] >> 32 )) #define SITOREG(si, x) (ctx->fpr[x & ~(cop1_64bit(xcp) == 0)] = \
#define SITOREG(si, x) (ctx->fpr[x & ~((xcp->cp0_status & FR_BIT) == 0)] = \ cop1_64bit(xcp) || !(x & 1) ? \
(xcp->cp0_status & FR_BIT) || !(x & 1) ? \
ctx->fpr[x & ~1] >> 32 << 32 | (u32)(si) : \ ctx->fpr[x & ~1] >> 32 << 32 | (u32)(si) : \
ctx->fpr[x & ~1] << 32 >> 32 | (u64)(si) << 32) ctx->fpr[x & ~1] << 32 >> 32 | (u64)(si) << 32)
#define DIFROMREG(di, x) ((di) = \ #define DIFROMREG(di, x) ((di) = ctx->fpr[x & ~(cop1_64bit(xcp) == 0)])
ctx->fpr[x & ~((xcp->cp0_status & FR_BIT) == 0)]) #define DITOREG(di, x) (ctx->fpr[x & ~(cop1_64bit(xcp) == 0)] = (di))
#define DITOREG(di, x) (ctx->fpr[x & ~((xcp->cp0_status & FR_BIT) == 0)] \
= (di))
#define SPFROMREG(sp, x) SIFROMREG((sp).bits, x) #define SPFROMREG(sp, x) SIFROMREG((sp).bits, x)
#define SPTOREG(sp, x) SITOREG((sp).bits, x) #define SPTOREG(sp, x) SITOREG((sp).bits, x)

View File

@ -90,6 +90,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
{ {
void *ret; void *ret;
if (dma_alloc_from_coherent(dev, size, dma_handle, &ret))
return ret;
gfp = massage_gfp_flags(dev, gfp); gfp = massage_gfp_flags(dev, gfp);
ret = (void *) __get_free_pages(gfp, get_order(size)); ret = (void *) __get_free_pages(gfp, get_order(size));
@ -122,6 +125,10 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
dma_addr_t dma_handle) dma_addr_t dma_handle)
{ {
unsigned long addr = (unsigned long) vaddr; unsigned long addr = (unsigned long) vaddr;
int order = get_order(size);
if (dma_release_from_coherent(dev, order, vaddr))
return;
plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL); plat_unmap_dma_mem(dev, dma_handle, size, DMA_BIDIRECTIONAL);

View File

@ -54,7 +54,8 @@ static struct prom_pmemblock * __init prom_getmdesc(void)
{ {
char *memsize_str; char *memsize_str;
unsigned int memsize; unsigned int memsize;
char cmdline[CL_SIZE], *ptr; char *ptr;
static char cmdline[CL_SIZE] __initdata;
/* otherwise look in the environment */ /* otherwise look in the environment */
memsize_str = prom_getenv("memsize"); memsize_str = prom_getenv("memsize");

View File

@ -69,7 +69,7 @@ static inline unsigned long tag2ul(char *arg, const char *tag)
void __init prom_setup_cmdline(void) void __init prom_setup_cmdline(void)
{ {
char cmd_line[CL_SIZE]; static char cmd_line[CL_SIZE] __initdata;
char *cp, *board; char *cp, *board;
int prom_argc; int prom_argc;
char **prom_argv, **prom_envp; char **prom_argv, **prom_envp;

View File

@ -160,7 +160,7 @@ static void __init prom_init_cmdline(void)
int argc; int argc;
int *argv32; int *argv32;
int i; /* Always ignore the "-c" at argv[0] */ int i; /* Always ignore the "-c" at argv[0] */
char builtin[CL_SIZE]; static char builtin[CL_SIZE] __initdata;
if (fw_arg0 >= CKSEG0 || fw_arg1 < CKSEG0) { if (fw_arg0 >= CKSEG0 || fw_arg1 < CKSEG0) {
/* /*
@ -315,7 +315,7 @@ static inline void txx9_cache_fixup(void)
static void __init preprocess_cmdline(void) static void __init preprocess_cmdline(void)
{ {
char cmdline[CL_SIZE]; static char cmdline[CL_SIZE] __initdata;
char *s; char *s;
strcpy(cmdline, arcs_cmdline); strcpy(cmdline, arcs_cmdline);

View File

@ -28,8 +28,6 @@
#define F_SETOWN 12 /* for sockets. */ #define F_SETOWN 12 /* for sockets. */
#define F_SETSIG 13 /* for sockets. */ #define F_SETSIG 13 /* for sockets. */
#define F_GETSIG 14 /* for sockets. */ #define F_GETSIG 14 /* for sockets. */
#define F_GETOWN_EX 15
#define F_SETOWN_EX 16
/* for posix fcntl() and lockf() */ /* for posix fcntl() and lockf() */
#define F_RDLCK 01 #define F_RDLCK 01

View File

@ -58,7 +58,7 @@ static int check_elf64(void *p, int size, struct addr_range *r)
return 64; return 64;
} }
void get4k(FILE *file, char *buf ) static void get4k(FILE *file, char *buf )
{ {
unsigned j; unsigned j;
unsigned num = fread(buf, 1, 4096, file); unsigned num = fread(buf, 1, 4096, file);
@ -66,12 +66,12 @@ void get4k(FILE *file, char *buf )
buf[j] = 0; buf[j] = 0;
} }
void put4k(FILE *file, char *buf ) static void put4k(FILE *file, char *buf )
{ {
fwrite(buf, 1, 4096, file); fwrite(buf, 1, 4096, file);
} }
void death(const char *msg, FILE *fdesc, const char *fname) static void death(const char *msg, FILE *fdesc, const char *fname)
{ {
fprintf(stderr, msg); fprintf(stderr, msg);
fclose(fdesc); fclose(fdesc);

View File

@ -55,6 +55,7 @@ static void __init reset_tod_clock(void)
disabled_wait(0); disabled_wait(0);
sched_clock_base_cc = TOD_UNIX_EPOCH; sched_clock_base_cc = TOD_UNIX_EPOCH;
S390_lowcore.last_update_clock = sched_clock_base_cc;
} }
#ifdef CONFIG_SHARED_KERNEL #ifdef CONFIG_SHARED_KERNEL
@ -167,6 +168,14 @@ static noinline __init void create_kernel_nss(void)
return; return;
} }
/* re-initialize cputime accounting. */
sched_clock_base_cc = get_clock();
S390_lowcore.last_update_clock = sched_clock_base_cc;
S390_lowcore.last_update_timer = 0x7fffffffffffffffULL;
S390_lowcore.user_timer = 0;
S390_lowcore.system_timer = 0;
asm volatile("SPT 0(%0)" : : "a" (&S390_lowcore.last_update_timer));
/* re-setup boot command line with new ipl vm parms */ /* re-setup boot command line with new ipl vm parms */
ipl_update_parameters(); ipl_update_parameters();
setup_boot_command_line(); setup_boot_command_line();

View File

@ -565,10 +565,10 @@ pgm_svcper:
lh %r7,0x8a # get svc number from lowcore lh %r7,0x8a # get svc number from lowcore
l %r9,__LC_THREAD_INFO # load pointer to thread_info struct l %r9,__LC_THREAD_INFO # load pointer to thread_info struct
TRACE_IRQS_OFF TRACE_IRQS_OFF
l %r1,__TI_task(%r9) l %r8,__TI_task(%r9)
mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID mvc __THREAD_per+__PER_atmid(2,%r8),__LC_PER_ATMID
mvc __THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS mvc __THREAD_per+__PER_address(4,%r8),__LC_PER_ADDRESS
mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID mvc __THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
TRACE_IRQS_ON TRACE_IRQS_ON
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts stosm __SF_EMPTY(%r15),0x03 # reenable interrupts

View File

@ -543,10 +543,10 @@ pgm_svcper:
mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER
llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore llgh %r7,__LC_SVC_INT_CODE # get svc number from lowcore
lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct
lg %r1,__TI_task(%r9) lg %r8,__TI_task(%r9)
mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID mvc __THREAD_per+__PER_atmid(2,%r8),__LC_PER_ATMID
mvc __THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS mvc __THREAD_per+__PER_address(8,%r8),__LC_PER_ADDRESS
mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID mvc __THREAD_per+__PER_access_id(1,%r8),__LC_PER_ACCESS_ID
oi __TI_flags+7(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP oi __TI_flags+7(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP
TRACE_IRQS_ON TRACE_IRQS_ON
stosm __SF_EMPTY(%r15),0x03 # reenable interrupts stosm __SF_EMPTY(%r15),0x03 # reenable interrupts

View File

@ -68,7 +68,7 @@ static void unmask_imask_irq(unsigned int irq)
} }
static struct irq_chip imask_irq_chip = { static struct irq_chip imask_irq_chip = {
.typename = "SR.IMASK", .name = "SR.IMASK",
.mask = mask_imask_irq, .mask = mask_imask_irq,
.unmask = unmask_imask_irq, .unmask = unmask_imask_irq,
.mask_ack = mask_imask_irq, .mask_ack = mask_imask_irq,

View File

@ -85,7 +85,7 @@ static void mask_and_ack_intc(unsigned int);
static void end_intc_irq(unsigned int irq); static void end_intc_irq(unsigned int irq);
static struct irq_chip intc_irq_type = { static struct irq_chip intc_irq_type = {
.typename = "INTC", .name = "INTC",
.startup = startup_intc_irq, .startup = startup_intc_irq,
.shutdown = shutdown_intc_irq, .shutdown = shutdown_intc_irq,
.enable = enable_intc_irq, .enable = enable_intc_irq,

View File

@ -61,14 +61,14 @@ unsigned long lastfoffset = -1;
unsigned long lastfrelno; unsigned long lastfrelno;
btfixup *lastf; btfixup *lastf;
void fatal(void) __attribute__((noreturn)); static void fatal(void) __attribute__((noreturn));
void fatal(void) static void fatal(void)
{ {
fprintf(stderr, "Malformed output from objdump\n%s\n", buffer); fprintf(stderr, "Malformed output from objdump\n%s\n", buffer);
exit(1); exit(1);
} }
btfixup *find(int type, char *name) static btfixup *find(int type, char *name)
{ {
int i; int i;
for (i = 0; i < last; i++) { for (i = 0; i < last; i++) {
@ -88,7 +88,7 @@ btfixup *find(int type, char *name)
return array + last - 1; return array + last - 1;
} }
void set_mode (char *buffer) static void set_mode (char *buffer)
{ {
for (mode = 0;; mode++) for (mode = 0;; mode++)
if (buffer[mode] < '0' || buffer[mode] > '9') if (buffer[mode] < '0' || buffer[mode] > '9')

View File

@ -35,17 +35,17 @@
* as PROM looks for a.out image only. * as PROM looks for a.out image only.
*/ */
unsigned short ld2(char *p) static unsigned short ld2(char *p)
{ {
return (p[0] << 8) | p[1]; return (p[0] << 8) | p[1];
} }
unsigned int ld4(char *p) static unsigned int ld4(char *p)
{ {
return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
} }
void st4(char *p, unsigned int x) static void st4(char *p, unsigned int x)
{ {
p[0] = x >> 24; p[0] = x >> 24;
p[1] = x >> 16; p[1] = x >> 16;
@ -53,7 +53,7 @@ void st4(char *p, unsigned int x)
p[3] = x; p[3] = x;
} }
void usage(void) static void usage(void)
{ {
/* fs_img.gz is an image of initial ramdisk. */ /* fs_img.gz is an image of initial ramdisk. */
fprintf(stderr, "Usage: piggyback vmlinux.aout System.map fs_img.gz\n"); fprintf(stderr, "Usage: piggyback vmlinux.aout System.map fs_img.gz\n");
@ -61,7 +61,7 @@ void usage(void)
exit(1); exit(1);
} }
void die(char *str) static void die(char *str)
{ {
perror (str); perror (str);
exit(1); exit(1);

View File

@ -32,7 +32,7 @@
/* Note: run this on an a.out kernel (use elftoaout for it), as PROM looks for a.out image onlly /* Note: run this on an a.out kernel (use elftoaout for it), as PROM looks for a.out image onlly
usage: piggyback vmlinux System.map tail, where tail is gzipped fs of the initial ramdisk */ usage: piggyback vmlinux System.map tail, where tail is gzipped fs of the initial ramdisk */
void die(char *str) static void die(char *str)
{ {
perror (str); perror (str);
exit(1); exit(1);

View File

@ -526,15 +526,21 @@ static const struct dmi_system_id sw_any_bug_dmi_table[] = {
static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c)
{ {
/* http://www.intel.com/Assets/PDF/specupdate/314554.pdf /* Intel Xeon Processor 7100 Series Specification Update
* http://www.intel.com/Assets/PDF/specupdate/314554.pdf
* AL30: A Machine Check Exception (MCE) Occurring during an * AL30: A Machine Check Exception (MCE) Occurring during an
* Enhanced Intel SpeedStep Technology Ratio Change May Cause * Enhanced Intel SpeedStep Technology Ratio Change May Cause
* Both Processor Cores to Lock Up when HT is enabled*/ * Both Processor Cores to Lock Up. */
if (c->x86_vendor == X86_VENDOR_INTEL) { if (c->x86_vendor == X86_VENDOR_INTEL) {
if ((c->x86 == 15) && if ((c->x86 == 15) &&
(c->x86_model == 6) && (c->x86_model == 6) &&
(c->x86_mask == 8) && smt_capable()) (c->x86_mask == 8)) {
printk(KERN_INFO "acpi-cpufreq: Intel(R) "
"Xeon(R) 7100 Errata AL30, processors may "
"lock up on frequency changes: disabling "
"acpi-cpufreq.\n");
return -ENODEV; return -ENODEV;
}
} }
return 0; return 0;
} }
@ -549,13 +555,18 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
unsigned int result = 0; unsigned int result = 0;
struct cpuinfo_x86 *c = &cpu_data(policy->cpu); struct cpuinfo_x86 *c = &cpu_data(policy->cpu);
struct acpi_processor_performance *perf; struct acpi_processor_performance *perf;
#ifdef CONFIG_SMP
static int blacklisted;
#endif
dprintk("acpi_cpufreq_cpu_init\n"); dprintk("acpi_cpufreq_cpu_init\n");
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
result = acpi_cpufreq_blacklist(c); if (blacklisted)
if (result) return blacklisted;
return result; blacklisted = acpi_cpufreq_blacklist(c);
if (blacklisted)
return blacklisted;
#endif #endif
data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL); data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL);

View File

@ -813,7 +813,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr));
break; break;
case 1 ... 15: case 1 ... 15:
longhaul_version = TYPE_LONGHAUL_V1; longhaul_version = TYPE_LONGHAUL_V2;
if (c->x86_mask < 8) { if (c->x86_mask < 8) {
cpu_model = CPU_SAMUEL2; cpu_model = CPU_SAMUEL2;
cpuname = "C3 'Samuel 2' [C5B]"; cpuname = "C3 'Samuel 2' [C5B]";

View File

@ -1022,7 +1022,7 @@ static int get_transition_latency(struct powernow_k8_data *data)
* set it to 1 to avoid problems in the future. * set it to 1 to avoid problems in the future.
* For all others it's a BIOS bug. * For all others it's a BIOS bug.
*/ */
if (!boot_cpu_data.x86 == 0x11) if (boot_cpu_data.x86 != 0x11)
printk(KERN_ERR FW_WARN PFX "Invalid zero transition " printk(KERN_ERR FW_WARN PFX "Invalid zero transition "
"latency\n"); "latency\n");
max_latency = 1; max_latency = 1;

View File

@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void)
return 0; return 0;
} }
struct get_freq_data { static void get_freq_data(void *_speed)
unsigned int speed;
unsigned int processor;
};
static void get_freq_data(void *_data)
{ {
struct get_freq_data *data = _data; unsigned int *speed = _speed;
data->speed = speedstep_get_frequency(data->processor); *speed = speedstep_get_frequency(speedstep_processor);
} }
static unsigned int speedstep_get(unsigned int cpu) static unsigned int speedstep_get(unsigned int cpu)
{ {
struct get_freq_data data = { .processor = cpu }; unsigned int speed;
/* You're supposed to ensure CPU is online. */ /* You're supposed to ensure CPU is online. */
if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0) if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0)
BUG(); BUG();
dprintk("detected %u kHz as current frequency\n", data.speed); dprintk("detected %u kHz as current frequency\n", speed);
return data.speed; return speed;
} }
/** /**

View File

@ -600,11 +600,13 @@ static int btusb_close(struct hci_dev *hdev)
btusb_stop_traffic(data); btusb_stop_traffic(data);
err = usb_autopm_get_interface(data->intf); err = usb_autopm_get_interface(data->intf);
if (err < 0) if (err < 0)
return 0; goto failed;
data->intf->needs_remote_wakeup = 0; data->intf->needs_remote_wakeup = 0;
usb_autopm_put_interface(data->intf); usb_autopm_put_interface(data->intf);
failed:
usb_scuttle_anchored_urbs(&data->deferred);
return 0; return 0;
} }

View File

@ -1161,12 +1161,6 @@ static int intel_i915_configure(void)
intel_i9xx_setup_flush(); intel_i9xx_setup_flush();
#ifdef USE_PCI_DMA_API
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36)))
dev_err(&intel_private.pcidev->dev,
"set gfx device dma mask 36bit failed!\n");
#endif
return 0; return 0;
} }
@ -2456,6 +2450,11 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
&bridge->mode); &bridge->mode);
} }
if (bridge->driver->mask_memory == intel_i965_mask_memory)
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36)))
dev_err(&intel_private.pcidev->dev,
"set gfx device dma mask 36bit failed!\n");
pci_set_drvdata(pdev, bridge); pci_set_drvdata(pdev, bridge);
return agp_add_bridge(bridge); return agp_add_bridge(bridge);
} }

View File

@ -221,6 +221,9 @@ int tty_port_block_til_ready(struct tty_port *port,
the port has just hung up or is in another error state */ the port has just hung up or is in another error state */
if ((filp->f_flags & O_NONBLOCK) || if ((filp->f_flags & O_NONBLOCK) ||
(tty->flags & (1 << TTY_IO_ERROR))) { (tty->flags & (1 << TTY_IO_ERROR))) {
/* Indicate we are open */
if (tty->termios->c_cflag & CBAUD)
tty_port_raise_dtr_rts(port);
port->flags |= ASYNC_NORMAL_ACTIVE; port->flags |= ASYNC_NORMAL_ACTIVE;
return 0; return 0;
} }

View File

@ -103,8 +103,8 @@ void vt_event_post(unsigned int event, unsigned int old, unsigned int new)
ve->event.event = event; ve->event.event = event;
/* kernel view is consoles 0..n-1, user space view is /* kernel view is consoles 0..n-1, user space view is
console 1..n with 0 meaning current, so we must bias */ console 1..n with 0 meaning current, so we must bias */
ve->event.old = old + 1; ve->event.oldev = old + 1;
ve->event.new = new + 1; ve->event.newev = new + 1;
wake = 1; wake = 1;
ve->done = 1; ve->done = 1;
} }
@ -186,7 +186,7 @@ int vt_waitactive(int n)
vt_event_wait(&vw); vt_event_wait(&vw);
if (vw.done == 0) if (vw.done == 0)
return -EINTR; return -EINTR;
} while (vw.event.new != n); } while (vw.event.newev != n);
return 0; return 0;
} }

View File

@ -41,7 +41,7 @@ static struct cpufreq_driver *cpufreq_driver;
static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data); static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
/* This one keeps track of the previously set governor of a removed CPU */ /* This one keeps track of the previously set governor of a removed CPU */
static DEFINE_PER_CPU(struct cpufreq_governor *, cpufreq_cpu_governor); static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
#endif #endif
static DEFINE_SPINLOCK(cpufreq_driver_lock); static DEFINE_SPINLOCK(cpufreq_driver_lock);
@ -774,10 +774,12 @@ int cpufreq_add_dev_policy(unsigned int cpu, struct cpufreq_policy *policy,
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
unsigned long flags; unsigned long flags;
unsigned int j; unsigned int j;
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
if (per_cpu(cpufreq_cpu_governor, cpu)) { struct cpufreq_governor *gov;
policy->governor = per_cpu(cpufreq_cpu_governor, cpu);
gov = __find_governor(per_cpu(cpufreq_cpu_governor, cpu));
if (gov) {
policy->governor = gov;
dprintk("Restoring governor %s for cpu %d\n", dprintk("Restoring governor %s for cpu %d\n",
policy->governor->name, cpu); policy->governor->name, cpu);
} }
@ -949,10 +951,13 @@ err_out_kobj_put:
static int cpufreq_add_dev(struct sys_device *sys_dev) static int cpufreq_add_dev(struct sys_device *sys_dev)
{ {
unsigned int cpu = sys_dev->id; unsigned int cpu = sys_dev->id;
int ret = 0; int ret = 0, found = 0;
struct cpufreq_policy *policy; struct cpufreq_policy *policy;
unsigned long flags; unsigned long flags;
unsigned int j; unsigned int j;
#ifdef CONFIG_HOTPLUG_CPU
int sibling;
#endif
if (cpu_is_offline(cpu)) if (cpu_is_offline(cpu))
return 0; return 0;
@ -999,7 +1004,19 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
INIT_WORK(&policy->update, handle_update); INIT_WORK(&policy->update, handle_update);
/* Set governor before ->init, so that driver could check it */ /* Set governor before ->init, so that driver could check it */
policy->governor = CPUFREQ_DEFAULT_GOVERNOR; #ifdef CONFIG_HOTPLUG_CPU
for_each_online_cpu(sibling) {
struct cpufreq_policy *cp = per_cpu(cpufreq_cpu_data, sibling);
if (cp && cp->governor &&
(cpumask_test_cpu(cpu, cp->related_cpus))) {
policy->governor = cp->governor;
found = 1;
break;
}
}
#endif
if (!found)
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
/* call driver. From then on the cpufreq must be able /* call driver. From then on the cpufreq must be able
* to accept all calls to ->verify and ->setpolicy for this CPU * to accept all calls to ->verify and ->setpolicy for this CPU
*/ */
@ -1111,7 +1128,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
per_cpu(cpufreq_cpu_governor, cpu) = data->governor; strncpy(per_cpu(cpufreq_cpu_governor, cpu), data->governor->name,
CPUFREQ_NAME_LEN);
#endif #endif
/* if we have other CPUs still registered, we need to unlink them, /* if we have other CPUs still registered, we need to unlink them,
@ -1135,7 +1153,8 @@ static int __cpufreq_remove_dev(struct sys_device *sys_dev)
continue; continue;
dprintk("removing link for cpu %u\n", j); dprintk("removing link for cpu %u\n", j);
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
per_cpu(cpufreq_cpu_governor, j) = data->governor; strncpy(per_cpu(cpufreq_cpu_governor, j),
data->governor->name, CPUFREQ_NAME_LEN);
#endif #endif
cpu_sys_dev = get_cpu_sysdev(j); cpu_sys_dev = get_cpu_sysdev(j);
sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq"); sysfs_remove_link(&cpu_sys_dev->kobj, "cpufreq");
@ -1606,9 +1625,22 @@ EXPORT_SYMBOL_GPL(cpufreq_register_governor);
void cpufreq_unregister_governor(struct cpufreq_governor *governor) void cpufreq_unregister_governor(struct cpufreq_governor *governor)
{ {
#ifdef CONFIG_HOTPLUG_CPU
int cpu;
#endif
if (!governor) if (!governor)
return; return;
#ifdef CONFIG_HOTPLUG_CPU
for_each_present_cpu(cpu) {
if (cpu_online(cpu))
continue;
if (!strcmp(per_cpu(cpufreq_cpu_governor, cpu), governor->name))
strcpy(per_cpu(cpufreq_cpu_governor, cpu), "\0");
}
#endif
mutex_lock(&cpufreq_governor_mutex); mutex_lock(&cpufreq_governor_mutex);
list_del(&governor->governor_list); list_del(&governor->governor_list);
mutex_unlock(&cpufreq_governor_mutex); mutex_unlock(&cpufreq_governor_mutex);

View File

@ -116,9 +116,9 @@ static inline cputime64_t get_cpu_idle_time_jiffy(unsigned int cpu,
idle_time = cputime64_sub(cur_wall_time, busy_time); idle_time = cputime64_sub(cur_wall_time, busy_time);
if (wall) if (wall)
*wall = cur_wall_time; *wall = (cputime64_t)jiffies_to_usecs(cur_wall_time);
return idle_time; return (cputime64_t)jiffies_to_usecs(idle_time);;
} }
static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall) static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall)

View File

@ -133,9 +133,9 @@ static inline cputime64_t get_cpu_idle_time_jiffy(unsigned int cpu,
idle_time = cputime64_sub(cur_wall_time, busy_time); idle_time = cputime64_sub(cur_wall_time, busy_time);
if (wall) if (wall)
*wall = cur_wall_time; *wall = (cputime64_t)jiffies_to_usecs(cur_wall_time);
return idle_time; return (cputime64_t)jiffies_to_usecs(idle_time);
} }
static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall) static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall)

View File

@ -661,7 +661,7 @@ int gpio_export(unsigned gpio, bool direction_may_change)
dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0), dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
desc, ioname ? ioname : "gpio%d", gpio); desc, ioname ? ioname : "gpio%d", gpio);
if (dev) { if (!IS_ERR(dev)) {
if (direction_may_change) if (direction_may_change)
status = sysfs_create_group(&dev->kobj, status = sysfs_create_group(&dev->kobj,
&gpio_attr_group); &gpio_attr_group);
@ -679,7 +679,7 @@ int gpio_export(unsigned gpio, bool direction_may_change)
if (status != 0) if (status != 0)
device_unregister(dev); device_unregister(dev);
} else } else
status = -ENODEV; status = PTR_ERR(dev);
if (status == 0) if (status == 0)
set_bit(FLAG_EXPORT, &desc->flags); set_bit(FLAG_EXPORT, &desc->flags);
} }
@ -800,11 +800,11 @@ static int gpiochip_export(struct gpio_chip *chip)
mutex_lock(&sysfs_lock); mutex_lock(&sysfs_lock);
dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip, dev = device_create(&gpio_class, chip->dev, MKDEV(0, 0), chip,
"gpiochip%d", chip->base); "gpiochip%d", chip->base);
if (dev) { if (!IS_ERR(dev)) {
status = sysfs_create_group(&dev->kobj, status = sysfs_create_group(&dev->kobj,
&gpiochip_attr_group); &gpiochip_attr_group);
} else } else
status = -ENODEV; status = PTR_ERR(dev);
chip->exported = (status == 0); chip->exported = (status == 0);
mutex_unlock(&sysfs_lock); mutex_unlock(&sysfs_lock);

View File

@ -561,7 +561,7 @@ struct table {
char *gpu_prefix; char *gpu_prefix;
}; };
struct offset *offset_new(unsigned o) static struct offset *offset_new(unsigned o)
{ {
struct offset *offset; struct offset *offset;
@ -573,12 +573,12 @@ struct offset *offset_new(unsigned o)
return offset; return offset;
} }
void table_offset_add(struct table *t, struct offset *offset) static void table_offset_add(struct table *t, struct offset *offset)
{ {
list_add_tail(&offset->list, &t->offsets); list_add_tail(&offset->list, &t->offsets);
} }
void table_init(struct table *t) static void table_init(struct table *t)
{ {
INIT_LIST_HEAD(&t->offsets); INIT_LIST_HEAD(&t->offsets);
t->offset_max = 0; t->offset_max = 0;
@ -586,7 +586,7 @@ void table_init(struct table *t)
t->table = NULL; t->table = NULL;
} }
void table_print(struct table *t) static void table_print(struct table *t)
{ {
unsigned nlloop, i, j, n, c, id; unsigned nlloop, i, j, n, c, id;
@ -611,7 +611,7 @@ void table_print(struct table *t)
printf("};\n"); printf("};\n");
} }
int table_build(struct table *t) static int table_build(struct table *t)
{ {
struct offset *offset; struct offset *offset;
unsigned i, m; unsigned i, m;
@ -631,7 +631,7 @@ int table_build(struct table *t)
} }
static char gpu_name[10]; static char gpu_name[10];
int parser_auth(struct table *t, const char *filename) static int parser_auth(struct table *t, const char *filename)
{ {
FILE *file; FILE *file;
regex_t mask_rex; regex_t mask_rex;

View File

@ -350,8 +350,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *attr,
case FAULT: case FAULT:
/* Note - only for remote1 and remote2 */ /* Note - only for remote1 and remote2 */
out = data->alarms & (sattr->index ? 0x8000 : 0x4000); out = !!(data->alarms & (sattr->index ? 0x8000 : 0x4000));
out = out ? 0 : 1;
break; break;
default: default:
@ -863,7 +862,7 @@ static SENSOR_DEVICE_ATTR_2(pwm1_freq, S_IRUGO | S_IWUSR, show_pwmfreq,
set_pwmfreq, INPUT, 0); set_pwmfreq, INPUT, 0);
static SENSOR_DEVICE_ATTR_2(pwm1_enable, S_IRUGO | S_IWUSR, show_pwmctrl, static SENSOR_DEVICE_ATTR_2(pwm1_enable, S_IRUGO | S_IWUSR, show_pwmctrl,
set_pwmctrl, INPUT, 0); set_pwmctrl, INPUT, 0);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_channel_temp, S_IRUGO | S_IWUSR, static SENSOR_DEVICE_ATTR_2(pwm1_auto_channels_temp, S_IRUGO | S_IWUSR,
show_pwmchan, set_pwmchan, INPUT, 0); show_pwmchan, set_pwmchan, INPUT, 0);
static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm, static SENSOR_DEVICE_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm,
set_pwm, MIN, 0); set_pwm, MIN, 0);
@ -875,7 +874,7 @@ static SENSOR_DEVICE_ATTR_2(pwm2_freq, S_IRUGO | S_IWUSR, show_pwmfreq,
set_pwmfreq, INPUT, 1); set_pwmfreq, INPUT, 1);
static SENSOR_DEVICE_ATTR_2(pwm2_enable, S_IRUGO | S_IWUSR, show_pwmctrl, static SENSOR_DEVICE_ATTR_2(pwm2_enable, S_IRUGO | S_IWUSR, show_pwmctrl,
set_pwmctrl, INPUT, 1); set_pwmctrl, INPUT, 1);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_channel_temp, S_IRUGO | S_IWUSR, static SENSOR_DEVICE_ATTR_2(pwm2_auto_channels_temp, S_IRUGO | S_IWUSR,
show_pwmchan, set_pwmchan, INPUT, 1); show_pwmchan, set_pwmchan, INPUT, 1);
static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm, static SENSOR_DEVICE_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm,
set_pwm, MIN, 1); set_pwm, MIN, 1);
@ -887,7 +886,7 @@ static SENSOR_DEVICE_ATTR_2(pwm3_freq, S_IRUGO | S_IWUSR, show_pwmfreq,
set_pwmfreq, INPUT, 2); set_pwmfreq, INPUT, 2);
static SENSOR_DEVICE_ATTR_2(pwm3_enable, S_IRUGO | S_IWUSR, show_pwmctrl, static SENSOR_DEVICE_ATTR_2(pwm3_enable, S_IRUGO | S_IWUSR, show_pwmctrl,
set_pwmctrl, INPUT, 2); set_pwmctrl, INPUT, 2);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_channel_temp, S_IRUGO | S_IWUSR, static SENSOR_DEVICE_ATTR_2(pwm3_auto_channels_temp, S_IRUGO | S_IWUSR,
show_pwmchan, set_pwmchan, INPUT, 2); show_pwmchan, set_pwmchan, INPUT, 2);
static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm, static SENSOR_DEVICE_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO | S_IWUSR, show_pwm,
set_pwm, MIN, 2); set_pwm, MIN, 2);
@ -947,19 +946,19 @@ static struct attribute *adt7475_attrs[] = {
&sensor_dev_attr_pwm1.dev_attr.attr, &sensor_dev_attr_pwm1.dev_attr.attr,
&sensor_dev_attr_pwm1_freq.dev_attr.attr, &sensor_dev_attr_pwm1_freq.dev_attr.attr,
&sensor_dev_attr_pwm1_enable.dev_attr.attr, &sensor_dev_attr_pwm1_enable.dev_attr.attr,
&sensor_dev_attr_pwm1_auto_channel_temp.dev_attr.attr, &sensor_dev_attr_pwm1_auto_channels_temp.dev_attr.attr,
&sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr, &sensor_dev_attr_pwm1_auto_point1_pwm.dev_attr.attr,
&sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr, &sensor_dev_attr_pwm1_auto_point2_pwm.dev_attr.attr,
&sensor_dev_attr_pwm2.dev_attr.attr, &sensor_dev_attr_pwm2.dev_attr.attr,
&sensor_dev_attr_pwm2_freq.dev_attr.attr, &sensor_dev_attr_pwm2_freq.dev_attr.attr,
&sensor_dev_attr_pwm2_enable.dev_attr.attr, &sensor_dev_attr_pwm2_enable.dev_attr.attr,
&sensor_dev_attr_pwm2_auto_channel_temp.dev_attr.attr, &sensor_dev_attr_pwm2_auto_channels_temp.dev_attr.attr,
&sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr, &sensor_dev_attr_pwm2_auto_point1_pwm.dev_attr.attr,
&sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr, &sensor_dev_attr_pwm2_auto_point2_pwm.dev_attr.attr,
&sensor_dev_attr_pwm3.dev_attr.attr, &sensor_dev_attr_pwm3.dev_attr.attr,
&sensor_dev_attr_pwm3_freq.dev_attr.attr, &sensor_dev_attr_pwm3_freq.dev_attr.attr,
&sensor_dev_attr_pwm3_enable.dev_attr.attr, &sensor_dev_attr_pwm3_enable.dev_attr.attr,
&sensor_dev_attr_pwm3_auto_channel_temp.dev_attr.attr, &sensor_dev_attr_pwm3_auto_channels_temp.dev_attr.attr,
&sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr, &sensor_dev_attr_pwm3_auto_point1_pwm.dev_attr.attr,
&sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr, &sensor_dev_attr_pwm3_auto_point2_pwm.dev_attr.attr,
NULL, NULL,
@ -1152,7 +1151,7 @@ static struct adt7475_data *adt7475_update_device(struct device *dev)
} }
/* Limits and settings, should never change update every 60 seconds */ /* Limits and settings, should never change update every 60 seconds */
if (time_after(jiffies, data->limits_updated + HZ * 2) || if (time_after(jiffies, data->limits_updated + HZ * 60) ||
!data->valid) { !data->valid) {
data->config5 = adt7475_read(REG_CONFIG5); data->config5 = adt7475_read(REG_CONFIG5);

View File

@ -323,14 +323,21 @@ static int __devinit s3c_hwmon_probe(struct platform_device *dev)
} }
for (i = 0; i < ARRAY_SIZE(pdata->in); i++) { for (i = 0; i < ARRAY_SIZE(pdata->in); i++) {
if (!pdata->in[i]) struct s3c24xx_adc_hwmon_incfg *cfg = pdata->in[i];
if (!cfg)
continue; continue;
if (pdata->in[i]->mult >= 0x10000) if (cfg->mult >= 0x10000)
dev_warn(&dev->dev, dev_warn(&dev->dev,
"channel %d multiplier too large\n", "channel %d multiplier too large\n",
i); i);
if (cfg->divider == 0) {
dev_err(&dev->dev, "channel %d divider zero\n", i);
continue;
}
ret = s3c_hwmon_create_attr(&dev->dev, pdata->in[i], ret = s3c_hwmon_create_attr(&dev->dev, pdata->in[i],
&hwmon->attrs[i], i); &hwmon->attrs[i], i);
if (ret) { if (ret) {

View File

@ -19,7 +19,9 @@
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c-pnx.h> #include <linux/i2c-pnx.h>
#include <linux/io.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/i2c.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -54,6 +56,9 @@ static inline void i2c_pnx_arm_timer(struct i2c_adapter *adap)
struct timer_list *timer = &data->mif.timer; struct timer_list *timer = &data->mif.timer;
int expires = I2C_PNX_TIMEOUT / (1000 / HZ); int expires = I2C_PNX_TIMEOUT / (1000 / HZ);
if (expires <= 1)
expires = 2;
del_timer_sync(timer); del_timer_sync(timer);
dev_dbg(&adap->dev, "Timer armed at %lu plus %u jiffies.\n", dev_dbg(&adap->dev, "Timer armed at %lu plus %u jiffies.\n",

View File

@ -337,16 +337,16 @@ int input_ff_create(struct input_dev *dev, int max_effects)
dev->ff = ff; dev->ff = ff;
dev->flush = flush_effects; dev->flush = flush_effects;
dev->event = input_ff_event; dev->event = input_ff_event;
set_bit(EV_FF, dev->evbit); __set_bit(EV_FF, dev->evbit);
/* Copy "true" bits into ff device bitmap */ /* Copy "true" bits into ff device bitmap */
for (i = 0; i <= FF_MAX; i++) for (i = 0; i <= FF_MAX; i++)
if (test_bit(i, dev->ffbit)) if (test_bit(i, dev->ffbit))
set_bit(i, ff->ffbit); __set_bit(i, ff->ffbit);
/* we can emulate RUMBLE with periodic effects */ /* we can emulate RUMBLE with periodic effects */
if (test_bit(FF_PERIODIC, ff->ffbit)) if (test_bit(FF_PERIODIC, ff->ffbit))
set_bit(FF_RUMBLE, dev->ffbit); __set_bit(FF_RUMBLE, dev->ffbit);
return 0; return 0;
} }
@ -362,12 +362,14 @@ EXPORT_SYMBOL_GPL(input_ff_create);
*/ */
void input_ff_destroy(struct input_dev *dev) void input_ff_destroy(struct input_dev *dev)
{ {
clear_bit(EV_FF, dev->evbit); struct ff_device *ff = dev->ff;
if (dev->ff) {
if (dev->ff->destroy) __clear_bit(EV_FF, dev->evbit);
dev->ff->destroy(dev->ff); if (ff) {
kfree(dev->ff->private); if (ff->destroy)
kfree(dev->ff); ff->destroy(ff);
kfree(ff->private);
kfree(ff);
dev->ff = NULL; dev->ff = NULL;
} }
} }

View File

@ -61,7 +61,6 @@ struct ml_device {
struct ml_effect_state states[FF_MEMLESS_EFFECTS]; struct ml_effect_state states[FF_MEMLESS_EFFECTS];
int gain; int gain;
struct timer_list timer; struct timer_list timer;
spinlock_t timer_lock;
struct input_dev *dev; struct input_dev *dev;
int (*play_effect)(struct input_dev *dev, void *data, int (*play_effect)(struct input_dev *dev, void *data,
@ -368,38 +367,38 @@ static void ml_effect_timer(unsigned long timer_data)
{ {
struct input_dev *dev = (struct input_dev *)timer_data; struct input_dev *dev = (struct input_dev *)timer_data;
struct ml_device *ml = dev->ff->private; struct ml_device *ml = dev->ff->private;
unsigned long flags;
debug("timer: updating effects"); debug("timer: updating effects");
spin_lock(&ml->timer_lock); spin_lock_irqsave(&dev->event_lock, flags);
ml_play_effects(ml); ml_play_effects(ml);
spin_unlock(&ml->timer_lock); spin_unlock_irqrestore(&dev->event_lock, flags);
} }
/*
* Sets requested gain for FF effects. Called with dev->event_lock held.
*/
static void ml_ff_set_gain(struct input_dev *dev, u16 gain) static void ml_ff_set_gain(struct input_dev *dev, u16 gain)
{ {
struct ml_device *ml = dev->ff->private; struct ml_device *ml = dev->ff->private;
int i; int i;
spin_lock_bh(&ml->timer_lock);
ml->gain = gain; ml->gain = gain;
for (i = 0; i < FF_MEMLESS_EFFECTS; i++) for (i = 0; i < FF_MEMLESS_EFFECTS; i++)
__clear_bit(FF_EFFECT_PLAYING, &ml->states[i].flags); __clear_bit(FF_EFFECT_PLAYING, &ml->states[i].flags);
ml_play_effects(ml); ml_play_effects(ml);
spin_unlock_bh(&ml->timer_lock);
} }
/*
* Start/stop specified FF effect. Called with dev->event_lock held.
*/
static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
{ {
struct ml_device *ml = dev->ff->private; struct ml_device *ml = dev->ff->private;
struct ml_effect_state *state = &ml->states[effect_id]; struct ml_effect_state *state = &ml->states[effect_id];
unsigned long flags;
spin_lock_irqsave(&ml->timer_lock, flags);
if (value > 0) { if (value > 0) {
debug("initiated play"); debug("initiated play");
@ -425,8 +424,6 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
ml_play_effects(ml); ml_play_effects(ml);
} }
spin_unlock_irqrestore(&ml->timer_lock, flags);
return 0; return 0;
} }
@ -436,7 +433,7 @@ static int ml_ff_upload(struct input_dev *dev,
struct ml_device *ml = dev->ff->private; struct ml_device *ml = dev->ff->private;
struct ml_effect_state *state = &ml->states[effect->id]; struct ml_effect_state *state = &ml->states[effect->id];
spin_lock_bh(&ml->timer_lock); spin_lock_irq(&dev->event_lock);
if (test_bit(FF_EFFECT_STARTED, &state->flags)) { if (test_bit(FF_EFFECT_STARTED, &state->flags)) {
__clear_bit(FF_EFFECT_PLAYING, &state->flags); __clear_bit(FF_EFFECT_PLAYING, &state->flags);
@ -448,7 +445,7 @@ static int ml_ff_upload(struct input_dev *dev,
ml_schedule_timer(ml); ml_schedule_timer(ml);
} }
spin_unlock_bh(&ml->timer_lock); spin_unlock_irq(&dev->event_lock);
return 0; return 0;
} }
@ -482,7 +479,6 @@ int input_ff_create_memless(struct input_dev *dev, void *data,
ml->private = data; ml->private = data;
ml->play_effect = play_effect; ml->play_effect = play_effect;
ml->gain = 0xffff; ml->gain = 0xffff;
spin_lock_init(&ml->timer_lock);
setup_timer(&ml->timer, ml_effect_timer, (unsigned long)dev); setup_timer(&ml->timer, ml_effect_timer, (unsigned long)dev);
set_bit(FF_GAIN, dev->ffbit); set_bit(FF_GAIN, dev->ffbit);

View File

@ -1292,17 +1292,24 @@ static int input_dev_uevent(struct device *device, struct kobj_uevent_env *env)
return 0; return 0;
} }
#define INPUT_DO_TOGGLE(dev, type, bits, on) \ #define INPUT_DO_TOGGLE(dev, type, bits, on) \
do { \ do { \
int i; \ int i; \
if (!test_bit(EV_##type, dev->evbit)) \ bool active; \
break; \ \
for (i = 0; i < type##_MAX; i++) { \ if (!test_bit(EV_##type, dev->evbit)) \
if (!test_bit(i, dev->bits##bit) || \ break; \
!test_bit(i, dev->bits)) \ \
continue; \ for (i = 0; i < type##_MAX; i++) { \
dev->event(dev, EV_##type, i, on); \ if (!test_bit(i, dev->bits##bit)) \
} \ continue; \
\
active = test_bit(i, dev->bits); \
if (!active && !on) \
continue; \
\
dev->event(dev, EV_##type, i, on ? active : 0); \
} \
} while (0) } while (0)
#ifdef CONFIG_PM #ifdef CONFIG_PM

View File

@ -1174,6 +1174,18 @@ static int atkbd_reconnect(struct serio *serio)
return -1; return -1;
atkbd_activate(atkbd); atkbd_activate(atkbd);
/*
* Restore LED state and repeat rate. While input core
* will do this for us at resume time reconnect may happen
* because user requested it via sysfs or simply because
* keyboard was unplugged and plugged in again so we need
* to do it ourselves here.
*/
atkbd_set_leds(atkbd);
if (!atkbd->softrepeat)
atkbd_set_repeat_rate(atkbd);
} }
atkbd_enable(atkbd); atkbd_enable(atkbd);
@ -1422,6 +1434,7 @@ static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count)
atkbd->dev = new_dev; atkbd->dev = new_dev;
atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra); atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra);
atkbd_reset_state(atkbd);
atkbd_activate(atkbd); atkbd_activate(atkbd);
atkbd_set_keycode_table(atkbd); atkbd_set_keycode_table(atkbd);
atkbd_set_device_attrs(atkbd); atkbd_set_device_attrs(atkbd);

View File

@ -107,8 +107,7 @@ static const struct dmi_system_id lifebook_dmi_table[] = {
.matches = { .matches = {
DMI_MATCH(DMI_PRODUCT_NAME, "CF-72"), DMI_MATCH(DMI_PRODUCT_NAME, "CF-72"),
}, },
.callback = lifebook_set_serio_phys, .callback = lifebook_set_6byte_proto,
.driver_data = "isa0060/serio3",
}, },
{ {
.ident = "Lifebook B142", .ident = "Lifebook B142",

View File

@ -581,7 +581,7 @@ static int cortron_detect(struct psmouse *psmouse, bool set_properties)
static int psmouse_extensions(struct psmouse *psmouse, static int psmouse_extensions(struct psmouse *psmouse,
unsigned int max_proto, bool set_properties) unsigned int max_proto, bool set_properties)
{ {
bool synaptics_hardware = true; bool synaptics_hardware = false;
/* /*
* We always check for lifebook because it does not disturb mouse * We always check for lifebook because it does not disturb mouse
@ -1673,7 +1673,7 @@ static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp)
{ {
int type = *((unsigned int *)kp->arg); int type = *((unsigned int *)kp->arg);
return sprintf(buffer, "%s\n", psmouse_protocol_by_type(type)->name); return sprintf(buffer, "%s", psmouse_protocol_by_type(type)->name);
} }
static int __init psmouse_init(void) static int __init psmouse_init(void)

View File

@ -5481,7 +5481,7 @@ HFCmulti_init(void)
if (err) { if (err) {
printk(KERN_ERR "error registering embedded driver: " printk(KERN_ERR "error registering embedded driver: "
"%x\n", err); "%x\n", err);
return -err; return err;
} }
HFC_cnt++; HFC_cnt++;
printk(KERN_INFO "%d devices registered\n", HFC_cnt); printk(KERN_INFO "%d devices registered\n", HFC_cnt);

View File

@ -1535,10 +1535,8 @@ static int isdn_ppp_mp_bundle_array_init(void)
int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle); int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL ) if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL )
return -ENOMEM; return -ENOMEM;
for (i = 0; i < ISDN_MAX_CHANNELS; i++) { for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
spin_lock_init(&isdn_ppp_bundle_arr[i].lock); spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
skb_queue_head_init(&isdn_ppp_bundle_arr[i].frags);
}
return 0; return 0;
} }
@ -1571,7 +1569,7 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL) if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
return -ENOMEM; return -ENOMEM;
lp->next = lp->last = lp; /* nobody else in a queue */ lp->next = lp->last = lp; /* nobody else in a queue */
skb_queue_head_init(&lp->netdev->pb->frags); lp->netdev->pb->frags = NULL;
lp->netdev->pb->frames = 0; lp->netdev->pb->frames = 0;
lp->netdev->pb->seq = UINT_MAX; lp->netdev->pb->seq = UINT_MAX;
} }
@ -1583,29 +1581,28 @@ static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
static u32 isdn_ppp_mp_get_seq( int short_seq, static u32 isdn_ppp_mp_get_seq( int short_seq,
struct sk_buff * skb, u32 last_seq ); struct sk_buff * skb, u32 last_seq );
static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from, static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
struct sk_buff *to); struct sk_buff * from, struct sk_buff * to );
static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp, static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
struct sk_buff *from, struct sk_buff *to, struct sk_buff * from, struct sk_buff * to );
u32 lastseq); static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb);
static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb ); static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct sk_buff *newfrag, *frag, *start, *nextf;
u32 newseq, minseq, thisseq;
isdn_mppp_stats *stats;
struct ippp_struct *is; struct ippp_struct *is;
isdn_net_local * lpq;
ippp_bundle * mp;
isdn_mppp_stats * stats;
struct sk_buff * newfrag, * frag, * start, *nextf;
u32 newseq, minseq, thisseq;
unsigned long flags; unsigned long flags;
isdn_net_local *lpq;
ippp_bundle *mp;
int slot; int slot;
spin_lock_irqsave(&net_dev->pb->lock, flags); spin_lock_irqsave(&net_dev->pb->lock, flags);
mp = net_dev->pb; mp = net_dev->pb;
stats = &mp->stats; stats = &mp->stats;
slot = lp->ppp_slot; slot = lp->ppp_slot;
if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
printk(KERN_ERR "%s: lp->ppp_slot(%d)\n", printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
@ -1616,19 +1613,20 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
return; return;
} }
is = ippp_table[slot]; is = ippp_table[slot];
if (++mp->frames > stats->max_queue_len) if( ++mp->frames > stats->max_queue_len )
stats->max_queue_len = mp->frames; stats->max_queue_len = mp->frames;
if (is->debug & 0x8) if (is->debug & 0x8)
isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb); isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ, newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
skb, is->last_link_seqno); skb, is->last_link_seqno);
/* if this packet seq # is less than last already processed one, /* if this packet seq # is less than last already processed one,
* toss it right away, but check for sequence start case first * toss it right away, but check for sequence start case first
*/ */
if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) { if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
mp->seq = newseq; /* the first packet: required for mp->seq = newseq; /* the first packet: required for
* rfc1990 non-compliant clients -- * rfc1990 non-compliant clients --
* prevents constant packet toss */ * prevents constant packet toss */
@ -1638,7 +1636,7 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
spin_unlock_irqrestore(&mp->lock, flags); spin_unlock_irqrestore(&mp->lock, flags);
return; return;
} }
/* find the minimum received sequence number over all links */ /* find the minimum received sequence number over all links */
is->last_link_seqno = minseq = newseq; is->last_link_seqno = minseq = newseq;
for (lpq = net_dev->queue;;) { for (lpq = net_dev->queue;;) {
@ -1659,31 +1657,22 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* packets */ * packets */
newfrag = skb; newfrag = skb;
/* Insert new fragment into the proper sequence slot. */ /* if this new fragment is before the first one, then enqueue it now. */
skb_queue_walk(&mp->frags, frag) { if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
if (MP_SEQ(frag) == newseq) { newfrag->next = frag;
isdn_ppp_mp_free_skb(mp, newfrag); mp->frags = frag = newfrag;
newfrag = NULL; newfrag = NULL;
break; }
}
if (MP_LT(newseq, MP_SEQ(frag))) {
__skb_queue_before(&mp->frags, frag, newfrag);
newfrag = NULL;
break;
}
}
if (newfrag)
__skb_queue_tail(&mp->frags, newfrag);
frag = skb_peek(&mp->frags); start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
start = ((MP_FLAGS(frag) & MP_BEGIN_FRAG) && MP_SEQ(frag) == mp->seq ? frag : NULL;
(MP_SEQ(frag) == mp->seq)) ? frag : NULL;
if (!start)
goto check_overflow;
/* main fragment traversing loop /*
* main fragment traversing loop
* *
* try to accomplish several tasks: * try to accomplish several tasks:
* - insert new fragment into the proper sequence slot (once that's done
* newfrag will be set to NULL)
* - reassemble any complete fragment sequence (non-null 'start' * - reassemble any complete fragment sequence (non-null 'start'
* indicates there is a continguous sequence present) * indicates there is a continguous sequence present)
* - discard any incomplete sequences that are below minseq -- due * - discard any incomplete sequences that are below minseq -- due
@ -1692,46 +1681,71 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* come to complete such sequence and it should be discarded * come to complete such sequence and it should be discarded
* *
* loop completes when we accomplished the following tasks: * loop completes when we accomplished the following tasks:
* - new fragment is inserted in the proper sequence ('newfrag' is
* set to NULL)
* - we hit a gap in the sequence, so no reassembly/processing is * - we hit a gap in the sequence, so no reassembly/processing is
* possible ('start' would be set to NULL) * possible ('start' would be set to NULL)
* *
* algorithm for this code is derived from code in the book * algorithm for this code is derived from code in the book
* 'PPP Design And Debugging' by James Carlson (Addison-Wesley) * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
*/ */
skb_queue_walk_safe(&mp->frags, frag, nextf) { while (start != NULL || newfrag != NULL) {
thisseq = MP_SEQ(frag);
/* check for misplaced start */ thisseq = MP_SEQ(frag);
if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) { nextf = frag->next;
printk(KERN_WARNING"isdn_mppp(seq %d): new "
"BEGIN flag with no prior END", thisseq); /* drop any duplicate fragments */
stats->seqerrs++; if (newfrag != NULL && thisseq == newseq) {
stats->frame_drops++; isdn_ppp_mp_free_skb(mp, newfrag);
isdn_ppp_mp_discard(mp, start, frag); newfrag = NULL;
start = frag; }
} else if (MP_LE(thisseq, minseq)) {
if (MP_FLAGS(frag) & MP_BEGIN_FRAG) /* insert new fragment before next element if possible. */
if (newfrag != NULL && (nextf == NULL ||
MP_LT(newseq, MP_SEQ(nextf)))) {
newfrag->next = nextf;
frag->next = nextf = newfrag;
newfrag = NULL;
}
if (start != NULL) {
/* check for misplaced start */
if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
printk(KERN_WARNING"isdn_mppp(seq %d): new "
"BEGIN flag with no prior END", thisseq);
stats->seqerrs++;
stats->frame_drops++;
start = isdn_ppp_mp_discard(mp, start,frag);
nextf = frag->next;
}
} else if (MP_LE(thisseq, minseq)) {
if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
start = frag; start = frag;
else { else {
if (MP_FLAGS(frag) & MP_END_FRAG) if (MP_FLAGS(frag) & MP_END_FRAG)
stats->frame_drops++; stats->frame_drops++;
__skb_unlink(skb, &mp->frags); if( mp->frags == frag )
mp->frags = nextf;
isdn_ppp_mp_free_skb(mp, frag); isdn_ppp_mp_free_skb(mp, frag);
frag = nextf;
continue; continue;
} }
} }
/* if we have end fragment, then we have full reassembly /* if start is non-null and we have end fragment, then
* sequence -- reassemble and process packet now * we have full reassembly sequence -- reassemble
* and process packet now
*/ */
if (MP_FLAGS(frag) & MP_END_FRAG) { if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK; minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
/* Reassemble the packet then dispatch it */ /* Reassemble the packet then dispatch it */
isdn_ppp_mp_reassembly(net_dev, lp, start, frag, thisseq); isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
start = NULL;
frag = NULL;
start = NULL; mp->frags = nextf;
frag = NULL; }
}
/* check if need to update start pointer: if we just /* check if need to update start pointer: if we just
* reassembled the packet and sequence is contiguous * reassembled the packet and sequence is contiguous
@ -1742,25 +1756,26 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* below low watermark and set start to the next frag or * below low watermark and set start to the next frag or
* clear start ptr. * clear start ptr.
*/ */
if (nextf != (struct sk_buff *)&mp->frags && if (nextf != NULL &&
((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) { ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
/* if we just reassembled and the next one is here, /* if we just reassembled and the next one is here,
* then start another reassembly. * then start another reassembly. */
*/
if (frag == NULL) { if (frag == NULL) {
if (MP_FLAGS(nextf) & MP_BEGIN_FRAG) if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
start = nextf; start = nextf;
else { else
printk(KERN_WARNING"isdn_mppp(seq %d):" {
" END flag with no following " printk(KERN_WARNING"isdn_mppp(seq %d):"
"BEGIN", thisseq); " END flag with no following "
"BEGIN", thisseq);
stats->seqerrs++; stats->seqerrs++;
} }
} }
} else {
if (nextf != (struct sk_buff *)&mp->frags && } else {
frag != NULL && if ( nextf != NULL && frag != NULL &&
MP_LT(thisseq, minseq)) { MP_LT(thisseq, minseq)) {
/* we've got a break in the sequence /* we've got a break in the sequence
* and we not at the end yet * and we not at the end yet
* and we did not just reassembled * and we did not just reassembled
@ -1769,39 +1784,41 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp,
* discard all the frames below low watermark * discard all the frames below low watermark
* and start over */ * and start over */
stats->frame_drops++; stats->frame_drops++;
isdn_ppp_mp_discard(mp, start, nextf); mp->frags = isdn_ppp_mp_discard(mp,start,nextf);
} }
/* break in the sequence, no reassembly */ /* break in the sequence, no reassembly */
start = NULL; start = NULL;
} }
if (!start)
break; frag = nextf;
} } /* while -- main loop */
check_overflow: if (mp->frags == NULL)
mp->frags = frag;
/* rather straighforward way to deal with (not very) possible /* rather straighforward way to deal with (not very) possible
* queue overflow * queue overflow */
*/
if (mp->frames > MP_MAX_QUEUE_LEN) { if (mp->frames > MP_MAX_QUEUE_LEN) {
stats->overflows++; stats->overflows++;
skb_queue_walk_safe(&mp->frags, frag, nextf) { while (mp->frames > MP_MAX_QUEUE_LEN) {
if (mp->frames <= MP_MAX_QUEUE_LEN) frag = mp->frags->next;
break; isdn_ppp_mp_free_skb(mp, mp->frags);
__skb_unlink(frag, &mp->frags); mp->frags = frag;
isdn_ppp_mp_free_skb(mp, frag);
} }
} }
spin_unlock_irqrestore(&mp->lock, flags); spin_unlock_irqrestore(&mp->lock, flags);
} }
static void isdn_ppp_mp_cleanup(isdn_net_local *lp) static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
{ {
struct sk_buff *skb, *tmp; struct sk_buff * frag = lp->netdev->pb->frags;
struct sk_buff * nextfrag;
skb_queue_walk_safe(&lp->netdev->pb->frags, skb, tmp) { while( frag ) {
__skb_unlink(skb, &lp->netdev->pb->frags); nextfrag = frag->next;
isdn_ppp_mp_free_skb(lp->netdev->pb, skb); isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
frag = nextfrag;
} }
lp->netdev->pb->frags = NULL;
} }
static u32 isdn_ppp_mp_get_seq( int short_seq, static u32 isdn_ppp_mp_get_seq( int short_seq,
@ -1838,115 +1855,72 @@ static u32 isdn_ppp_mp_get_seq( int short_seq,
return seq; return seq;
} }
static void isdn_ppp_mp_discard(ippp_bundle *mp, struct sk_buff *from, struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
struct sk_buff *to) struct sk_buff * from, struct sk_buff * to )
{ {
if (from) { if( from )
struct sk_buff *skb, *tmp; while (from != to) {
int freeing = 0; struct sk_buff * next = from->next;
isdn_ppp_mp_free_skb(mp, from);
skb_queue_walk_safe(&mp->frags, skb, tmp) { from = next;
if (skb == to)
break;
if (skb == from)
freeing = 1;
if (!freeing)
continue;
__skb_unlink(skb, &mp->frags);
isdn_ppp_mp_free_skb(mp, skb);
} }
} return from;
} }
static unsigned int calc_tot_len(struct sk_buff_head *queue, void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
struct sk_buff *from, struct sk_buff *to) struct sk_buff * from, struct sk_buff * to )
{ {
unsigned int tot_len = 0; ippp_bundle * mp = net_dev->pb;
struct sk_buff *skb;
int found_start = 0;
skb_queue_walk(queue, skb) {
if (skb == from)
found_start = 1;
if (!found_start)
continue;
tot_len += skb->len - MP_HEADER_LEN;
if (skb == to)
break;
}
return tot_len;
}
/* Reassemble packet using fragments in the reassembly queue from
* 'from' until 'to', inclusive.
*/
static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
struct sk_buff *from, struct sk_buff *to,
u32 lastseq)
{
ippp_bundle *mp = net_dev->pb;
unsigned int tot_len;
struct sk_buff *skb;
int proto; int proto;
struct sk_buff * skb;
unsigned int tot_len;
if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n", printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
__func__, lp->ppp_slot); __func__, lp->ppp_slot);
return; return;
} }
if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
tot_len = calc_tot_len(&mp->frags, from, to); if( ippp_table[lp->ppp_slot]->debug & 0x40 )
if (MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG)) {
if (ippp_table[lp->ppp_slot]->debug & 0x40)
printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, " printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
"len %d\n", MP_SEQ(from), from->len); "len %d\n", MP_SEQ(from), from->len );
skb = from; skb = from;
skb_pull(skb, MP_HEADER_LEN); skb_pull(skb, MP_HEADER_LEN);
__skb_unlink(skb, &mp->frags);
mp->frames--; mp->frames--;
} else { } else {
struct sk_buff *walk, *tmp; struct sk_buff * frag;
int found_start = 0; int n;
if (ippp_table[lp->ppp_slot]->debug & 0x40) for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++)
tot_len += frag->len - MP_HEADER_LEN;
if( ippp_table[lp->ppp_slot]->debug & 0x40 )
printk(KERN_DEBUG"isdn_mppp: reassembling frames %d " printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
"to %d, len %d\n", MP_SEQ(from), lastseq, "to %d, len %d\n", MP_SEQ(from),
tot_len); (MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len );
if( (skb = dev_alloc_skb(tot_len)) == NULL ) {
skb = dev_alloc_skb(tot_len);
if (!skb)
printk(KERN_ERR "isdn_mppp: cannot allocate sk buff " printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
"of size %d\n", tot_len); "of size %d\n", tot_len);
isdn_ppp_mp_discard(mp, from, to);
return;
}
found_start = 0; while( from != to ) {
skb_queue_walk_safe(&mp->frags, walk, tmp) { unsigned int len = from->len - MP_HEADER_LEN;
if (walk == from)
found_start = 1;
if (!found_start)
continue;
if (skb) { skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
unsigned int len = walk->len - MP_HEADER_LEN; skb_put(skb,len),
skb_copy_from_linear_data_offset(walk, MP_HEADER_LEN, len);
skb_put(skb, len), frag = from->next;
len); isdn_ppp_mp_free_skb(mp, from);
} from = frag;
__skb_unlink(walk, &mp->frags);
isdn_ppp_mp_free_skb(mp, walk);
if (walk == to)
break;
} }
} }
if (!skb)
return;
proto = isdn_ppp_strip_proto(skb); proto = isdn_ppp_strip_proto(skb);
isdn_ppp_push_higher(net_dev, lp, skb, proto); isdn_ppp_push_higher(net_dev, lp, skb, proto);
} }
static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb) static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb)
{ {
dev_kfree_skb(skb); dev_kfree_skb(skb);
mp->frames--; mp->frames--;

View File

@ -78,6 +78,8 @@ static int __devinit create_gpio_led(const struct gpio_led *template,
{ {
int ret, state; int ret, state;
led_dat->gpio = -1;
/* skip leds that aren't available */ /* skip leds that aren't available */
if (!gpio_is_valid(template->gpio)) { if (!gpio_is_valid(template->gpio)) {
printk(KERN_INFO "Skipping unavailable LED gpio %d (%s)\n", printk(KERN_INFO "Skipping unavailable LED gpio %d (%s)\n",

View File

@ -944,6 +944,14 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
desc->raid_disk < mddev->raid_disks */) { desc->raid_disk < mddev->raid_disks */) {
set_bit(In_sync, &rdev->flags); set_bit(In_sync, &rdev->flags);
rdev->raid_disk = desc->raid_disk; rdev->raid_disk = desc->raid_disk;
} else if (desc->state & (1<<MD_DISK_ACTIVE)) {
/* active but not in sync implies recovery up to
* reshape position. We don't know exactly where
* that is, so set to zero for now */
if (mddev->minor_version >= 91) {
rdev->recovery_offset = 0;
rdev->raid_disk = desc->raid_disk;
}
} }
if (desc->state & (1<<MD_DISK_WRITEMOSTLY)) if (desc->state & (1<<MD_DISK_WRITEMOSTLY))
set_bit(WriteMostly, &rdev->flags); set_bit(WriteMostly, &rdev->flags);
@ -1032,8 +1040,19 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
list_for_each_entry(rdev2, &mddev->disks, same_set) { list_for_each_entry(rdev2, &mddev->disks, same_set) {
mdp_disk_t *d; mdp_disk_t *d;
int desc_nr; int desc_nr;
if (rdev2->raid_disk >= 0 && test_bit(In_sync, &rdev2->flags) int is_active = test_bit(In_sync, &rdev2->flags);
&& !test_bit(Faulty, &rdev2->flags))
if (rdev2->raid_disk >= 0 &&
sb->minor_version >= 91)
/* we have nowhere to store the recovery_offset,
* but if it is not below the reshape_position,
* we can piggy-back on that.
*/
is_active = 1;
if (rdev2->raid_disk < 0 ||
test_bit(Faulty, &rdev2->flags))
is_active = 0;
if (is_active)
desc_nr = rdev2->raid_disk; desc_nr = rdev2->raid_disk;
else else
desc_nr = next_spare++; desc_nr = next_spare++;
@ -1043,16 +1062,16 @@ static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
d->number = rdev2->desc_nr; d->number = rdev2->desc_nr;
d->major = MAJOR(rdev2->bdev->bd_dev); d->major = MAJOR(rdev2->bdev->bd_dev);
d->minor = MINOR(rdev2->bdev->bd_dev); d->minor = MINOR(rdev2->bdev->bd_dev);
if (rdev2->raid_disk >= 0 && test_bit(In_sync, &rdev2->flags) if (is_active)
&& !test_bit(Faulty, &rdev2->flags))
d->raid_disk = rdev2->raid_disk; d->raid_disk = rdev2->raid_disk;
else else
d->raid_disk = rdev2->desc_nr; /* compatibility */ d->raid_disk = rdev2->desc_nr; /* compatibility */
if (test_bit(Faulty, &rdev2->flags)) if (test_bit(Faulty, &rdev2->flags))
d->state = (1<<MD_DISK_FAULTY); d->state = (1<<MD_DISK_FAULTY);
else if (test_bit(In_sync, &rdev2->flags)) { else if (is_active) {
d->state = (1<<MD_DISK_ACTIVE); d->state = (1<<MD_DISK_ACTIVE);
d->state |= (1<<MD_DISK_SYNC); if (test_bit(In_sync, &rdev2->flags))
d->state |= (1<<MD_DISK_SYNC);
active++; active++;
working++; working++;
} else { } else {
@ -1382,8 +1401,6 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
if (rdev->raid_disk >= 0 && if (rdev->raid_disk >= 0 &&
!test_bit(In_sync, &rdev->flags)) { !test_bit(In_sync, &rdev->flags)) {
if (mddev->curr_resync_completed > rdev->recovery_offset)
rdev->recovery_offset = mddev->curr_resync_completed;
if (rdev->recovery_offset > 0) { if (rdev->recovery_offset > 0) {
sb->feature_map |= sb->feature_map |=
cpu_to_le32(MD_FEATURE_RECOVERY_OFFSET); cpu_to_le32(MD_FEATURE_RECOVERY_OFFSET);
@ -1917,6 +1934,14 @@ static void sync_sbs(mddev_t * mddev, int nospares)
*/ */
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
/* First make sure individual recovery_offsets are correct */
list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->raid_disk >= 0 &&
!test_bit(In_sync, &rdev->flags) &&
mddev->curr_resync_completed > rdev->recovery_offset)
rdev->recovery_offset = mddev->curr_resync_completed;
}
list_for_each_entry(rdev, &mddev->disks, same_set) { list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->sb_events == mddev->events || if (rdev->sb_events == mddev->events ||
(nospares && (nospares &&

View File

@ -4823,11 +4823,40 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
static int only_parity(int raid_disk, int algo, int raid_disks, int max_degraded)
{
switch (algo) {
case ALGORITHM_PARITY_0:
if (raid_disk < max_degraded)
return 1;
break;
case ALGORITHM_PARITY_N:
if (raid_disk >= raid_disks - max_degraded)
return 1;
break;
case ALGORITHM_PARITY_0_6:
if (raid_disk == 0 ||
raid_disk == raid_disks - 1)
return 1;
break;
case ALGORITHM_LEFT_ASYMMETRIC_6:
case ALGORITHM_RIGHT_ASYMMETRIC_6:
case ALGORITHM_LEFT_SYMMETRIC_6:
case ALGORITHM_RIGHT_SYMMETRIC_6:
if (raid_disk == raid_disks - 1)
return 1;
}
return 0;
}
static int run(mddev_t *mddev) static int run(mddev_t *mddev)
{ {
raid5_conf_t *conf; raid5_conf_t *conf;
int working_disks = 0, chunk_size; int working_disks = 0, chunk_size;
int dirty_parity_disks = 0;
mdk_rdev_t *rdev; mdk_rdev_t *rdev;
sector_t reshape_offset = 0;
if (mddev->recovery_cp != MaxSector) if (mddev->recovery_cp != MaxSector)
printk(KERN_NOTICE "raid5: %s is not clean" printk(KERN_NOTICE "raid5: %s is not clean"
@ -4861,6 +4890,7 @@ static int run(mddev_t *mddev)
"on a stripe boundary\n"); "on a stripe boundary\n");
return -EINVAL; return -EINVAL;
} }
reshape_offset = here_new * mddev->new_chunk_sectors;
/* here_new is the stripe we will write to */ /* here_new is the stripe we will write to */
here_old = mddev->reshape_position; here_old = mddev->reshape_position;
sector_div(here_old, mddev->chunk_sectors * sector_div(here_old, mddev->chunk_sectors *
@ -4916,10 +4946,51 @@ static int run(mddev_t *mddev)
/* /*
* 0 for a fully functional array, 1 or 2 for a degraded array. * 0 for a fully functional array, 1 or 2 for a degraded array.
*/ */
list_for_each_entry(rdev, &mddev->disks, same_set) list_for_each_entry(rdev, &mddev->disks, same_set) {
if (rdev->raid_disk >= 0 && if (rdev->raid_disk < 0)
test_bit(In_sync, &rdev->flags)) continue;
if (test_bit(In_sync, &rdev->flags))
working_disks++; working_disks++;
/* This disc is not fully in-sync. However if it
* just stored parity (beyond the recovery_offset),
* when we don't need to be concerned about the
* array being dirty.
* When reshape goes 'backwards', we never have
* partially completed devices, so we only need
* to worry about reshape going forwards.
*/
/* Hack because v0.91 doesn't store recovery_offset properly. */
if (mddev->major_version == 0 &&
mddev->minor_version > 90)
rdev->recovery_offset = reshape_offset;
printk("%d: w=%d pa=%d pr=%d m=%d a=%d r=%d op1=%d op2=%d\n",
rdev->raid_disk, working_disks, conf->prev_algo,
conf->previous_raid_disks, conf->max_degraded,
conf->algorithm, conf->raid_disks,
only_parity(rdev->raid_disk,
conf->prev_algo,
conf->previous_raid_disks,
conf->max_degraded),
only_parity(rdev->raid_disk,
conf->algorithm,
conf->raid_disks,
conf->max_degraded));
if (rdev->recovery_offset < reshape_offset) {
/* We need to check old and new layout */
if (!only_parity(rdev->raid_disk,
conf->algorithm,
conf->raid_disks,
conf->max_degraded))
continue;
}
if (!only_parity(rdev->raid_disk,
conf->prev_algo,
conf->previous_raid_disks,
conf->max_degraded))
continue;
dirty_parity_disks++;
}
mddev->degraded = (max(conf->raid_disks, conf->previous_raid_disks) mddev->degraded = (max(conf->raid_disks, conf->previous_raid_disks)
- working_disks); - working_disks);
@ -4935,7 +5006,7 @@ static int run(mddev_t *mddev)
mddev->dev_sectors &= ~(mddev->chunk_sectors - 1); mddev->dev_sectors &= ~(mddev->chunk_sectors - 1);
mddev->resync_max_sectors = mddev->dev_sectors; mddev->resync_max_sectors = mddev->dev_sectors;
if (mddev->degraded > 0 && if (mddev->degraded > dirty_parity_disks &&
mddev->recovery_cp != MaxSector) { mddev->recovery_cp != MaxSector) {
if (mddev->ok_start_degraded) if (mddev->ok_start_degraded)
printk(KERN_WARNING printk(KERN_WARNING
@ -5361,9 +5432,11 @@ static int raid5_start_reshape(mddev_t *mddev)
!test_bit(Faulty, &rdev->flags)) { !test_bit(Faulty, &rdev->flags)) {
if (raid5_add_disk(mddev, rdev) == 0) { if (raid5_add_disk(mddev, rdev) == 0) {
char nm[20]; char nm[20];
set_bit(In_sync, &rdev->flags); if (rdev->raid_disk >= conf->previous_raid_disks)
set_bit(In_sync, &rdev->flags);
else
rdev->recovery_offset = 0;
added_devices++; added_devices++;
rdev->recovery_offset = 0;
sprintf(nm, "rd%d", rdev->raid_disk); sprintf(nm, "rd%d", rdev->raid_disk);
if (sysfs_create_link(&mddev->kobj, if (sysfs_create_link(&mddev->kobj,
&rdev->kobj, nm)) &rdev->kobj, nm))

View File

@ -1529,6 +1529,7 @@ static int mmc_omap_remove(struct platform_device *pdev)
host->pdata->cleanup(&pdev->dev); host->pdata->cleanup(&pdev->dev);
mmc_omap_fclk_enable(host, 0); mmc_omap_fclk_enable(host, 0);
free_irq(host->irq, host);
clk_put(host->fclk); clk_put(host->fclk);
clk_disable(host->iclk); clk_disable(host->iclk);
clk_put(host->iclk); clk_put(host->iclk);

View File

@ -209,8 +209,8 @@ static int sa1100_probe_subdev(struct sa_subdev_info *subdev, struct resource *r
} }
subdev->mtd->owner = THIS_MODULE; subdev->mtd->owner = THIS_MODULE;
printk(KERN_INFO "SA1100 flash: CFI device at 0x%08lx, %dMiB, " printk(KERN_INFO "SA1100 flash: CFI device at 0x%08lx, %uMiB, %d-bit\n",
"%d-bit\n", phys, subdev->mtd->size >> 20, phys, (unsigned)(subdev->mtd->size >> 20),
subdev->map.bankwidth * 8); subdev->map.bankwidth * 8);
return 0; return 0;

View File

@ -35,66 +35,16 @@ config CAN_CALC_BITTIMING
arguments "tq", "prop_seg", "phase_seg1", "phase_seg2" and "sjw". arguments "tq", "prop_seg", "phase_seg1", "phase_seg2" and "sjw".
If unsure, say Y. If unsure, say Y.
config CAN_SJA1000
depends on CAN_DEV && HAS_IOMEM
tristate "Philips SJA1000"
---help---
Driver for the SJA1000 CAN controllers from Philips or NXP
config CAN_SJA1000_ISA
depends on CAN_SJA1000 && ISA
tristate "ISA Bus based legacy SJA1000 driver"
---help---
This driver adds legacy support for SJA1000 chips connected to
the ISA bus using I/O port, memory mapped or indirect access.
config CAN_SJA1000_PLATFORM
depends on CAN_SJA1000
tristate "Generic Platform Bus based SJA1000 driver"
---help---
This driver adds support for the SJA1000 chips connected to
the "platform bus" (Linux abstraction for directly to the
processor attached devices). Which can be found on various
boards from Phytec (http://www.phytec.de) like the PCM027,
PCM038.
config CAN_SJA1000_OF_PLATFORM
depends on CAN_SJA1000 && PPC_OF
tristate "Generic OF Platform Bus based SJA1000 driver"
---help---
This driver adds support for the SJA1000 chips connected to
the OpenFirmware "platform bus" found on embedded systems with
OpenFirmware bindings, e.g. if you have a PowerPC based system
you may want to enable this option.
config CAN_EMS_PCI
tristate "EMS CPC-PCI, CPC-PCIe and CPC-104P Card"
depends on PCI && CAN_SJA1000
---help---
This driver is for the one, two or four channel CPC-PCI,
CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche
(http://www.ems-wuensche.de).
config CAN_EMS_USB
tristate "EMS CPC-USB/ARM7 CAN/USB interface"
depends on USB && CAN_DEV
---help---
This driver is for the one channel CPC-USB/ARM7 CAN/USB interface
from from EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de).
config CAN_KVASER_PCI
tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards"
depends on PCI && CAN_SJA1000
---help---
This driver is for the the PCIcanx and PCIcan cards (1, 2 or
4 channel) from Kvaser (http://www.kvaser.com).
config CAN_AT91 config CAN_AT91
tristate "Atmel AT91 onchip CAN controller" tristate "Atmel AT91 onchip CAN controller"
depends on CAN && CAN_DEV && ARCH_AT91SAM9263 depends on CAN_DEV && ARCH_AT91SAM9263
---help--- ---help---
This is a driver for the SoC CAN controller in Atmel's AT91SAM9263. This is a driver for the SoC CAN controller in Atmel's AT91SAM9263.
source "drivers/net/can/sja1000/Kconfig"
source "drivers/net/can/usb/Kconfig"
config CAN_DEBUG_DEVICES config CAN_DEBUG_DEVICES
bool "CAN devices debugging messages" bool "CAN devices debugging messages"
depends on CAN depends on CAN

View File

@ -629,6 +629,11 @@ nla_put_failure:
return -EMSGSIZE; return -EMSGSIZE;
} }
static size_t can_get_xstats_size(const struct net_device *dev)
{
return sizeof(struct can_device_stats);
}
static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev) static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev)
{ {
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
@ -657,6 +662,7 @@ static struct rtnl_link_ops can_link_ops __read_mostly = {
.changelink = can_changelink, .changelink = can_changelink,
.get_size = can_get_size, .get_size = can_get_size,
.fill_info = can_fill_info, .fill_info = can_fill_info,
.get_xstats_size = can_get_xstats_size,
.fill_xstats = can_fill_xstats, .fill_xstats = can_fill_xstats,
}; };

View File

@ -0,0 +1,47 @@
menuconfig CAN_SJA1000
tristate "Philips/NXP SJA1000 devices"
depends on CAN_DEV && HAS_IOMEM
if CAN_SJA1000
config CAN_SJA1000_ISA
tristate "ISA Bus based legacy SJA1000 driver"
depends on ISA
---help---
This driver adds legacy support for SJA1000 chips connected to
the ISA bus using I/O port, memory mapped or indirect access.
config CAN_SJA1000_PLATFORM
tristate "Generic Platform Bus based SJA1000 driver"
---help---
This driver adds support for the SJA1000 chips connected to
the "platform bus" (Linux abstraction for directly to the
processor attached devices). Which can be found on various
boards from Phytec (http://www.phytec.de) like the PCM027,
PCM038.
config CAN_SJA1000_OF_PLATFORM
tristate "Generic OF Platform Bus based SJA1000 driver"
depends on PPC_OF
---help---
This driver adds support for the SJA1000 chips connected to
the OpenFirmware "platform bus" found on embedded systems with
OpenFirmware bindings, e.g. if you have a PowerPC based system
you may want to enable this option.
config CAN_EMS_PCI
tristate "EMS CPC-PCI, CPC-PCIe and CPC-104P Card"
depends on PCI
---help---
This driver is for the one, two or four channel CPC-PCI,
CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche
(http://www.ems-wuensche.de).
config CAN_KVASER_PCI
tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards"
depends on PCI
---help---
This driver is for the the PCIcanx and PCIcan cards (1, 2 or
4 channel) from Kvaser (http://www.kvaser.com).
endif

View File

@ -0,0 +1,10 @@
menu "CAN USB interfaces"
depends on USB && CAN_DEV
config CAN_EMS_USB
tristate "EMS CPC-USB/ARM7 CAN/USB interface"
---help---
This driver is for the one channel CPC-USB/ARM7 CAN/USB interface
from from EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de).
endmenu

View File

@ -3,3 +3,5 @@
# #
obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o
ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG

View File

@ -879,7 +879,7 @@ recycle:
pci_dma_sync_single_for_cpu(adap->pdev, dma_addr, len, pci_dma_sync_single_for_cpu(adap->pdev, dma_addr, len,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
(*sd->pg_chunk.p_cnt)--; (*sd->pg_chunk.p_cnt)--;
if (!*sd->pg_chunk.p_cnt) if (!*sd->pg_chunk.p_cnt && sd->pg_chunk.page != fl->pg_chunk.page)
pci_unmap_page(adap->pdev, pci_unmap_page(adap->pdev,
sd->pg_chunk.mapping, sd->pg_chunk.mapping,
fl->alloc_size, fl->alloc_size,
@ -2088,7 +2088,7 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
(*sd->pg_chunk.p_cnt)--; (*sd->pg_chunk.p_cnt)--;
if (!*sd->pg_chunk.p_cnt) if (!*sd->pg_chunk.p_cnt && sd->pg_chunk.page != fl->pg_chunk.page)
pci_unmap_page(adap->pdev, pci_unmap_page(adap->pdev,
sd->pg_chunk.mapping, sd->pg_chunk.mapping,
fl->alloc_size, fl->alloc_size,

View File

@ -2140,9 +2140,6 @@ static int emac_poll(struct napi_struct *napi, int budget)
u32 status = 0; u32 status = 0;
u32 num_pkts = 0; u32 num_pkts = 0;
if (!netif_running(ndev))
return 0;
/* Check interrupt vectors and call packet processing */ /* Check interrupt vectors and call packet processing */
status = emac_read(EMAC_MACINVECTOR); status = emac_read(EMAC_MACINVECTOR);

View File

@ -5821,10 +5821,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
dev->dev_addr); dev->dev_addr);
dev_printk(KERN_ERR, &pci_dev->dev, dev_printk(KERN_ERR, &pci_dev->dev,
"Please complain to your hardware vendor. Switching to a random MAC.\n"); "Please complain to your hardware vendor. Switching to a random MAC.\n");
dev->dev_addr[0] = 0x00; random_ether_addr(dev->dev_addr);
dev->dev_addr[1] = 0x00;
dev->dev_addr[2] = 0x6c;
get_random_bytes(&dev->dev_addr[3], 3);
} }
dprintk(KERN_DEBUG "%s: MAC Address %pM\n", dprintk(KERN_DEBUG "%s: MAC Address %pM\n",

View File

@ -263,8 +263,8 @@ struct emac_regs {
/* EMACx_TRTR */ /* EMACx_TRTR */
#define EMAC_TRTR_SHIFT_EMAC4 27 #define EMAC_TRTR_SHIFT_EMAC4 24
#define EMAC_TRTR_SHIFT 24 #define EMAC_TRTR_SHIFT 27
/* EMAC specific TX descriptor control fields (write access) */ /* EMAC specific TX descriptor control fields (write access) */
#define EMAC_TX_CTRL_GFCS 0x0200 #define EMAC_TX_CTRL_GFCS 0x0200

View File

@ -5994,6 +5994,7 @@ static pci_ers_result_t ixgbe_io_slot_reset(struct pci_dev *pdev)
} else { } else {
pci_set_master(pdev); pci_set_master(pdev);
pci_restore_state(pdev); pci_restore_state(pdev);
pci_save_state(pdev);
pci_wake_from_d3(pdev, false); pci_wake_from_d3(pdev, false);

View File

@ -139,7 +139,7 @@ out:
return NULL; return NULL;
} }
static void __devinit mdio_gpio_bus_deinit(struct device *dev) static void mdio_gpio_bus_deinit(struct device *dev)
{ {
struct mii_bus *bus = dev_get_drvdata(dev); struct mii_bus *bus = dev_get_drvdata(dev);
struct mdio_gpio_info *bitbang = bus->priv; struct mdio_gpio_info *bitbang = bus->priv;

View File

@ -1944,8 +1944,15 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
} }
/* Pull completed packets off the queue and receive them. */ /* Pull completed packets off the queue and receive them. */
while ((skb = ppp_mp_reconstruct(ppp))) while ((skb = ppp_mp_reconstruct(ppp))) {
ppp_receive_nonmp_frame(ppp, skb); if (pskb_may_pull(skb, 2))
ppp_receive_nonmp_frame(ppp, skb);
else {
++ppp->dev->stats.rx_length_errors;
kfree_skb(skb);
ppp_receive_error(ppp);
}
}
return; return;

View File

@ -1085,7 +1085,7 @@ static int __devinit r6040_init_one(struct pci_dev *pdev,
int bar = 0; int bar = 0;
u16 *adrp; u16 *adrp;
printk(KERN_INFO "%s\n", version); printk("%s\n", version);
err = pci_enable_device(pdev); err = pci_enable_device(pdev);
if (err) if (err)

View File

@ -3243,9 +3243,9 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp, static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
struct net_device *dev) struct net_device *dev)
{ {
unsigned int mtu = dev->mtu; unsigned int max_frame = dev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE; tp->rx_buf_sz = (max_frame > RX_BUF_SIZE) ? max_frame : RX_BUF_SIZE;
} }
static int rtl8169_open(struct net_device *dev) static int rtl8169_open(struct net_device *dev)

View File

@ -3494,6 +3494,7 @@ static void s2io_reset(struct s2io_nic *sp)
/* Restore the PCI state saved during initialization. */ /* Restore the PCI state saved during initialization. */
pci_restore_state(sp->pdev); pci_restore_state(sp->pdev);
pci_save_state(sp->pdev);
pci_read_config_word(sp->pdev, 0x2, &val16); pci_read_config_word(sp->pdev, 0x2, &val16);
if (check_pci_device_id(val16) != (u16)PCI_ANY_ID) if (check_pci_device_id(val16) != (u16)PCI_ANY_ID)
break; break;

View File

@ -986,7 +986,7 @@ static int smsc911x_poll(struct napi_struct *napi, int budget)
struct net_device *dev = pdata->dev; struct net_device *dev = pdata->dev;
int npackets = 0; int npackets = 0;
while (likely(netif_running(dev)) && (npackets < budget)) { while (npackets < budget) {
unsigned int pktlength; unsigned int pktlength;
unsigned int pktwords; unsigned int pktwords;
struct sk_buff *skb; struct sk_buff *skb;

View File

@ -2063,7 +2063,15 @@ static int gem_check_invariants(struct gem *gp)
mif_cfg &= ~MIF_CFG_PSELECT; mif_cfg &= ~MIF_CFG_PSELECT;
writel(mif_cfg, gp->regs + MIF_CFG); writel(mif_cfg, gp->regs + MIF_CFG);
} else { } else {
gp->phy_type = phy_serialink; #ifdef CONFIG_SPARC
const char *p;
p = of_get_property(gp->of_node, "shared-pins", NULL);
if (p && !strcmp(p, "serdes"))
gp->phy_type = phy_serdes;
else
#endif
gp->phy_type = phy_serialink;
} }
if (gp->phy_type == phy_mii_mdio1 || if (gp->phy_type == phy_mii_mdio1 ||
gp->phy_type == phy_mii_mdio0) { gp->phy_type == phy_mii_mdio0) {

View File

@ -1125,7 +1125,6 @@ ath5k_mode_setup(struct ath5k_softc *sc)
/* configure operational mode */ /* configure operational mode */
ath5k_hw_set_opmode(ah); ath5k_hw_set_opmode(ah);
ath5k_hw_set_mcast_filter(ah, 0, 0);
ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt); ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt);
} }

View File

@ -63,12 +63,16 @@ static const struct pci_device_id ath5k_led_devices[] = {
{ ATH_SDEVICE(PCI_VENDOR_ID_AMBIT, 0x0422), ATH_LED(1, 1) }, { ATH_SDEVICE(PCI_VENDOR_ID_AMBIT, 0x0422), ATH_LED(1, 1) },
/* E-machines E510 (tuliom@gmail.com) */ /* E-machines E510 (tuliom@gmail.com) */
{ ATH_SDEVICE(PCI_VENDOR_ID_AMBIT, 0x0428), ATH_LED(3, 0) }, { ATH_SDEVICE(PCI_VENDOR_ID_AMBIT, 0x0428), ATH_LED(3, 0) },
/* BenQ Joybook R55v (nowymarluk@wp.pl) */
{ ATH_SDEVICE(PCI_VENDOR_ID_QMI, 0x0100), ATH_LED(1, 0) },
/* Acer Extensa 5620z (nekoreeve@gmail.com) */ /* Acer Extensa 5620z (nekoreeve@gmail.com) */
{ ATH_SDEVICE(PCI_VENDOR_ID_QMI, 0x0105), ATH_LED(3, 0) }, { ATH_SDEVICE(PCI_VENDOR_ID_QMI, 0x0105), ATH_LED(3, 0) },
/* Fukato Datacask Jupiter 1014a (mrb74@gmx.at) */ /* Fukato Datacask Jupiter 1014a (mrb74@gmx.at) */
{ ATH_SDEVICE(PCI_VENDOR_ID_AZWAVE, 0x1026), ATH_LED(3, 0) }, { ATH_SDEVICE(PCI_VENDOR_ID_AZWAVE, 0x1026), ATH_LED(3, 0) },
/* IBM ThinkPad AR5BXB6 (legovini@spiro.fisica.unipd.it) */ /* IBM ThinkPad AR5BXB6 (legovini@spiro.fisica.unipd.it) */
{ ATH_SDEVICE(PCI_VENDOR_ID_IBM, 0x058a), ATH_LED(1, 0) }, { ATH_SDEVICE(PCI_VENDOR_ID_IBM, 0x058a), ATH_LED(1, 0) },
/* HP Compaq CQ60-206US (ddreggors@jumptv.com) */
{ ATH_SDEVICE(PCI_VENDOR_ID_HP, 0x0137a), ATH_LED(3, 1) },
/* HP Compaq C700 (nitrousnrg@gmail.com) */ /* HP Compaq C700 (nitrousnrg@gmail.com) */
{ ATH_SDEVICE(PCI_VENDOR_ID_HP, 0x0137b), ATH_LED(3, 1) }, { ATH_SDEVICE(PCI_VENDOR_ID_HP, 0x0137b), ATH_LED(3, 1) },
/* IBM-specific AR5212 (all others) */ /* IBM-specific AR5212 (all others) */

View File

@ -4521,9 +4521,8 @@ static int b43_op_beacon_set_tim(struct ieee80211_hw *hw,
{ {
struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wl *wl = hw_to_b43_wl(hw);
mutex_lock(&wl->mutex); /* FIXME: add locking */
b43_update_templates(wl); b43_update_templates(wl);
mutex_unlock(&wl->mutex);
return 0; return 0;
} }

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