diff --git a/[refs] b/[refs]
index b11aa2c610ec..7399d88cd833 100644
--- a/[refs]
+++ b/[refs]
@@ -1,2 +1,2 @@
---
-refs/heads/master: 52e8e19b019ca7ad6951d7a39b78d24b198238bc
+refs/heads/master: bb20698d46bac1b2b48cfe1fcb33e54ac885946a
diff --git a/trunk/Documentation/DocBook/Makefile b/trunk/Documentation/DocBook/Makefile
index 9b1f6ca100d1..fabc06466b93 100644
--- a/trunk/Documentation/DocBook/Makefile
+++ b/trunk/Documentation/DocBook/Makefile
@@ -136,7 +136,7 @@ quiet_cmd_db2ps = PS $@
%.ps : %.xml
$(call cmd,db2ps)
-quiet_cmd_db2pdf = PDF $@
+quiet_cmd_db2pdf = PDF $@
cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template))
%.pdf : %.xml
$(call cmd,db2pdf)
@@ -148,7 +148,7 @@ build_main_index = rm -rf $(main_idx) && \
echo '
Kernel Version: $(KERNELVERSION)
' >> $(main_idx) && \
cat $(HTML) >> $(main_idx)
-quiet_cmd_db2html = HTML $@
+quiet_cmd_db2html = HTML $@
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
echo ' \
$(patsubst %.html,%,$(notdir $@))' > $@
diff --git a/trunk/Documentation/DocBook/deviceiobook.tmpl b/trunk/Documentation/DocBook/deviceiobook.tmpl
index 3ed88126ab8f..60d6e0b81bd9 100644
--- a/trunk/Documentation/DocBook/deviceiobook.tmpl
+++ b/trunk/Documentation/DocBook/deviceiobook.tmpl
@@ -24,7 +24,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/DocBook/mcabook.tmpl b/trunk/Documentation/DocBook/mcabook.tmpl
index 467ccac6ec50..499eddc2d079 100644
--- a/trunk/Documentation/DocBook/mcabook.tmpl
+++ b/trunk/Documentation/DocBook/mcabook.tmpl
@@ -12,7 +12,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/DocBook/wanbook.tmpl b/trunk/Documentation/DocBook/wanbook.tmpl
index 8c93db122f04..9eebcc304de4 100644
--- a/trunk/Documentation/DocBook/wanbook.tmpl
+++ b/trunk/Documentation/DocBook/wanbook.tmpl
@@ -12,7 +12,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/DocBook/z8530book.tmpl b/trunk/Documentation/DocBook/z8530book.tmpl
index 6f3883be877e..a42a8a4c7689 100644
--- a/trunk/Documentation/DocBook/z8530book.tmpl
+++ b/trunk/Documentation/DocBook/z8530book.tmpl
@@ -12,7 +12,7 @@
Cox
- alan@lxorguk.ukuu.org.uk
+ alan@redhat.com
diff --git a/trunk/Documentation/ManagementStyle b/trunk/Documentation/ManagementStyle
index a5f0ea58c788..49a8efa5afeb 100644
--- a/trunk/Documentation/ManagementStyle
+++ b/trunk/Documentation/ManagementStyle
@@ -17,7 +17,7 @@ companies. If you sign purchase orders or you have any clue about the
budget of your group, you're almost certainly not a kernel manager.
These suggestions may or may not apply to you.
-First off, I'd suggest buying "Seven Habits of Highly Effective
+First off, I'd suggest buying "Seven Habits of Highly Successful
People", and NOT read it. Burn it, it's a great symbolic gesture.
(*) This document does so not so much by answering the question, but by
diff --git a/trunk/Documentation/accounting/.gitignore b/trunk/Documentation/accounting/.gitignore
deleted file mode 100644
index 86485203c4ae..000000000000
--- a/trunk/Documentation/accounting/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-getdelays
diff --git a/trunk/Documentation/auxdisplay/.gitignore b/trunk/Documentation/auxdisplay/.gitignore
deleted file mode 100644
index 7af222860a96..000000000000
--- a/trunk/Documentation/auxdisplay/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-cfag12864b-example
diff --git a/trunk/Documentation/connector/.gitignore b/trunk/Documentation/connector/.gitignore
deleted file mode 100644
index d2b9c32accd4..000000000000
--- a/trunk/Documentation/connector/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-ucon
diff --git a/trunk/Documentation/filesystems/Locking b/trunk/Documentation/filesystems/Locking
index 23d2f4460deb..8362860e21a7 100644
--- a/trunk/Documentation/filesystems/Locking
+++ b/trunk/Documentation/filesystems/Locking
@@ -161,12 +161,8 @@ prototypes:
int (*set_page_dirty)(struct page *page);
int (*readpages)(struct file *filp, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages);
- int (*write_begin)(struct file *, struct address_space *mapping,
- loff_t pos, unsigned len, unsigned flags,
- struct page **pagep, void **fsdata);
- int (*write_end)(struct file *, struct address_space *mapping,
- loff_t pos, unsigned len, unsigned copied,
- struct page *page, void *fsdata);
+ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
+ int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
sector_t (*bmap)(struct address_space *, sector_t);
int (*invalidatepage) (struct page *, unsigned long);
int (*releasepage) (struct page *, int);
@@ -184,6 +180,8 @@ sync_page: no maybe
writepages: no
set_page_dirty no no
readpages: no
+prepare_write: no yes yes
+commit_write: no yes yes
write_begin: no locks the page yes
write_end: no yes, unlocks yes
perform_write: no n/a yes
@@ -193,7 +191,7 @@ releasepage: no yes
direct_IO: no
launder_page: no yes
- ->write_begin(), ->write_end(), ->sync_page() and ->readpage()
+ ->prepare_write(), ->commit_write(), ->sync_page() and ->readpage()
may be called from the request handler (/dev/loop).
->readpage() unlocks the page, either synchronously or via I/O
diff --git a/trunk/Documentation/filesystems/vfs.txt b/trunk/Documentation/filesystems/vfs.txt
index 5579bda58a6d..c4d348dabe94 100644
--- a/trunk/Documentation/filesystems/vfs.txt
+++ b/trunk/Documentation/filesystems/vfs.txt
@@ -492,7 +492,7 @@ written-back to storage typically in whole pages, however the
address_space has finer control of write sizes.
The read process essentially only requires 'readpage'. The write
-process is more complicated and uses write_begin/write_end or
+process is more complicated and uses prepare_write/commit_write or
set_page_dirty to write data into the address_space, and writepage,
sync_page, and writepages to writeback data to storage.
@@ -521,6 +521,8 @@ struct address_space_operations {
int (*set_page_dirty)(struct page *page);
int (*readpages)(struct file *filp, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages);
+ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
+ int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
int (*write_begin)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata);
@@ -596,7 +598,37 @@ struct address_space_operations {
readpages is only used for read-ahead, so read errors are
ignored. If anything goes wrong, feel free to give up.
- write_begin:
+ prepare_write: called by the generic write path in VM to set up a write
+ request for a page. This indicates to the address space that
+ the given range of bytes is about to be written. The
+ address_space should check that the write will be able to
+ complete, by allocating space if necessary and doing any other
+ internal housekeeping. If the write will update parts of
+ any basic-blocks on storage, then those blocks should be
+ pre-read (if they haven't been read already) so that the
+ updated blocks can be written out properly.
+ The page will be locked.
+
+ Note: the page _must not_ be marked uptodate in this function
+ (or anywhere else) unless it actually is uptodate right now. As
+ soon as a page is marked uptodate, it is possible for a concurrent
+ read(2) to copy it to userspace.
+
+ commit_write: If prepare_write succeeds, new data will be copied
+ into the page and then commit_write will be called. It will
+ typically update the size of the file (if appropriate) and
+ mark the inode as dirty, and do any other related housekeeping
+ operations. It should avoid returning an error if possible -
+ errors should have been handled by prepare_write.
+
+ write_begin: This is intended as a replacement for prepare_write. The
+ key differences being that:
+ - it returns a locked page (in *pagep) rather than being
+ given a pre locked page;
+ - it must be able to cope with short writes (where the
+ length passed to write_begin is greater than the number
+ of bytes copied into the page).
+
Called by the generic buffered write code to ask the filesystem to
prepare to write len bytes at the given offset in the file. The
address_space should check that the write will be able to complete,
@@ -608,9 +640,6 @@ struct address_space_operations {
The filesystem must return the locked pagecache page for the specified
offset, in *pagep, for the caller to write into.
- It must be able to cope with short writes (where the length passed to
- write_begin is greater than the number of bytes copied into the page).
-
flags is a field for AOP_FLAG_xxx flags, described in
include/linux/fs.h.
diff --git a/trunk/Documentation/ia64/.gitignore b/trunk/Documentation/ia64/.gitignore
deleted file mode 100644
index ab806edc8732..000000000000
--- a/trunk/Documentation/ia64/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-aliasing-test
diff --git a/trunk/Documentation/isdn/CREDITS b/trunk/Documentation/isdn/CREDITS
index c1679e913fca..8cac6c2f23ee 100644
--- a/trunk/Documentation/isdn/CREDITS
+++ b/trunk/Documentation/isdn/CREDITS
@@ -5,7 +5,7 @@ I want to thank all who contributed to this project and especially to:
Thomas Bogendörfer (tsbogend@bigbug.franken.de)
Tester, lots of bugfixes and hints.
-Alan Cox (alan@lxorguk.ukuu.org.uk)
+Alan Cox (alan@redhat.com)
For help getting into standard-kernel.
Henner Eisen (eis@baty.hanse.de)
diff --git a/trunk/Documentation/networking/.gitignore b/trunk/Documentation/networking/.gitignore
deleted file mode 100644
index 286a5680f490..000000000000
--- a/trunk/Documentation/networking/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-ifenslave
diff --git a/trunk/Documentation/networking/dmfe.txt b/trunk/Documentation/networking/dmfe.txt
index 8006c227fda2..b1b7499dd9d3 100644
--- a/trunk/Documentation/networking/dmfe.txt
+++ b/trunk/Documentation/networking/dmfe.txt
@@ -60,6 +60,6 @@ Tobias Ringstrom : Current Maintainer
Contributors:
Marcelo Tosatti
-Alan Cox
+Alan Cox
Jeff Garzik
Vojtech Pavlik
diff --git a/trunk/Documentation/pcmcia/.gitignore b/trunk/Documentation/pcmcia/.gitignore
deleted file mode 100644
index 53d081336757..000000000000
--- a/trunk/Documentation/pcmcia/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-crc32hash
diff --git a/trunk/Documentation/scsi/aacraid.txt b/trunk/Documentation/scsi/aacraid.txt
index ddace3afc83b..709ca991a451 100644
--- a/trunk/Documentation/scsi/aacraid.txt
+++ b/trunk/Documentation/scsi/aacraid.txt
@@ -128,7 +128,7 @@ Supported Cards/Chipsets
People
-------------------------
-Alan Cox
+Alan Cox
Christoph Hellwig (updates for new-style PCI probing and SCSI host registration,
small cleanups/fixes)
Matt Domsch (revision ioctl, adapter messages)
diff --git a/trunk/Documentation/spi/.gitignore b/trunk/Documentation/spi/.gitignore
deleted file mode 100644
index 4280576397e8..000000000000
--- a/trunk/Documentation/spi/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-spidev_fdx
-spidev_test
diff --git a/trunk/Documentation/sysctl/kernel.txt b/trunk/Documentation/sysctl/kernel.txt
index bde799e06598..a4ccdd1981cf 100644
--- a/trunk/Documentation/sysctl/kernel.txt
+++ b/trunk/Documentation/sysctl/kernel.txt
@@ -363,11 +363,21 @@ tainted:
Non-zero if the kernel has been tainted. Numeric values, which
can be ORed together:
- 1 - A module with a non-GPL license has been loaded, this
- includes modules with no license.
- Set by modutils >= 2.4.9 and module-init-tools.
- 2 - A module was force loaded by insmod -f.
- Set by modutils >= 2.4.9 and module-init-tools.
- 4 - Unsafe SMP processors: SMP with CPUs not designed for SMP.
- 64 - A module from drivers/staging was loaded.
+ 1 - A module with a non-GPL license has been loaded, this
+ includes modules with no license.
+ Set by modutils >= 2.4.9 and module-init-tools.
+ 2 - A module was force loaded by insmod -f.
+ Set by modutils >= 2.4.9 and module-init-tools.
+ 4 - Unsafe SMP processors: SMP with CPUs not designed for SMP.
+ 8 - A module was forcibly unloaded from the system by rmmod -f.
+ 16 - A hardware machine check error occurred on the system.
+ 32 - A bad page was discovered on the system.
+ 64 - The user has asked that the system be marked "tainted". This
+ could be because they are running software that directly modifies
+ the hardware, or for other reasons.
+ 128 - The system has died.
+ 256 - The ACPI DSDT has been overridden with one supplied by the user
+ instead of using the one provided by the hardware.
+ 512 - A kernel warning has occurred.
+1024 - A module from drivers/staging was loaded.
diff --git a/trunk/Documentation/video4linux/.gitignore b/trunk/Documentation/video4linux/.gitignore
deleted file mode 100644
index 952703943e8e..000000000000
--- a/trunk/Documentation/video4linux/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-v4lgrab
diff --git a/trunk/Documentation/video4linux/bttv/CONTRIBUTORS b/trunk/Documentation/video4linux/bttv/CONTRIBUTORS
index eb41b2650860..8aad6dd93d6b 100644
--- a/trunk/Documentation/video4linux/bttv/CONTRIBUTORS
+++ b/trunk/Documentation/video4linux/bttv/CONTRIBUTORS
@@ -3,7 +3,7 @@ Contributors to bttv:
Michael Chu
AverMedia fix and more flexible card recognition
-Alan Cox
+Alan Cox
Video4Linux interface and 2.1.x kernel adaptation
Chris Kleitsch
diff --git a/trunk/Documentation/vm/.gitignore b/trunk/Documentation/vm/.gitignore
deleted file mode 100644
index 33e8a023df02..000000000000
--- a/trunk/Documentation/vm/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-slabinfo
diff --git a/trunk/Documentation/watchdog/src/.gitignore b/trunk/Documentation/watchdog/src/.gitignore
deleted file mode 100644
index ac90997dba93..000000000000
--- a/trunk/Documentation/watchdog/src/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-watchdog-simple
-watchdog-test
diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS
index ce521d25ce34..16202c8ac68f 100644
--- a/trunk/MAINTAINERS
+++ b/trunk/MAINTAINERS
@@ -2701,16 +2701,6 @@ M: matthew@wil.cx
L: linux-scsi@vger.kernel.org
S: Maintained
-LTP (Linux Test Project)
-P: Subrata Modak
-M: subrata@linux.vnet.ibm.com
-P: Mike Frysinger
-M: vapier@gentoo.org
-L: ltp-list@lists.sourceforge.net (subscribers-only)
-W: http://ltp.sourceforge.net/
-T: git kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
-S: Maintained
-
M32R ARCHITECTURE
P: Hirokazu Takata
M: takata@linux-m32r.org
diff --git a/trunk/arch/x86/boot/compressed/.gitignore b/trunk/arch/x86/boot/compressed/.gitignore
index 63eff3b04d01..be0ed065249b 100644
--- a/trunk/arch/x86/boot/compressed/.gitignore
+++ b/trunk/arch/x86/boot/compressed/.gitignore
@@ -1,3 +1 @@
relocs
-vmlinux.bin.all
-vmlinux.relocs
diff --git a/trunk/drivers/Kconfig b/trunk/drivers/Kconfig
index 2f557f570ade..d38f43f593d4 100644
--- a/trunk/drivers/Kconfig
+++ b/trunk/drivers/Kconfig
@@ -68,8 +68,6 @@ source "drivers/ssb/Kconfig"
source "drivers/mfd/Kconfig"
-source "drivers/regulator/Kconfig"
-
source "drivers/media/Kconfig"
source "drivers/video/Kconfig"
diff --git a/trunk/drivers/block/loop.c b/trunk/drivers/block/loop.c
index 5c4ee70d5cf3..3f09cd8bcc38 100644
--- a/trunk/drivers/block/loop.c
+++ b/trunk/drivers/block/loop.c
@@ -40,7 +40,8 @@
* Heinz Mauelshagen , Feb 2002
*
* Support for falling back on the write file operation when the address space
- * operations write_begin is not available on the backing filesystem.
+ * operations prepare_write and/or commit_write are not available on the
+ * backing filesystem.
* Anton Altaparmakov, 16 Feb 2005
*
* Still To Fix:
@@ -764,7 +765,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
*/
if (!file->f_op->splice_read)
goto out_putf;
- if (aops->write_begin)
+ if (aops->prepare_write || aops->write_begin)
lo_flags |= LO_FLAGS_USE_AOPS;
if (!(lo_flags & LO_FLAGS_USE_AOPS) && !file->f_op->write)
lo_flags |= LO_FLAGS_READ_ONLY;
diff --git a/trunk/drivers/char/ipmi/ipmi_devintf.c b/trunk/drivers/char/ipmi/ipmi_devintf.c
index 1d7b429f7ffa..835a33c8d5f5 100644
--- a/trunk/drivers/char/ipmi/ipmi_devintf.c
+++ b/trunk/drivers/char/ipmi/ipmi_devintf.c
@@ -957,4 +957,3 @@ module_exit(cleanup_ipmi);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Corey Minyard ");
MODULE_DESCRIPTION("Linux device interface for the IPMI message handler.");
-MODULE_ALIAS("platform:ipmi_si");
diff --git a/trunk/drivers/edac/Kconfig b/trunk/drivers/edac/Kconfig
index e0dbd388757f..5a11e3cbcae2 100644
--- a/trunk/drivers/edac/Kconfig
+++ b/trunk/drivers/edac/Kconfig
@@ -102,13 +102,6 @@ config EDAC_I3000
Support for error detection and correction on the Intel
3000 and 3010 server chipsets.
-config EDAC_X38
- tristate "Intel X38"
- depends on EDAC_MM_EDAC && PCI && X86
- help
- Support for error detection and correction on the Intel
- X38 server chipsets.
-
config EDAC_I82860
tristate "Intel 82860"
depends on EDAC_MM_EDAC && PCI && X86_32
diff --git a/trunk/drivers/edac/Makefile b/trunk/drivers/edac/Makefile
index 62c2d9bad8dc..e5e9104b5520 100644
--- a/trunk/drivers/edac/Makefile
+++ b/trunk/drivers/edac/Makefile
@@ -26,7 +26,6 @@ obj-$(CONFIG_EDAC_I82443BXGX) += i82443bxgx_edac.o
obj-$(CONFIG_EDAC_I82875P) += i82875p_edac.o
obj-$(CONFIG_EDAC_I82975X) += i82975x_edac.o
obj-$(CONFIG_EDAC_I3000) += i3000_edac.o
-obj-$(CONFIG_EDAC_X38) += x38_edac.o
obj-$(CONFIG_EDAC_I82860) += i82860_edac.o
obj-$(CONFIG_EDAC_R82600) += r82600_edac.o
obj-$(CONFIG_EDAC_PASEMI) += pasemi_edac.o
diff --git a/trunk/drivers/edac/cell_edac.c b/trunk/drivers/edac/cell_edac.c
index cd2e3b8087e7..887072f5dc8b 100644
--- a/trunk/drivers/edac/cell_edac.c
+++ b/trunk/drivers/edac/cell_edac.c
@@ -9,7 +9,6 @@
*/
#undef DEBUG
-#include
#include
#include
#include
@@ -165,8 +164,6 @@ static int __devinit cell_edac_probe(struct platform_device *pdev)
if (regs == NULL)
return -ENODEV;
- edac_op_state = EDAC_OPSTATE_POLL;
-
/* Get channel population */
reg = in_be64(®s->mic_mnt_cfg);
dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg);
diff --git a/trunk/drivers/edac/x38_edac.c b/trunk/drivers/edac/x38_edac.c
deleted file mode 100644
index 2406c2ce2844..000000000000
--- a/trunk/drivers/edac/x38_edac.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * Intel X38 Memory Controller kernel module
- * Copyright (C) 2008 Cluster Computing, Inc.
- *
- * This file may be distributed under the terms of the
- * GNU General Public License.
- *
- * This file is based on i3200_edac.c
- *
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include "edac_core.h"
-
-#define X38_REVISION "1.1"
-
-#define EDAC_MOD_STR "x38_edac"
-
-#define PCI_DEVICE_ID_INTEL_X38_HB 0x29e0
-
-#define X38_RANKS 8
-#define X38_RANKS_PER_CHANNEL 4
-#define X38_CHANNELS 2
-
-/* Intel X38 register addresses - device 0 function 0 - DRAM Controller */
-
-#define X38_MCHBAR_LOW 0x48 /* MCH Memory Mapped Register BAR */
-#define X38_MCHBAR_HIGH 0x4b
-#define X38_MCHBAR_MASK 0xfffffc000ULL /* bits 35:14 */
-#define X38_MMR_WINDOW_SIZE 16384
-
-#define X38_TOM 0xa0 /* Top of Memory (16b)
- *
- * 15:10 reserved
- * 9:0 total populated physical memory
- */
-#define X38_TOM_MASK 0x3ff /* bits 9:0 */
-#define X38_TOM_SHIFT 26 /* 64MiB grain */
-
-#define X38_ERRSTS 0xc8 /* Error Status Register (16b)
- *
- * 15 reserved
- * 14 Isochronous TBWRR Run Behind FIFO Full
- * (ITCV)
- * 13 Isochronous TBWRR Run Behind FIFO Put
- * (ITSTV)
- * 12 reserved
- * 11 MCH Thermal Sensor Event
- * for SMI/SCI/SERR (GTSE)
- * 10 reserved
- * 9 LOCK to non-DRAM Memory Flag (LCKF)
- * 8 reserved
- * 7 DRAM Throttle Flag (DTF)
- * 6:2 reserved
- * 1 Multi-bit DRAM ECC Error Flag (DMERR)
- * 0 Single-bit DRAM ECC Error Flag (DSERR)
- */
-#define X38_ERRSTS_UE 0x0002
-#define X38_ERRSTS_CE 0x0001
-#define X38_ERRSTS_BITS (X38_ERRSTS_UE | X38_ERRSTS_CE)
-
-
-/* Intel MMIO register space - device 0 function 0 - MMR space */
-
-#define X38_C0DRB 0x200 /* Channel 0 DRAM Rank Boundary (16b x 4)
- *
- * 15:10 reserved
- * 9:0 Channel 0 DRAM Rank Boundary Address
- */
-#define X38_C1DRB 0x600 /* Channel 1 DRAM Rank Boundary (16b x 4) */
-#define X38_DRB_MASK 0x3ff /* bits 9:0 */
-#define X38_DRB_SHIFT 26 /* 64MiB grain */
-
-#define X38_C0ECCERRLOG 0x280 /* Channel 0 ECC Error Log (64b)
- *
- * 63:48 Error Column Address (ERRCOL)
- * 47:32 Error Row Address (ERRROW)
- * 31:29 Error Bank Address (ERRBANK)
- * 28:27 Error Rank Address (ERRRANK)
- * 26:24 reserved
- * 23:16 Error Syndrome (ERRSYND)
- * 15: 2 reserved
- * 1 Multiple Bit Error Status (MERRSTS)
- * 0 Correctable Error Status (CERRSTS)
- */
-#define X38_C1ECCERRLOG 0x680 /* Channel 1 ECC Error Log (64b) */
-#define X38_ECCERRLOG_CE 0x1
-#define X38_ECCERRLOG_UE 0x2
-#define X38_ECCERRLOG_RANK_BITS 0x18000000
-#define X38_ECCERRLOG_SYNDROME_BITS 0xff0000
-
-#define X38_CAPID0 0xe0 /* see P.94 of spec for details */
-
-static int x38_channel_num;
-
-static int how_many_channel(struct pci_dev *pdev)
-{
- unsigned char capid0_8b; /* 8th byte of CAPID0 */
-
- pci_read_config_byte(pdev, X38_CAPID0 + 8, &capid0_8b);
- if (capid0_8b & 0x20) { /* check DCD: Dual Channel Disable */
- debugf0("In single channel mode.\n");
- x38_channel_num = 1;
- } else {
- debugf0("In dual channel mode.\n");
- x38_channel_num = 2;
- }
-
- return x38_channel_num;
-}
-
-static unsigned long eccerrlog_syndrome(u64 log)
-{
- return (log & X38_ECCERRLOG_SYNDROME_BITS) >> 16;
-}
-
-static int eccerrlog_row(int channel, u64 log)
-{
- return ((log & X38_ECCERRLOG_RANK_BITS) >> 27) |
- (channel * X38_RANKS_PER_CHANNEL);
-}
-
-enum x38_chips {
- X38 = 0,
-};
-
-struct x38_dev_info {
- const char *ctl_name;
-};
-
-struct x38_error_info {
- u16 errsts;
- u16 errsts2;
- u64 eccerrlog[X38_CHANNELS];
-};
-
-static const struct x38_dev_info x38_devs[] = {
- [X38] = {
- .ctl_name = "x38"},
-};
-
-static struct pci_dev *mci_pdev;
-static int x38_registered = 1;
-
-
-static void x38_clear_error_info(struct mem_ctl_info *mci)
-{
- struct pci_dev *pdev;
-
- pdev = to_pci_dev(mci->dev);
-
- /*
- * Clear any error bits.
- * (Yes, we really clear bits by writing 1 to them.)
- */
- pci_write_bits16(pdev, X38_ERRSTS, X38_ERRSTS_BITS,
- X38_ERRSTS_BITS);
-}
-
-static u64 x38_readq(const void __iomem *addr)
-{
- return readl(addr) | (((u64)readl(addr + 4)) << 32);
-}
-
-static void x38_get_and_clear_error_info(struct mem_ctl_info *mci,
- struct x38_error_info *info)
-{
- struct pci_dev *pdev;
- void __iomem *window = mci->pvt_info;
-
- pdev = to_pci_dev(mci->dev);
-
- /*
- * This is a mess because there is no atomic way to read all the
- * registers at once and the registers can transition from CE being
- * overwritten by UE.
- */
- pci_read_config_word(pdev, X38_ERRSTS, &info->errsts);
- if (!(info->errsts & X38_ERRSTS_BITS))
- return;
-
- info->eccerrlog[0] = x38_readq(window + X38_C0ECCERRLOG);
- if (x38_channel_num == 2)
- info->eccerrlog[1] = x38_readq(window + X38_C1ECCERRLOG);
-
- pci_read_config_word(pdev, X38_ERRSTS, &info->errsts2);
-
- /*
- * If the error is the same for both reads then the first set
- * of reads is valid. If there is a change then there is a CE
- * with no info and the second set of reads is valid and
- * should be UE info.
- */
- if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) {
- info->eccerrlog[0] = x38_readq(window + X38_C0ECCERRLOG);
- if (x38_channel_num == 2)
- info->eccerrlog[1] =
- x38_readq(window + X38_C1ECCERRLOG);
- }
-
- x38_clear_error_info(mci);
-}
-
-static void x38_process_error_info(struct mem_ctl_info *mci,
- struct x38_error_info *info)
-{
- int channel;
- u64 log;
-
- if (!(info->errsts & X38_ERRSTS_BITS))
- return;
-
- if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) {
- edac_mc_handle_ce_no_info(mci, "UE overwrote CE");
- info->errsts = info->errsts2;
- }
-
- for (channel = 0; channel < x38_channel_num; channel++) {
- log = info->eccerrlog[channel];
- if (log & X38_ECCERRLOG_UE) {
- edac_mc_handle_ue(mci, 0, 0,
- eccerrlog_row(channel, log), "x38 UE");
- } else if (log & X38_ECCERRLOG_CE) {
- edac_mc_handle_ce(mci, 0, 0,
- eccerrlog_syndrome(log),
- eccerrlog_row(channel, log), 0, "x38 CE");
- }
- }
-}
-
-static void x38_check(struct mem_ctl_info *mci)
-{
- struct x38_error_info info;
-
- debugf1("MC%d: %s()\n", mci->mc_idx, __func__);
- x38_get_and_clear_error_info(mci, &info);
- x38_process_error_info(mci, &info);
-}
-
-
-void __iomem *x38_map_mchbar(struct pci_dev *pdev)
-{
- union {
- u64 mchbar;
- struct {
- u32 mchbar_low;
- u32 mchbar_high;
- };
- } u;
- void __iomem *window;
-
- pci_read_config_dword(pdev, X38_MCHBAR_LOW, &u.mchbar_low);
- pci_write_config_dword(pdev, X38_MCHBAR_LOW, u.mchbar_low | 0x1);
- pci_read_config_dword(pdev, X38_MCHBAR_HIGH, &u.mchbar_high);
- u.mchbar &= X38_MCHBAR_MASK;
-
- if (u.mchbar != (resource_size_t)u.mchbar) {
- printk(KERN_ERR
- "x38: mmio space beyond accessible range (0x%llx)\n",
- (unsigned long long)u.mchbar);
- return NULL;
- }
-
- window = ioremap_nocache(u.mchbar, X38_MMR_WINDOW_SIZE);
- if (!window)
- printk(KERN_ERR "x38: cannot map mmio space at 0x%llx\n",
- (unsigned long long)u.mchbar);
-
- return window;
-}
-
-
-static void x38_get_drbs(void __iomem *window,
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL])
-{
- int i;
-
- for (i = 0; i < X38_RANKS_PER_CHANNEL; i++) {
- drbs[0][i] = readw(window + X38_C0DRB + 2*i) & X38_DRB_MASK;
- drbs[1][i] = readw(window + X38_C1DRB + 2*i) & X38_DRB_MASK;
- }
-}
-
-static bool x38_is_stacked(struct pci_dev *pdev,
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL])
-{
- u16 tom;
-
- pci_read_config_word(pdev, X38_TOM, &tom);
- tom &= X38_TOM_MASK;
-
- return drbs[X38_CHANNELS - 1][X38_RANKS_PER_CHANNEL - 1] == tom;
-}
-
-static unsigned long drb_to_nr_pages(
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL],
- bool stacked, int channel, int rank)
-{
- int n;
-
- n = drbs[channel][rank];
- if (rank > 0)
- n -= drbs[channel][rank - 1];
- if (stacked && (channel == 1) && drbs[channel][rank] ==
- drbs[channel][X38_RANKS_PER_CHANNEL - 1]) {
- n -= drbs[0][X38_RANKS_PER_CHANNEL - 1];
- }
-
- n <<= (X38_DRB_SHIFT - PAGE_SHIFT);
- return n;
-}
-
-static int x38_probe1(struct pci_dev *pdev, int dev_idx)
-{
- int rc;
- int i;
- struct mem_ctl_info *mci = NULL;
- unsigned long last_page;
- u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL];
- bool stacked;
- void __iomem *window;
-
- debugf0("MC: %s()\n", __func__);
-
- window = x38_map_mchbar(pdev);
- if (!window)
- return -ENODEV;
-
- x38_get_drbs(window, drbs);
-
- how_many_channel(pdev);
-
- /* FIXME: unconventional pvt_info usage */
- mci = edac_mc_alloc(0, X38_RANKS, x38_channel_num, 0);
- if (!mci)
- return -ENOMEM;
-
- debugf3("MC: %s(): init mci\n", __func__);
-
- mci->dev = &pdev->dev;
- mci->mtype_cap = MEM_FLAG_DDR2;
-
- mci->edac_ctl_cap = EDAC_FLAG_SECDED;
- mci->edac_cap = EDAC_FLAG_SECDED;
-
- mci->mod_name = EDAC_MOD_STR;
- mci->mod_ver = X38_REVISION;
- mci->ctl_name = x38_devs[dev_idx].ctl_name;
- mci->dev_name = pci_name(pdev);
- mci->edac_check = x38_check;
- mci->ctl_page_to_phys = NULL;
- mci->pvt_info = window;
-
- stacked = x38_is_stacked(pdev, drbs);
-
- /*
- * The dram rank boundary (DRB) reg values are boundary addresses
- * for each DRAM rank with a granularity of 64MB. DRB regs are
- * cumulative; the last one will contain the total memory
- * contained in all ranks.
- */
- last_page = -1UL;
- for (i = 0; i < mci->nr_csrows; i++) {
- unsigned long nr_pages;
- struct csrow_info *csrow = &mci->csrows[i];
-
- nr_pages = drb_to_nr_pages(drbs, stacked,
- i / X38_RANKS_PER_CHANNEL,
- i % X38_RANKS_PER_CHANNEL);
-
- if (nr_pages == 0) {
- csrow->mtype = MEM_EMPTY;
- continue;
- }
-
- csrow->first_page = last_page + 1;
- last_page += nr_pages;
- csrow->last_page = last_page;
- csrow->nr_pages = nr_pages;
-
- csrow->grain = nr_pages << PAGE_SHIFT;
- csrow->mtype = MEM_DDR2;
- csrow->dtype = DEV_UNKNOWN;
- csrow->edac_mode = EDAC_UNKNOWN;
- }
-
- x38_clear_error_info(mci);
-
- rc = -ENODEV;
- if (edac_mc_add_mc(mci)) {
- debugf3("MC: %s(): failed edac_mc_add_mc()\n", __func__);
- goto fail;
- }
-
- /* get this far and it's successful */
- debugf3("MC: %s(): success\n", __func__);
- return 0;
-
-fail:
- iounmap(window);
- if (mci)
- edac_mc_free(mci);
-
- return rc;
-}
-
-static int __devinit x38_init_one(struct pci_dev *pdev,
- const struct pci_device_id *ent)
-{
- int rc;
-
- debugf0("MC: %s()\n", __func__);
-
- if (pci_enable_device(pdev) < 0)
- return -EIO;
-
- rc = x38_probe1(pdev, ent->driver_data);
- if (!mci_pdev)
- mci_pdev = pci_dev_get(pdev);
-
- return rc;
-}
-
-static void __devexit x38_remove_one(struct pci_dev *pdev)
-{
- struct mem_ctl_info *mci;
-
- debugf0("%s()\n", __func__);
-
- mci = edac_mc_del_mc(&pdev->dev);
- if (!mci)
- return;
-
- iounmap(mci->pvt_info);
-
- edac_mc_free(mci);
-}
-
-static const struct pci_device_id x38_pci_tbl[] __devinitdata = {
- {
- PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0,
- X38},
- {
- 0,
- } /* 0 terminated list. */
-};
-
-MODULE_DEVICE_TABLE(pci, x38_pci_tbl);
-
-static struct pci_driver x38_driver = {
- .name = EDAC_MOD_STR,
- .probe = x38_init_one,
- .remove = __devexit_p(x38_remove_one),
- .id_table = x38_pci_tbl,
-};
-
-static int __init x38_init(void)
-{
- int pci_rc;
-
- debugf3("MC: %s()\n", __func__);
-
- /* Ensure that the OPSTATE is set correctly for POLL or NMI */
- opstate_init();
-
- pci_rc = pci_register_driver(&x38_driver);
- if (pci_rc < 0)
- goto fail0;
-
- if (!mci_pdev) {
- x38_registered = 0;
- mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
- PCI_DEVICE_ID_INTEL_X38_HB, NULL);
- if (!mci_pdev) {
- debugf0("x38 pci_get_device fail\n");
- pci_rc = -ENODEV;
- goto fail1;
- }
-
- pci_rc = x38_init_one(mci_pdev, x38_pci_tbl);
- if (pci_rc < 0) {
- debugf0("x38 init fail\n");
- pci_rc = -ENODEV;
- goto fail1;
- }
- }
-
- return 0;
-
-fail1:
- pci_unregister_driver(&x38_driver);
-
-fail0:
- if (mci_pdev)
- pci_dev_put(mci_pdev);
-
- return pci_rc;
-}
-
-static void __exit x38_exit(void)
-{
- debugf3("MC: %s()\n", __func__);
-
- pci_unregister_driver(&x38_driver);
- if (!x38_registered) {
- x38_remove_one(mci_pdev);
- pci_dev_put(mci_pdev);
- }
-}
-
-module_init(x38_init);
-module_exit(x38_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Cluster Computing, Inc. Hitoshi Mitake");
-MODULE_DESCRIPTION("MC support for Intel X38 memory hub controllers");
-
-module_param(edac_op_state, int, 0444);
-MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
diff --git a/trunk/drivers/message/i2o/i2o_block.c b/trunk/drivers/message/i2o/i2o_block.c
index 84bdc2ee69e6..11a617ab4243 100644
--- a/trunk/drivers/message/i2o/i2o_block.c
+++ b/trunk/drivers/message/i2o/i2o_block.c
@@ -567,8 +567,8 @@ static void i2o_block_biosparam(unsigned long capacity, unsigned short *cyls,
/**
* i2o_block_open - Open the block device
- * @bdev: block device being opened
- * @mode: file open mode
+ * @inode: inode for block device being opened
+ * @file: file to open
*
* Power up the device, mount and lock the media. This function is called,
* if the block device is opened for access.
@@ -596,8 +596,8 @@ static int i2o_block_open(struct block_device *bdev, fmode_t mode)
/**
* i2o_block_release - Release the I2O block device
- * @disk: gendisk device being released
- * @mode: file open mode
+ * @inode: inode for block device being released
+ * @file: file to close
*
* Unlock and unmount the media, and power down the device. Gets called if
* the block device is closed.
@@ -643,8 +643,8 @@ static int i2o_block_getgeo(struct block_device *bdev, struct hd_geometry *geo)
/**
* i2o_block_ioctl - Issue device specific ioctl calls.
- * @bdev: block device being opened
- * @mode: file open mode
+ * @inode: inode for block device ioctl
+ * @file: file for ioctl
* @cmd: ioctl command
* @arg: arg
*
diff --git a/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c b/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c
index ce39fa54949b..08e26beefe64 100644
--- a/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c
+++ b/trunk/drivers/misc/hdpuftrs/hdpu_nexus.c
@@ -113,6 +113,7 @@ static int hdpu_nexus_probe(struct platform_device *pdev)
if (!hdpu_chassis_id)
printk(KERN_WARNING "sky_nexus: "
"Unable to create proc dir entry: sky_chassis_id\n");
+ }
return 0;
}
diff --git a/trunk/drivers/misc/sgi-xp/Makefile b/trunk/drivers/misc/sgi-xp/Makefile
index 4fc40d8e1bcc..35ce28578075 100644
--- a/trunk/drivers/misc/sgi-xp/Makefile
+++ b/trunk/drivers/misc/sgi-xp/Makefile
@@ -5,14 +5,14 @@
obj-$(CONFIG_SGI_XP) += xp.o
xp-y := xp_main.o
xp-$(CONFIG_IA64_SGI_SN2) += xp_sn2.o xp_nofault.o
-xp-$(CONFIG_IA64_GENERIC) += xp_sn2.o xp_nofault.o
+xp-$(CONFIG_IA64_GENERIC) += xp_sn2.o xp_nofault.o xp_uv.o
xp-$(CONFIG_IA64_SGI_UV) += xp_uv.o
xp-$(CONFIG_X86_64) += xp_uv.o
obj-$(CONFIG_SGI_XP) += xpc.o
xpc-y := xpc_main.o xpc_channel.o xpc_partition.o
xpc-$(CONFIG_IA64_SGI_SN2) += xpc_sn2.o
-xpc-$(CONFIG_IA64_GENERIC) += xpc_sn2.o
+xpc-$(CONFIG_IA64_GENERIC) += xpc_sn2.o xpc_uv.o
xpc-$(CONFIG_IA64_SGI_UV) += xpc_uv.o
xpc-$(CONFIG_X86_64) += xpc_uv.o
diff --git a/trunk/drivers/misc/sgi-xp/xp.h b/trunk/drivers/misc/sgi-xp/xp.h
index ed1722e50049..859a5281c61b 100644
--- a/trunk/drivers/misc/sgi-xp/xp.h
+++ b/trunk/drivers/misc/sgi-xp/xp.h
@@ -19,11 +19,7 @@
#include
#include /* defines is_shub1() and is_shub2() */
#define is_shub() ia64_platform_is("sn2")
-#ifdef CONFIG_IA64_SGI_UV
#define is_uv() ia64_platform_is("uv")
-#else
-#define is_uv() 0
-#endif
#endif
#ifdef CONFIG_X86_64
#include
diff --git a/trunk/drivers/misc/sgi-xp/xpc_main.c b/trunk/drivers/misc/sgi-xp/xpc_main.c
index e8d5cfbd32c2..46325fc84811 100644
--- a/trunk/drivers/misc/sgi-xp/xpc_main.c
+++ b/trunk/drivers/misc/sgi-xp/xpc_main.c
@@ -1104,7 +1104,7 @@ xpc_do_exit(enum xp_retval reason)
if (is_shub())
xpc_exit_sn2();
- else if (is_uv())
+ else
xpc_exit_uv();
}
@@ -1363,7 +1363,7 @@ xpc_init(void)
out_1:
if (is_shub())
xpc_exit_sn2();
- else if (is_uv())
+ else
xpc_exit_uv();
return ret;
}
diff --git a/trunk/drivers/misc/sony-laptop.c b/trunk/drivers/misc/sony-laptop.c
index f483c4221f76..5a97d3a9d745 100644
--- a/trunk/drivers/misc/sony-laptop.c
+++ b/trunk/drivers/misc/sony-laptop.c
@@ -2315,10 +2315,8 @@ static int sony_pic_possible_resources(struct acpi_device *device)
*/
static int sony_pic_disable(struct acpi_device *device)
{
- acpi_status ret = acpi_evaluate_object(device->handle, "_DIS", NULL,
- NULL);
-
- if (ACPI_FAILURE(ret) && ret != AE_NOT_FOUND)
+ if (ACPI_FAILURE(acpi_evaluate_object(device->handle,
+ "_DIS", NULL, NULL)))
return -ENXIO;
dprintk("Device disabled\n");
diff --git a/trunk/drivers/net/amd8111e.c b/trunk/drivers/net/amd8111e.c
index ba1be0b3a8c8..c54967f7942a 100644
--- a/trunk/drivers/net/amd8111e.c
+++ b/trunk/drivers/net/amd8111e.c
@@ -833,14 +833,12 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget)
} while(intr0 & RINT0);
- if (rx_pkt_limit > 0) {
- /* Receive descriptor is empty now */
- spin_lock_irqsave(&lp->lock, flags);
- __netif_rx_complete(dev, napi);
- writel(VAL0|RINTEN0, mmio + INTEN0);
- writel(VAL2 | RDMD0, mmio + CMD0);
- spin_unlock_irqrestore(&lp->lock, flags);
- }
+ /* Receive descriptor is empty now */
+ spin_lock_irqsave(&lp->lock, flags);
+ __netif_rx_complete(dev, napi);
+ writel(VAL0|RINTEN0, mmio + INTEN0);
+ writel(VAL2 | RDMD0, mmio + CMD0);
+ spin_unlock_irqrestore(&lp->lock, flags);
rx_not_empty:
return num_rx_pkt;
diff --git a/trunk/drivers/net/ehea/ehea.h b/trunk/drivers/net/ehea/ehea.h
index 002d918fb4c7..82dd1a891ce7 100644
--- a/trunk/drivers/net/ehea/ehea.h
+++ b/trunk/drivers/net/ehea/ehea.h
@@ -40,7 +40,7 @@
#include
#define DRV_NAME "ehea"
-#define DRV_VERSION "EHEA_0095"
+#define DRV_VERSION "EHEA_0094"
/* eHEA capability flags */
#define DLPAR_PORT_ADD_REM 1
diff --git a/trunk/drivers/net/ehea/ehea_qmr.c b/trunk/drivers/net/ehea/ehea_qmr.c
index 9d006878f045..9b61dc9865d1 100644
--- a/trunk/drivers/net/ehea/ehea_qmr.c
+++ b/trunk/drivers/net/ehea/ehea_qmr.c
@@ -632,13 +632,10 @@ static void ehea_rebuild_busmap(void)
}
}
-static int ehea_update_busmap(unsigned long pfn, unsigned long nr_pages, int add)
+static int ehea_update_busmap(unsigned long pfn, unsigned long pgnum, int add)
{
unsigned long i, start_section, end_section;
- if (!nr_pages)
- return 0;
-
if (!ehea_bmap) {
ehea_bmap = kzalloc(sizeof(struct ehea_bmap), GFP_KERNEL);
if (!ehea_bmap)
@@ -646,7 +643,7 @@ static int ehea_update_busmap(unsigned long pfn, unsigned long nr_pages, int add
}
start_section = (pfn * PAGE_SIZE) / EHEA_SECTSIZE;
- end_section = start_section + ((nr_pages * PAGE_SIZE) / EHEA_SECTSIZE);
+ end_section = start_section + ((pgnum * PAGE_SIZE) / EHEA_SECTSIZE);
/* Mark entries as valid or invalid only; address is assigned later */
for (i = start_section; i < end_section; i++) {
u64 flag;
@@ -695,54 +692,10 @@ int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages)
return ret;
}
-static int ehea_is_hugepage(unsigned long pfn)
-{
- int page_order;
-
- if (pfn & EHEA_HUGEPAGE_PFN_MASK)
- return 0;
-
- page_order = compound_order(pfn_to_page(pfn));
- if (page_order + PAGE_SHIFT != EHEA_HUGEPAGESHIFT)
- return 0;
-
- return 1;
-}
-
-static int ehea_create_busmap_callback(unsigned long initial_pfn,
- unsigned long total_nr_pages, void *arg)
+static int ehea_create_busmap_callback(unsigned long pfn,
+ unsigned long nr_pages, void *arg)
{
- int ret;
- unsigned long pfn, start_pfn, end_pfn, nr_pages;
-
- if ((total_nr_pages * PAGE_SIZE) < EHEA_HUGEPAGE_SIZE)
- return ehea_update_busmap(initial_pfn, total_nr_pages,
- EHEA_BUSMAP_ADD_SECT);
-
- /* Given chunk is >= 16GB -> check for hugepages */
- start_pfn = initial_pfn;
- end_pfn = initial_pfn + total_nr_pages;
- pfn = start_pfn;
-
- while (pfn < end_pfn) {
- if (ehea_is_hugepage(pfn)) {
- /* Add mem found in front of the hugepage */
- nr_pages = pfn - start_pfn;
- ret = ehea_update_busmap(start_pfn, nr_pages,
- EHEA_BUSMAP_ADD_SECT);
- if (ret)
- return ret;
-
- /* Skip the hugepage */
- pfn += (EHEA_HUGEPAGE_SIZE / PAGE_SIZE);
- start_pfn = pfn;
- } else
- pfn += (EHEA_SECTSIZE / PAGE_SIZE);
- }
-
- /* Add mem found behind the hugepage(s) */
- nr_pages = pfn - start_pfn;
- return ehea_update_busmap(start_pfn, nr_pages, EHEA_BUSMAP_ADD_SECT);
+ return ehea_update_busmap(pfn, nr_pages, EHEA_BUSMAP_ADD_SECT);
}
int ehea_create_busmap(void)
diff --git a/trunk/drivers/net/ehea/ehea_qmr.h b/trunk/drivers/net/ehea/ehea_qmr.h
index 0817c1e74a19..1e58dc06b7d2 100644
--- a/trunk/drivers/net/ehea/ehea_qmr.h
+++ b/trunk/drivers/net/ehea/ehea_qmr.h
@@ -40,9 +40,6 @@
#define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT)
#define EHEA_SECTSIZE (1UL << 24)
#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT)
-#define EHEA_HUGEPAGESHIFT 34
-#define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT)
-#define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT)
#if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE)
#error eHEA module cannot work if kernel sectionsize < ehea sectionsize
diff --git a/trunk/drivers/net/ibm_newemac/core.c b/trunk/drivers/net/ibm_newemac/core.c
index 901212aa37cb..2ee2622258f5 100644
--- a/trunk/drivers/net/ibm_newemac/core.c
+++ b/trunk/drivers/net/ibm_newemac/core.c
@@ -2605,7 +2605,7 @@ static int __devinit emac_init_config(struct emac_instance *dev)
of_device_is_compatible(np, "ibm,emac-440gr"))
dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;
if (of_device_is_compatible(np, "ibm,emac-405ez")) {
-#ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL
+#ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CONTROL
dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x;
#else
printk(KERN_ERR "%s: Flow control not disabled!\n",
diff --git a/trunk/drivers/net/mlx4/en_main.c b/trunk/drivers/net/mlx4/en_main.c
index 4b9794e97a79..1b0eebf84f76 100644
--- a/trunk/drivers/net/mlx4/en_main.c
+++ b/trunk/drivers/net/mlx4/en_main.c
@@ -35,6 +35,7 @@
#include
#include
#include
+#include
#include
#include
diff --git a/trunk/drivers/net/mlx4/fw.c b/trunk/drivers/net/mlx4/fw.c
index cee199ceba2f..be09fdb79cb8 100644
--- a/trunk/drivers/net/mlx4/fw.c
+++ b/trunk/drivers/net/mlx4/fw.c
@@ -360,9 +360,9 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
#define QUERY_PORT_ETH_MTU_OFFSET 0x02
#define QUERY_PORT_WIDTH_OFFSET 0x06
#define QUERY_PORT_MAX_GID_PKEY_OFFSET 0x07
+#define QUERY_PORT_MAC_OFFSET 0x08
#define QUERY_PORT_MAX_MACVLAN_OFFSET 0x0a
#define QUERY_PORT_MAX_VL_OFFSET 0x0b
-#define QUERY_PORT_MAC_OFFSET 0x10
for (i = 1; i <= dev_cap->num_ports; ++i) {
err = mlx4_cmd_box(dev, 0, mailbox->dma, i, 0, MLX4_CMD_QUERY_PORT,
diff --git a/trunk/drivers/net/tulip/dmfe.c b/trunk/drivers/net/tulip/dmfe.c
index c91852f49a48..8e46a513a252 100644
--- a/trunk/drivers/net/tulip/dmfe.c
+++ b/trunk/drivers/net/tulip/dmfe.c
@@ -420,13 +420,9 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
/* Allocate Tx/Rx descriptor memory */
db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) *
DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr);
- if (!db->desc_pool_ptr)
- goto err_out_res;
db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC *
TX_DESC_CNT + 4, &db->buf_pool_dma_ptr);
- if (!db->buf_pool_ptr)
- goto err_out_free_desc;
db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr;
db->first_tx_desc_dma = db->desc_pool_dma_ptr;
@@ -473,7 +469,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
err = register_netdev (dev);
if (err)
- goto err_out_free_buf;
+ goto err_out_res;
printk(KERN_INFO "%s: Davicom DM%04lx at pci%s, "
"%s, irq %d.\n",
@@ -487,12 +483,6 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
return 0;
-err_out_free_buf:
- pci_free_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4,
- db->buf_pool_ptr, db->buf_pool_dma_ptr);
-err_out_free_desc:
- pci_free_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20,
- db->desc_pool_ptr, db->desc_pool_dma_ptr);
err_out_res:
pci_release_regions(pdev);
err_out_disable:
diff --git a/trunk/drivers/net/usb/dm9601.c b/trunk/drivers/net/usb/dm9601.c
index db3377dae9d5..78df2be8a728 100644
--- a/trunk/drivers/net/usb/dm9601.c
+++ b/trunk/drivers/net/usb/dm9601.c
@@ -396,20 +396,6 @@ static void dm9601_set_multicast(struct net_device *net)
dm_write_reg_async(dev, DM_RX_CTRL, rx_ctl);
}
-static int dm9601_set_mac_address(struct net_device *net, void *p)
-{
- struct sockaddr *addr = p;
- struct usbnet *dev = netdev_priv(net);
-
- if (!is_valid_ether_addr(addr->sa_data))
- return -EINVAL;
-
- memcpy(net->dev_addr, addr->sa_data, net->addr_len);
- dm_write_async(dev, DM_PHY_ADDR, net->addr_len, net->dev_addr);
-
- return 0;
-}
-
static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
{
int ret;
@@ -420,7 +406,6 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
dev->net->do_ioctl = dm9601_ioctl;
dev->net->set_multicast_list = dm9601_set_multicast;
- dev->net->set_mac_address = dm9601_set_mac_address;
dev->net->ethtool_ops = &dm9601_ethtool_ops;
dev->net->hard_header_len += DM_TX_OVERHEAD;
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
diff --git a/trunk/drivers/net/via-velocity.c b/trunk/drivers/net/via-velocity.c
index 3590ea5a902d..2dced383bcfb 100644
--- a/trunk/drivers/net/via-velocity.c
+++ b/trunk/drivers/net/via-velocity.c
@@ -521,7 +521,7 @@ static void __devexit velocity_remove1(struct pci_dev *pdev)
* we don't duplicate code for each option.
*/
-static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max, int def, char *name, const char *devname)
+static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max, int def, char *name, char *devname)
{
if (val == -1)
*opt = def;
@@ -550,7 +550,7 @@ static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max,
* we don't duplicate code for each option.
*/
-static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 flag, char *name, const char *devname)
+static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 flag, char *name, char *devname)
{
(*opt) &= (~flag);
if (val == -1)
@@ -576,7 +576,7 @@ static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 fla
* for the current device
*/
-static void __devinit velocity_get_options(struct velocity_opt *opts, int index, const char *devname)
+static void __devinit velocity_get_options(struct velocity_opt *opts, int index, char *devname)
{
velocity_set_int_opt(&opts->rx_thresh, rx_thresh[index], RX_THRESH_MIN, RX_THRESH_MAX, RX_THRESH_DEF, "rx_thresh", devname);
@@ -863,7 +863,6 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi
static int first = 1;
struct net_device *dev;
int i;
- const char *drv_string;
const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data];
struct velocity_info *vptr;
struct mac_regs __iomem * regs;
@@ -936,9 +935,7 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi
dev->dev_addr[i] = readb(®s->PAR[i]);
- drv_string = dev_driver_string(&pdev->dev);
-
- velocity_get_options(&vptr->options, velocity_nics, drv_string);
+ velocity_get_options(&vptr->options, velocity_nics, dev->name);
/*
* Mask out the options cannot be set to the chip
diff --git a/trunk/drivers/net/wan/syncppp.c b/trunk/drivers/net/wan/syncppp.c
index 6e92f7b44b1a..327d58589e12 100644
--- a/trunk/drivers/net/wan/syncppp.c
+++ b/trunk/drivers/net/wan/syncppp.c
@@ -756,11 +756,10 @@ static void sppp_cisco_input (struct sppp *sp, struct sk_buff *skb)
case CISCO_ADDR_REQ:
/* Stolen from net/ipv4/devinet.c -- SIOCGIFADDR ioctl */
{
- __be32 addr = 0, mask = htonl(~0U); /* FIXME: is the mask correct? */
-#ifdef CONFIG_INET
struct in_device *in_dev;
struct in_ifaddr *ifa;
-
+ __be32 addr = 0, mask = htonl(~0U); /* FIXME: is the mask correct? */
+#ifdef CONFIG_INET
rcu_read_lock();
if ((in_dev = __in_dev_get_rcu(dev)) != NULL)
{
diff --git a/trunk/drivers/net/wireless/ath5k/base.c b/trunk/drivers/net/wireless/ath5k/base.c
index cfd4d052d666..0f1d6bdd51a2 100644
--- a/trunk/drivers/net/wireless/ath5k/base.c
+++ b/trunk/drivers/net/wireless/ath5k/base.c
@@ -661,7 +661,8 @@ ath5k_pci_resume(struct pci_dev *pdev)
{
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
struct ath5k_softc *sc = hw->priv;
- int err;
+ struct ath5k_hw *ah = sc->ah;
+ int i, err;
pci_restore_state(pdev);
@@ -687,6 +688,16 @@ ath5k_pci_resume(struct pci_dev *pdev)
goto err_irq;
ath5k_led_enable(sc);
+ /*
+ * Reset the key cache since some parts do not
+ * reset the contents on initial power up or resume.
+ *
+ * FIXME: This may need to be revisited when mac80211 becomes
+ * aware of suspend/resume.
+ */
+ for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
+ ath5k_hw_reset_key(ah, i);
+
return 0;
err_irq:
free_irq(pdev->irq, sc);
@@ -707,6 +718,7 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
struct ath5k_softc *sc = hw->priv;
struct ath5k_hw *ah = sc->ah;
u8 mac[ETH_ALEN];
+ unsigned int i;
int ret;
ATH5K_DBG(sc, ATH5K_DEBUG_ANY, "devid 0x%x\n", pdev->device);
@@ -724,6 +736,13 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
if (ret > 0)
__set_bit(ATH_STAT_MRRETRY, sc->status);
+ /*
+ * Reset the key cache since some parts do not
+ * reset the contents on initial power up.
+ */
+ for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
+ ath5k_hw_reset_key(ah, i);
+
/*
* Collect the channel list. The 802.11 layer
* is resposible for filtering this list based
@@ -2183,8 +2202,7 @@ ath5k_beacon_config(struct ath5k_softc *sc)
static int
ath5k_init(struct ath5k_softc *sc, bool is_resume)
{
- struct ath5k_hw *ah = sc->ah;
- int ret, i;
+ int ret;
mutex_lock(&sc->lock);
@@ -2217,17 +2235,10 @@ ath5k_init(struct ath5k_softc *sc, bool is_resume)
if (ret)
goto done;
- /*
- * Reset the key cache since some parts do not reset the
- * contents on initial power up or resume from suspend.
- */
- for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
- ath5k_hw_reset_key(ah, i);
-
__set_bit(ATH_STAT_STARTED, sc->status);
/* Set ack to be sent at low bit-rates */
- ath5k_hw_set_ack_bitrate_high(ah, false);
+ ath5k_hw_set_ack_bitrate_high(sc->ah, false);
mod_timer(&sc->calib_tim, round_jiffies(jiffies +
msecs_to_jiffies(ath5k_calinterval * 1000)));
diff --git a/trunk/drivers/net/wireless/p54/p54common.c b/trunk/drivers/net/wireless/p54/p54common.c
index 827ca0384a4c..2d022f83774c 100644
--- a/trunk/drivers/net/wireless/p54/p54common.c
+++ b/trunk/drivers/net/wireless/p54/p54common.c
@@ -319,7 +319,7 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
void *tmp;
int err;
u8 *end = (u8 *)eeprom + len;
- u16 synth = 0;
+ u16 synth;
DECLARE_MAC_BUF(mac);
wrap = (struct eeprom_pda_wrap *) eeprom;
@@ -422,8 +422,7 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len)
entry = (void *)entry + (entry_len + 1)*2;
}
- if (!synth || !priv->iq_autocal || !priv->output_limit ||
- !priv->curve_data) {
+ if (!priv->iq_autocal || !priv->output_limit || !priv->curve_data) {
printk(KERN_ERR "p54: not all required entries found in eeprom!\n");
err = -EINVAL;
goto err;
diff --git a/trunk/drivers/net/wireless/p54/p54pci.c b/trunk/drivers/net/wireless/p54/p54pci.c
index 88b3cad8b65e..1c2a02a741af 100644
--- a/trunk/drivers/net/wireless/p54/p54pci.c
+++ b/trunk/drivers/net/wireless/p54/p54pci.c
@@ -346,6 +346,68 @@ static void p54p_tx(struct ieee80211_hw *dev, struct p54_control_hdr *data,
printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy));
}
+static int p54p_open(struct ieee80211_hw *dev)
+{
+ struct p54p_priv *priv = dev->priv;
+ int err;
+
+ init_completion(&priv->boot_comp);
+ err = request_irq(priv->pdev->irq, &p54p_interrupt,
+ IRQF_SHARED, "p54pci", dev);
+ if (err) {
+ printk(KERN_ERR "%s: failed to register IRQ handler\n",
+ wiphy_name(dev->wiphy));
+ return err;
+ }
+
+ memset(priv->ring_control, 0, sizeof(*priv->ring_control));
+ err = p54p_upload_firmware(dev);
+ if (err) {
+ free_irq(priv->pdev->irq, dev);
+ return err;
+ }
+ priv->rx_idx_data = priv->tx_idx_data = 0;
+ priv->rx_idx_mgmt = priv->tx_idx_mgmt = 0;
+
+ p54p_refill_rx_ring(dev, 0, priv->ring_control->rx_data,
+ ARRAY_SIZE(priv->ring_control->rx_data), priv->rx_buf_data);
+
+ p54p_refill_rx_ring(dev, 2, priv->ring_control->rx_mgmt,
+ ARRAY_SIZE(priv->ring_control->rx_mgmt), priv->rx_buf_mgmt);
+
+ P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma));
+ P54P_READ(ring_control_base);
+ wmb();
+ udelay(10);
+
+ P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT));
+ P54P_READ(int_enable);
+ wmb();
+ udelay(10);
+
+ P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
+ P54P_READ(dev_int);
+
+ if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) {
+ printk(KERN_ERR "%s: Cannot boot firmware!\n",
+ wiphy_name(dev->wiphy));
+ free_irq(priv->pdev->irq, dev);
+ return -ETIMEDOUT;
+ }
+
+ P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE));
+ P54P_READ(int_enable);
+ wmb();
+ udelay(10);
+
+ P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
+ P54P_READ(dev_int);
+ wmb();
+ udelay(10);
+
+ return 0;
+}
+
static void p54p_stop(struct ieee80211_hw *dev)
{
struct p54p_priv *priv = dev->priv;
@@ -412,68 +474,6 @@ static void p54p_stop(struct ieee80211_hw *dev)
memset(ring_control, 0, sizeof(*ring_control));
}
-static int p54p_open(struct ieee80211_hw *dev)
-{
- struct p54p_priv *priv = dev->priv;
- int err;
-
- init_completion(&priv->boot_comp);
- err = request_irq(priv->pdev->irq, &p54p_interrupt,
- IRQF_SHARED, "p54pci", dev);
- if (err) {
- printk(KERN_ERR "%s: failed to register IRQ handler\n",
- wiphy_name(dev->wiphy));
- return err;
- }
-
- memset(priv->ring_control, 0, sizeof(*priv->ring_control));
- err = p54p_upload_firmware(dev);
- if (err) {
- free_irq(priv->pdev->irq, dev);
- return err;
- }
- priv->rx_idx_data = priv->tx_idx_data = 0;
- priv->rx_idx_mgmt = priv->tx_idx_mgmt = 0;
-
- p54p_refill_rx_ring(dev, 0, priv->ring_control->rx_data,
- ARRAY_SIZE(priv->ring_control->rx_data), priv->rx_buf_data);
-
- p54p_refill_rx_ring(dev, 2, priv->ring_control->rx_mgmt,
- ARRAY_SIZE(priv->ring_control->rx_mgmt), priv->rx_buf_mgmt);
-
- P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma));
- P54P_READ(ring_control_base);
- wmb();
- udelay(10);
-
- P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT));
- P54P_READ(int_enable);
- wmb();
- udelay(10);
-
- P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
- P54P_READ(dev_int);
-
- if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) {
- printk(KERN_ERR "%s: Cannot boot firmware!\n",
- wiphy_name(dev->wiphy));
- p54p_stop(dev);
- return -ETIMEDOUT;
- }
-
- P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE));
- P54P_READ(int_enable);
- wmb();
- udelay(10);
-
- P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
- P54P_READ(dev_int);
- wmb();
- udelay(10);
-
- return 0;
-}
-
static int __devinit p54p_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
@@ -556,13 +556,11 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
spin_lock_init(&priv->lock);
tasklet_init(&priv->rx_tasklet, p54p_rx_tasklet, (unsigned long)dev);
- err = p54p_open(dev);
- if (err)
- goto err_free_common;
+ p54p_open(dev);
err = p54_read_eeprom(dev);
p54p_stop(dev);
if (err)
- goto err_free_common;
+ goto err_free_desc;
err = ieee80211_register_hw(dev);
if (err) {
@@ -575,6 +573,8 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
err_free_common:
p54_free_common(dev);
+
+ err_free_desc:
pci_free_consistent(pdev, sizeof(*priv->ring_control),
priv->ring_control, priv->ring_control_dma);
diff --git a/trunk/drivers/regulator/da903x.c b/trunk/drivers/regulator/da903x.c
index 773b29cec8be..3688e339db87 100644
--- a/trunk/drivers/regulator/da903x.c
+++ b/trunk/drivers/regulator/da903x.c
@@ -79,11 +79,6 @@ struct da903x_regulator_info {
int enable_bit;
};
-static inline struct device *to_da903x_dev(struct regulator_dev *rdev)
-{
- return rdev_get_dev(rdev)->parent->parent;
-}
-
static inline int check_range(struct da903x_regulator_info *info,
int min_uV, int max_uV)
{
@@ -98,7 +93,7 @@ static int da903x_set_ldo_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
if (check_range(info, min_uV, max_uV)) {
@@ -116,7 +111,7 @@ static int da903x_set_ldo_voltage(struct regulator_dev *rdev,
static int da903x_get_voltage(struct regulator_dev *rdev)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
int ret;
@@ -133,7 +128,7 @@ static int da903x_get_voltage(struct regulator_dev *rdev)
static int da903x_enable(struct regulator_dev *rdev)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
return da903x_set_bits(da9034_dev, info->enable_reg,
1 << info->enable_bit);
@@ -142,7 +137,7 @@ static int da903x_enable(struct regulator_dev *rdev)
static int da903x_disable(struct regulator_dev *rdev)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
return da903x_clr_bits(da9034_dev, info->enable_reg,
1 << info->enable_bit);
@@ -151,7 +146,7 @@ static int da903x_disable(struct regulator_dev *rdev)
static int da903x_is_enabled(struct regulator_dev *rdev)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
uint8_t reg_val;
int ret;
@@ -167,7 +162,7 @@ static int da9030_set_ldo1_15_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da903x_dev = to_da903x_dev(rdev);
+ struct device *da903x_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
int ret;
@@ -194,7 +189,7 @@ static int da9030_set_ldo14_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da903x_dev = to_da903x_dev(rdev);
+ struct device *da903x_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
int thresh;
@@ -220,7 +215,7 @@ static int da9030_set_ldo14_voltage(struct regulator_dev *rdev,
static int da9030_get_ldo14_voltage(struct regulator_dev *rdev)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da903x_dev = to_da903x_dev(rdev);
+ struct device *da903x_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
int ret;
@@ -243,7 +238,7 @@ static int da9034_set_dvc_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
int ret;
@@ -269,7 +264,7 @@ static int da9034_set_ldo12_voltage(struct regulator_dev *rdev,
int min_uV, int max_uV)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
if (check_range(info, min_uV, max_uV)) {
@@ -288,7 +283,7 @@ static int da9034_set_ldo12_voltage(struct regulator_dev *rdev,
static int da9034_get_ldo12_voltage(struct regulator_dev *rdev)
{
struct da903x_regulator_info *info = rdev_get_drvdata(rdev);
- struct device *da9034_dev = to_da903x_dev(rdev);
+ struct device *da9034_dev = rdev_get_dev(rdev)->parent;
uint8_t val, mask;
int ret;
@@ -471,7 +466,7 @@ static int __devinit da903x_regulator_probe(struct platform_device *pdev)
if (ri->desc.id == DA9030_ID_LDO1 || ri->desc.id == DA9030_ID_LDO15)
ri->desc.ops = &da9030_regulator_ldo1_15_ops;
- rdev = regulator_register(&ri->desc, &pdev->dev, ri);
+ rdev = regulator_register(&ri->desc, pdev->dev.parent, ri);
if (IS_ERR(rdev)) {
dev_err(&pdev->dev, "failed to register regulator %s\n",
ri->desc.name);
diff --git a/trunk/drivers/rtc/rtc-ds3234.c b/trunk/drivers/rtc/rtc-ds3234.c
index 45e5b106af73..37d131d03f33 100644
--- a/trunk/drivers/rtc/rtc-ds3234.c
+++ b/trunk/drivers/rtc/rtc-ds3234.c
@@ -189,7 +189,7 @@ static const struct rtc_class_ops ds3234_rtc_ops = {
.set_time = ds3234_set_time,
};
-static int __devinit ds3234_probe(struct spi_device *spi)
+static int ds3234_probe(struct spi_device *spi)
{
struct rtc_device *rtc;
unsigned char tmp;
@@ -249,7 +249,7 @@ static int __devinit ds3234_probe(struct spi_device *spi)
return 0;
}
-static int __devexit ds3234_remove(struct spi_device *spi)
+static int __exit ds3234_remove(struct spi_device *spi)
{
struct ds3234 *chip = platform_get_drvdata(spi);
struct rtc_device *rtc = chip->rtc;
diff --git a/trunk/drivers/rtc/rtc-s3c.c b/trunk/drivers/rtc/rtc-s3c.c
index f59277bbedaa..910bc704939c 100644
--- a/trunk/drivers/rtc/rtc-s3c.c
+++ b/trunk/drivers/rtc/rtc-s3c.c
@@ -455,8 +455,6 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev)
s3c_rtc_setfreq(&pdev->dev, 1);
- device_init_wakeup(&pdev->dev, 1);
-
/* register RTC and exit */
rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops,
@@ -509,7 +507,7 @@ static int s3c_rtc_resume(struct platform_device *pdev)
#define s3c_rtc_resume NULL
#endif
-static struct platform_driver s3c2410_rtc_driver = {
+static struct platform_driver s3c2410_rtcdrv = {
.probe = s3c_rtc_probe,
.remove = __devexit_p(s3c_rtc_remove),
.suspend = s3c_rtc_suspend,
@@ -525,12 +523,12 @@ static char __initdata banner[] = "S3C24XX RTC, (c) 2004,2006 Simtec Electronics
static int __init s3c_rtc_init(void)
{
printk(banner);
- return platform_driver_register(&s3c2410_rtc_driver);
+ return platform_driver_register(&s3c2410_rtcdrv);
}
static void __exit s3c_rtc_exit(void)
{
- platform_driver_unregister(&s3c2410_rtc_driver);
+ platform_driver_unregister(&s3c2410_rtcdrv);
}
module_init(s3c_rtc_init);
diff --git a/trunk/drivers/s390/net/qeth_core_main.c b/trunk/drivers/s390/net/qeth_core_main.c
index 52d26592c72c..7de410d5be4a 100644
--- a/trunk/drivers/s390/net/qeth_core_main.c
+++ b/trunk/drivers/s390/net/qeth_core_main.c
@@ -3025,7 +3025,7 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
struct qdio_buffer *buffer, int is_tso, int *next_element_to_fill,
int offset)
{
- int length = skb->len;
+ int length = skb->len - offset;
int length_here;
int element;
char *data;
@@ -3037,7 +3037,6 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
if (offset >= 0) {
data = skb->data + offset;
- length -= offset;
first_lap = 0;
}
diff --git a/trunk/drivers/s390/net/qeth_l2_main.c b/trunk/drivers/s390/net/qeth_l2_main.c
index 1b1e80336d2c..955ba7a31b90 100644
--- a/trunk/drivers/s390/net/qeth_l2_main.c
+++ b/trunk/drivers/s390/net/qeth_l2_main.c
@@ -373,6 +373,8 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
qeth_set_allowed_threads(card, 0, 1);
+ if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
+ return -ERESTARTSYS;
if (card->read.state == CH_STATE_UP &&
card->write.state == CH_STATE_UP &&
(card->state == CARD_STATE_UP)) {
@@ -449,15 +451,12 @@ static void qeth_l2_process_inbound_buffer(struct qeth_card *card,
netif_rx(skb);
break;
case QETH_HEADER_TYPE_OSN:
- if (card->info.type == QETH_CARD_TYPE_OSN) {
- skb_push(skb, sizeof(struct qeth_hdr));
- skb_copy_to_linear_data(skb, hdr,
+ skb_push(skb, sizeof(struct qeth_hdr));
+ skb_copy_to_linear_data(skb, hdr,
sizeof(struct qeth_hdr));
- len = skb->len;
- card->osn_info.data_cb(skb);
- break;
- }
- /* else unknown */
+ len = skb->len;
+ card->osn_info.data_cb(skb);
+ break;
default:
dev_kfree_skb_any(skb);
QETH_DBF_TEXT(TRACE, 3, "inbunkno");
@@ -976,6 +975,12 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
+ if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) {
+ PRINT_WARN("set_online of card %s interrupted by user!\n",
+ CARD_BUS_ID(card));
+ return -ERESTARTSYS;
+ }
+
recover_flag = card->state;
rc = ccw_device_set_online(CARD_RDEV(card));
if (rc) {
@@ -1086,7 +1091,11 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
if (card->dev && netif_carrier_ok(card->dev))
netif_carrier_off(card->dev);
recover_flag = card->state;
- qeth_l2_stop_card(card, recovery_mode);
+ if (qeth_l2_stop_card(card, recovery_mode) == -ERESTARTSYS) {
+ PRINT_WARN("Stopping card %s interrupted by user!\n",
+ CARD_BUS_ID(card));
+ return -ERESTARTSYS;
+ }
rc = ccw_device_set_offline(CARD_DDEV(card));
rc2 = ccw_device_set_offline(CARD_WDEV(card));
rc3 = ccw_device_set_offline(CARD_RDEV(card));
diff --git a/trunk/drivers/s390/net/qeth_l3_main.c b/trunk/drivers/s390/net/qeth_l3_main.c
index ed59fedd5922..99547dea44de 100644
--- a/trunk/drivers/s390/net/qeth_l3_main.c
+++ b/trunk/drivers/s390/net/qeth_l3_main.c
@@ -2064,6 +2064,8 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
qeth_set_allowed_threads(card, 0, 1);
+ if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
+ return -ERESTARTSYS;
if (card->read.state == CH_STATE_UP &&
card->write.state == CH_STATE_UP &&
(card->state == CARD_STATE_UP)) {
@@ -3047,6 +3049,11 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
+ if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) {
+ PRINT_WARN("set_online of card %s interrupted by user!\n",
+ CARD_BUS_ID(card));
+ return -ERESTARTSYS;
+ }
recover_flag = card->state;
rc = ccw_device_set_online(CARD_RDEV(card));
@@ -3163,7 +3170,11 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev,
if (card->dev && netif_carrier_ok(card->dev))
netif_carrier_off(card->dev);
recover_flag = card->state;
- qeth_l3_stop_card(card, recovery_mode);
+ if (qeth_l3_stop_card(card, recovery_mode) == -ERESTARTSYS) {
+ PRINT_WARN("Stopping card %s interrupted by user!\n",
+ CARD_BUS_ID(card));
+ return -ERESTARTSYS;
+ }
rc = ccw_device_set_offline(CARD_DDEV(card));
rc2 = ccw_device_set_offline(CARD_WDEV(card));
rc3 = ccw_device_set_offline(CARD_RDEV(card));
diff --git a/trunk/drivers/s390/net/qeth_l3_sys.c b/trunk/drivers/s390/net/qeth_l3_sys.c
index c144b9924d52..210ddb639748 100644
--- a/trunk/drivers/s390/net/qeth_l3_sys.c
+++ b/trunk/drivers/s390/net/qeth_l3_sys.c
@@ -121,6 +121,9 @@ static ssize_t qeth_l3_dev_route6_show(struct device *dev,
if (!card)
return -EINVAL;
+ if (!qeth_is_supported(card, IPA_IPV6))
+ return sprintf(buf, "%s\n", "n/a");
+
return qeth_l3_dev_route_show(card, &card->options.route6, buf);
}
@@ -132,6 +135,10 @@ static ssize_t qeth_l3_dev_route6_store(struct device *dev,
if (!card)
return -EINVAL;
+ if (!qeth_is_supported(card, IPA_IPV6)) {
+ return -EOPNOTSUPP;
+ }
+
return qeth_l3_dev_route_store(card, &card->options.route6,
QETH_PROT_IPV6, buf, count);
}
diff --git a/trunk/drivers/usb/class/usbtmc.c b/trunk/drivers/usb/class/usbtmc.c
index 8e74657f106c..543811f6e6e8 100644
--- a/trunk/drivers/usb/class/usbtmc.c
+++ b/trunk/drivers/usb/class/usbtmc.c
@@ -133,7 +133,7 @@ static int usbtmc_release(struct inode *inode, struct file *file)
static int usbtmc_ioctl_abort_bulk_in(struct usbtmc_device_data *data)
{
- u8 *buffer;
+ char *buffer;
struct device *dev;
int rv;
int n;
diff --git a/trunk/drivers/usb/core/hcd.c b/trunk/drivers/usb/core/hcd.c
index e1b42626d04d..fc9018e72a09 100644
--- a/trunk/drivers/usb/core/hcd.c
+++ b/trunk/drivers/usb/core/hcd.c
@@ -106,9 +106,6 @@ static DEFINE_SPINLOCK(hcd_root_hub_lock);
/* used when updating an endpoint's URB list */
static DEFINE_SPINLOCK(hcd_urb_list_lock);
-/* used to protect against unlinking URBs after the device is gone */
-static DEFINE_SPINLOCK(hcd_urb_unlink_lock);
-
/* wait queue for synchronous unlinks */
DECLARE_WAIT_QUEUE_HEAD(usb_kill_urb_queue);
@@ -1379,25 +1376,10 @@ static int unlink1(struct usb_hcd *hcd, struct urb *urb, int status)
int usb_hcd_unlink_urb (struct urb *urb, int status)
{
struct usb_hcd *hcd;
- int retval = -EIDRM;
- unsigned long flags;
+ int retval;
- /* Prevent the device and bus from going away while
- * the unlink is carried out. If they are already gone
- * then urb->use_count must be 0, since disconnected
- * devices can't have any active URBs.
- */
- spin_lock_irqsave(&hcd_urb_unlink_lock, flags);
- if (atomic_read(&urb->use_count) > 0) {
- retval = 0;
- usb_get_dev(urb->dev);
- }
- spin_unlock_irqrestore(&hcd_urb_unlink_lock, flags);
- if (retval == 0) {
- hcd = bus_to_hcd(urb->dev->bus);
- retval = unlink1(hcd, urb, status);
- usb_put_dev(urb->dev);
- }
+ hcd = bus_to_hcd(urb->dev->bus);
+ retval = unlink1(hcd, urb, status);
if (retval == 0)
retval = -EINPROGRESS;
@@ -1546,17 +1528,6 @@ void usb_hcd_disable_endpoint(struct usb_device *udev,
hcd->driver->endpoint_disable(hcd, ep);
}
-/* Protect against drivers that try to unlink URBs after the device
- * is gone, by waiting until all unlinks for @udev are finished.
- * Since we don't currently track URBs by device, simply wait until
- * nothing is running in the locked region of usb_hcd_unlink_urb().
- */
-void usb_hcd_synchronize_unlinks(struct usb_device *udev)
-{
- spin_lock_irq(&hcd_urb_unlink_lock);
- spin_unlock_irq(&hcd_urb_unlink_lock);
-}
-
/*-------------------------------------------------------------------------*/
/* called in any context */
diff --git a/trunk/drivers/usb/core/hcd.h b/trunk/drivers/usb/core/hcd.h
index 9465e70f4dd0..2dcde61c465e 100644
--- a/trunk/drivers/usb/core/hcd.h
+++ b/trunk/drivers/usb/core/hcd.h
@@ -232,7 +232,6 @@ extern void usb_hcd_flush_endpoint(struct usb_device *udev,
struct usb_host_endpoint *ep);
extern void usb_hcd_disable_endpoint(struct usb_device *udev,
struct usb_host_endpoint *ep);
-extern void usb_hcd_synchronize_unlinks(struct usb_device *udev);
extern int usb_hcd_get_frame_number(struct usb_device *udev);
extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
diff --git a/trunk/drivers/usb/core/hub.c b/trunk/drivers/usb/core/hub.c
index b19cbfcd51da..9b3f16bd12cb 100644
--- a/trunk/drivers/usb/core/hub.c
+++ b/trunk/drivers/usb/core/hub.c
@@ -659,9 +659,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func2);
schedule_delayed_work(&hub->init_work,
msecs_to_jiffies(delay));
-
- /* Suppress autosuspend until init is done */
- to_usb_interface(hub->intfdev)->pm_usage_cnt = 1;
return; /* Continues at init2: below */
} else {
hub_power_on(hub, true);
@@ -1432,7 +1429,6 @@ void usb_disconnect(struct usb_device **pdev)
*/
dev_dbg (&udev->dev, "unregistering device\n");
usb_disable_device(udev, 0);
- usb_hcd_synchronize_unlinks(udev);
usb_unlock_device(udev);
diff --git a/trunk/drivers/usb/core/urb.c b/trunk/drivers/usb/core/urb.c
index 4342bd9c3bb6..f2638009a464 100644
--- a/trunk/drivers/usb/core/urb.c
+++ b/trunk/drivers/usb/core/urb.c
@@ -474,12 +474,6 @@ EXPORT_SYMBOL_GPL(usb_submit_urb);
* indicating that the request has been canceled (rather than any other
* code).
*
- * Drivers should not call this routine or related routines, such as
- * usb_kill_urb() or usb_unlink_anchored_urbs(), after their disconnect
- * method has returned. The disconnect function should synchronize with
- * a driver's I/O routines to insure that all URB-related activity has
- * completed before it returns.
- *
* This request is always asynchronous. Success is indicated by
* returning -EINPROGRESS, at which time the URB will probably not yet
* have been given back to the device driver. When it is eventually
@@ -556,9 +550,6 @@ EXPORT_SYMBOL_GPL(usb_unlink_urb);
* This routine may not be used in an interrupt context (such as a bottom
* half or a completion handler), or when holding a spinlock, or in other
* situations where the caller can't schedule().
- *
- * This routine should not be called by a driver after its disconnect
- * method has returned.
*/
void usb_kill_urb(struct urb *urb)
{
@@ -597,9 +588,6 @@ EXPORT_SYMBOL_GPL(usb_kill_urb);
* This routine may not be used in an interrupt context (such as a bottom
* half or a completion handler), or when holding a spinlock, or in other
* situations where the caller can't schedule().
- *
- * This routine should not be called by a driver after its disconnect
- * method has returned.
*/
void usb_poison_urb(struct urb *urb)
{
@@ -634,9 +622,6 @@ EXPORT_SYMBOL_GPL(usb_unpoison_urb);
*
* this allows all outstanding URBs to be killed starting
* from the back of the queue
- *
- * This routine should not be called by a driver after its disconnect
- * method has returned.
*/
void usb_kill_anchored_urbs(struct usb_anchor *anchor)
{
@@ -666,9 +651,6 @@ EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs);
* this allows all outstanding URBs to be poisoned starting
* from the back of the queue. Newly added URBs will also be
* poisoned
- *
- * This routine should not be called by a driver after its disconnect
- * method has returned.
*/
void usb_poison_anchored_urbs(struct usb_anchor *anchor)
{
@@ -690,7 +672,6 @@ void usb_poison_anchored_urbs(struct usb_anchor *anchor)
spin_unlock_irq(&anchor->lock);
}
EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs);
-
/**
* usb_unlink_anchored_urbs - asynchronously cancel transfer requests en masse
* @anchor: anchor the requests are bound to
@@ -699,9 +680,6 @@ EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs);
* from the back of the queue. This function is asynchronous.
* The unlinking is just tiggered. It may happen after this
* function has returned.
- *
- * This routine should not be called by a driver after its disconnect
- * method has returned.
*/
void usb_unlink_anchored_urbs(struct usb_anchor *anchor)
{
diff --git a/trunk/drivers/usb/storage/unusual_devs.h b/trunk/drivers/usb/storage/unusual_devs.h
index fb9e20e624c1..a2b9ebbef38e 100644
--- a/trunk/drivers/usb/storage/unusual_devs.h
+++ b/trunk/drivers/usb/storage/unusual_devs.h
@@ -333,13 +333,6 @@ UNUSUAL_DEV( 0x0482, 0x0103, 0x0100, 0x0100,
"Finecam S5",
US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
-/* Patch submitted by Jens Taprogge */
-UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100,
- "Kyocera",
- "CONTAX SL300R T*",
- US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE),
-
/* Reported by Paul Stewart
* This entry is needed because the device reports Sub=ff */
UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001,
diff --git a/trunk/drivers/video/console/fbcon.c b/trunk/drivers/video/console/fbcon.c
index b92947d62ad6..64b3d30027b8 100644
--- a/trunk/drivers/video/console/fbcon.c
+++ b/trunk/drivers/video/console/fbcon.c
@@ -2118,7 +2118,7 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int s
height, width);
}
-static void updatescrollmode(struct display *p,
+static __inline__ void updatescrollmode(struct display *p,
struct fb_info *info,
struct vc_data *vc)
{
diff --git a/trunk/drivers/video/fbmem.c b/trunk/drivers/video/fbmem.c
index 6048b55f2878..cd5f20da738a 100644
--- a/trunk/drivers/video/fbmem.c
+++ b/trunk/drivers/video/fbmem.c
@@ -1262,8 +1262,8 @@ fb_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
case FBIOPUT_CON2FBMAP:
arg = (unsigned long) compat_ptr(arg);
case FBIOBLANK:
- mutex_unlock(&info->lock);
- return fb_ioctl(file, cmd, arg);
+ ret = fb_ioctl(file, cmd, arg);
+ break;
case FBIOGET_FSCREENINFO:
ret = fb_get_fscreeninfo(inode, file, cmd, arg);
diff --git a/trunk/drivers/video/via/global.h b/trunk/drivers/video/via/global.h
index 7543d5f7e309..8e5263c5b812 100644
--- a/trunk/drivers/video/via/global.h
+++ b/trunk/drivers/video/via/global.h
@@ -38,6 +38,7 @@
#include "iface.h"
#include "viafbdev.h"
#include "chip.h"
+#include "debug.h"
#include "accel.h"
#include "share.h"
#include "dvi.h"
@@ -47,10 +48,12 @@
#include "lcd.h"
#include "ioctl.h"
+#include "viamode.h"
#include "via_utility.h"
#include "vt1636.h"
#include "tblDPASetting.h"
#include "tbl1636.h"
+#include "viafbdev.h"
/* External struct*/
diff --git a/trunk/fs/ecryptfs/crypto.c b/trunk/fs/ecryptfs/crypto.c
index 6046239465a1..06db79d05c12 100644
--- a/trunk/fs/ecryptfs/crypto.c
+++ b/trunk/fs/ecryptfs/crypto.c
@@ -1251,7 +1251,6 @@ struct kmem_cache *ecryptfs_header_cache_2;
/**
* ecryptfs_write_headers_virt
* @page_virt: The virtual address to write the headers to
- * @max: The size of memory allocated at page_virt
* @size: Set to the number of bytes written by this function
* @crypt_stat: The cryptographic context
* @ecryptfs_dentry: The eCryptfs dentry
@@ -1279,8 +1278,7 @@ struct kmem_cache *ecryptfs_header_cache_2;
*
* Returns zero on success
*/
-static int ecryptfs_write_headers_virt(char *page_virt, size_t max,
- size_t *size,
+static int ecryptfs_write_headers_virt(char *page_virt, size_t *size,
struct ecryptfs_crypt_stat *crypt_stat,
struct dentry *ecryptfs_dentry)
{
@@ -1298,7 +1296,7 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t max,
offset += written;
rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat,
ecryptfs_dentry, &written,
- max - offset);
+ PAGE_CACHE_SIZE - offset);
if (rc)
ecryptfs_printk(KERN_WARNING, "Error generating key packet "
"set; rc = [%d]\n", rc);
@@ -1370,14 +1368,14 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry)
goto out;
}
/* Released in this function */
- virt = (char *)get_zeroed_page(GFP_KERNEL);
+ virt = kzalloc(crypt_stat->num_header_bytes_at_front, GFP_KERNEL);
if (!virt) {
printk(KERN_ERR "%s: Out of memory\n", __func__);
rc = -ENOMEM;
goto out;
}
- rc = ecryptfs_write_headers_virt(virt, PAGE_CACHE_SIZE, &size,
- crypt_stat, ecryptfs_dentry);
+ rc = ecryptfs_write_headers_virt(virt, &size, crypt_stat,
+ ecryptfs_dentry);
if (unlikely(rc)) {
printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n",
__func__, rc);
@@ -1395,7 +1393,8 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry)
goto out_free;
}
out_free:
- free_page((unsigned long)virt);
+ memset(virt, 0, crypt_stat->num_header_bytes_at_front);
+ kfree(virt);
out:
return rc;
}
diff --git a/trunk/fs/fat/inode.c b/trunk/fs/fat/inode.c
index 2b2eec1283bf..19eafbe3c379 100644
--- a/trunk/fs/fat/inode.c
+++ b/trunk/fs/fat/inode.c
@@ -175,7 +175,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb,
if (rw == WRITE) {
/*
- * FIXME: blockdev_direct_IO() doesn't use ->write_begin(),
+ * FIXME: blockdev_direct_IO() doesn't use ->prepare_write(),
* so we need to update the ->mmu_private to block boundary.
*
* But we must fill the remaining area or hole by nul for
diff --git a/trunk/fs/jbd/transaction.c b/trunk/fs/jbd/transaction.c
index 60d4c32c8808..d15cd6e7251e 100644
--- a/trunk/fs/jbd/transaction.c
+++ b/trunk/fs/jbd/transaction.c
@@ -860,6 +860,7 @@ int journal_get_create_access(handle_t *handle, struct buffer_head *bh)
* int journal_get_undo_access() - Notify intent to modify metadata with non-rewindable consequences
* @handle: transaction
* @bh: buffer to undo
+ * @credits: store the number of taken credits here (if not NULL)
*
* Sometimes there is a need to distinguish between metadata which has
* been committed to disk and that which has not. The ext3fs code uses
diff --git a/trunk/fs/libfs.c b/trunk/fs/libfs.c
index e960a8321902..74688598bcf7 100644
--- a/trunk/fs/libfs.c
+++ b/trunk/fs/libfs.c
@@ -814,7 +814,7 @@ EXPORT_SYMBOL(simple_getattr);
EXPORT_SYMBOL(simple_link);
EXPORT_SYMBOL(simple_lookup);
EXPORT_SYMBOL(simple_pin_fs);
-EXPORT_UNUSED_SYMBOL(simple_prepare_write);
+EXPORT_SYMBOL(simple_prepare_write);
EXPORT_SYMBOL(simple_readpage);
EXPORT_SYMBOL(simple_release_fs);
EXPORT_SYMBOL(simple_rename);
diff --git a/trunk/fs/ocfs2/file.c b/trunk/fs/ocfs2/file.c
index 7efe937a415f..8d3225a78073 100644
--- a/trunk/fs/ocfs2/file.c
+++ b/trunk/fs/ocfs2/file.c
@@ -679,7 +679,8 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start,
/* Some parts of this taken from generic_cont_expand, which turned out
* to be too fragile to do exactly what we need without us having to
- * worry about recursive locking in ->write_begin() and ->write_end(). */
+ * worry about recursive locking in ->prepare_write() and
+ * ->commit_write(). */
static int ocfs2_write_zero_page(struct inode *inode,
u64 size)
{
diff --git a/trunk/fs/splice.c b/trunk/fs/splice.c
index 1abab5cee4ba..a1e701c27156 100644
--- a/trunk/fs/splice.c
+++ b/trunk/fs/splice.c
@@ -731,8 +731,8 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
};
/*
- * The actor worker might be calling ->write_begin and
- * ->write_end. Most of the time, these expect i_mutex to
+ * The actor worker might be calling ->prepare_write and
+ * ->commit_write. Most of the time, these expect i_mutex to
* be held. Since this may result in an ABBA deadlock with
* pipe->inode, we have to order lock acquiry here.
*/
diff --git a/trunk/include/linux/cgroup.h b/trunk/include/linux/cgroup.h
index 1164963c3a85..8b00f6643e93 100644
--- a/trunk/include/linux/cgroup.h
+++ b/trunk/include/linux/cgroup.h
@@ -25,6 +25,7 @@ struct cgroup;
extern int cgroup_init_early(void);
extern int cgroup_init(void);
+extern void cgroup_init_smp(void);
extern void cgroup_lock(void);
extern bool cgroup_lock_live_group(struct cgroup *cgrp);
extern void cgroup_unlock(void);
@@ -347,6 +348,8 @@ struct cgroup_subsys {
struct cgroupfs_root *root;
struct list_head sibling;
+
+ void *private;
};
#define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys;
@@ -407,6 +410,7 @@ void cgroup_mm_owner_callbacks(struct task_struct *old,
static inline int cgroup_init_early(void) { return 0; }
static inline int cgroup_init(void) { return 0; }
+static inline void cgroup_init_smp(void) {}
static inline void cgroup_fork(struct task_struct *p) {}
static inline void cgroup_fork_callbacks(struct task_struct *p) {}
static inline void cgroup_post_fork(struct task_struct *p) {}
diff --git a/trunk/include/linux/freezer.h b/trunk/include/linux/freezer.h
index 5a361f85cfec..8f225339eee9 100644
--- a/trunk/include/linux/freezer.h
+++ b/trunk/include/linux/freezer.h
@@ -44,6 +44,11 @@ static inline bool should_send_signal(struct task_struct *p)
return !(p->flags & PF_FREEZER_NOSIG);
}
+/*
+ * Wake up a frozen process
+ */
+extern int __thaw_process(struct task_struct *p);
+
/* Takes and releases task alloc lock using task_lock() */
extern int thaw_process(struct task_struct *p);
diff --git a/trunk/include/linux/fs.h b/trunk/include/linux/fs.h
index 0dcdd9458f4b..5b248d61430c 100644
--- a/trunk/include/linux/fs.h
+++ b/trunk/include/linux/fs.h
@@ -489,6 +489,13 @@ struct address_space_operations {
int (*readpages)(struct file *filp, struct address_space *mapping,
struct list_head *pages, unsigned nr_pages);
+ /*
+ * ext3 requires that a successful prepare_write() call be followed
+ * by a commit_write() call - they must be balanced
+ */
+ int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
+ int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
+
int (*write_begin)(struct file *, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
struct page **pagep, void **fsdata);
diff --git a/trunk/include/linux/kernel.h b/trunk/include/linux/kernel.h
index fba141d3ca07..396a350b87a6 100644
--- a/trunk/include/linux/kernel.h
+++ b/trunk/include/linux/kernel.h
@@ -116,8 +116,6 @@ extern int _cond_resched(void);
# define might_resched() do { } while (0)
#endif
-#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
- void __might_sleep(char *file, int line);
/**
* might_sleep - annotation for functions that can sleep
*
@@ -128,6 +126,8 @@ extern int _cond_resched(void);
* be bitten later when the calling function happens to sleep when it is not
* supposed to.
*/
+#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
+ void __might_sleep(char *file, int line);
# define might_sleep() \
do { __might_sleep(__FILE__, __LINE__); might_resched(); } while (0)
#else
diff --git a/trunk/include/linux/resource.h b/trunk/include/linux/resource.h
index 40fc7e626082..aaa423a6f3d9 100644
--- a/trunk/include/linux/resource.h
+++ b/trunk/include/linux/resource.h
@@ -59,10 +59,10 @@ struct rlimit {
#define _STK_LIM (8*1024*1024)
/*
- * GPG2 wants 64kB of mlocked memory, to make sure pass phrases
+ * GPG wants 32kB of mlocked memory, to make sure pass phrases
* and other sensitive information are never written to disk.
*/
-#define MLOCK_LIMIT ((PAGE_SIZE > 64*1024) ? PAGE_SIZE : 64*1024)
+#define MLOCK_LIMIT (8 * PAGE_SIZE)
/*
* Due to binary compatibility, the actual resource numbers
diff --git a/trunk/include/linux/security.h b/trunk/include/linux/security.h
index c13f1cec9abb..f5c4a51eb42e 100644
--- a/trunk/include/linux/security.h
+++ b/trunk/include/linux/security.h
@@ -1585,7 +1585,6 @@ int security_syslog(int type);
int security_settime(struct timespec *ts, struct timezone *tz);
int security_vm_enough_memory(long pages);
int security_vm_enough_memory_mm(struct mm_struct *mm, long pages);
-int security_vm_enough_memory_kern(long pages);
int security_bprm_alloc(struct linux_binprm *bprm);
void security_bprm_free(struct linux_binprm *bprm);
void security_bprm_apply_creds(struct linux_binprm *bprm, int unsafe);
@@ -1821,11 +1820,6 @@ static inline int security_vm_enough_memory(long pages)
return cap_vm_enough_memory(current->mm, pages);
}
-static inline int security_vm_enough_memory_kern(long pages)
-{
- return cap_vm_enough_memory(current->mm, pages);
-}
-
static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
return cap_vm_enough_memory(mm, pages);
diff --git a/trunk/include/linux/spi/spi_bitbang.h b/trunk/include/linux/spi/spi_bitbang.h
index bf8de281b4ed..b8db32cea1de 100644
--- a/trunk/include/linux/spi/spi_bitbang.h
+++ b/trunk/include/linux/spi/spi_bitbang.h
@@ -18,9 +18,6 @@
* duplex (MicroWire) controllers. Provide chipslect() and txrx_bufs(),
* and custom setup()/cleanup() methods.
*/
-
-#include
-
struct spi_bitbang {
struct workqueue_struct *workqueue;
struct work_struct work;
diff --git a/trunk/include/net/mac80211.h b/trunk/include/net/mac80211.h
index 8856e2d60e9f..d861197f83c7 100644
--- a/trunk/include/net/mac80211.h
+++ b/trunk/include/net/mac80211.h
@@ -1474,6 +1474,7 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
* ieee80211_beacon_get - beacon generation function
* @hw: pointer obtained from ieee80211_alloc_hw().
* @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
+ * @control: will be filled with information needed to send this beacon.
*
* If the beacon frames are generated by the host system (i.e., not in
* hardware/firmware), the low-level driver uses this function to receive
@@ -1574,6 +1575,7 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
* ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames
* @hw: pointer as obtained from ieee80211_alloc_hw().
* @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
+ * @control: will be filled with information needed to send returned frame.
*
* Function for accessing buffered broadcast and multicast frames. If
* hardware/firmware does not implement buffering of broadcast/multicast
@@ -1621,8 +1623,9 @@ unsigned int ieee80211_hdrlen(__le16 fc);
*
* @keyconf: the parameter passed with the set key
* @skb: the skb for which the key is needed
+ * @rc4key: a buffer to which the key will be written
* @type: TBD
- * @key: a buffer to which the key will be written
+ * @key: TBD
*/
void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
struct sk_buff *skb,
@@ -1723,8 +1726,7 @@ void ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,
* @hw: pointer as obtained from ieee80211_alloc_hw().
* @ra: receiver address of the BA session recipient
* @tid: the TID to BA on.
- *
- * Return: success if addBA request was sent, failure otherwise
+ * @return: success if addBA request was sent, failure otherwise
*
* Although mac80211/low level driver/user space application can estimate
* the need to start aggregation on a certain RA/TID, the session level
@@ -1762,8 +1764,7 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra,
* @ra: receiver address of the BA session recipient
* @tid: the TID to stop BA.
* @initiator: if indicates initiator DELBA frame will be sent.
- *
- * Return: error if no sta with matching da found, success otherwise
+ * @return: error if no sta with matching da found, success otherwise
*
* Although mac80211/low level driver/user space application can estimate
* the need to stop aggregation on a certain RA/TID, the session level
diff --git a/trunk/include/sound/soc.h b/trunk/include/sound/soc.h
index 5e0189876afd..a1e0357a84d7 100644
--- a/trunk/include/sound/soc.h
+++ b/trunk/include/sound/soc.h
@@ -28,8 +28,7 @@
*/
#define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \
((unsigned long)&(struct soc_mixer_control) \
- {.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \
- .invert = xinvert})
+ {.reg = xreg, .shift = xshift, .max = xmax, .invert = xinvert})
#define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
((unsigned long)&(struct soc_mixer_control) \
{.reg = xreg, .max = xmax, .invert = xinvert})
diff --git a/trunk/init/Kconfig b/trunk/init/Kconfig
index 86b00c53fade..44e9208f9c78 100644
--- a/trunk/init/Kconfig
+++ b/trunk/init/Kconfig
@@ -401,20 +401,16 @@ config CGROUP_MEM_RES_CTLR
depends on CGROUPS && RESOURCE_COUNTERS
select MM_OWNER
help
- Provides a memory resource controller that manages both anonymous
- memory and page cache. (See Documentation/controllers/memory.txt)
+ Provides a memory resource controller that manages both page cache and
+ RSS memory.
Note that setting this option increases fixed memory overhead
- associated with each page of memory in the system. By this,
- 20(40)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory
- usage tracking struct at boot. Total amount of this is printed out
- at boot.
+ associated with each page of memory in the system by 4/8 bytes
+ and also increases cache misses because struct page on many 64bit
+ systems will not fit into a single cache line anymore.
Only enable when you're ok with these trade offs and really
- sure you need the memory resource controller. Even when you enable
- this, you can set "cgroup_disable=memory" at your boot option to
- disable memory resource controller and you can avoid overheads.
- (and lose benefits of memory resource contoller)
+ sure you need the memory resource controller.
This config option also selects MM_OWNER config option, which
could in turn add some fork/exit overhead.
diff --git a/trunk/init/do_mounts_md.c b/trunk/init/do_mounts_md.c
index 4d42f450b590..4c87ee1fe5d3 100644
--- a/trunk/init/do_mounts_md.c
+++ b/trunk/init/do_mounts_md.c
@@ -1,4 +1,4 @@
-#include
+
#include
#include
diff --git a/trunk/kernel/cgroup_freezer.c b/trunk/kernel/cgroup_freezer.c
index 7fa476f01d05..e95056954498 100644
--- a/trunk/kernel/cgroup_freezer.c
+++ b/trunk/kernel/cgroup_freezer.c
@@ -162,13 +162,9 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
struct task_struct *task)
{
struct freezer *freezer;
+ int retval;
- /*
- * Anything frozen can't move or be moved to/from.
- *
- * Since orig_freezer->state == FROZEN means that @task has been
- * frozen, so it's sufficient to check the latter condition.
- */
+ /* Anything frozen can't move or be moved to/from */
if (is_task_frozen_enough(task))
return -EBUSY;
@@ -177,7 +173,13 @@ static int freezer_can_attach(struct cgroup_subsys *ss,
if (freezer->state == CGROUP_FROZEN)
return -EBUSY;
- return 0;
+ retval = 0;
+ task_lock(task);
+ freezer = task_freezer(task);
+ if (freezer->state == CGROUP_FROZEN)
+ retval = -EBUSY;
+ task_unlock(task);
+ return retval;
}
static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
@@ -188,9 +190,8 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task)
freezer = task_freezer(task);
task_unlock(task);
- spin_lock_irq(&freezer->lock);
BUG_ON(freezer->state == CGROUP_FROZEN);
-
+ spin_lock_irq(&freezer->lock);
/* Locking avoids race with FREEZING -> THAWED transitions. */
if (freezer->state == CGROUP_FREEZING)
freeze_task(task, true);
@@ -275,18 +276,25 @@ static int try_to_freeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
return num_cant_freeze_now ? -EBUSY : 0;
}
-static void unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
+static int unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer)
{
struct cgroup_iter it;
struct task_struct *task;
cgroup_iter_start(cgroup, &it);
while ((task = cgroup_iter_next(cgroup, &it))) {
- thaw_process(task);
+ int do_wake;
+
+ task_lock(task);
+ do_wake = __thaw_process(task);
+ task_unlock(task);
+ if (do_wake)
+ wake_up_process(task);
}
cgroup_iter_end(cgroup, &it);
-
freezer->state = CGROUP_THAWED;
+
+ return 0;
}
static int freezer_change_state(struct cgroup *cgroup,
@@ -296,22 +304,27 @@ static int freezer_change_state(struct cgroup *cgroup,
int retval = 0;
freezer = cgroup_freezer(cgroup);
-
spin_lock_irq(&freezer->lock);
-
update_freezer_state(cgroup, freezer);
if (goal_state == freezer->state)
goto out;
-
- switch (goal_state) {
+ switch (freezer->state) {
case CGROUP_THAWED:
- unfreeze_cgroup(cgroup, freezer);
+ retval = try_to_freeze_cgroup(cgroup, freezer);
break;
+ case CGROUP_FREEZING:
+ if (goal_state == CGROUP_FROZEN) {
+ /* Userspace is retrying after
+ * "/bin/echo FROZEN > freezer.state" returned -EBUSY */
+ retval = try_to_freeze_cgroup(cgroup, freezer);
+ break;
+ }
+ /* state == FREEZING and goal_state == THAWED, so unfreeze */
case CGROUP_FROZEN:
- retval = try_to_freeze_cgroup(cgroup, freezer);
+ retval = unfreeze_cgroup(cgroup, freezer);
break;
default:
- BUG();
+ break;
}
out:
spin_unlock_irq(&freezer->lock);
diff --git a/trunk/kernel/freezer.c b/trunk/kernel/freezer.c
index 2f4936cf7083..ba6248b323ef 100644
--- a/trunk/kernel/freezer.c
+++ b/trunk/kernel/freezer.c
@@ -121,16 +121,6 @@ void cancel_freezing(struct task_struct *p)
}
}
-static int __thaw_process(struct task_struct *p)
-{
- if (frozen(p)) {
- p->flags &= ~PF_FROZEN;
- return 1;
- }
- clear_freeze_flag(p);
- return 0;
-}
-
/*
* Wake up a frozen process
*
@@ -140,6 +130,16 @@ static int __thaw_process(struct task_struct *p)
* refrigerator() could call frozen_process(), in which case the task would be
* frozen and no one would thaw it.
*/
+int __thaw_process(struct task_struct *p)
+{
+ if (frozen(p)) {
+ p->flags &= ~PF_FROZEN;
+ return 1;
+ }
+ clear_freeze_flag(p);
+ return 0;
+}
+
int thaw_process(struct task_struct *p)
{
task_lock(p);
diff --git a/trunk/kernel/profile.c b/trunk/kernel/profile.c
index 9830a037d8db..a9e422df6bf6 100644
--- a/trunk/kernel/profile.c
+++ b/trunk/kernel/profile.c
@@ -102,7 +102,7 @@ int profile_setup(char *str)
__setup("profile=", profile_setup);
-int __ref profile_init(void)
+int profile_init(void)
{
int buffer_bytes;
if (!prof_on)
diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c
index 4530fc654455..105217da5c82 100644
--- a/trunk/kernel/signal.c
+++ b/trunk/kernel/signal.c
@@ -1144,8 +1144,7 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid)
struct task_struct * p;
for_each_process(p) {
- if (task_pid_vnr(p) > 1 &&
- !same_thread_group(p, current)) {
+ if (p->pid > 1 && !same_thread_group(p, current)) {
int err = group_send_sig_info(sig, info, p);
++count;
if (err != -EPERM)
diff --git a/trunk/kernel/trace/Kconfig b/trunk/kernel/trace/Kconfig
index b58f43bec363..e0cea282e0c5 100644
--- a/trunk/kernel/trace/Kconfig
+++ b/trunk/kernel/trace/Kconfig
@@ -8,6 +8,7 @@ config NOP_TRACER
config HAVE_FUNCTION_TRACER
bool
+ select NOP_TRACER
config HAVE_DYNAMIC_FTRACE
bool
@@ -27,7 +28,6 @@ config TRACING
select RING_BUFFER
select STACKTRACE
select TRACEPOINTS
- select NOP_TRACER
menu "Tracers"
diff --git a/trunk/kernel/trace/ftrace.c b/trunk/kernel/trace/ftrace.c
index 4a39d24568c8..7618c528756b 100644
--- a/trunk/kernel/trace/ftrace.c
+++ b/trunk/kernel/trace/ftrace.c
@@ -1339,14 +1339,6 @@ void __init ftrace_init(void)
}
#else
-
-static int __init ftrace_nodyn_init(void)
-{
- ftrace_enabled = 1;
- return 0;
-}
-device_initcall(ftrace_nodyn_init);
-
# define ftrace_startup() do { } while (0)
# define ftrace_shutdown() do { } while (0)
# define ftrace_startup_sysctl() do { } while (0)
diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c
index f3e5f8944d17..ab8553658af3 100644
--- a/trunk/mm/filemap.c
+++ b/trunk/mm/filemap.c
@@ -2029,8 +2029,48 @@ int pagecache_write_begin(struct file *file, struct address_space *mapping,
{
const struct address_space_operations *aops = mapping->a_ops;
- return aops->write_begin(file, mapping, pos, len, flags,
+ if (aops->write_begin) {
+ return aops->write_begin(file, mapping, pos, len, flags,
pagep, fsdata);
+ } else {
+ int ret;
+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+ unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
+ struct inode *inode = mapping->host;
+ struct page *page;
+again:
+ page = __grab_cache_page(mapping, index);
+ *pagep = page;
+ if (!page)
+ return -ENOMEM;
+
+ if (flags & AOP_FLAG_UNINTERRUPTIBLE && !PageUptodate(page)) {
+ /*
+ * There is no way to resolve a short write situation
+ * for a !Uptodate page (except by double copying in
+ * the caller done by generic_perform_write_2copy).
+ *
+ * Instead, we have to bring it uptodate here.
+ */
+ ret = aops->readpage(file, page);
+ page_cache_release(page);
+ if (ret) {
+ if (ret == AOP_TRUNCATED_PAGE)
+ goto again;
+ return ret;
+ }
+ goto again;
+ }
+
+ ret = aops->prepare_write(file, page, offset, offset+len);
+ if (ret) {
+ unlock_page(page);
+ page_cache_release(page);
+ if (pos + len > inode->i_size)
+ vmtruncate(inode, inode->i_size);
+ }
+ return ret;
+ }
}
EXPORT_SYMBOL(pagecache_write_begin);
@@ -2039,9 +2079,32 @@ int pagecache_write_end(struct file *file, struct address_space *mapping,
struct page *page, void *fsdata)
{
const struct address_space_operations *aops = mapping->a_ops;
+ int ret;
- mark_page_accessed(page);
- return aops->write_end(file, mapping, pos, len, copied, page, fsdata);
+ if (aops->write_end) {
+ mark_page_accessed(page);
+ ret = aops->write_end(file, mapping, pos, len, copied,
+ page, fsdata);
+ } else {
+ unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
+ struct inode *inode = mapping->host;
+
+ flush_dcache_page(page);
+ ret = aops->commit_write(file, page, offset, offset+len);
+ unlock_page(page);
+ mark_page_accessed(page);
+ page_cache_release(page);
+
+ if (ret < 0) {
+ if (pos + len > inode->i_size)
+ vmtruncate(inode, inode->i_size);
+ } else if (ret > 0)
+ ret = min_t(size_t, copied, ret);
+ else
+ ret = copied;
+ }
+
+ return ret;
}
EXPORT_SYMBOL(pagecache_write_end);
@@ -2163,6 +2226,174 @@ struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index)
}
EXPORT_SYMBOL(__grab_cache_page);
+static ssize_t generic_perform_write_2copy(struct file *file,
+ struct iov_iter *i, loff_t pos)
+{
+ struct address_space *mapping = file->f_mapping;
+ const struct address_space_operations *a_ops = mapping->a_ops;
+ struct inode *inode = mapping->host;
+ long status = 0;
+ ssize_t written = 0;
+
+ do {
+ struct page *src_page;
+ struct page *page;
+ pgoff_t index; /* Pagecache index for current page */
+ unsigned long offset; /* Offset into pagecache page */
+ unsigned long bytes; /* Bytes to write to page */
+ size_t copied; /* Bytes copied from user */
+
+ offset = (pos & (PAGE_CACHE_SIZE - 1));
+ index = pos >> PAGE_CACHE_SHIFT;
+ bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset,
+ iov_iter_count(i));
+
+ /*
+ * a non-NULL src_page indicates that we're doing the
+ * copy via get_user_pages and kmap.
+ */
+ src_page = NULL;
+
+ /*
+ * Bring in the user page that we will copy from _first_.
+ * Otherwise there's a nasty deadlock on copying from the
+ * same page as we're writing to, without it being marked
+ * up-to-date.
+ *
+ * Not only is this an optimisation, but it is also required
+ * to check that the address is actually valid, when atomic
+ * usercopies are used, below.
+ */
+ if (unlikely(iov_iter_fault_in_readable(i, bytes))) {
+ status = -EFAULT;
+ break;
+ }
+
+ page = __grab_cache_page(mapping, index);
+ if (!page) {
+ status = -ENOMEM;
+ break;
+ }
+
+ /*
+ * non-uptodate pages cannot cope with short copies, and we
+ * cannot take a pagefault with the destination page locked.
+ * So pin the source page to copy it.
+ */
+ if (!PageUptodate(page) && !segment_eq(get_fs(), KERNEL_DS)) {
+ unlock_page(page);
+
+ src_page = alloc_page(GFP_KERNEL);
+ if (!src_page) {
+ page_cache_release(page);
+ status = -ENOMEM;
+ break;
+ }
+
+ /*
+ * Cannot get_user_pages with a page locked for the
+ * same reason as we can't take a page fault with a
+ * page locked (as explained below).
+ */
+ copied = iov_iter_copy_from_user(src_page, i,
+ offset, bytes);
+ if (unlikely(copied == 0)) {
+ status = -EFAULT;
+ page_cache_release(page);
+ page_cache_release(src_page);
+ break;
+ }
+ bytes = copied;
+
+ lock_page(page);
+ /*
+ * Can't handle the page going uptodate here, because
+ * that means we would use non-atomic usercopies, which
+ * zero out the tail of the page, which can cause
+ * zeroes to become transiently visible. We could just
+ * use a non-zeroing copy, but the APIs aren't too
+ * consistent.
+ */
+ if (unlikely(!page->mapping || PageUptodate(page))) {
+ unlock_page(page);
+ page_cache_release(page);
+ page_cache_release(src_page);
+ continue;
+ }
+ }
+
+ status = a_ops->prepare_write(file, page, offset, offset+bytes);
+ if (unlikely(status))
+ goto fs_write_aop_error;
+
+ if (!src_page) {
+ /*
+ * Must not enter the pagefault handler here, because
+ * we hold the page lock, so we might recursively
+ * deadlock on the same lock, or get an ABBA deadlock
+ * against a different lock, or against the mmap_sem
+ * (which nests outside the page lock). So increment
+ * preempt count, and use _atomic usercopies.
+ *
+ * The page is uptodate so we are OK to encounter a
+ * short copy: if unmodified parts of the page are
+ * marked dirty and written out to disk, it doesn't
+ * really matter.
+ */
+ pagefault_disable();
+ copied = iov_iter_copy_from_user_atomic(page, i,
+ offset, bytes);
+ pagefault_enable();
+ } else {
+ void *src, *dst;
+ src = kmap_atomic(src_page, KM_USER0);
+ dst = kmap_atomic(page, KM_USER1);
+ memcpy(dst + offset, src + offset, bytes);
+ kunmap_atomic(dst, KM_USER1);
+ kunmap_atomic(src, KM_USER0);
+ copied = bytes;
+ }
+ flush_dcache_page(page);
+
+ status = a_ops->commit_write(file, page, offset, offset+bytes);
+ if (unlikely(status < 0))
+ goto fs_write_aop_error;
+ if (unlikely(status > 0)) /* filesystem did partial write */
+ copied = min_t(size_t, copied, status);
+
+ unlock_page(page);
+ mark_page_accessed(page);
+ page_cache_release(page);
+ if (src_page)
+ page_cache_release(src_page);
+
+ iov_iter_advance(i, copied);
+ pos += copied;
+ written += copied;
+
+ balance_dirty_pages_ratelimited(mapping);
+ cond_resched();
+ continue;
+
+fs_write_aop_error:
+ unlock_page(page);
+ page_cache_release(page);
+ if (src_page)
+ page_cache_release(src_page);
+
+ /*
+ * prepare_write() may have instantiated a few blocks
+ * outside i_size. Trim these off again. Don't need
+ * i_size_read because we hold i_mutex.
+ */
+ if (pos + bytes > inode->i_size)
+ vmtruncate(inode, inode->i_size);
+ break;
+ } while (iov_iter_count(i));
+
+ return written ? written : status;
+}
+
static ssize_t generic_perform_write(struct file *file,
struct iov_iter *i, loff_t pos)
{
@@ -2263,7 +2494,10 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
struct iov_iter i;
iov_iter_init(&i, iov, nr_segs, count, written);
- status = generic_perform_write(file, &i, pos);
+ if (a_ops->write_begin)
+ status = generic_perform_write(file, &i, pos);
+ else
+ status = generic_perform_write_2copy(file, &i, pos);
if (likely(status >= 0)) {
written += status;
diff --git a/trunk/mm/mmap.c b/trunk/mm/mmap.c
index de14ac21e5b5..74f4d158022e 100644
--- a/trunk/mm/mmap.c
+++ b/trunk/mm/mmap.c
@@ -175,8 +175,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
/* Don't let a single process grow too big:
leave 3% of the size of this process for other processes */
- if (mm)
- allowed -= mm->total_vm / 32;
+ allowed -= mm->total_vm / 32;
/*
* cast `allowed' as a signed long because vm_committed_space
diff --git a/trunk/mm/nommu.c b/trunk/mm/nommu.c
index 7695dc850785..2696b24f2bb3 100644
--- a/trunk/mm/nommu.c
+++ b/trunk/mm/nommu.c
@@ -1454,8 +1454,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
/* Don't let a single process grow too big:
leave 3% of the size of this process for other processes */
- if (mm)
- allowed -= mm->total_vm / 32;
+ allowed -= current->mm->total_vm / 32;
/*
* cast `allowed' as a signed long because vm_committed_space
diff --git a/trunk/mm/shmem.c b/trunk/mm/shmem.c
index 0ed075215e5f..d38d7e61fcd0 100644
--- a/trunk/mm/shmem.c
+++ b/trunk/mm/shmem.c
@@ -161,8 +161,8 @@ static inline struct shmem_sb_info *SHMEM_SB(struct super_block *sb)
*/
static inline int shmem_acct_size(unsigned long flags, loff_t size)
{
- return (flags & VM_ACCOUNT) ?
- security_vm_enough_memory_kern(VM_ACCT(size)) : 0;
+ return (flags & VM_ACCOUNT)?
+ security_vm_enough_memory(VM_ACCT(size)): 0;
}
static inline void shmem_unacct_size(unsigned long flags, loff_t size)
@@ -179,8 +179,8 @@ static inline void shmem_unacct_size(unsigned long flags, loff_t size)
*/
static inline int shmem_acct_block(unsigned long flags)
{
- return (flags & VM_ACCOUNT) ?
- 0 : security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE));
+ return (flags & VM_ACCOUNT)?
+ 0: security_vm_enough_memory(VM_ACCT(PAGE_CACHE_SIZE));
}
static inline void shmem_unacct_blocks(unsigned long flags, long pages)
diff --git a/trunk/mm/vmalloc.c b/trunk/mm/vmalloc.c
index f1cc03bbf6ac..036536945dd9 100644
--- a/trunk/mm/vmalloc.c
+++ b/trunk/mm/vmalloc.c
@@ -897,8 +897,7 @@ EXPORT_SYMBOL(vm_unmap_ram);
* @count: number of pages
* @node: prefer to allocate data structures on this node
* @prot: memory protection to use. PAGE_KERNEL for regular RAM
- *
- * Returns: a pointer to the address that has been mapped, or %NULL on failure
+ * @returns: a pointer to the address that has been mapped, or NULL on failure
*/
void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot)
{
diff --git a/trunk/net/core/pktgen.c b/trunk/net/core/pktgen.c
index a47f5bad110d..99f656d35b4f 100644
--- a/trunk/net/core/pktgen.c
+++ b/trunk/net/core/pktgen.c
@@ -1973,27 +1973,28 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
/* make sure that we don't pick a non-existing transmit queue */
ntxq = pkt_dev->odev->real_num_tx_queues;
- if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) {
+ if (ntxq <= num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) {
printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU "
- "disabled because CPU count (%d) exceeds number "
- "of tx queues (%d) on %s\n", num_online_cpus(), ntxq,
- pkt_dev->odev->name);
+ "disabled because CPU count (%d) exceeds number ",
+ num_online_cpus());
+ printk(KERN_WARNING "pktgen: WARNING: of tx queues "
+ "(%d) on %s \n", ntxq, pkt_dev->odev->name);
pkt_dev->flags &= ~F_QUEUE_MAP_CPU;
}
if (ntxq <= pkt_dev->queue_map_min) {
printk(KERN_WARNING "pktgen: WARNING: Requested "
- "queue_map_min (zero-based) (%d) exceeds valid range "
- "[0 - %d] for (%d) queues on %s, resetting\n",
- pkt_dev->queue_map_min, (ntxq ?: 1)- 1, ntxq,
- pkt_dev->odev->name);
+ "queue_map_min (%d) exceeds number of tx\n",
+ pkt_dev->queue_map_min);
+ printk(KERN_WARNING "pktgen: WARNING: queues (%d) on "
+ "%s, resetting\n", ntxq, pkt_dev->odev->name);
pkt_dev->queue_map_min = ntxq - 1;
}
- if (pkt_dev->queue_map_max >= ntxq) {
+ if (ntxq <= pkt_dev->queue_map_max) {
printk(KERN_WARNING "pktgen: WARNING: Requested "
- "queue_map_max (zero-based) (%d) exceeds valid range "
- "[0 - %d] for (%d) queues on %s, resetting\n",
- pkt_dev->queue_map_max, (ntxq ?: 1)- 1, ntxq,
- pkt_dev->odev->name);
+ "queue_map_max (%d) exceeds number of tx\n",
+ pkt_dev->queue_map_max);
+ printk(KERN_WARNING "pktgen: WARNING: queues (%d) on "
+ "%s, resetting\n", ntxq, pkt_dev->odev->name);
pkt_dev->queue_map_max = ntxq - 1;
}
diff --git a/trunk/net/mac80211/rc80211_minstrel_debugfs.c b/trunk/net/mac80211/rc80211_minstrel_debugfs.c
index 98f480708050..0b024cd6b809 100644
--- a/trunk/net/mac80211/rc80211_minstrel_debugfs.c
+++ b/trunk/net/mac80211/rc80211_minstrel_debugfs.c
@@ -94,8 +94,8 @@ minstrel_stats_open(struct inode *inode, struct file *file)
prob / 10, prob % 10,
mr->last_success,
mr->last_attempts,
- (unsigned long long)mr->succ_hist,
- (unsigned long long)mr->att_hist);
+ mr->succ_hist,
+ mr->att_hist);
}
p += sprintf(p, "\nTotal packet count:: ideal %d "
"lookaround %d\n\n",
@@ -106,7 +106,7 @@ minstrel_stats_open(struct inode *inode, struct file *file)
return 0;
}
-static ssize_t
+static int
minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *o)
{
struct minstrel_stats_info *ms;
diff --git a/trunk/net/rfkill/rfkill-input.c b/trunk/net/rfkill/rfkill-input.c
index bfdade72e066..21124ec0a73d 100644
--- a/trunk/net/rfkill/rfkill-input.c
+++ b/trunk/net/rfkill/rfkill-input.c
@@ -256,11 +256,6 @@ static struct input_handler rfkill_handler = {
static int __init rfkill_handler_init(void)
{
- unsigned long last_run = jiffies - msecs_to_jiffies(500);
- rfkill_wlan.last = last_run;
- rfkill_bt.last = last_run;
- rfkill_uwb.last = last_run;
- rfkill_wimax.last = last_run;
return input_register_handler(&rfkill_handler);
}
diff --git a/trunk/security/security.c b/trunk/security/security.c
index c0acfa7177e5..255b08559b2b 100644
--- a/trunk/security/security.c
+++ b/trunk/security/security.c
@@ -198,23 +198,14 @@ int security_settime(struct timespec *ts, struct timezone *tz)
int security_vm_enough_memory(long pages)
{
- WARN_ON(current->mm == NULL);
return security_ops->vm_enough_memory(current->mm, pages);
}
int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
- WARN_ON(mm == NULL);
return security_ops->vm_enough_memory(mm, pages);
}
-int security_vm_enough_memory_kern(long pages)
-{
- /* If current->mm is a kernel thread then we will pass NULL,
- for this specific case that is fine */
- return security_ops->vm_enough_memory(current->mm, pages);
-}
-
int security_bprm_alloc(struct linux_binprm *bprm)
{
return security_ops->bprm_alloc_security(bprm);
diff --git a/trunk/sound/core/control.c b/trunk/sound/core/control.c
index b0bf42691047..6d71f9a7ccbb 100644
--- a/trunk/sound/core/control.c
+++ b/trunk/sound/core/control.c
@@ -225,13 +225,8 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
kctl.id.iface = ncontrol->iface;
kctl.id.device = ncontrol->device;
kctl.id.subdevice = ncontrol->subdevice;
- if (ncontrol->name) {
+ if (ncontrol->name)
strlcpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name));
- if (strcmp(ncontrol->name, kctl.id.name) != 0)
- snd_printk(KERN_WARNING
- "Control name '%s' truncated to '%s'\n",
- ncontrol->name, kctl.id.name);
- }
kctl.id.index = ncontrol->index;
kctl.count = ncontrol->count ? ncontrol->count : 1;
access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
diff --git a/trunk/sound/pci/ac97/ac97_codec.c b/trunk/sound/pci/ac97/ac97_codec.c
index bd510eceff1f..6704acbca8c0 100644
--- a/trunk/sound/pci/ac97/ac97_codec.c
+++ b/trunk/sound/pci/ac97/ac97_codec.c
@@ -1927,9 +1927,9 @@ static int snd_ac97_dev_register(struct snd_device *device)
ac97->dev.bus = &ac97_bus_type;
ac97->dev.parent = ac97->bus->card->dev;
ac97->dev.release = ac97_device_release;
- dev_set_name(&ac97->dev, "%d-%d:%s",
- ac97->bus->card->number, ac97->num,
- snd_ac97_get_short_name(ac97));
+ snprintf(ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s",
+ ac97->bus->card->number, ac97->num,
+ snd_ac97_get_short_name(ac97));
if ((err = device_register(&ac97->dev)) < 0) {
snd_printk(KERN_ERR "Can't register ac97 bus\n");
ac97->dev.bus = NULL;
diff --git a/trunk/sound/pci/hda/hda_codec.c b/trunk/sound/pci/hda/hda_codec.c
index ba1ab737b55f..6447754ae56e 100644
--- a/trunk/sound/pci/hda/hda_codec.c
+++ b/trunk/sound/pci/hda/hda_codec.c
@@ -64,7 +64,6 @@ static struct hda_vendor_id hda_vendor_ids[] = {
{ 0x14f1, "Conexant" },
{ 0x17e8, "Chrontel" },
{ 0x1854, "LG" },
- { 0x1aec, "Wolfson Microelectronics" },
{ 0x434d, "C-Media" },
{ 0x8384, "SigmaTel" },
{} /* terminator */
diff --git a/trunk/sound/pci/hda/hda_intel.c b/trunk/sound/pci/hda/hda_intel.c
index 35722ec920cb..f080f8ce0ecb 100644
--- a/trunk/sound/pci/hda/hda_intel.c
+++ b/trunk/sound/pci/hda/hda_intel.c
@@ -45,7 +45,6 @@
#include
#include
#include
-#include
#include
#include
#include "hda_codec.h"
@@ -398,9 +397,6 @@ struct azx {
/* for pending irqs */
struct work_struct irq_pending_work;
-
- /* reboot notifier (for mysterious hangup problem at power-down) */
- struct notifier_block reboot_notifier;
};
/* driver types */
@@ -1982,28 +1978,6 @@ static int azx_resume(struct pci_dev *pci)
#endif /* CONFIG_PM */
-/*
- * reboot notifier for hang-up problem at power-down
- */
-static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
-{
- struct azx *chip = container_of(nb, struct azx, reboot_notifier);
- azx_stop_chip(chip);
- return NOTIFY_OK;
-}
-
-static void azx_notifier_register(struct azx *chip)
-{
- chip->reboot_notifier.notifier_call = azx_halt;
- register_reboot_notifier(&chip->reboot_notifier);
-}
-
-static void azx_notifier_unregister(struct azx *chip)
-{
- if (chip->reboot_notifier.notifier_call)
- unregister_reboot_notifier(&chip->reboot_notifier);
-}
-
/*
* destructor
*/
@@ -2011,8 +1985,6 @@ static int azx_free(struct azx *chip)
{
int i;
- azx_notifier_unregister(chip);
-
if (chip->initialized) {
azx_clear_irq_pending(chip);
for (i = 0; i < chip->num_streams; i++)
@@ -2376,7 +2348,6 @@ static int __devinit azx_probe(struct pci_dev *pci,
pci_set_drvdata(pci, card);
chip->running = 1;
power_down_all_codecs(chip);
- azx_notifier_register(chip);
dev++;
return err;
diff --git a/trunk/sound/pci/hda/patch_analog.c b/trunk/sound/pci/hda/patch_analog.c
index d3fd432cb3ea..2b00c4afdf97 100644
--- a/trunk/sound/pci/hda/patch_analog.c
+++ b/trunk/sound/pci/hda/patch_analog.c
@@ -3860,7 +3860,6 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
- SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
{}
};
diff --git a/trunk/sound/pci/hda/patch_sigmatel.c b/trunk/sound/pci/hda/patch_sigmatel.c
index df9b0bc7f878..788fdc6f3264 100644
--- a/trunk/sound/pci/hda/patch_sigmatel.c
+++ b/trunk/sound/pci/hda/patch_sigmatel.c
@@ -566,8 +566,10 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
nid = codec->slave_dig_outs[smux_idx - 1];
if (spec->cur_smux[smux_idx] == smux->num_items - 1)
val = AMP_OUT_MUTE;
+ if (smux_idx == 0)
+ nid = spec->multiout.dig_out_nid;
else
- val = AMP_OUT_UNMUTE;
+ nid = codec->slave_dig_outs[smux_idx - 1];
/* un/mute SPDIF out */
snd_hda_codec_write_cache(codec, nid, 0,
AC_VERB_SET_AMP_GAIN_MUTE, val);
diff --git a/trunk/sound/pci/ice1712/ice1712.c b/trunk/sound/pci/ice1712/ice1712.c
index 58d7cda03de5..5b442383fcda 100644
--- a/trunk/sound/pci/ice1712/ice1712.c
+++ b/trunk/sound/pci/ice1712/ice1712.c
@@ -2688,13 +2688,12 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
return err;
}
- if (ice_has_con_ac97(ice)) {
+ if (ice_has_con_ac97(ice))
err = snd_ice1712_pcm(ice, pcm_dev++, NULL);
if (err < 0) {
snd_card_free(card);
return err;
}
- }
err = snd_ice1712_ac97_mixer(ice);
if (err < 0) {
@@ -2716,13 +2715,12 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
}
}
- if (ice_has_con_ac97(ice)) {
+ if (ice_has_con_ac97(ice))
err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL);
if (err < 0) {
snd_card_free(card);
return err;
}
- }
if (!c->no_mpu401) {
err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712,
diff --git a/trunk/sound/pci/intel8x0.c b/trunk/sound/pci/intel8x0.c
index 19d3391e229f..c88d1eace1c4 100644
--- a/trunk/sound/pci/intel8x0.c
+++ b/trunk/sound/pci/intel8x0.c
@@ -2702,7 +2702,6 @@ static struct snd_pci_quirk intel8x0_clock_list[] __devinitdata = {
SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000),
SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100),
SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000),
- SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000),
SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000),
{ } /* terminator */
};
diff --git a/trunk/sound/soc/codecs/wm9713.c b/trunk/sound/soc/codecs/wm9713.c
index 945b32ed9884..aba402b3c999 100644
--- a/trunk/sound/soc/codecs/wm9713.c
+++ b/trunk/sound/soc/codecs/wm9713.c
@@ -140,7 +140,7 @@ SOC_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0),
SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0),
SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0),
-SOC_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0),
+SOC_SINGLE("ALC Decay Time ", AC97_CODEC_CLASS_REV, 4, 15, 0),
SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0),
SOC_ENUM("ALC Function", wm9713_enum[6]),
SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0),
diff --git a/trunk/sound/soc/fsl/mpc5200_psc_i2s.c b/trunk/sound/soc/fsl/mpc5200_psc_i2s.c
index 94a02eaa4825..86923299bc10 100644
--- a/trunk/sound/soc/fsl/mpc5200_psc_i2s.c
+++ b/trunk/sound/soc/fsl/mpc5200_psc_i2s.c
@@ -277,7 +277,7 @@ static int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd)
struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs;
u16 imr;
u8 psc_cmd;
- unsigned long flags;
+ long flags;
if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE)
s = &psc_i2s->capture;
@@ -699,11 +699,9 @@ static ssize_t psc_i2s_stat_store(struct device *dev,
return count;
}
-static DEVICE_ATTR(status, 0644, psc_i2s_status_show, NULL);
-static DEVICE_ATTR(playback_underrun, 0644, psc_i2s_stat_show,
- psc_i2s_stat_store);
-static DEVICE_ATTR(capture_overrun, 0644, psc_i2s_stat_show,
- psc_i2s_stat_store);
+DEVICE_ATTR(status, 0644, psc_i2s_status_show, NULL);
+DEVICE_ATTR(playback_underrun, 0644, psc_i2s_stat_show, psc_i2s_stat_store);
+DEVICE_ATTR(capture_overrun, 0644, psc_i2s_stat_show, psc_i2s_stat_store);
/* ---------------------------------------------------------------------
* OF platform bus binding code:
@@ -821,8 +819,8 @@ static int __devinit psc_i2s_of_probe(struct of_device *op,
/* Register the SYSFS files */
rc = device_create_file(psc_i2s->dev, &dev_attr_status);
- rc |= device_create_file(psc_i2s->dev, &dev_attr_capture_overrun);
- rc |= device_create_file(psc_i2s->dev, &dev_attr_playback_underrun);
+ rc = device_create_file(psc_i2s->dev, &dev_attr_capture_overrun);
+ rc = device_create_file(psc_i2s->dev, &dev_attr_playback_underrun);
if (rc)
dev_info(psc_i2s->dev, "error creating sysfs files\n");
diff --git a/trunk/sound/soc/soc-core.c b/trunk/sound/soc/soc-core.c
index a3adbf06b1e5..462e635dfc74 100644
--- a/trunk/sound/soc/soc-core.c
+++ b/trunk/sound/soc/soc-core.c
@@ -1462,7 +1462,7 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
struct soc_mixer_control *mc =
(struct soc_mixer_control *)kcontrol->private_value;
int max = mc->max;
- unsigned int shift = mc->shift;
+ unsigned int shift = mc->min;
unsigned int rshift = mc->rshift;
if (max == 1)
diff --git a/trunk/sound/usb/usbquirks.h b/trunk/sound/usb/usbquirks.h
index 92115755d98e..69689e79bf79 100644
--- a/trunk/sound/usb/usbquirks.h
+++ b/trunk/sound/usb/usbquirks.h
@@ -1480,36 +1480,6 @@ YAMAHA_DEVICE(0x7010, "UB99"),
}
}
},
-{
- /* Advanced modes of the Edirol UA-25EX.
- * For the standard mode, UA-25EX has ID 0582:00e7, which
- * offers only 16-bit PCM at 44.1 kHz and no MIDI.
- */
- USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6),
- .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
- .vendor_name = "EDIROL",
- .product_name = "UA-25EX",
- .ifnum = QUIRK_ANY_INTERFACE,
- .type = QUIRK_COMPOSITE,
- .data = (const struct snd_usb_audio_quirk[]) {
- {
- .ifnum = 0,
- .type = QUIRK_AUDIO_EDIROL_UAXX
- },
- {
- .ifnum = 1,
- .type = QUIRK_AUDIO_EDIROL_UAXX
- },
- {
- .ifnum = 2,
- .type = QUIRK_AUDIO_EDIROL_UAXX
- },
- {
- .ifnum = -1
- }
- }
- }
-},
/* Guillemot devices */
{