CVSROOT: /home/cvs
Module name: linux
Changes by: ralf@ftp.linux-mips.org 05/03/02 19:58:04
Modified files:
. : CREDITS Makefile
arch/arm/kernel: debug.S
arch/arm/mach-imx: dma.c generic.c
arch/arm/mm : consistent.c
arch/i386/kernel: apic.c
arch/ia64/kernel: ptrace.c
arch/ppc64/mm : tlb.c
arch/x86_64/mm : srat.c
drivers/acpi : pci_irq.c
drivers/block : cfq-iosched.c genhd.c
drivers/char : keyboard.c pty.c
drivers/ide : ide-disk.c ide-io.c
drivers/ide/pci: hpt366.c
drivers/input/serio: i8042-x86ia64io.h
drivers/isdn/hisax: icc.c icc.h
drivers/net : hp100.c rrunner.c
drivers/net/wireless/prism54: islpci_hotplug.c
drivers/parport: parport_pc.c
drivers/scsi : dc395x.c scsi_devinfo.c
drivers/serial : 8250.c 8250_pci.c Makefile
drivers/usb/class: cdc-acm.c
drivers/usb/core: devio.c
drivers/video : modedb.c
drivers/video/aty: radeon_base.c
fs : binfmt_elf.c pipe.c
fs/sysfs : file.c
include/linux : ide.h pci_ids.h sysctl.h
include/net : ipv6.h
kernel : audit.c auditsc.c sysctl.c
mm : highmem.c
net/core : pktgen.c
net/ipv4 : fib_hash.c route.c
net/ipv4/netfilter: ip_conntrack_standalone.c ipt_hashlimit.c
net/ipv6 : addrconf.c af_inet6.c proc.c
net/unix : af_unix.c
security/keys : compat.c keyctl.c
security/selinux/ss: conditional.c policydb.c
sound/oss : aedsp16.c opl3sa2.c sonicvibes.c
Log message:
Merge with Linux 2.6.11.
diff -urN linux/CREDITS linux/CREDITS
--- linux/CREDITS 2005/02/13 20:16:13 1.139
+++ linux/CREDITS 2005/03/02 19:58:00 1.140
@@ -805,6 +805,21 @@
S: Round Rock, TX 78682
S: USA
+N: Ben Dooks
+E: ben-linux@fluff.org
+E: ben@simtec.co.uk
+W: http://www.fluff.org/ben/
+W: http://www.simtec.co.uk/
+D: Samsung S3C2410/S3C2440 support, general ARM support
+D: Maintaining Simtec Electronics development boards
+S: Simtec Electronics
+S: Avondale Drive
+S: Tarleton
+S: Preston
+S: Lancs
+S: PR4 6AX
+S: United Kingdom
+
N: John G Dorsey
E: john+@cs.cmu.edu
D: ARM Linux ports to Assabet/Neponset, Spot
diff -urN linux/Makefile linux/Makefile
--- linux/Makefile 2005/02/28 15:45:09 1.246
+++ linux/Makefile 2005/03/02 19:58:00 1.247
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 11
-EXTRAVERSION =-rc5
+EXTRAVERSION =
NAME=Woozy Numbat
# *DOCUMENTATION*
diff -urN linux/arch/arm/kernel/debug.S linux/arch/arm/kernel/debug.S
--- linux/arch/arm/kernel/debug.S 2005/02/28 15:45:09 1.17
+++ linux/arch/arm/kernel/debug.S 2005/03/02 19:58:00 1.18
@@ -52,29 +52,6 @@
#include <asm/arch/debug-macro.S>
#endif
-#if 0
-// #elif defined(CONFIG_ARCH_FTVPCI)
- .macro addruart,rx
- mrc p15, 0, \rx, c1, c0
- tst \rx, #1 @ MMU enabled?
- movne \rx, #0xe0000000
- moveq \rx, #0x10000000
- .endm
-
- .macro senduart,rd,rx
- str \rd, [\rx, #0xc]
- .endm
-
- .macro busyuart,rd,rx
-1001: ldr \rd, [\rx, #0x4]
- tst \rd, #1 << 2
- beq 1001b
- .endm
-
- .macro waituart,rd,rx
- .endm
-#endif
-
/*
* Useful debugging routines
*/
diff -urN linux/arch/arm/mach-imx/dma.c linux/arch/arm/mach-imx/dma.c
--- linux/arch/arm/mach-imx/dma.c 2004/08/24 15:10:03 1.1
+++ linux/arch/arm/mach-imx/dma.c 2005/03/02 19:58:00 1.2
@@ -136,7 +136,7 @@
i, channel->name);
DBOSR |= (1 << i);
}
- DISR |= (1 << i);
+ DISR = (1 << i);
}
return IRQ_HANDLED;
}
@@ -158,10 +158,10 @@
*/
printk(KERN_WARNING
"spurious IRQ for DMA channel %d\n", i);
- DISR |= (1 << i);
}
}
}
+ DISR = disr;
return IRQ_HANDLED;
}
diff -urN linux/arch/arm/mach-imx/generic.c linux/arch/arm/mach-imx/generic.c
--- linux/arch/arm/mach-imx/generic.c 2004/08/24 15:10:03 1.1
+++ linux/arch/arm/mach-imx/generic.c 2005/03/02 19:58:00 1.2
@@ -100,8 +100,8 @@
static unsigned int imx_decode_pll(unsigned int pll)
{
u32 mfi = (pll >> 10) & 0xf;
- u32 mfn = pll & 0x3f;
- u32 mfd = (pll >> 16) & 0x3f;
+ u32 mfn = pll & 0x3ff;
+ u32 mfd = (pll >> 16) & 0x3ff;
u32 pd = (pll >> 26) & 0xf;
u32 f_ref = (CSCR & CSCR_SYSTEM_SEL) ? 16000000 : (CLK32 * 512);
diff -urN linux/arch/arm/mm/consistent.c linux/arch/arm/mm/consistent.c
--- linux/arch/arm/mm/consistent.c 2005/02/28 15:45:10 1.25
+++ linux/arch/arm/mm/consistent.c 2005/03/02 19:58:00 1.26
@@ -293,7 +293,8 @@
vma->vm_flags |= VM_RESERVED;
ret = remap_pfn_range(vma, vma->vm_start,
page_to_pfn(c->vm_pages) + off,
- user_size, vma->vm_page_prot);
+ user_size << PAGE_SHIFT,
+ vma->vm_page_prot);
}
}
diff -urN linux/arch/i386/kernel/apic.c linux/arch/i386/kernel/apic.c
--- linux/arch/i386/kernel/apic.c 2005/02/07 02:54:31 1.60
+++ linux/arch/i386/kernel/apic.c 2005/03/02 19:58:00 1.61
@@ -894,7 +894,7 @@
* Default initialization for 8254 timers. If we use other timers like HPET,
* we override this later
*/
-void (*wait_timer_tick)(void) = wait_8254_wraparound;
+void (*wait_timer_tick)(void) __initdata = wait_8254_wraparound;
/*
* This function sets up the local APIC timer, with a timeout of
@@ -930,7 +930,7 @@
apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR);
}
-static void setup_APIC_timer(unsigned int clocks)
+static void __init setup_APIC_timer(unsigned int clocks)
{
unsigned long flags;
diff -urN linux/arch/ia64/kernel/ptrace.c linux/arch/ia64/kernel/ptrace.c
--- linux/arch/ia64/kernel/ptrace.c 2005/02/13 20:16:16 1.34
+++ linux/arch/ia64/kernel/ptrace.c 2005/03/02 19:58:00 1.35
@@ -16,6 +16,7 @@
#include <linux/smp_lock.h>
#include <linux/user.h>
#include <linux/security.h>
+#include <linux/audit.h>
#include <asm/pgtable.h>
#include <asm/processor.h>
diff -urN linux/arch/ppc64/mm/tlb.c linux/arch/ppc64/mm/tlb.c
--- linux/arch/ppc64/mm/tlb.c 2004/09/19 12:30:06 1.4
+++ linux/arch/ppc64/mm/tlb.c 2005/03/02 19:58:00 1.5
@@ -85,8 +85,12 @@
ptepage = virt_to_page(ptep);
mm = (struct mm_struct *) ptepage->mapping;
- addr = ptepage->index +
- (((unsigned long)ptep & ~PAGE_MASK) * PTRS_PER_PTE);
+ addr = ptepage->index;
+ if (pte_huge(pte))
+ addr += ((unsigned long)ptep & ~PAGE_MASK)
+ / sizeof(*ptep) * HPAGE_SIZE;
+ else
+ addr += ((unsigned long)ptep & ~PAGE_MASK) * PTRS_PER_PTE;
if (REGION_ID(addr) == USER_REGION_ID)
context = mm->context.id;
diff -urN linux/arch/x86_64/mm/srat.c linux/arch/x86_64/mm/srat.c
--- linux/arch/x86_64/mm/srat.c 2005/02/07 02:54:39 1.3
+++ linux/arch/x86_64/mm/srat.c 2005/03/02 19:58:00 1.4
@@ -23,7 +23,7 @@
static nodemask_t nodes_parsed __initdata;
static nodemask_t nodes_found __initdata;
static struct node nodes[MAX_NUMNODES] __initdata;
-static __u8 pxm2node[256] __initdata = { [0 ... 255] = 0xff };
+static __u8 pxm2node[256] = { [0 ... 255] = 0xff };
static __init int setup_node(int pxm)
{
diff -urN linux/drivers/acpi/pci_irq.c linux/drivers/acpi/pci_irq.c
--- linux/drivers/acpi/pci_irq.c 2005/01/25 04:28:09 1.24
+++ linux/drivers/acpi/pci_irq.c 2005/03/02 19:58:01 1.25
@@ -460,7 +460,7 @@
acpi_pci_irq_disable (
struct pci_dev *dev)
{
- u32 gsi = 0;
+ int gsi = 0;
u8 pin = 0;
int edge_level = ACPI_LEVEL_SENSITIVE;
int active_high_low = ACPI_ACTIVE_LOW;
@@ -487,10 +487,10 @@
* If no PRT entry was found, we'll try to derive an IRQ from the
* device's parent bridge.
*/
- if (!gsi)
+ if (gsi < 0)
gsi = acpi_pci_irq_derive(dev, pin,
&edge_level, &active_high_low);
- if (!gsi)
+ if (gsi < 0)
return_VOID;
/*
diff -urN linux/drivers/block/cfq-iosched.c linux/drivers/block/cfq-iosched.c
--- linux/drivers/block/cfq-iosched.c 2005/02/07 02:54:43 1.10
+++ linux/drivers/block/cfq-iosched.c 2005/03/02 19:58:01 1.11
@@ -1819,7 +1819,7 @@
.elevator_owner = THIS_MODULE,
};
-int cfq_init(void)
+static int __init cfq_init(void)
{
int ret;
diff -urN linux/drivers/block/genhd.c linux/drivers/block/genhd.c
--- linux/drivers/block/genhd.c 2005/02/07 02:54:43 1.79
+++ linux/drivers/block/genhd.c 2005/03/02 19:58:01 1.80
@@ -660,9 +660,10 @@
{
int res = 0;
struct block_device *bdev = bdget_disk(disk, index);
- if (bdev)
+ if (bdev) {
res = __invalidate_device(bdev, 1);
- bdput(bdev);
+ bdput(bdev);
+ }
return res;
}
diff -urN linux/drivers/char/keyboard.c linux/drivers/char/keyboard.c
--- linux/drivers/char/keyboard.c 2005/01/25 04:28:12 1.48
+++ linux/drivers/char/keyboard.c 2005/03/02 19:58:01 1.49
@@ -198,6 +198,8 @@
if (scancode < 0 || scancode >= dev->keycodemax)
return -EINVAL;
+ if (keycode < 0 || keycode > KEY_MAX)
+ return -EINVAL;
oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
diff -urN linux/drivers/char/pty.c linux/drivers/char/pty.c
--- linux/drivers/char/pty.c 2005/01/13 14:05:52 1.35
+++ linux/drivers/char/pty.c 2005/03/02 19:58:01 1.36
@@ -149,13 +149,15 @@
static int pty_chars_in_buffer(struct tty_struct *tty)
{
struct tty_struct *to = tty->link;
+ ssize_t (*chars_in_buffer)(struct tty_struct *);
int count;
- if (!to || !to->ldisc.chars_in_buffer)
+ /* We should get the line discipline lock for "tty->link" */
+ if (!to || !(chars_in_buffer = to->ldisc.chars_in_buffer))
return 0;
/* The ldisc must report 0 if no characters available to be read */
- count = to->ldisc.chars_in_buffer(to);
+ count = chars_in_buffer(to);
if (tty->driver->subtype == PTY_TYPE_SLAVE) return count;
diff -urN linux/drivers/ide/ide-disk.c linux/drivers/ide/ide-disk.c
--- linux/drivers/ide/ide-disk.c 2005/02/13 20:16:22 1.78
+++ linux/drivers/ide/ide-disk.c 2005/03/02 19:58:01 1.79
@@ -119,9 +119,8 @@
/*
* __ide_do_rw_disk() issues READ and WRITE commands to a disk,
* using LBA if supported, or CHS otherwise, to address sectors.
- * It also takes care of issuing special DRIVE_CMDs.
*/
-ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq,
sector_t block)
+static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request
*rq, sector_t block)
{
ide_hwif_t *hwif = HWIF(drive);
unsigned int dma = drive->using_dma;
@@ -256,7 +255,6 @@
return pre_task_out_intr(drive, rq);
}
}
-EXPORT_SYMBOL_GPL(__ide_do_rw_disk);
/*
* 268435455 == 137439 MB or 28bit limit
@@ -281,9 +279,9 @@
block, rq->nr_sectors, (unsigned long)rq->buffer);
if (hwif->rw_disk)
- return hwif->rw_disk(drive, rq, block);
- else
- return __ide_do_rw_disk(drive, rq, block);
+ hwif->rw_disk(drive, rq);
+
+ return __ide_do_rw_disk(drive, rq, block);
}
/*
diff -urN linux/drivers/ide/ide-io.c linux/drivers/ide/ide-io.c
--- linux/drivers/ide/ide-io.c 2005/02/28 15:45:14 1.31
+++ linux/drivers/ide/ide-io.c 2005/03/02 19:58:01 1.32
@@ -1163,14 +1163,14 @@
* happens anyway when any interrupt comes in, IDE or otherwise
* -- the kernel masks the IRQ while it is being handled.
*/
- if (hwif->irq != masked_irq)
+ if (masked_irq != IDE_NO_IRQ && hwif->irq != masked_irq)
disable_irq_nosync(hwif->irq);
spin_unlock(&ide_lock);
local_irq_enable();
/* allow other IRQs while we start this request */
startstop = start_request(drive, rq);
spin_lock_irq(&ide_lock);
- if (hwif->irq != masked_irq)
+ if (masked_irq != IDE_NO_IRQ && hwif->irq != masked_irq)
enable_irq(hwif->irq);
if (startstop == ide_stopped)
hwgroup->busy = 0;
diff -urN linux/drivers/ide/pci/hpt366.c linux/drivers/ide/pci/hpt366.c
--- linux/drivers/ide/pci/hpt366.c 2005/02/13 20:16:23 1.30
+++ linux/drivers/ide/pci/hpt366.c 2005/03/02 19:58:01 1.31
@@ -1018,32 +1018,25 @@
}
/**
- * hpt372n_rw_disk - wrapper for I/O
+ * hpt372n_rw_disk - prepare for I/O
* @drive: drive for command
* @rq: block request structure
- * @block: block number
- *
- * This is called when a disk I/O is issued to the 372N instead
- * of the default functionality. We need it because of the clock
- * switching
*
+ * This is called when a disk I/O is issued to the 372N.
+ * We need it because of the clock switching.
*/
-
-static ide_startstop_t hpt372n_rw_disk(ide_drive_t *drive, struct request *rq,
sector_t block)
+
+static void hpt372n_rw_disk(ide_drive_t *drive, struct request *rq)
{
+ ide_hwif_t *hwif = drive->hwif;
int wantclock;
-
- if(rq_data_dir(rq) == READ)
- wantclock = 0x21;
- else
- wantclock = 0x23;
-
- if(HWIF(drive)->config_data != wantclock)
- {
+
+ wantclock = rq_data_dir(rq) ? 0x23 : 0x21;
+
+ if (hwif->config_data != wantclock) {
hpt372n_set_clock(drive, wantclock);
- HWIF(drive)->config_data = wantclock;
+ hwif->config_data = wantclock;
}
- return __ide_do_rw_disk(drive, rq, block);
}
/*
diff -urN linux/drivers/input/serio/i8042-x86ia64io.h
linux/drivers/input/serio/i8042-x86ia64io.h
--- linux/drivers/input/serio/i8042-x86ia64io.h 2005/01/13 14:06:03 1.1
+++ linux/drivers/input/serio/i8042-x86ia64io.h 2005/03/02 19:58:01 1.2
@@ -224,7 +224,7 @@
static struct acpi_driver i8042_acpi_aux_driver = {
.name = "i8042",
- .ids = "PNP0F13,SYN0801",
+ .ids = "PNP0F03,PNP0F0B,PNP0F0E,PNP0F12,PNP0F13,SYN0801",
.ops = {
.add = i8042_acpi_aux_add,
},
diff -urN linux/drivers/isdn/hisax/icc.c linux/drivers/isdn/hisax/icc.c
--- linux/drivers/isdn/hisax/icc.c 2004/03/11 16:46:49 1.13
+++ linux/drivers/isdn/hisax/icc.c 2005/03/02 19:58:01 1.14
@@ -27,7 +27,7 @@
static char *ICCVer[] __initdata =
{"2070 A1/A3", "2070 B1", "2070 B2/B3", "2070 V2.4"};
-void
+void __init
ICCVersion(struct IsdnCardState *cs, char *s)
{
int val;
diff -urN linux/drivers/isdn/hisax/icc.h linux/drivers/isdn/hisax/icc.h
--- linux/drivers/isdn/hisax/icc.h 2004/03/11 16:46:49 1.7
+++ linux/drivers/isdn/hisax/icc.h 2005/03/02 19:58:01 1.8
@@ -65,7 +65,7 @@
#define ICC_IND_AIL 0xE
#define ICC_IND_DC 0xF
-extern void ICCVersion(struct IsdnCardState *cs, char *s);
+extern void __init ICCVersion(struct IsdnCardState *cs, char *s);
extern void initicc(struct IsdnCardState *cs);
extern void icc_interrupt(struct IsdnCardState *cs, u_char val);
extern void clear_pending_icc_ints(struct IsdnCardState *cs);
diff -urN linux/drivers/net/hp100.c linux/drivers/net/hp100.c
--- linux/drivers/net/hp100.c 2005/01/13 14:06:10 1.44
+++ linux/drivers/net/hp100.c 2005/03/02 19:58:01 1.45
@@ -306,7 +306,7 @@
* Read board id and convert to string.
* Effectively same code as decode_eisa_sig
*/
-static __init const char *hp100_read_id(int ioaddr)
+static __devinit const char *hp100_read_id(int ioaddr)
{
int i;
static char str[HP100_SIG_LEN];
@@ -429,8 +429,8 @@
}
#endif
-static int __init hp100_probe1(struct net_device *dev, int ioaddr,
- u_char bus, struct pci_dev *pci_dev)
+static int __devinit hp100_probe1(struct net_device *dev, int ioaddr,
+ u_char bus, struct pci_dev *pci_dev)
{
int i;
int err = -ENODEV;
diff -urN linux/drivers/net/rrunner.c linux/drivers/net/rrunner.c
--- linux/drivers/net/rrunner.c 2004/10/25 20:44:28 1.38
+++ linux/drivers/net/rrunner.c 2005/03/02 19:58:01 1.39
@@ -62,7 +62,7 @@
MODULE_DESCRIPTION("Essential RoadRunner HIPPI driver");
MODULE_LICENSE("GPL");
-static char version[] __initdata = "rrunner.c: v0.50 11/11/2002 Jes Sorensen
(jes@wildopensource.com)\n";
+static char version[] __devinitdata = "rrunner.c: v0.50 11/11/2002 Jes
Sorensen (jes@wildopensource.com)\n";
/*
* Implementation notes:
diff -urN linux/drivers/net/wireless/prism54/islpci_hotplug.c
linux/drivers/net/wireless/prism54/islpci_hotplug.c
--- linux/drivers/net/wireless/prism54/islpci_hotplug.c 2005/01/13 14:06:17
1.8
+++ linux/drivers/net/wireless/prism54/islpci_hotplug.c 2005/03/02 19:58:01
1.9
@@ -163,7 +163,7 @@
if (rvalue || !mem_addr) {
printk(KERN_ERR "%s: PCI device memory region not configured;
fix your BIOS or CardBus bridge/drivers\n",
DRV_NAME);
- goto do_pci_disable_device;
+ goto do_pci_release_regions;
}
/* enable PCI bus-mastering */
diff -urN linux/drivers/parport/parport_pc.c linux/drivers/parport/parport_pc.c
--- linux/drivers/parport/parport_pc.c 2005/01/25 04:28:38 1.72
+++ linux/drivers/parport/parport_pc.c 2005/03/02 19:58:01 1.73
@@ -2488,7 +2488,7 @@
/* VIA 8231 support by Pavel Fedin <sonic_amiga@rambler.ru>
based on VIA 686a support code by Jeff Garzik <jgarzik@pobox.com> */
-static int __initdata parport_init_mode = 0;
+static int __devinitdata parport_init_mode = 0;
/* Data for two known VIA chips */
static struct parport_pc_via_data via_686a_data __devinitdata = {
diff -urN linux/drivers/scsi/dc395x.c linux/drivers/scsi/dc395x.c
--- linux/drivers/scsi/dc395x.c 2004/12/04 18:16:06 1.15
+++ linux/drivers/scsi/dc395x.c 2005/03/02 19:58:01 1.16
@@ -488,7 +488,7 @@
int def; /* default value */
int safe; /* safe value */
};
-static struct ParameterData __initdata cfg_data[] = {
+static struct ParameterData __devinitdata cfg_data[] = {
{ /* adapter id */
CFG_PARAM_UNSET,
0,
@@ -573,7 +573,7 @@
* set_safe_settings - if the use_safe_settings option is set then
* set all values to the safe and slow values.
**/
-static void __init set_safe_settings(void)
+static void __devinit set_safe_settings(void)
{
if (use_safe_settings)
{
@@ -592,7 +592,7 @@
* fix_settings - reset any boot parameters which are out of range
* back to the default values.
**/
-static void __init fix_settings(void)
+static void __devinit fix_settings(void)
{
int i;
@@ -619,7 +619,7 @@
* Mapping from the eeprom delay index value (index into this array)
* to the the number of actual seconds that the delay should be for.
*/
-static char __initdata eeprom_index_to_delay_map[] =
+static char __devinitdata eeprom_index_to_delay_map[] =
{ 1, 3, 5, 10, 16, 30, 60, 120 };
@@ -629,7 +629,7 @@
*
* @eeprom: The eeprom structure in which we find the delay index to map.
**/
-static void __init eeprom_index_to_delay(struct NvRamType *eeprom)
+static void __devinit eeprom_index_to_delay(struct NvRamType *eeprom)
{
eeprom->delay_time = eeprom_index_to_delay_map[eeprom->delay_time];
}
@@ -642,7 +642,7 @@
*
* @delay: The delay, in seconds, to find the eeprom index for.
**/
-static int __init delay_to_eeprom_index(int delay)
+static int __devinit delay_to_eeprom_index(int delay)
{
u8 idx = 0;
while (idx < 7 && eeprom_index_to_delay_map[idx] < delay)
@@ -658,7 +658,7 @@
*
* @eeprom: The eeprom data to override with command line options.
**/
-static void __init eeprom_override(struct NvRamType *eeprom)
+static void __devinit eeprom_override(struct NvRamType *eeprom)
{
u8 id;
@@ -3931,7 +3931,7 @@
*
* @io_port: base I/O address
**/
-static void __init trms1040_wait_30us(unsigned long io_port)
+static void __devinit trms1040_wait_30us(unsigned long io_port)
{
/* ScsiPortStallExecution(30); wait 30 us */
outb(5, io_port + TRM_S1040_GEN_TIMER);
@@ -3948,7 +3948,7 @@
* @cmd: SB + op code (command) to send
* @addr: address to send
**/
-static void __init trms1040_write_cmd(unsigned long io_port, u8 cmd, u8 addr)
+static void __devinit trms1040_write_cmd(unsigned long io_port, u8 cmd, u8
addr)
{
int i;
u8 send_data;
@@ -3993,7 +3993,7 @@
* @addr: offset into EEPROM
* @byte: bytes to write
**/
-static void __init trms1040_set_data(unsigned long io_port, u8 addr, u8 byte)
+static void __devinit trms1040_set_data(unsigned long io_port, u8 addr, u8
byte)
{
int i;
u8 send_data;
@@ -4047,7 +4047,7 @@
* @eeprom: the data to write
* @io_port: the base io port
**/
-static void __init trms1040_write_all(struct NvRamType *eeprom, unsigned long
io_port)
+static void __devinit trms1040_write_all(struct NvRamType *eeprom, unsigned
long io_port)
{
u8 *b_eeprom = (u8 *)eeprom;
u8 addr;
@@ -4087,7 +4087,7 @@
*
* Returns the the byte read.
**/
-static u8 __init trms1040_get_data(unsigned long io_port, u8 addr)
+static u8 __devinit trms1040_get_data(unsigned long io_port, u8 addr)
{
int i;
u8 read_byte;
@@ -4125,7 +4125,7 @@
* @eeprom: where to store the data
* @io_port: the base io port
**/
-static void __init trms1040_read_all(struct NvRamType *eeprom, unsigned long
io_port)
+static void __devinit trms1040_read_all(struct NvRamType *eeprom, unsigned
long io_port)
{
u8 *b_eeprom = (u8 *)eeprom;
u8 addr;
@@ -4155,7 +4155,7 @@
* @eeprom: caller allocated strcuture to read the eeprom data into
* @io_port: io port to read from
**/
-static void __init check_eeprom(struct NvRamType *eeprom, unsigned long
io_port)
+static void __devinit check_eeprom(struct NvRamType *eeprom, unsigned long
io_port)
{
u16 *w_eeprom = (u16 *)eeprom;
u16 w_addr;
@@ -4225,7 +4225,7 @@
*
* @eeprom: The eeprom data strucutre to show details for.
**/
-static void __init print_eeprom_settings(struct NvRamType *eeprom)
+static void __devinit print_eeprom_settings(struct NvRamType *eeprom)
{
dprintkl(KERN_INFO, "Used settings: AdapterID=%02i,
Speed=%i(%02i.%01iMHz), dev_mode=0x%02x\n",
eeprom->scsi_id,
@@ -4254,7 +4254,7 @@
/*
* Allocate SG tables; as we have to pci_map them, an SG list (struct SGentry*)
* should never cross a page boundary */
-static int __init adapter_sg_tables_alloc(struct AdapterCtlBlk *acb)
+static int __devinit adapter_sg_tables_alloc(struct AdapterCtlBlk *acb)
{
const unsigned mem_needed = (DC395x_MAX_SRB_CNT+1)
*SEGMENTX_LEN;
@@ -4300,7 +4300,7 @@
*
* @acb: The adapter to print the information for.
**/
-static void __init adapter_print_config(struct AdapterCtlBlk *acb)
+static void __devinit adapter_print_config(struct AdapterCtlBlk *acb)
{
u8 bval;
@@ -4344,7 +4344,7 @@
*
* @acb: The adapter to initialize.
**/
-static void __init adapter_init_params(struct AdapterCtlBlk *acb)
+static void __devinit adapter_init_params(struct AdapterCtlBlk *acb)
{
struct NvRamType *eeprom = &acb->eeprom;
int i;
@@ -4406,7 +4406,7 @@
*
* @host: The scsi host instance to fill in the values for.
**/
-static void __init adapter_init_scsi_host(struct Scsi_Host *host)
+static void __devinit adapter_init_scsi_host(struct Scsi_Host *host)
{
struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata;
struct NvRamType *eeprom = &acb->eeprom;
@@ -4447,7 +4447,7 @@
*
* @acb: The adapter which we are to init.
**/
-static void __init adapter_init_chip(struct AdapterCtlBlk *acb)
+static void __devinit adapter_init_chip(struct AdapterCtlBlk *acb)
{
struct NvRamType *eeprom = &acb->eeprom;
@@ -4500,7 +4500,7 @@
* Returns 0 if the initialization succeeds, any other value on
* failure.
**/
-static int __init adapter_init(struct AdapterCtlBlk *acb,
+static int __devinit adapter_init(struct AdapterCtlBlk *acb,
unsigned long io_port, u32 io_port_len, unsigned int irq)
{
if (!request_region(io_port, io_port_len, DC395X_NAME)) {
diff -urN linux/drivers/scsi/scsi_devinfo.c linux/drivers/scsi/scsi_devinfo.c
--- linux/drivers/scsi/scsi_devinfo.c 2004/12/27 02:15:59 1.14
+++ linux/drivers/scsi/scsi_devinfo.c 2005/03/02 19:58:02 1.15
@@ -28,7 +28,7 @@
static const char spaces[] = " "; /* 16 of them */
static unsigned scsi_default_dev_flags;
static LIST_HEAD(scsi_dev_info_list);
-static __initdata char scsi_dev_flags[256];
+static char scsi_dev_flags[256];
/*
* scsi_static_device_list: deprecated list of devices that require
diff -urN linux/drivers/serial/8250.c linux/drivers/serial/8250.c
--- linux/drivers/serial/8250.c 2005/02/13 20:16:26 1.31
+++ linux/drivers/serial/8250.c 2005/03/02 19:58:02 1.32
@@ -450,9 +450,11 @@
*/
static int size_fifo(struct uart_8250_port *up)
{
- unsigned char old_fcr, old_mcr, old_dll, old_dlm;
+ unsigned char old_fcr, old_mcr, old_dll, old_dlm, old_lcr;
int count;
+ old_lcr = serial_inp(up, UART_LCR);
+ serial_outp(up, UART_LCR, 0);
old_fcr = serial_inp(up, UART_FCR);
old_mcr = serial_inp(up, UART_MCR);
serial_outp(up, UART_FCR, UART_FCR_ENABLE_FIFO |
@@ -475,11 +477,40 @@
serial_outp(up, UART_LCR, UART_LCR_DLAB);
serial_outp(up, UART_DLL, old_dll);
serial_outp(up, UART_DLM, old_dlm);
+ serial_outp(up, UART_LCR, old_lcr);
return count;
}
/*
+ * Read UART ID using the divisor method - set DLL and DLM to zero
+ * and the revision will be in DLL and device type in DLM. We
+ * preserve the device state across this.
+ */
+static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
+{
+ unsigned char old_dll, old_dlm, old_lcr;
+ unsigned int id;
+
+ old_lcr = serial_inp(p, UART_LCR);
+ serial_outp(p, UART_LCR, UART_LCR_DLAB);
+
+ old_dll = serial_inp(p, UART_DLL);
+ old_dlm = serial_inp(p, UART_DLM);
+
+ serial_outp(p, UART_DLL, 0);
+ serial_outp(p, UART_DLM, 0);
+
+ id = serial_inp(p, UART_DLL) | serial_inp(p, UART_DLM) << 8;
+
+ serial_outp(p, UART_DLL, old_dll);
+ serial_outp(p, UART_DLM, old_dlm);
+ serial_outp(p, UART_LCR, old_lcr);
+
+ return id;
+}
+
+/*
* This is a helper routine to autodetect StarTech/Exar/Oxsemi UART's.
* When this function is called we know it is at least a StarTech
* 16650 V2, but it might be one of several StarTech UARTs, or one of
@@ -491,7 +522,7 @@
*/
static void autoconfig_has_efr(struct uart_8250_port *up)
{
- unsigned char id1, id2, id3, rev, saved_dll, saved_dlm;
+ unsigned int id1, id2, id3, rev;
/*
* Everything with an EFR has SLEEP
@@ -541,21 +572,13 @@
* 0x12 - XR16C2850.
* 0x14 - XR16C854.
*/
- serial_outp(up, UART_LCR, UART_LCR_DLAB);
- saved_dll = serial_inp(up, UART_DLL);
- saved_dlm = serial_inp(up, UART_DLM);
- serial_outp(up, UART_DLL, 0);
- serial_outp(up, UART_DLM, 0);
- id2 = serial_inp(up, UART_DLL);
- id1 = serial_inp(up, UART_DLM);
- serial_outp(up, UART_DLL, saved_dll);
- serial_outp(up, UART_DLM, saved_dlm);
-
- DEBUG_AUTOCONF("850id=%02x:%02x ", id1, id2);
-
- if (id1 == 0x10 || id1 == 0x12 || id1 == 0x14) {
- if (id1 == 0x10)
- up->rev = id2;
+ id1 = autoconfig_read_divisor_id(up);
+ DEBUG_AUTOCONF("850id=%04x ", id1);
+
+ id2 = id1 >> 8;
+ if (id2 == 0x10 || id2 == 0x12 || id2 == 0x14) {
+ if (id2 == 0x10)
+ up->rev = id1 & 255;
up->port.type = PORT_16850;
return;
}
@@ -597,6 +620,19 @@
up->port.type = PORT_16450;
}
+static int broken_efr(struct uart_8250_port *up)
+{
+ /*
+ * Exar ST16C2550 "A2" devices incorrectly detect as
+ * having an EFR, and report an ID of 0x0201. See
+ * http://www.exar.com/info.php?pdf=dan180_oct2004.pdf
+ */
+ if (autoconfig_read_divisor_id(up) == 0x0201 && size_fifo(up) == 16)
+ return 1;
+
+ return 0;
+}
+
/*
* We know that the chip has FIFOs. Does it have an EFR? The
* EFR is located in the same register position as the IIR and
@@ -633,7 +669,7 @@
* (other ST16C650V2 UARTs, TI16C752A, etc)
*/
serial_outp(up, UART_LCR, 0xBF);
- if (serial_in(up, UART_EFR) == 0) {
+ if (serial_in(up, UART_EFR) == 0 && !broken_efr(up)) {
DEBUG_AUTOCONF("EFRv2 ");
autoconfig_has_efr(up);
return;
diff -urN linux/drivers/serial/8250_pci.c linux/drivers/serial/8250_pci.c
--- linux/drivers/serial/8250_pci.c 2004/12/04 18:16:07 1.28
+++ linux/drivers/serial/8250_pci.c 2005/03/02 19:58:02 1.29
@@ -2212,6 +2212,13 @@
0, pbn_exar_XR17C158 },
/*
+ * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke)
+ */
+ { PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ pbn_b0_1_115200 },
+
+ /*
* These entries match devices with class COMMUNICATION_SERIAL,
* COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
*/
@@ -2241,7 +2248,7 @@
static int __init serial8250_pci_init(void)
{
- return pci_module_init(&serial_pci_driver);
+ return pci_register_driver(&serial_pci_driver);
}
static void __exit serial8250_pci_exit(void)
diff -urN linux/drivers/serial/Makefile linux/drivers/serial/Makefile
--- linux/drivers/serial/Makefile 2005/02/13 20:16:26 1.31
+++ linux/drivers/serial/Makefile 2005/03/02 19:58:02 1.32
@@ -6,9 +6,9 @@
serial-8250-y :=
serial-8250-$(CONFIG_SERIAL_8250_ACPI) += 8250_acpi.o
+serial-8250-$(CONFIG_PNP) += 8250_pnp.o
serial-8250-$(CONFIG_GSC) += 8250_gsc.o
serial-8250-$(CONFIG_PCI) += 8250_pci.o
-serial-8250-$(CONFIG_PNP) += 8250_pnp.o
serial-8250-$(CONFIG_HP300) += 8250_hp300.o
obj-$(CONFIG_SERIAL_CORE) += serial_core.o
diff -urN linux/drivers/usb/class/cdc-acm.c linux/drivers/usb/class/cdc-acm.c
--- linux/drivers/usb/class/cdc-acm.c 2005/02/13 20:16:27 1.42
+++ linux/drivers/usb/class/cdc-acm.c 2005/03/02 19:58:02 1.43
@@ -278,15 +278,14 @@
- if (acm->used) {
+ if (acm->used++) {
goto done;
}
acm->ctrlurb->dev = acm->dev;
if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {
dbg("usb_submit_urb(ctrl irq) failed");
- rv = -EIO;
- goto err_out;
+ goto bail_out;
}
acm->readurb->dev = acm->dev;
@@ -303,7 +302,6 @@
tty->low_latency = 1;
done:
- acm->used++;
err_out:
up(&open_sem);
return rv;
@@ -312,6 +310,8 @@
usb_kill_urb(acm->readurb);
bail_out_and_unlink:
usb_kill_urb(acm->ctrlurb);
+bail_out:
+ acm->used--;
up(&open_sem);
return -EIO;
}
diff -urN linux/drivers/usb/core/devio.c linux/drivers/usb/core/devio.c
--- linux/drivers/usb/core/devio.c 2005/02/13 20:16:27 1.35
+++ linux/drivers/usb/core/devio.c 2005/03/02 19:58:02 1.36
@@ -841,7 +841,7 @@
if ((ret = checkintf(ps, ifnum)))
return ret;
}
- if ((uurb.endpoint & ~USB_ENDPOINT_DIR_MASK) != 0)
+ if ((uurb.endpoint & USB_ENDPOINT_DIR_MASK) != 0)
ep = ps->dev->ep_in [uurb.endpoint & USB_ENDPOINT_NUMBER_MASK];
else
ep = ps->dev->ep_out [uurb.endpoint & USB_ENDPOINT_NUMBER_MASK];
diff -urN linux/drivers/video/modedb.c linux/drivers/video/modedb.c
--- linux/drivers/video/modedb.c 2005/01/13 14:06:29 1.17
+++ linux/drivers/video/modedb.c 2005/03/02 19:58:02 1.18
@@ -37,7 +37,7 @@
#define DEFAULT_MODEDB_INDEX 0
-static const __init struct fb_videomode modedb[] = {
+static const struct fb_videomode modedb[] = {
{
/* 640x400 @ 70 Hz, 31.5 kHz hsync */
NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2,
diff -urN linux/drivers/video/aty/radeon_base.c
linux/drivers/video/aty/radeon_base.c
--- linux/drivers/video/aty/radeon_base.c 2005/02/28 15:45:17 1.16
+++ linux/drivers/video/aty/radeon_base.c 2005/03/02 19:58:02 1.17
@@ -2551,7 +2551,7 @@
MODULE_DESCRIPTION("framebuffer driver for ATI Radeon chipset");
MODULE_LICENSE("GPL");
module_param(noaccel, bool, 0);
-module_param(default_dynclk, int, -2);
+module_param(default_dynclk, int, 0);
MODULE_PARM_DESC(default_dynclk, "int: -2=enable on mobility only,-1=do not
change,0=off,1=on");
MODULE_PARM_DESC(noaccel, "bool: disable acceleration");
module_param(nomodeset, bool, 0);
diff -urN linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c
--- linux/fs/binfmt_elf.c 2005/02/28 15:45:17 1.106
+++ linux/fs/binfmt_elf.c 2005/03/02 19:58:02 1.107
@@ -803,13 +803,14 @@
nbyte = ELF_MIN_ALIGN - nbyte;
if (nbyte > elf_brk - elf_bss)
nbyte = elf_brk - elf_bss;
- /*
- * This bss-zeroing can fail if the ELF file
- * specifies odd protections. So we don't check
- * the return value
- */
- (void)clear_user((void __user *)elf_bss +
- load_bias, nbyte);
+ if (clear_user((void __user *)elf_bss +
+ load_bias, nbyte)) {
+ /*
+ * This bss-zeroing can fail if the ELF
+ * file specifies odd protections. So
+ * we don't check the return value
+ */
+ }
}
}
diff -urN linux/fs/pipe.c linux/fs/pipe.c
--- linux/fs/pipe.c 2005/02/07 02:54:54 1.63
+++ linux/fs/pipe.c 2005/03/02 19:58:02 1.64
@@ -235,6 +235,12 @@
down(PIPE_SEM(*inode));
info = inode->i_pipe;
+ if (!PIPE_READERS(*inode)) {
+ send_sig(SIGPIPE, current, 0);
+ ret = -EPIPE;
+ goto out;
+ }
+
/* We try to merge small writes */
if (info->nrbufs && total_len < PAGE_SIZE) {
int lastbuf = (info->curbuf + info->nrbufs - 1) &
(PIPE_BUFFERS-1);
@@ -398,13 +404,18 @@
/* Reading only -- no need for acquiring the semaphore. */
nrbufs = info->nrbufs;
- mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
- mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
+ mask = 0;
+ if (filp->f_mode & FMODE_READ) {
+ mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
+ if (!PIPE_WRITERS(*inode) && filp->f_version !=
PIPE_WCOUNTER(*inode))
+ mask |= POLLHUP;
+ }
- if (!PIPE_WRITERS(*inode) && filp->f_version != PIPE_WCOUNTER(*inode))
- mask |= POLLHUP;
- if (!PIPE_READERS(*inode))
- mask |= POLLERR;
+ if (filp->f_mode & FMODE_WRITE) {
+ mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
+ if (!PIPE_READERS(*inode))
+ mask |= POLLERR;
+ }
return mask;
}
diff -urN linux/fs/sysfs/file.c linux/fs/sysfs/file.c
--- linux/fs/sysfs/file.c 2004/11/15 11:49:36 1.13
+++ linux/fs/sysfs/file.c 2005/03/02 19:58:02 1.14
@@ -231,15 +231,16 @@
sysfs_write_file(struct file *file, const char __user *buf, size_t count,
loff_t *ppos)
{
struct sysfs_buffer * buffer = file->private_data;
+ ssize_t len;
down(&buffer->sem);
- count = fill_write_buffer(buffer,buf,count);
- if (count > 0)
- count = flush_write_buffer(file->f_dentry,buffer,count);
- if (count > 0)
- *ppos += count;
+ len = fill_write_buffer(buffer, buf, count);
+ if (len > 0)
+ len = flush_write_buffer(file->f_dentry, buffer, len);
+ if (len > 0)
+ *ppos += len;
up(&buffer->sem);
- return count;
+ return len;
}
static int check_perm(struct inode * inode, struct file * file)
diff -urN linux/include/linux/ide.h linux/include/linux/ide.h
--- linux/include/linux/ide.h 2005/02/13 20:16:31 1.99
+++ linux/include/linux/ide.h 2005/03/02 19:58:02 1.100
@@ -797,7 +797,7 @@
struct pci_dev *pci_dev; /* for pci chipsets */
struct ide_pci_device_s *cds; /* chipset device struct */
- ide_startstop_t (*rw_disk)(ide_drive_t *, struct request *, sector_t);
+ void (*rw_disk)(ide_drive_t *, struct request *);
#if 0
ide_hwif_ops_t *hwifops;
@@ -934,9 +934,9 @@
/* BOOL: protects all fields below */
volatile int busy;
/* BOOL: wake us up on timer expiry */
- int sleeping : 1;
+ unsigned int sleeping : 1;
/* BOOL: polling active & poll_timeout field valid */
- int polling : 1;
+ unsigned int polling : 1;
/* current drive */
ide_drive_t *drive;
/* ptr to current hwif in linked-list */
@@ -1318,7 +1318,6 @@
extern int taskfile_lib_get_identify(ide_drive_t *drive, u8 *);
extern int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout);
-ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
sector_t block);
/*
* ide_stall_queue() can be used by a drive to give excess bandwidth back
diff -urN linux/include/linux/pci_ids.h linux/include/linux/pci_ids.h
--- linux/include/linux/pci_ids.h 2005/01/25 04:28:56 1.137
+++ linux/include/linux/pci_ids.h 2005/03/02 19:58:02 1.138
@@ -1971,6 +1971,9 @@
#define PCI_DEVICE_ID_BCM4401 0x4401
#define PCI_DEVICE_ID_BCM4401B0 0x4402
+#define PCI_VENDOR_ID_TOPIC 0x151f
+#define PCI_DEVICE_ID_TOPIC_TP560 0x0000
+
#define PCI_VENDOR_ID_ENE 0x1524
#define PCI_DEVICE_ID_ENE_1211 0x1211
#define PCI_DEVICE_ID_ENE_1225 0x1225
diff -urN linux/include/linux/sysctl.h linux/include/linux/sysctl.h
--- linux/include/linux/sysctl.h 2005/02/28 15:45:18 1.93
+++ linux/include/linux/sysctl.h 2005/03/02 19:58:02 1.94
@@ -797,6 +797,8 @@
void __user *, size_t *, loff_t *);
extern int proc_dointvec_userhz_jiffies(ctl_table *, int, struct file *,
void __user *, size_t *, loff_t *);
+extern int proc_dointvec_ms_jiffies(ctl_table *, int, struct file *,
+ void __user *, size_t *, loff_t *);
extern int proc_doulongvec_minmax(ctl_table *, int, struct file *,
void __user *, size_t *, loff_t *);
extern int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int,
@@ -814,6 +816,7 @@
extern ctl_handler sysctl_string;
extern ctl_handler sysctl_intvec;
extern ctl_handler sysctl_jiffies;
+extern ctl_handler sysctl_ms_jiffies;
/*
diff -urN linux/include/net/ipv6.h linux/include/net/ipv6.h
--- linux/include/net/ipv6.h 2005/01/25 04:28:58 1.37
+++ linux/include/net/ipv6.h 2005/03/02 19:58:03 1.38
@@ -149,6 +149,8 @@
int snmp6_register_dev(struct inet6_dev *idev);
int snmp6_unregister_dev(struct inet6_dev *idev);
+int snmp6_alloc_dev(struct inet6_dev *idev);
+int snmp6_free_dev(struct inet6_dev *idev);
int snmp6_mib_init(void *ptr[2], size_t mibsize, size_t mibalign);
void snmp6_mib_free(void *ptr[2]);
diff -urN linux/kernel/audit.c linux/kernel/audit.c
--- linux/kernel/audit.c 2005/02/07 02:55:03 1.6
+++ linux/kernel/audit.c 2005/03/02 19:58:03 1.7
@@ -360,7 +360,7 @@
status_set.backlog_limit = audit_backlog_limit;
status_set.lost = atomic_read(&audit_lost);
status_set.backlog = atomic_read(&audit_backlog);
- audit_send_reply(pid, seq, AUDIT_GET, 0, 0,
+ audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_GET, 0, 0,
&status_set, sizeof(status_set));
break;
case AUDIT_SET:
@@ -407,8 +407,8 @@
/* fallthrough */
case AUDIT_LIST:
#ifdef CONFIG_AUDITSYSCALL
- err = audit_receive_filter(nlh->nlmsg_type, pid, uid, seq,
- data);
+ err = audit_receive_filter(nlh->nlmsg_type, NETLINK_CB(skb).pid,
+ uid, seq, data);
#else
err = -EOPNOTSUPP;
#endif
diff -urN linux/kernel/auditsc.c linux/kernel/auditsc.c
--- linux/kernel/auditsc.c 2005/02/07 02:55:03 1.6
+++ linux/kernel/auditsc.c 2005/03/02 19:58:03 1.7
@@ -358,7 +358,7 @@
case AUDIT_INODE:
if (ctx) {
for (j = 0; j < ctx->name_count; j++) {
- if (MINOR(ctx->names[j].ino)==value) {
+ if (ctx->names[j].ino == value) {
++result;
break;
}
diff -urN linux/kernel/sysctl.c linux/kernel/sysctl.c
--- linux/kernel/sysctl.c 2005/02/07 02:55:03 1.94
+++ linux/kernel/sysctl.c 2005/03/02 19:58:03 1.95
@@ -1902,6 +1902,27 @@
return 0;
}
+static int do_proc_dointvec_ms_jiffies_conv(int *negp, unsigned long *lvalp,
+ int *valp,
+ int write, void *data)
+{
+ if (write) {
+ *valp = msecs_to_jiffies(*negp ? -*lvalp : *lvalp);
+ } else {
+ int val = *valp;
+ unsigned long lval;
+ if (val < 0) {
+ *negp = -1;
+ lval = (unsigned long)-val;
+ } else {
+ *negp = 0;
+ lval = (unsigned long)val;
+ }
+ *lvalp = jiffies_to_msecs(lval);
+ }
+ return 0;
+}
+
/**
* proc_dointvec_jiffies - read a vector of integers as seconds
* @table: the sysctl table
@@ -1946,6 +1967,28 @@
do_proc_dointvec_userhz_jiffies_conv,NULL);
}
+/**
+ * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds
+ * @table: the sysctl table
+ * @write: %TRUE if this is a write to the sysctl file
+ * @filp: the file structure
+ * @buffer: the user buffer
+ * @lenp: the size of the user buffer
+ *
+ * Reads/writes up to table->maxlen/sizeof(unsigned int) integer
+ * values from/to the user buffer, treated as an ASCII string.
+ * The values read are assumed to be in 1/1000 seconds, and
+ * are converted into jiffies.
+ *
+ * Returns 0 on success.
+ */
+int proc_dointvec_ms_jiffies(ctl_table *table, int write, struct file *filp,
+ void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+ return do_proc_dointvec(table, write, filp, buffer, lenp, ppos,
+ do_proc_dointvec_ms_jiffies_conv, NULL);
+}
+
#else /* CONFIG_PROC_FS */
int proc_dostring(ctl_table *table, int write, struct file *filp,
@@ -1990,6 +2033,12 @@
return -ENOSYS;
}
+int proc_dointvec_ms_jiffies(ctl_table *table, int write, struct file *filp,
+ void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+ return -ENOSYS;
+}
+
int proc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
@@ -2119,6 +2168,33 @@
return 1;
}
+/* Strategy function to convert jiffies to seconds */
+int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
+ void __user *oldval, size_t __user *oldlenp,
+ void __user *newval, size_t newlen, void **context)
+{
+ if (oldval) {
+ size_t olen;
+ if (oldlenp) {
+ if (get_user(olen, oldlenp))
+ return -EFAULT;
+ if (olen!=sizeof(int))
+ return -EINVAL;
+ }
+ if (put_user(jiffies_to_msecs(*(int *)(table->data)), (int
__user *)oldval) ||
+ (oldlenp && put_user(sizeof(int),oldlenp)))
+ return -EFAULT;
+ }
+ if (newval && newlen) {
+ int new;
+ if (newlen != sizeof(int))
+ return -EINVAL;
+ if (get_user(new, (int __user *)newval))
+ return -EFAULT;
+ *(int *)(table->data) = msecs_to_jiffies(new);
+ }
+ return 1;
+}
#else /* CONFIG_SYSCTL */
@@ -2149,6 +2225,13 @@
return -ENOSYS;
}
+int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
+ void __user *oldval, size_t __user *oldlenp,
+ void __user *newval, size_t newlen, void **context)
+{
+ return -ENOSYS;
+}
+
int proc_dostring(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
@@ -2185,6 +2268,12 @@
return -ENOSYS;
}
+int proc_dointvec_ms_jiffies(ctl_table *table, int write, struct file *filp,
+ void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+ return -ENOSYS;
+}
+
int proc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
@@ -2219,11 +2308,13 @@
EXPORT_SYMBOL(proc_dointvec_jiffies);
EXPORT_SYMBOL(proc_dointvec_minmax);
EXPORT_SYMBOL(proc_dointvec_userhz_jiffies);
+EXPORT_SYMBOL(proc_dointvec_ms_jiffies);
EXPORT_SYMBOL(proc_dostring);
EXPORT_SYMBOL(proc_doulongvec_minmax);
EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax);
EXPORT_SYMBOL(register_sysctl_table);
EXPORT_SYMBOL(sysctl_intvec);
EXPORT_SYMBOL(sysctl_jiffies);
+EXPORT_SYMBOL(sysctl_ms_jiffies);
EXPORT_SYMBOL(sysctl_string);
EXPORT_SYMBOL(unregister_sysctl_table);
diff -urN linux/mm/highmem.c linux/mm/highmem.c
--- linux/mm/highmem.c 2005/01/13 14:07:01 1.54
+++ linux/mm/highmem.c 2005/03/02 19:58:03 1.55
@@ -425,7 +425,7 @@
* at least one page was bounced, fill in possible non-highmem
* pages
*/
- bio_for_each_segment(from, *bio_orig, i) {
+ __bio_for_each_segment(from, *bio_orig, i, 0) {
to = bio_iovec_idx(bio, i);
if (!to->bv_page) {
to->bv_page = from->bv_page;
diff -urN linux/net/core/pktgen.c linux/net/core/pktgen.c
--- linux/net/core/pktgen.c 2005/02/28 15:45:19 1.20
+++ linux/net/core/pktgen.c 2005/03/02 19:58:03 1.21
@@ -104,6 +104,8 @@
* Corrections from Nikolai Malykh (nmalykh@bilim.com)
* Removed unused flags F_SET_SRCMAC & F_SET_SRCIP 041230
*
+ * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan
<nacc@us.ibm.com>
+ * 050103
*/
#include <linux/sys.h>
#include <linux/types.h>
@@ -135,6 +137,7 @@
#include <linux/ipv6.h>
#include <linux/udp.h>
#include <linux/proc_fs.h>
+#include <linux/wait.h>
#include <net/checksum.h>
#include <net/ipv6.h>
#include <net/addrconf.h>
@@ -148,7 +151,7 @@
#include <asm/timex.h>
-#define VERSION "pktgen v2.56: Packet Generator for packet performance
testing.\n"
+#define VERSION "pktgen v2.58: Packet Generator for packet performance
testing.\n"
/* #define PG_DEBUG(a) a */
#define PG_DEBUG(a)
@@ -808,6 +811,7 @@
struct pktgen_dev *pkt_dev = (struct pktgen_dev*)(data);
char* pg_result = NULL;
int tmp = 0;
+ char buf[128];
pg_result = &(pkt_dev->result[0]);
@@ -1068,7 +1072,6 @@
return count;
}
if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) {
- char buf[IP_NAME_SZ];
len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1);
if (len < 0) { return len; }
@@ -1088,7 +1091,6 @@
return count;
}
if (!strcmp(name, "dst_max")) {
- char buf[IP_NAME_SZ];
len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1);
if (len < 0) { return len; }
@@ -1109,9 +1111,7 @@
return count;
}
if (!strcmp(name, "dst6")) {
- char buf[128];
-
- len = strn_len(&user_buffer[i], 128 - 1);
+ len = strn_len(&user_buffer[i], sizeof(buf) - 1);
if (len < 0) return len;
pkt_dev->flags |= F_IPV6;
@@ -1133,9 +1133,7 @@
return count;
}
if (!strcmp(name, "dst6_min")) {
- char buf[128];
-
- len = strn_len(&user_buffer[i], 128 - 1);
+ len = strn_len(&user_buffer[i], sizeof(buf) - 1);
if (len < 0) return len;
pkt_dev->flags |= F_IPV6;
@@ -1156,9 +1154,7 @@
return count;
}
if (!strcmp(name, "dst6_max")) {
- char buf[128];
-
- len = strn_len(&user_buffer[i], 128 - 1);
+ len = strn_len(&user_buffer[i], sizeof(buf) - 1);
if (len < 0) return len;
pkt_dev->flags |= F_IPV6;
@@ -1178,9 +1174,7 @@
return count;
}
if (!strcmp(name, "src6")) {
- char buf[128];
-
- len = strn_len(&user_buffer[i], 128 - 1);
+ len = strn_len(&user_buffer[i], sizeof(buf) - 1);
if (len < 0) return len;
pkt_dev->flags |= F_IPV6;
@@ -1202,7 +1196,6 @@
return count;
}
if (!strcmp(name, "src_min")) {
- char buf[IP_NAME_SZ];
len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1);
if (len < 0) { return len; }
if (copy_from_user(buf, &user_buffer[i], len))
@@ -1221,7 +1214,6 @@
return count;
}
if (!strcmp(name, "src_max")) {
- char buf[IP_NAME_SZ];
len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1);
if (len < 0) { return len; }
if (copy_from_user(buf, &user_buffer[i], len))
@@ -2402,16 +2394,14 @@
static int pktgen_wait_thread_run(struct pktgen_thread *t )
{
- wait_queue_head_t queue;
-
- init_waitqueue_head(&queue);
-
if_lock(t);
while(thread_is_running(t)) {
+
if_unlock(t);
-
- interruptible_sleep_on_timeout(&queue, HZ/10);
+
+ msleep_interruptible(100);
+
if (signal_pending(current))
goto signal;
if_lock(t);
@@ -2738,6 +2728,7 @@
static void pktgen_thread_worker(struct pktgen_thread *t)
{
+ DEFINE_WAIT(wait);
struct pktgen_dev *pkt_dev = NULL;
int cpu = t->cpu;
sigset_t tmpsig;
@@ -2805,9 +2796,11 @@
do_softirq();
tx_since_softirq = 0;
}
+ } else {
+ prepare_to_wait(&(t->queue), &wait, TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ/10);
+ finish_wait(&(t->queue), &wait);
}
- else
- interruptible_sleep_on_timeout(&(t->queue), HZ/10);
/*
* Back from sleep, either due to the timeout or signal.
@@ -3117,8 +3110,7 @@
struct pktgen_thread *t = pktgen_threads;
pktgen_threads->control |= (T_TERMINATE);
- while( t == pktgen_threads)
- interruptible_sleep_on_timeout(&queue, HZ);
+ wait_event_interruptible_timeout(queue, (t != pktgen_threads),
HZ);
}
/* Un-register us from receiving netdevice events */
diff -urN linux/net/ipv4/fib_hash.c linux/net/ipv4/fib_hash.c
--- linux/net/ipv4/fib_hash.c 2005/01/25 04:29:03 1.23
+++ linux/net/ipv4/fib_hash.c 2005/03/02 19:58:03 1.24
@@ -684,7 +684,7 @@
list_for_each_entry(fa, &f->fn_alias, fa_list) {
if (i < s_i)
- continue;
+ goto next;
if (fib_dump_info(skb, NETLINK_CB(cb->skb).pid,
cb->nlh->nlmsg_seq,
@@ -699,7 +699,7 @@
cb->args[3] = i;
return -1;
}
-
+ next:
i++;
}
}
diff -urN linux/net/ipv4/route.c linux/net/ipv4/route.c
--- linux/net/ipv4/route.c 2005/02/28 15:45:19 1.82
+++ linux/net/ipv4/route.c 2005/03/02 19:58:03 1.83
@@ -2545,10 +2545,10 @@
.ctl_name = NET_IPV4_ROUTE_GC_MIN_INTERVAL_MS,
.procname = "gc_min_interval_ms",
.data = &ip_rt_gc_min_interval,
- .maxlen = sizeof(unsigned long),
+ .maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = &proc_doulongvec_ms_jiffies_minmax,
- .strategy = &sysctl_jiffies,
+ .proc_handler = &proc_dointvec_ms_jiffies,
+ .strategy = &sysctl_ms_jiffies,
},
{
.ctl_name = NET_IPV4_ROUTE_GC_TIMEOUT,
diff -urN linux/net/ipv4/netfilter/ip_conntrack_standalone.c
linux/net/ipv4/netfilter/ip_conntrack_standalone.c
--- linux/net/ipv4/netfilter/ip_conntrack_standalone.c 2005/02/07 02:55:05
1.36
+++ linux/net/ipv4/netfilter/ip_conntrack_standalone.c 2005/03/02 19:58:03
1.37
@@ -384,10 +384,12 @@
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
+#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE)
/* Previously seen (loopback)? Ignore. Do this before
fragment check. */
if ((*pskb)->nfct)
return NF_ACCEPT;
+#endif
/* Gather fragments. */
if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
diff -urN linux/net/ipv4/netfilter/ipt_hashlimit.c
linux/net/ipv4/netfilter/ipt_hashlimit.c
--- linux/net/ipv4/netfilter/ipt_hashlimit.c 2005/02/13 20:16:33 1.4
+++ linux/net/ipv4/netfilter/ipt_hashlimit.c 2005/03/02 19:58:03 1.5
@@ -98,6 +98,7 @@
};
static DECLARE_RWLOCK(hashlimit_lock); /* protects htables list */
+static DECLARE_MUTEX(hlimit_mutex); /* additional checkentry protection */
static LIST_HEAD(hashlimit_htables);
static kmem_cache_t *hashlimit_cachep;
@@ -531,10 +532,19 @@
if (!r->cfg.expire)
return 0;
+ /* This is the best we've got: We cannot release and re-grab lock,
+ * since checkentry() is called before ip_tables.c grabs ipt_mutex.
+ * We also cannot grab the hashtable spinlock, since htable_create will
+ * call vmalloc, and that can sleep. And we cannot just re-search
+ * the list of htable's in htable_create(), since then we would
+ * create duplicate proc files. -HW */
+ down(&hlimit_mutex);
r->hinfo = htable_find_get(r->name);
if (!r->hinfo && (htable_create(r) != 0)) {
+ up(&hlimit_mutex);
return 0;
}
+ up(&hlimit_mutex);
/* Ugly hack: For SMP, we only want to use one set */
r->u.master = r;
diff -urN linux/net/ipv6/addrconf.c linux/net/ipv6/addrconf.c
--- linux/net/ipv6/addrconf.c 2005/01/25 04:29:05 1.73
+++ linux/net/ipv6/addrconf.c 2005/03/02 19:58:03 1.74
@@ -308,7 +308,7 @@
printk("Freeing alive inet6 device %p\n", idev);
return;
}
- snmp6_unregister_dev(idev);
+ snmp6_free_dev(idev);
kfree(idev);
}
@@ -339,6 +339,16 @@
/* We refer to the device */
dev_hold(dev);
+ if (snmp6_alloc_dev(ndev) < 0) {
+ ADBG((KERN_WARNING
+ "%s(): cannot allocate memory for statistics;
dev=%s.\n",
+ __FUNCTION__, dev->name));
+ neigh_parms_release(&nd_tbl, ndev->nd_parms);
+ ndev->dead = 1;
+ in6_dev_finish_destroy(ndev);
+ return NULL;
+ }
+
if (snmp6_register_dev(ndev) < 0) {
ADBG((KERN_WARNING
"%s(): cannot create /proc/net/dev_snmp6/%s\n",
@@ -2013,6 +2023,10 @@
dev->ip6_ptr = NULL;
idev->dead = 1;
write_unlock_bh(&addrconf_lock);
+
+ /* Step 1.5: remove snmp6 entry */
+ snmp6_unregister_dev(idev);
+
}
/* Step 2: clear hash table */
diff -urN linux/net/ipv6/af_inet6.c linux/net/ipv6/af_inet6.c
--- linux/net/ipv6/af_inet6.c 2005/01/25 04:29:05 1.69
+++ linux/net/ipv6/af_inet6.c 2005/03/02 19:58:03 1.70
@@ -652,8 +652,10 @@
{
if (ptr == NULL)
return;
- free_percpu(ptr[0]);
- free_percpu(ptr[1]);
+ if (ptr[0])
+ free_percpu(ptr[0]);
+ if (ptr[1])
+ free_percpu(ptr[1]);
ptr[0] = ptr[1] = NULL;
}
diff -urN linux/net/ipv6/proc.c linux/net/ipv6/proc.c
--- linux/net/ipv6/proc.c 2004/08/06 00:33:32 1.26
+++ linux/net/ipv6/proc.c 2005/03/02 19:58:03 1.27
@@ -201,33 +201,23 @@
int snmp6_register_dev(struct inet6_dev *idev)
{
- int err = -ENOMEM;
struct proc_dir_entry *p;
if (!idev || !idev->dev)
return -EINVAL;
- if (snmp6_mib_init((void **)idev->stats.icmpv6, sizeof(struct
icmpv6_mib),
- __alignof__(struct icmpv6_mib)) < 0)
- goto err_icmp;
+ if (!proc_net_devsnmp6)
+ return -ENOENT;
- if (!proc_net_devsnmp6) {
- err = -ENOENT;
- goto err_proc;
- }
p = create_proc_entry(idev->dev->name, S_IRUGO, proc_net_devsnmp6);
if (!p)
- goto err_proc;
+ return -ENOMEM;
+
p->data = idev;
p->proc_fops = &snmp6_seq_fops;
idev->stats.proc_dir_entry = p;
return 0;
-
-err_proc:
- snmp6_mib_free((void **)idev->stats.icmpv6);
-err_icmp:
- return err;
}
int snmp6_unregister_dev(struct inet6_dev *idev)
@@ -238,8 +228,6 @@
return -EINVAL;
remove_proc_entry(idev->stats.proc_dir_entry->name,
proc_net_devsnmp6);
- snmp6_mib_free((void **)idev->stats.icmpv6);
-
return 0;
}
@@ -280,6 +268,17 @@
int snmp6_register_dev(struct inet6_dev *idev)
{
+ return 0;
+}
+
+int snmp6_unregister_dev(struct inet6_dev *idev)
+{
+ return 0;
+}
+#endif /* CONFIG_PROC_FS */
+
+int snmp6_alloc_dev(struct inet6_dev *idev)
+{
int err = -ENOMEM;
if (!idev || !idev->dev)
@@ -295,11 +294,10 @@
return err;
}
-int snmp6_unregister_dev(struct inet6_dev *idev)
+int snmp6_free_dev(struct inet6_dev *idev)
{
snmp6_mib_free((void **)idev->stats.icmpv6);
return 0;
}
-#endif
diff -urN linux/net/unix/af_unix.c linux/net/unix/af_unix.c
--- linux/net/unix/af_unix.c 2005/01/25 04:29:09 1.91
+++ linux/net/unix/af_unix.c 2005/03/02 19:58:03 1.92
@@ -1850,15 +1850,22 @@
case SIOCINQ:
{
struct sk_buff *skb;
+
if (sk->sk_state == TCP_LISTEN) {
err = -EINVAL;
break;
}
spin_lock(&sk->sk_receive_queue.lock);
- skb = skb_peek(&sk->sk_receive_queue);
- if (skb)
- amount=skb->len;
+ if (sk->sk_type == SOCK_STREAM ||
+ sk->sk_type == SOCK_SEQPACKET) {
+ skb_queue_walk(&sk->sk_receive_queue, skb)
+ amount += skb->len;
+ } else {
+ skb = skb_peek(&sk->sk_receive_queue);
+ if (skb)
+ amount=skb->len;
+ }
spin_unlock(&sk->sk_receive_queue.lock);
err = put_user(amount, (int __user *)arg);
break;
diff -urN linux/security/keys/compat.c linux/security/keys/compat.c
--- linux/security/keys/compat.c 2004/11/15 11:49:52 1.1
+++ linux/security/keys/compat.c 2005/03/02 19:58:03 1.2
@@ -31,7 +31,7 @@
return keyctl_get_keyring_ID(arg2, arg3);
case KEYCTL_JOIN_SESSION_KEYRING:
- return keyctl_join_session_keyring(compat_ptr(arg3));
+ return keyctl_join_session_keyring(compat_ptr(arg2));
case KEYCTL_UPDATE:
return keyctl_update_key(arg2, compat_ptr(arg3), arg4);
diff -urN linux/security/keys/keyctl.c linux/security/keys/keyctl.c
--- linux/security/keys/keyctl.c 2004/11/15 11:49:52 1.2
+++ linux/security/keys/keyctl.c 2005/03/02 19:58:03 1.3
@@ -923,7 +923,7 @@
(int) arg3);
case KEYCTL_JOIN_SESSION_KEYRING:
- return keyctl_join_session_keyring((const char __user *) arg3);
+ return keyctl_join_session_keyring((const char __user *) arg2);
case KEYCTL_UPDATE:
return keyctl_update_key((key_serial_t) arg2,
diff -urN linux/security/selinux/ss/conditional.c
linux/security/selinux/ss/conditional.c
--- linux/security/selinux/ss/conditional.c 2005/01/13 14:07:09 1.3
+++ linux/security/selinux/ss/conditional.c 2005/03/02 19:58:04 1.4
@@ -401,8 +401,10 @@
expr->expr_type = le32_to_cpu(buf[0]);
expr->bool = le32_to_cpu(buf[1]);
- if (!expr_isvalid(p, expr))
+ if (!expr_isvalid(p, expr)) {
+ kfree(expr);
goto err;
+ }
if (i == 0) {
node->expr = expr;
diff -urN linux/security/selinux/ss/policydb.c
linux/security/selinux/ss/policydb.c
--- linux/security/selinux/ss/policydb.c 2005/01/25 04:29:14 1.12
+++ linux/security/selinux/ss/policydb.c 2005/03/02 19:58:04 1.13
@@ -773,7 +773,7 @@
cladatum = kmalloc(sizeof(*cladatum), GFP_KERNEL);
if (!cladatum) {
rc = -ENOMEM;
- goto bad;
+ goto out;
}
memset(cladatum, 0, sizeof(*cladatum));
diff -urN linux/sound/oss/aedsp16.c linux/sound/oss/aedsp16.c
--- linux/sound/oss/aedsp16.c 2005/01/13 14:07:13 1.3
+++ linux/sound/oss/aedsp16.c 2005/03/02 19:58:04 1.4
@@ -489,7 +489,7 @@
{0x00, 0x00}
};
-static struct aedsp16_info ae_config __initdata = {
+static struct aedsp16_info ae_config = {
DEF_AEDSP16_IOB,
DEF_AEDSP16_IRQ,
DEF_AEDSP16_MRQ,
@@ -1155,7 +1155,7 @@
return TRUE;
}
-static void __init uninit_aedsp16_sb(void)
+static void uninit_aedsp16_sb(void)
{
DBG(("uninit_aedsp16_sb: "));
@@ -1196,7 +1196,7 @@
return TRUE;
}
-static void __init uninit_aedsp16_mss(void)
+static void uninit_aedsp16_mss(void)
{
DBG(("uninit_aedsp16_mss: "));
@@ -1237,7 +1237,7 @@
return TRUE;
}
-static void __init uninit_aedsp16_mpu(void)
+static void uninit_aedsp16_mpu(void)
{
DBG(("uninit_aedsp16_mpu: "));
@@ -1294,7 +1294,7 @@
return initialized;
}
-static void __init uninit_aedsp16(void)
+static void __exit uninit_aedsp16(void)
{
if (ae_config.mss_base != -1)
uninit_aedsp16_mss();
diff -urN linux/sound/oss/opl3sa2.c linux/sound/oss/opl3sa2.c
--- linux/sound/oss/opl3sa2.c 2005/01/25 04:29:15 1.18
+++ linux/sound/oss/opl3sa2.c 2005/03/02 19:58:04 1.19
@@ -711,7 +711,7 @@
}
-static void __init opl3sa2_clear_slots(struct address_info* hw_config)
+static void opl3sa2_clear_slots(struct address_info* hw_config)
{
int i;
diff -urN linux/sound/oss/sonicvibes.c linux/sound/oss/sonicvibes.c
--- linux/sound/oss/sonicvibes.c 2005/01/13 14:07:13 1.20
+++ linux/sound/oss/sonicvibes.c 2005/03/02 19:58:04 1.21
@@ -2470,7 +2470,7 @@
static struct initvol {
int mixch;
int vol;
-} initvol[] __initdata = {
+} initvol[] __devinitdata = {
{ SOUND_MIXER_WRITE_RECLEV, 0x4040 },
{ SOUND_MIXER_WRITE_LINE1, 0x4040 },
{ SOUND_MIXER_WRITE_CD, 0x4040 },
@@ -2487,7 +2487,7 @@
static int __devinit sv_probe(struct pci_dev *pcidev, const struct
pci_device_id *pciid)
{
- static char __initdata sv_ddma_name[] = "S3 Inc. SonicVibes DDMA
Controller";
+ static char __devinitdata sv_ddma_name[] = "S3 Inc. SonicVibes DDMA
Controller";
struct sv_state *s;
mm_segment_t fs;
int i, val, ret;
|