Commit c35f2ad2 authored by Linus Torvalds's avatar Linus Torvalds

Linux 2.4.0-test10pre5

    - Mikael Pettersson: more Pentium IV cleanup.
    - David Miller: non-x86 platforms missed "pte_same()".
    - Russell King: NFS invalidate_inode_pages() can do bad things!
    - Randy Dunlap: usb-core.c is gone - module fix
    - Ben LaHaise: swapcache fixups for the new atomic pte update code
    - Oleg Drokin: fix nm256_audio memory region confusion
    - Randy Dunlap: USB printer fixes
    - David Miller: sparc updates
    - David Miller: off-by-one error in /proc socket dumper
    - David Miller: restore non-local bind() behaviour.
    - David Miller: wakeups on socket shutdown()
    - Jeff Garzik: DEPCA net drvr fixes and CodingStyle
    - Jeff Garzik: netsemi net drvr fix
    - Jeff Garzik & Andrea Arkangeli: keyboard cleanup
    - Jeff Garzik: VIA audio update
    - Andrea Arkangeli: mxcsr initialization cleanup and fix
    - Gabriel Paubert: better twd_i387_to_fxsr() emulation
    - Andries Brouwer: proper error return in ext2 mkdir()
parent b98cb33e
......@@ -56,15 +56,16 @@
<chapter id="intro">
<title>Introduction</title>
<para>
The Via VT82C686A and VT82C686A "super southbridge" chips contain
AC97-compatible audio logic which features dual full-duplex 16-bit stereo
PCM sound channels, plus a third PCM channel intended for use
The Via VT82C686A "super southbridge" chips contain
AC97-compatible audio logic which features dual 16-bit stereo
PCM sound channels (full duplex), plus a third PCM channel intended for use
in hardware-assisted FM synthesis.
</para>
<para>
The current Linux kernel audio driver for this family of chips
supports audio playback, but recording and hardware-assisted
FM support features are not yet available.
supports audio playback and recording, but hardware-assisted
FM features, and hardware buffer direct-access (mmap)
support are not yet available.
</para>
<para>
This driver supports any Linux kernel version after 2.3.50.
......@@ -148,13 +149,6 @@
<title>Known Bugs And Assumptions</title>
<para>
<variablelist>
<varlistentry><term>Recording support</term>
<listitem>
<para>
Recording support is currently missing.
</para>
</listitem></varlistentry>
<varlistentry><term>MMAP support</term>
<listitem>
<para>
......@@ -188,17 +182,6 @@
</para>
</listitem></varlistentry>
<varlistentry><term>Broken apps</term>
<listitem>
<para>
Applications which attempt to open the sound device in read/write
mode (O_RDWR) will fail. This is incorrect OSS behavior, but since
this driver will eventually support recording as well as playback,
we will be able to (in the future) support even broken programs which
unconditionally use O_RDWR.
</para>
</listitem></varlistentry>
</variablelist>
</para>
......@@ -221,8 +204,8 @@
<title>Random Notes</title>
<para>
Two /proc pseudo-files provide diagnostic information. This is generally
not useful to most users. Power users can disable VIA_PROC_FS macro in the
driver source code, and remove the /proc support code. In any case, once
not useful to most users. Power users can disable CONFIG_SOUND_VIA82CXXX_PROCFS,
and remove the /proc support code. Once
version 2.0.0 is released, the /proc support code will be disabled by
default. Available /proc pseudo-files:
</para>
......@@ -235,16 +218,6 @@
a vendor id of 0x1106, and a device id of 0x3058. Subsystem vendor
and device ids are not examined.
</para>
<para>
Only supports a single sound chip, as this is a motherboard chipset.
Some architecture remains for multiple cards, feel free to submit
a patch to clean some of that up.
</para>
<para>
No consideration for SMP, this chipset is not known to be found on
any SMP motherboards. However, spin_locks must be used anyway in order
to handle interrupts correctly.
</para>
<para>
GNU indent formatting options: -kr -i8 -pcs
</para>
......@@ -265,6 +238,147 @@
<chapter id="changelog">
<title>Driver ChangeLog</title>
<sect1 id="version1112"><title>
Version 1.1.12
</title>
<itemizedlist spacing=compact>
<listitem>
<para>
mmap bug fixes from Linus.
</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="version1111"><title>
Version 1.1.11
</title>
<itemizedlist spacing=compact>
<listitem>
<para>
Many more bug fixes. mmap enabled by default, but may still be buggy.
</para>
</listitem>
<listitem>
<para>
Uses new and spiffy method of mmap'ing the DMA buffer, based
on a suggestion from Linus.
</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="version1110"><title>
Version 1.1.10
</title>
<itemizedlist spacing=compact>
<listitem>
<para>
Many bug fixes. mmap enabled by default, but may still be buggy.
</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="version119"><title>
Version 1.1.9
</title>
<itemizedlist spacing=compact>
<listitem>
<para>
Redesign and rewrite audio playback implementation. (faster and smaller, hopefully)
</para>
</listitem>
<listitem>
<para>
Implement recording and full duplex (DSP_CAP_DUPLEX) support.
</para>
</listitem>
<listitem>
<para>
Make procfs support optional.
</para>
</listitem>
<listitem>
<para>
Quick interrupt status check, to lessen overhead in interrupt
sharing situations.
</para>
</listitem>
<listitem>
<para>
Add mmap(2) support. Disabled for now, it is still buggy and experimental.
</para>
</listitem>
<listitem>
<para>
Surround all syscalls with a semaphore for cheap and easy SMP protection.
</para>
</listitem>
<listitem>
<para>
Fix bug in channel shutdown (hardware channel reset) code.
</para>
</listitem>
<listitem>
<para>
Remove unnecessary spinlocks (better performance).
</para>
</listitem>
<listitem>
<para>
Eliminate "unknown AFMT" message by using a different method
of selecting the best AFMT_xxx sound sample format for use.
</para>
</listitem>
<listitem>
<para>
Support for realtime hardware pointer position reporting
(DSP_CAP_REALTIME, SNDCTL_DSP_GETxPTR ioctls)
</para>
</listitem>
<listitem>
<para>
Support for capture/playback triggering
(DSP_CAP_TRIGGER, SNDCTL_DSP_SETTRIGGER ioctls)
</para>
</listitem>
<listitem>
<para>
SNDCTL_DSP_SETDUPLEX and SNDCTL_DSP_POST ioctls now handled.
</para>
</listitem>
<listitem>
<para>
Rewrite open(2) and close(2) logic to allow only one user at
a time. All other open(2) attempts will sleep until they succeed.
FIXME: open(O_RDONLY) and open(O_WRONLY) should be allowed to succeed.
</para>
</listitem>
<listitem>
<para>
Reviewed code to ensure that SMP and multiple audio devices
are fully supported.
</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="version118"><title>
Version 1.1.8
</title>
......
......@@ -32,6 +32,21 @@
#define HAVE_HWFP 1
#endif
/*
* The _current_ task is using the FPU for the first time
* so initialize it and set the mxcsr to its default
* value at reset if we support FXSR and then
* remeber the current task has used the FPU.
*/
void init_fpu(void)
{
__asm__("fninit");
if ( HAVE_FXSR )
load_mxcsr(0x1f80);
current->used_math = 1;
}
/*
* FPU lazy state save handling.
*/
......@@ -66,16 +81,16 @@ void restore_fpu( struct task_struct *tsk )
static inline unsigned short twd_i387_to_fxsr( unsigned short twd )
{
unsigned short ret = 0;
int i;
unsigned int tmp; /* to avoid 16 bit prefixes in the code */
for ( i = 0 ; i < 8 ; i++ ) {
if ( (twd & 0x3) != 0x3 ) {
ret |= (1 << i);
}
twd = twd >> 2;
}
return ret;
/* Transform each pair of bits into 01 (valid) or 00 (empty) */
tmp = ~twd;
tmp = (tmp | (tmp>>1)) & 0x5555; /* 0V0V0V0V0V0V0V0V */
/* and move the valid bits to the lower byte. */
tmp = (tmp | (tmp >> 1)) & 0x3333; /* 00VV00VV00VV00VV */
tmp = (tmp | (tmp >> 2)) & 0x0f0f; /* 0000VVVV0000VVVV */
tmp = (tmp | (tmp >> 4)) & 0x00ff; /* 00000000VVVVVVVV */
return tmp;
}
static inline unsigned long twd_fxsr_to_i387( struct i387_fxsave_struct *fxsave )
......@@ -92,8 +107,8 @@ static inline unsigned long twd_fxsr_to_i387( struct i387_fxsave_struct *fxsave
if ( twd & 0x1 ) {
st = (struct _fpxreg *) FPREG_ADDR( fxsave, i );
switch ( st->exponent ) {
case 0xffff:
switch ( st->exponent & 0x7fff ) {
case 0x7fff:
tag = 2; /* Special */
break;
case 0x0000:
......
......@@ -177,7 +177,7 @@ static void do_update_one(void *unused)
req->err = 1; /* assume the worst */
if (c->x86_vendor != X86_VENDOR_INTEL || c->x86 < 6){
if (c->x86_vendor != X86_VENDOR_INTEL || c->x86 != 6){
printk(KERN_ERR "microcode: CPU%d not an Intel P6\n", cpu_num);
return;
}
......
......@@ -1549,7 +1549,7 @@ void __init identify_cpu(struct cpuinfo_x86 *c)
/* Pentium IV. */
if (c->x86 == 15) {
get_model_name(c);
goto name_decoded;
return;
}
/* Names for the Pentium II/Celeron processors
......@@ -1688,12 +1688,12 @@ int get_cpuinfo(char * buffer)
#endif
p += sprintf(p,"processor\t: %d\n"
"vendor_id\t: %s\n"
"cpu family\t: %c\n"
"cpu family\t: %d\n"
"model\t\t: %d\n"
"model name\t: %s\n",
n,
c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
c->x86 + '0',
c->x86,
c->x86_model,
c->x86_model_id[0] ? c->x86_model_id : "unknown");
......
......@@ -741,11 +741,7 @@ asmlinkage void math_state_restore(struct pt_regs regs)
if (current->used_math) {
restore_fpu(current);
} else {
/*
* Our first FPU usage, clean the chip.
*/
__asm__("fninit");
current->used_math = 1;
init_fpu();
}
current->flags |= PF_USEDFPU; /* So we fnsave on switch_to() */
}
......
......@@ -495,28 +495,7 @@ void __init paging_init(void)
* This function cannot be __init, since exceptions don't work in that
* section.
*/
static int do_test_wp_bit(unsigned long vaddr)
{
char tmp_reg;
int flag;
__asm__ __volatile__(
" movb %0,%1 \n"
"1: movb %1,%0 \n"
" xorl %2,%2 \n"
"2: \n"
".section __ex_table,\"a\"\n"
" .align 4 \n"
" .long 1b,2b \n"
".previous \n"
:"=m" (*(char *) vaddr),
"=q" (tmp_reg),
"=r" (flag)
:"2" (1)
:"memory");
return flag;
}
static int do_test_wp_bit(unsigned long vaddr);
void __init test_wp_bit(void)
{
......@@ -652,6 +631,30 @@ void __init mem_init(void)
}
/* Put this after the callers, so that it cannot be inlined */
static int do_test_wp_bit(unsigned long vaddr)
{
char tmp_reg;
int flag;
__asm__ __volatile__(
" movb %0,%1 \n"
"1: movb %1,%0 \n"
" xorl %2,%2 \n"
"2: \n"
".section __ex_table,\"a\"\n"
" .align 4 \n"
" .long 1b,2b \n"
".previous \n"
:"=m" (*(char *) vaddr),
"=q" (tmp_reg),
"=r" (flag)
:"2" (1)
:"memory");
return flag;
}
void free_initmem(void)
{
unsigned long addr;
......
/* $Id: init.c,v 1.93 2000/08/31 11:40:55 anton Exp $
/* $Id: init.c,v 1.94 2000/10/19 00:49:51 davem Exp $
* linux/arch/sparc/mm/init.c
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
......
......@@ -264,6 +264,7 @@ CONFIG_BLK_DEV_NS87415=y
# CONFIG_BLK_DEV_PDC202XX is not set
# CONFIG_PDC202XX_BURST is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_CHIPSETS is not set
......
/* $Id: ioctl32.c,v 1.98 2000/08/16 12:33:00 davem Exp $
/* $Id: ioctl32.c,v 1.99 2000/10/17 16:20:33 davem Exp $
* ioctl32.c: Conversion between 32bit and 64bit native ioctls.
*
* Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com)
......@@ -3221,9 +3221,16 @@ COMPATIBLE_IOCTL(_IOR('v' , BASE_VIDIOCPRIVATE+7, int))
/* Little p (/dev/rtc, /dev/envctrl, etc.) */
COMPATIBLE_IOCTL(RTCGET)
COMPATIBLE_IOCTL(RTCSET)
COMPATIBLE_IOCTL(I2CIOCSADR)
COMPATIBLE_IOCTL(I2CIOCGADR)
COMPATIBLE_IOCTL(D7SIOCRD)
COMPATIBLE_IOCTL(ENVCTRL_RD_WARNING_TEMPERATURE)
COMPATIBLE_IOCTL(ENVCTRL_RD_SHUTDOWN_TEMPERATURE)
COMPATIBLE_IOCTL(ENVCTRL_RD_CPU_TEMPERATURE)
COMPATIBLE_IOCTL(ENVCTRL_RD_FAN_STATUS)
COMPATIBLE_IOCTL(ENVCTRL_RD_VOLTAGE_STATUS)
COMPATIBLE_IOCTL(ENVCTRL_RD_SCSI_TEMPERATURE)
COMPATIBLE_IOCTL(ENVCTRL_RD_ETHERNET_TEMPERATURE)
COMPATIBLE_IOCTL(ENVCTRL_RD_MTHRBD_TEMPERATURE)
COMPATIBLE_IOCTL(ENVCTRL_RD_CPU_VOLTAGE)
/* COMPATIBLE_IOCTL(D7SIOCRD) same value as ENVCTRL_RD_VOLTAGE_STATUS */
COMPATIBLE_IOCTL(D7SIOCWR)
COMPATIBLE_IOCTL(D7SIOCTM)
/* Little m */
......
/* $Id: init.c,v 1.156 2000/09/21 06:34:48 anton Exp $
/* $Id: init.c,v 1.157 2000/10/19 00:49:52 davem Exp $
* arch/sparc64/mm/init.c
*
* Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
......
/* $Id: socksys.c,v 1.16 2000/07/27 00:03:48 davem Exp $
/* $Id: socksys.c,v 1.17 2000/10/19 00:49:53 davem Exp $
* socksys.c: /dev/inet/ stuff for Solaris emulation.
*
* Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
......
......@@ -65,7 +65,7 @@ static void aux_write_ack(int val);
static void __aux_write_ack(int val);
#endif
spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
static spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
static unsigned char handle_kbd_event(void);
/* used only by send_data - set by keyboard_interrupt */
......@@ -448,7 +448,7 @@ static unsigned char handle_kbd_event(void)
unsigned char status = kbd_read_status();
unsigned int work = 10000;
while (status & KBD_STAT_OBF) {
while ((--work > 0) && (status & KBD_STAT_OBF)) {
unsigned char scancode;
scancode = kbd_read_input();
......@@ -467,28 +467,24 @@ static unsigned char handle_kbd_event(void)
}
status = kbd_read_status();
if (!--work) {
printk(KERN_ERR "pc_keyb: controller jammed (0x%02X).\n",
status);
break;
}
}
if (!work)
printk(KERN_ERR "pc_keyb: controller jammed (0x%02X).\n", status);
return status;
}
static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned long flags;
#ifdef CONFIG_VT
kbd_pt_regs = regs;
#endif
spin_lock_irqsave(&kbd_controller_lock, flags);
spin_lock_irq(&kbd_controller_lock);
handle_kbd_event();
spin_unlock_irqrestore(&kbd_controller_lock, flags);
spin_unlock_irq(&kbd_controller_lock);
}
/*
......
......@@ -94,7 +94,7 @@ static unsigned char q40ecl[]=
};
spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
static spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
/*
......@@ -340,11 +340,10 @@ static int qprev=0;
static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned long flags;
unsigned char status;
disable_keyboard();
spin_lock_irqsave(&kbd_controller_lock, flags);
spin_lock(&kbd_controller_lock);
kbd_pt_regs = regs;
status = IRQ_KEYB_MASK & master_inb(INTERRUPT_REG);
......@@ -386,7 +385,7 @@ static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
keyup=1;
}
exit:
spin_unlock_irqrestore(&kbd_controller_lock, flags);
spin_unlock(&kbd_controller_lock);
master_outb(-1,KEYBOARD_UNLOCK_REG); /* keyb ints reenabled herewith */
enable_keyboard();
}
......
This diff is collapsed.
......@@ -24,6 +24,8 @@
Version 1.0.1:
- Spinlock fixes
- Bug fixes and better intr performance (Tjeerd)
Version 1.0.2:
- Now reads correct MAC address from eeprom
*/
......@@ -33,7 +35,7 @@ static const char version1[] =
static const char version2[] =
" http://www.scyld.com/network/natsemi.html\n";
static const char version3[] =
" (unofficial 2.4.x kernel port, version 1.0.1, September 5, 2000 Jeff Garzik, Tjeerd Mulder)\n";
" (unofficial 2.4.x kernel port, version 1.0.2, October 6, 2000 Jeff Garzik, Tjeerd Mulder)\n";
/* Updated to recommendations in pci-skeleton v2.03. */
/* Automatically extracted configuration info:
......@@ -405,8 +407,13 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
printk(KERN_INFO "%s: %s at 0x%lx, ",
dev->name, natsemi_pci_info[chip_idx].name, ioaddr);
for (i = 0; i < ETH_ALEN/2; i++)
((u16 *)dev->dev_addr)[i] = be16_to_cpu(eeprom_read(ioaddr, i + 7));
for (i = 0; i < ETH_ALEN/2; i++) {
/* weird organization */
unsigned short a;
a = (le16_to_cpu(eeprom_read(ioaddr, i + 6)) >> 15) +
(le16_to_cpu(eeprom_read(ioaddr, i + 7)) << 1);
((u16 *)dev->dev_addr)[i] = a;
}
for (i = 0; i < ETH_ALEN-1; i++)
printk("%2.2x:", dev->dev_addr[i]);
printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq);
......@@ -513,7 +520,8 @@ static int eeprom_read(long addr, int location)
for (i = 16; i > 0; i--) {
writel(EE_ChipSelect | EE_ShiftClk, ee_addr);
eeprom_delay(ee_addr);
retval = (retval << 1) | ((readl(ee_addr) & EE_DataOut) ? 1 : 0);
/* data bits are LSB first */
retval = (retval >> 1) | ((readl(ee_addr) & EE_DataOut) ? 0x8000 : 0);
writel(EE_ChipSelect, ee_addr);
eeprom_delay(ee_addr);
}
......
/* $Id: audio.c,v 1.55 2000/10/10 01:07:39 davem Exp $
/* $Id: audio.c,v 1.56 2000/10/19 00:50:02 davem Exp $
* drivers/sbus/audio/audio.c
*
* Copyright 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
......
This diff is collapsed.
......@@ -58,9 +58,7 @@ nm256_release_ports (struct nm256_info *card)
for (x = 0; x < 2; x++) {
if (card->port[x].ptr != NULL) {
u32 size =
card->port[x].end_offset - card->port[x].start_offset;
release_region ((unsigned long) card->port[x].ptr, size);
iounmap (card->port[x].ptr);
card->port[x].ptr = NULL;
}
}
......@@ -1025,7 +1023,7 @@ nm256_peek_for_sig (struct nm256_info *card)
pointer);
}
release_region ((unsigned long) temp, 16);
iounmap (temp);
}
/*
......
This diff is collapsed.
......@@ -21,7 +21,7 @@ export-objs := usb.o
# Multipart objects.
list-multi := usbcore.o
usbcore-objs := usb.o usb-debug.o usb-core.o hub.o
usbcore-objs := usb.o usb-debug.o hub.o
# Optional parts of multipart objects.
......
......@@ -52,6 +52,7 @@
#define IOCNR_GET_DEVICE_ID 1
#define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len) /* get device_id string */
#define LPGETSTATUS 0x060b /* same as in drivers/char/lp.c */
/*
* A DEVICE_ID string may include the printer's serial number.
......@@ -179,10 +180,17 @@ static int usblp_open(struct inode *inode, struct file *file)
if (usblp->used)
goto out;
/*
* TODO: need to implement LP_ABORTOPEN + O_NONBLOCK as in drivers/char/lp.c ???
* This is #if 0-ed because we *don't* want to fail an open
* just because the printer is off-line.
*/
#if 0
if ((retval = usblp_check_status(usblp, 0))) {
retval = retval > 1 ? -EIO : -ENOSPC;
goto out;
}
#endif
usblp->used = 1;
file->private_data = usblp;
......@@ -232,19 +240,33 @@ static unsigned int usblp_poll(struct file *file, struct poll_table_struct *wait
static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
struct usblp *usblp = file->private_data;
int length;
int length, err;
unsigned char status;
if ((_IOC_TYPE(cmd) != 'P') || (_IOC_DIR(cmd) != _IOC_READ))
return -EINVAL;
if (_IOC_TYPE(cmd) == 'P') /* new-style ioctl number */
switch (_IOC_NR(cmd)) {
case IOCNR_GET_DEVICE_ID: /* get the DEVICE_ID string */
if (_IOC_DIR(cmd) != _IOC_READ)
return -EINVAL;
err = usblp_get_id(usblp, 0, usblp->device_id_string, DEVICE_ID_SIZE - 1);
if (err < 0) {
dbg ("usblp%d: error = %d reading IEEE-1284 Device ID string",
usblp->minor, err);
usblp->device_id_string[0] = usblp->device_id_string[1] = '\0';
return -EIO;
}
length = (usblp->device_id_string[0] << 8) + usblp->device_id_string[1]; /* big-endian */
if (length < DEVICE_ID_SIZE)
usblp->device_id_string[length] = '\0';
else
usblp->device_id_string[DEVICE_ID_SIZE - 1] = '\0';
dbg ("usblp_ioctl GET_DEVICE_ID actlen: %d, size: %d, string: '%s'",
length, _IOC_SIZE(cmd), &usblp->device_id_string[2]);
dbg ("usblp%d Device ID string [%d/max %d]='%s'",
usblp->minor, length, _IOC_SIZE(cmd), &usblp->device_id_string[2]);
if (length > _IOC_SIZE(cmd)) length = _IOC_SIZE(cmd); /* truncate */
......@@ -256,6 +278,21 @@ static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
default:
return -EINVAL;
}
else /* old-style ioctl value */
switch (cmd) {
case LPGETSTATUS:
if (usblp_read_status(usblp, &status)) {
err("usblp%d: failed reading printer status", usblp->minor);
return -EIO;
}
if (copy_to_user ((unsigned char *)arg, &status, 1))
return -EFAULT;
break;
default:
return -EINVAL;
}
return 0;
}
......
/*
* driver/usb/usb-core.c
*
* (C) Copyright David Waite 1999
* based on code from usb.c, by Linus Torvalds
*
* The purpose of this file is to pull any and all generic modular code from
* usb.c and put it in a separate file. This way usb.c is kept as a generic
* library, while this file handles starting drivers, etc.
*
*/
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/usb.h>
/*
* USB core
*/
int usb_hub_init(void);
void usb_hub_cleanup(void);
int usb_major_init(void);
void usb_major_cleanup(void);
/*
* Cleanup
*/
static void __exit usb_exit(void)
{
usb_major_cleanup();
usbdevfs_cleanup();
usb_hub_cleanup();
}
/*
* Init
*/
static int __init usb_init(void)
{
usb_major_init();
usbdevfs_init();
usb_hub_init();
return 0;
}
module_init(usb_init);
module_exit(usb_exit);
......@@ -26,6 +26,7 @@
#include <linux/malloc.h>
#include <linux/interrupt.h> /* for in_interrupt() */
#include <linux/kmod.h>
#include <linux/init.h>
#ifdef CONFIG_USB_DEBUG
......@@ -47,6 +48,9 @@ static const int usb_bandwidth_option =
0;
#endif
extern int usb_hub_init(void);
extern void usb_hub_cleanup(void);
/*
* Prototypes for the device driver probing/loading functions
*/
......@@ -2029,6 +2033,32 @@ struct list_head *usb_bus_get_list(void)
}
#endif
/*
* Init
*/
static int __init usb_init(void)
{
usb_major_init();
usbdevfs_init();
usb_hub_init();
return 0;
}
/*
* Cleanup
*/
static void __exit usb_exit(void)
{
usb_major_cleanup();
usbdevfs_cleanup();
usb_hub_cleanup();
}
module_init(usb_init);
module_exit(usb_exit);
/*
* USB may be built into the kernel or be built as modules.
* If the USB core [and maybe a host controller driver] is built
......
......@@ -129,7 +129,6 @@ static void write_mda_w(unsigned int val, unsigned char reg)
outb_p(reg+1, mda_index_port); outb_p(val & 0xff, mda_value_port);
spin_unlock_irqrestore(&mda_lock, flags);
restore_flags(flags);
}
static int test_mda_b(unsigned char val, unsigned char reg)
......
......@@ -434,7 +434,7 @@ static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode)
inode->i_nlink--; /* is this nlink == 0? */
mark_inode_dirty(inode);
iput (inode);
return -EIO;
return err;
}
de = (struct ext2_dir_entry_2 *) dir_block->b_data;
de->inode = cpu_to_le32(inode->i_ino);
......
......@@ -38,4 +38,6 @@ static inline void ptep_mkdirty(pte_t *ptep)
set_pte(ptep, pte_mkdirty(old_pte));
}
#define pte_same(A,B) (pte_val(A) == pte_val(B))
#endif /* _ASM_GENERIC_PGTABLE_H */
......@@ -94,7 +94,6 @@ static void __init check_fpu(void)
printk(KERN_INFO "Enabling unmasked SIMD FPU exception support... ");
set_in_cr4(X86_CR4_OSXMMEXCPT);
printk("done.\n");
load_mxcsr(0x1f80);
}
#endif
......@@ -166,6 +165,7 @@ __asm__(".align 4\nvide: ret");
static void __init check_amd_k6(void)
{
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
boot_cpu_data.x86 == 5 &&
boot_cpu_data.x86_model == 6 &&
boot_cpu_data.x86_mask == 1)
{
......
......@@ -93,7 +93,7 @@ typedef struct user_fxsr_struct elf_fpxregset_t;
For the moment, we have only optimizations for the Intel generations,
but that could change... */
#define ELF_PLATFORM ("i386\0i486\0i586\0i686"+((boot_cpu_data.x86-3)*5))
#define ELF_PLATFORM ("i386\0i486\0i586\0i686"+(((boot_cpu_data.x86>6?6:boot_cpu_data.x86)-3)*5))
#ifdef __KERNEL__
#define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
......
......@@ -16,6 +16,7 @@
#include <asm/sigcontext.h>
#include <asm/user.h>
extern void init_fpu(void);
/*
* FPU lazy state save handling...
*/
......
......@@ -48,8 +48,8 @@ struct user_i387_struct {
long twd;
long fip;
long fcs;
long fdp;
long fds;
long foo;
long fos;
long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */
};
......
/* $Id: pgtable.h,v 1.103 2000/10/16 14:32:49 anton Exp $ */
/* $Id: pgtable.h,v 1.104 2000/10/19 00:50:16 davem Exp $ */
#ifndef _SPARC_PGTABLE_H
#define _SPARC_PGTABLE_H
......
/* $Id: envctrl.h,v 1.1 1998/05/16 17:26:07 ecd Exp $
/* $Id: envctrl.h,v 1.2 2000/10/17 16:20:36 davem Exp $
*
* envctrl.h: Definitions for access to the i2c environment
* monitoring on Ultrasparc systems.
*
* Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
* Copyright (C) 2000 Vinh Truong (vinh.truong@eng.sun.com)
* VT - Add all ioctl commands and environment status definitions
* VT - Add application note
*/
#ifndef _SPARC64_ENVCTRL_H
#define _SPARC64_ENVCTRL_H 1
#include <linux/ioctl.h>
#define I2CIOCSADR _IOW('p', 0x40, int)
#define I2CIOCGADR _IOR('p', 0x41, int)
/* Application note:
*
* The driver supports 4 operations: open(), close(), ioctl(), read()
* The device name is /dev/envctrl.
* Below is sample usage:
*
* fd = open("/dev/envtrl", O_RDONLY);
* if (ioctl(fd, ENVCTRL_READ_SHUTDOWN_TEMPERATURE, 0) < 0)
* printf("error\n");
* ret = read(fd, buf, 10);
* close(fd);
*
* Notice in the case of cpu voltage and temperature, the default is
* cpu0. If we need to know the info of cpu1, cpu2, cpu3, we need to
* pass in cpu number in ioctl() last parameter. For example, to
* get the voltage of cpu2:
*
* ioctlbuf[0] = 2;
* if (ioctl(fd, ENVCTRL_READ_CPU_VOLTAGE, ioctlbuf) < 0)
* printf("error\n");
* ret = read(fd, buf, 10);
*
* All the return values are in ascii. So check read return value
* and do appropriate conversions in your application.
*/
/* IOCTL commands */
/* Note: these commands reflect possible monitor features.
* Some boards choose to support some of the features only.
*/
#define ENVCTRL_RD_CPU_TEMPERATURE _IOR('p', 0x40, int)
#define ENVCTRL_RD_CPU_VOLTAGE _IOR('p', 0x41, int)
#define ENVCTRL_RD_FAN_STATUS _IOR('p', 0x42, int)
#define ENVCTRL_RD_WARNING_TEMPERATURE _IOR('p', 0x43, int)
#define ENVCTRL_RD_SHUTDOWN_TEMPERATURE _IOR('p', 0x44, int)
#define ENVCTRL_RD_VOLTAGE_STATUS _IOR('p', 0x45, int)
#define ENVCTRL_RD_SCSI_TEMPERATURE _IOR('p', 0x46, int)
#define ENVCTRL_RD_ETHERNET_TEMPERATURE _IOR('p', 0x47, int)
#define ENVCTRL_RD_MTHRBD_TEMPERATURE _IOR('p', 0x48, int)
/* Read return values for a voltage status request. */
#define ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD 0x01
#define ENVCTRL_VOLTAGE_BAD 0x02
#define ENVCTRL_POWERSUPPLY_BAD 0x03
#define ENVCTRL_VOLTAGE_POWERSUPPLY_BAD 0x04
/* Read return values for a fan status request.
* A failure match means either the fan fails or
* the fan is not connected. Some boards have optional
* connectors to connect extra fans.
*
* There are maximum 8 monitor fans. Some are cpu fans
* some are system fans. The mask below only indicates
* fan by order number.
* Below is a sample application:
*
* if (ioctl(fd, ENVCTRL_READ_FAN_STATUS, 0) < 0) {
* printf("ioctl fan failed\n");
* }
* if (read(fd, rslt, 1) <= 0) {
* printf("error or fan not monitored\n");
* } else {
* if (rslt[0] == ENVCTRL_ALL_FANS_GOOD) {
* printf("all fans good\n");
* } else if (rslt[0] == ENVCTRL_ALL_FANS_BAD) {
* printf("all fans bad\n");
* } else {
* if (rslt[0] & ENVCTRL_FAN0_FAILURE_MASK) {
* printf("fan 0 failed or not connected\n");
* }
* ......
*/
#define ENVCTRL_ALL_FANS_GOOD 0x00
#define ENVCTRL_FAN0_FAILURE_MASK 0x01
#define ENVCTRL_FAN1_FAILURE_MASK 0x02
#define ENVCTRL_FAN2_FAILURE_MASK 0x04
#define ENVCTRL_FAN3_FAILURE_MASK 0x08
#define ENVCTRL_FAN4_FAILURE_MASK 0x10
#define ENVCTRL_FAN5_FAILURE_MASK 0x20
#define ENVCTRL_FAN6_FAILURE_MASK 0x40
#define ENVCTRL_FAN7_FAILURE_MASK 0x80
#define ENVCTRL_ALL_FANS_BAD 0xFF
#endif /* !(_SPARC64_ENVCTRL_H) */
/* $Id: pgtable.h,v 1.131 2000/08/11 03:00:14 davem Exp $
/* $Id: pgtable.h,v 1.132 2000/10/19 00:50:16 davem Exp $
* pgtable.h: SpitFire page table operations.
*
* Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu)
......
......@@ -95,6 +95,7 @@ struct vm_area_struct {
#define VM_DONTCOPY 0x00020000 /* Do not copy this vma on fork */
#define VM_DONTEXPAND 0x00040000 /* Cannot expand with mremap() */
#define VM_RESERVED 0x00080000 /* Don't unmap it from swap_out */
#define VM_STACK_FLAGS 0x00000177
......
......@@ -274,6 +274,7 @@ enum
NET_TCP_RMEM=85,
NET_TCP_APP_WIN=86,
NET_TCP_ADV_WIN_SCALE=87,
NET_IPV4_NONLOCAL_BIND=88,
};
enum {
......
......@@ -135,6 +135,12 @@ void invalidate_inode_pages(struct inode * inode)
if (TryLockPage(page))
continue;
/* Neither can we invalidate something in use.. */
if (page_count(page) != 1) {
UnlockPage(page);
continue;
}
__lru_cache_del(page);
__remove_inode_page(page);
UnlockPage(page);
......@@ -156,6 +162,7 @@ static inline void truncate_partial_page(struct page *page, unsigned partial)
static inline void truncate_complete_page(struct page *page)
{
/* Leave it on the LRU if it gets converted into anonymous buffers */
if (!page->buffers || block_flushpage(page, 0))
lru_cache_del(page);
......@@ -167,6 +174,7 @@ static inline void truncate_complete_page(struct page *page)
* all sorts of fun problems ...
*/
ClearPageDirty(page);
ClearPageUptodate(page);
remove_inode_page(page);
page_cache_release(page);
}
......
......@@ -87,6 +87,13 @@ static int try_to_swap_out(struct mm_struct * mm, struct vm_area_struct* vma, un
if (TryLockPage(page))
goto out_failed;
/* From this point on, the odds are that we're going to
* nuke this pte, so read and clear the pte. This hook
* is needed on CPUs which update the accessed and dirty
* bits in hardware.
*/
pte = ptep_get_and_clear(page_table);
/*
* Is the page already in the swap cache? If so, then
* we can just drop our reference to it without doing
......@@ -98,10 +105,6 @@ static int try_to_swap_out(struct mm_struct * mm, struct vm_area_struct* vma, un
if (PageSwapCache(page)) {
entry.val = page->index;
swap_duplicate(entry);
if (pte_dirty(pte))
BUG();
if (pte_write(pte))
BUG();
set_pte(page_table, swp_entry_to_pte(entry));
drop_pte:
UnlockPage(page);
......@@ -112,13 +115,6 @@ static int try_to_swap_out(struct mm_struct * mm, struct vm_area_struct* vma, un
goto out_failed;
}
/* From this point on, the odds are that we're going to
* nuke this pte, so read and clear the pte. This hook
* is needed on CPUs which update the accessed and dirty
* bits in hardware.
*/
pte = ptep_get_and_clear(page_table);
/*
* Is it a clean page? Then it must be recoverable
* by just paging it in again, and we can just drop
......@@ -318,7 +314,7 @@ static int swap_out_vma(struct mm_struct * mm, struct vm_area_struct * vma, unsi
unsigned long end;
/* Don't swap out areas which are locked down */
if (vma->vm_flags & VM_LOCKED)
if (vma->vm_flags & (VM_LOCKED|VM_RESERVED))
return 0;
pgdir = pgd_offset(mm, address);
......
......@@ -5,7 +5,7 @@
*
* PF_INET protocol family socket handler.
*
* Version: $Id: af_inet.c,v 1.116 2000/10/15 01:34:45 davem Exp $
* Version: $Id: af_inet.c,v 1.118 2000/10/19 15:51:02 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
......@@ -447,6 +447,9 @@ int inet_release(struct socket *sock)
return(0);
}
/* It is off by default, see below. */
int sysctl_ip_nonlocal_bind;
static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
{
struct sockaddr_in *addr=(struct sockaddr_in *)uaddr;
......@@ -464,6 +467,20 @@ static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
chk_addr_ret = inet_addr_type(addr->sin_addr.s_addr);
/* Not specified by any standard per-se, however it breaks too
* many applications when removed. It is unfortunate since
* allowing applications to make a non-local bind solves
* several problems with systems using dynamic addressing.
* (ie. your servers still start up even if your ISDN link
* is temporarily down)
*/
if (sysctl_ip_nonlocal_bind == 0 &&
addr->sin_addr.s_addr != INADDR_ANY &&
chk_addr_ret != RTN_LOCAL &&
chk_addr_ret != RTN_MULTICAST &&
chk_addr_ret != RTN_BROADCAST)
return -EADDRNOTAVAIL;
snum = ntohs(addr->sin_port);
if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE))
return -EACCES;
......@@ -753,14 +770,15 @@ int inet_shutdown(struct socket *sock, int how)
}
switch (sk->state) {
case TCP_CLOSE:
err = -ENOTCONN;
/* Hack to wake up other listeners, who can poll for
POLLHUP, even on eg. unconnected UDP sockets -- RR */
default:
sk->shutdown |= how;
if (sk->prot->shutdown)
sk->prot->shutdown(sk, how);
break;
case TCP_CLOSE:
err = -ENOTCONN;
break;
/* Remaining two branches are temporary solution for missing
* close() in multithreaded environment. It is _not_ a good idea,
......
......@@ -5,7 +5,7 @@
*
* RAW - implementation of IP "raw" sockets.
*
* Version: $Id: raw.c,v 1.53 2000/08/09 11:59:04 davem Exp $
* Version: $Id: raw.c,v 1.54 2000/10/18 18:04:23 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
......@@ -653,7 +653,7 @@ int raw_get_info(char *buffer, char **start, off_t offset, int length)
if (sk->family != PF_INET)
continue;
pos += 128;
if (pos < offset)
if (pos <= offset)
continue;
get_raw_sock(sk, tmpbuf, i);
len += sprintf(buffer+len, "%-127s\n", tmpbuf);
......
/*
* sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
*
* $Id: sysctl_net_ipv4.c,v 1.46 2000/09/16 09:38:30 davem Exp $
* $Id: sysctl_net_ipv4.c,v 1.47 2000/10/19 15:51:02 davem Exp $
*
* Begun April 1, 1996, Mike Shaver.
* Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
......@@ -15,6 +15,9 @@
#include <net/route.h>
#include <net/tcp.h>
/* From af_inet.c */
extern int sysctl_ip_nonlocal_bind;
/* From icmp.c */
extern int sysctl_icmp_echo_ignore_all;
extern int sysctl_icmp_echo_ignore_broadcasts;
......@@ -110,6 +113,9 @@ ctl_table ipv4_table[] = {
{NET_IPV4_NO_PMTU_DISC, "ip_no_pmtu_disc",
&ipv4_config.no_pmtu_disc, sizeof(int), 0644, NULL,
&proc_dointvec},
{NET_IPV4_NONLOCAL_BIND, "ip_nonlocal_bind",
&sysctl_ip_nonlocal_bind, sizeof(int), 0644, NULL,
&proc_dointvec},
{NET_IPV4_TCP_SYN_RETRIES, "tcp_syn_retries",
&sysctl_tcp_syn_retries, sizeof(int), 0644, NULL, &proc_dointvec},
{NET_TCP_SYNACK_RETRIES, "tcp_synack_retries",
......
......@@ -5,7 +5,7 @@
*
* Implementation of the Transmission Control Protocol(TCP).
*
* Version: $Id: tcp_ipv4.c,v 1.217 2000/10/15 13:15:19 davem Exp $
* Version: $Id: tcp_ipv4.c,v 1.218 2000/10/18 18:04:22 davem Exp $
*
* IPv4 specific functions
*
......@@ -2097,7 +2097,7 @@ int tcp_get_info(char *buffer, char **start, off_t offset, int length)
continue;
pos += TMPSZ;
if (pos < offset)
if (pos <= offset)
continue;
get_openreq(sk, req, tmpbuf, num, uid);
len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf);
......@@ -2129,7 +2129,7 @@ int tcp_get_info(char *buffer, char **start, off_t offset, int length)
if (!TCP_INET_FAMILY(sk->family))
continue;
pos += TMPSZ;
if (pos < offset)
if (pos <= offset)
continue;
get_tcp_sock(sk, tmpbuf, num);
len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf);
......@@ -2144,7 +2144,7 @@ int tcp_get_info(char *buffer, char **start, off_t offset, int length)
if (!TCP_INET_FAMILY(tw->family))
continue;
pos += TMPSZ;
if (pos < offset)
if (pos <= offset)
continue;
get_timewait_sock(tw, tmpbuf, num);
len += sprintf(buffer+len, "%-*s\n", TMPSZ-1, tmpbuf);
......
......@@ -5,7 +5,7 @@
*
* The User Datagram Protocol (UDP).
*
* Version: $Id: udp.c,v 1.89 2000/10/03 07:29:01 anton Exp $
* Version: $Id: udp.c,v 1.90 2000/10/18 18:04:22 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
......@@ -1028,7 +1028,7 @@ int udp_get_info(char *buffer, char **start, off_t offset, int length)
if (sk->family != PF_INET)
continue;
pos += 128;
if (pos < offset)
if (pos <= offset)
continue;
get_udp_sock(sk, tmpbuf, i);
len += sprintf(buffer+len, "%-127s\n", tmpbuf);
......
......@@ -7,7 +7,7 @@
*
* Adapted from linux/net/ipv4/af_inet.c
*
* $Id: af_inet6.c,v 1.59 2000/10/15 01:34:45 davem Exp $
* $Id: af_inet6.c,v 1.60 2000/10/19 01:05:34 davem Exp $
*
* Fixes:
* Hideaki YOSHIFUJI : sin6_scope_id support
......
......@@ -7,7 +7,7 @@
*
* Adapted from linux/net/ipv4/raw.c
*
* $Id: raw.c,v 1.40 2000/08/09 11:59:04 davem Exp $
* $Id: raw.c,v 1.41 2000/10/18 18:04:23 davem Exp $
*
* Fixes:
* Hideaki YOSHIFUJI : sin6_scope_id support
......@@ -793,7 +793,7 @@ int raw6_get_info(char *buffer, char **start, off_t offset, int length)
if (sk->family != PF_INET6)
continue;
pos += LINE_LEN+1;
if (pos < offset)
if (pos <= offset)
continue;
get_raw6_sock(sk, tmpbuf, i);
len += sprintf(buffer+len, LINE_FMT, tmpbuf);
......
......@@ -5,7 +5,7 @@
* Authors:
* Pedro Roque <roque@di.fc.ul.pt>
*
* $Id: tcp_ipv6.c,v 1.125 2000/08/09 11:59:04 davem Exp $
* $Id: tcp_ipv6.c,v 1.126 2000/10/18 18:04:23 davem Exp $
*
* Based on:
* linux/net/ipv4/tcp.c
......@@ -2009,7 +2009,7 @@ int tcp6_get_info(char *buffer, char **start, off_t offset, int length)
if (req->class->family != PF_INET6)
continue;
pos += LINE_LEN+1;
if (pos < offset)
if (pos <= offset)
continue;
get_openreq6(sk, req, tmpbuf, num, uid);
len += sprintf(buffer+len, LINE_FMT, tmpbuf);
......@@ -2041,7 +2041,7 @@ int tcp6_get_info(char *buffer, char **start, off_t offset, int length)
if (sk->family != PF_INET6)
continue;
pos += LINE_LEN+1;
if (pos < offset)
if (pos <= offset)
continue;
get_tcp6_sock(sk, tmpbuf, num);
len += sprintf(buffer+len, LINE_FMT, tmpbuf);
......@@ -2056,7 +2056,7 @@ int tcp6_get_info(char *buffer, char **start, off_t offset, int length)
if (tw->family != PF_INET6)
continue;
pos += LINE_LEN+1;
if (pos < offset)
if (pos <= offset)
continue;
get_timewait6_sock(tw, tmpbuf, num);
len += sprintf(buffer+len, LINE_FMT, tmpbuf);
......
......@@ -7,7 +7,7 @@
*
* Based on linux/ipv4/udp.c
*
* $Id: udp.c,v 1.57 2000/09/18 05:59:48 davem Exp $
* $Id: udp.c,v 1.58 2000/10/18 18:04:23 davem Exp $
*
* Fixes:
* Hideaki YOSHIFUJI : sin6_scope_id support
......@@ -956,7 +956,7 @@ int udp6_get_info(char *buffer, char **start, off_t offset, int length)
if (sk->family != PF_INET6)
continue;
pos += LINE_LEN+1;
if (pos < offset)
if (pos <= offset)
continue;
get_udp6_sock(sk, tmpbuf, i);
len += sprintf(buffer+len, LINE_FMT, tmpbuf);
......
......@@ -5,7 +5,7 @@
*
* PACKET - implements raw packet sockets.
*
* Version: $Id: af_packet.c,v 1.44 2000/10/15 01:34:47 davem Exp $
* Version: $Id: af_packet.c,v 1.45 2000/10/19 01:05:35 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
......
......@@ -8,7 +8,7 @@
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Version: $Id: af_unix.c,v 1.106 2000/10/15 01:34:48 davem Exp $
* Version: $Id: af_unix.c,v 1.107 2000/10/19 01:05:36 davem Exp $
*
* Fixes:
* Linus Torvalds : Assorted bug cures.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment