]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.25 2.3.25
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:28:14 +0000 (15:28 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:28:14 +0000 (15:28 -0500)
29 files changed:
CREDITS
Documentation/kernel-parameters.txt
arch/i386/kernel/apm.c
arch/i386/kernel/i386_ksyms.c
arch/i386/kernel/process.c
arch/sparc/config.in
arch/sparc64/config.in
drivers/block/loop.c
drivers/misc/acpi.c
drivers/sbus/audio/Config.in
drivers/sbus/char/Config.in
drivers/scsi/scsi.c
drivers/sound/cmpci.c
drivers/sound/maestro.c
drivers/usb/audio.c
drivers/usb/cpia.c
drivers/usb/cpia.h
drivers/video/clgenfb.c
drivers/video/fbcon-mac.c
fs/buffer.c
fs/ncpfs/dir.c
fs/ncpfs/ncplib_kernel.c
fs/open.c
fs/proc/proc_misc.c
include/linux/acpi.h
include/linux/fb.h
kernel/exit.c
mm/swapfile.c
net/sunrpc/clnt.c

diff --git a/CREDITS b/CREDITS
index 749f212bdd31bf5202c253929a02ea36709bd9e8..c4cb6ccd3b0e364f160ac5e7a3ba323abd45dbcd 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -286,6 +286,10 @@ W: http://math-www.uni-paderborn.de/~axel/
 D: Configuration help text support
 D: Linux CD and Support Giveaway List
 
+N: Erik Inge Bolsø
+E: knan@mo.himolde.no
+D: Misc kernel hacks
+
 N: Zoltan Boszormenyi
 E: zboszor@mol.hu
 D: MTRR emulation with Cyrix style ARR registers
index 1eade18a4405363e85b158d7af716e48e1edce7c..e88c7c150ded911efb04cacf8b1478a7ff073d03 100644 (file)
@@ -20,6 +20,7 @@ restrictions referred to are that the relevant option is valid if:
     ISDN       Appropriate ISDN support is enabled.
     JOY        Appropriate joystick support is enabled.
     LP         Printer support is enabled.
+    LOOP       Loopback device support is enabled.
     MCA        MCA bus support is enabled.
     MDA        The MDA console is enabled.
     MOUSE      Appropriate mouse support is enabled.
@@ -208,6 +209,9 @@ or  lp=auto         driver.  'lp=reset' (which can be specified in
 
     mac5380=           [HW,SCSI]
 
+    max_loop=[0-255]   [LOOP] States the maximum number of loopback devices
+                       that can be mounted.
+
     maxcpus=           [SMP] States the maximum number of processors that
                        an SMP kernel should make use of.
 
index de8a3cd84a3905c99d04e845db9b798dac0e1342..9be0b1a8e4a69a92a8a0ca80d434471a71b599da 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/desc.h>
 
+/*
+ * Make APM look as much as just another ACPI module as possible..
+ */
+#include <linux/acpi.h>
+
+
 EXPORT_SYMBOL(apm_register_callback);
 EXPORT_SYMBOL(apm_unregister_callback);
 
@@ -1400,6 +1406,11 @@ static int apm(void *unused)
                        apm_bios_info.flags &= ~APM_BIOS_DISENGAGED;
        }
 
+/* Install our power off handler.. */
+#ifdef CONFIG_APM_POWER_OFF
+       acpi_power_off = apm_power_off;
+#endif
+
        apm_mainloop();
        return 0;
 }
index d9aa5ce581517ea678e5cb3f25b8f889c9c63720..7a275f9181f476223135680ed5cc00017af31df9 100644 (file)
@@ -45,6 +45,7 @@ EXPORT_SYMBOL(disable_irq);
 EXPORT_SYMBOL(disable_irq_nosync);
 EXPORT_SYMBOL(kernel_thread);
 EXPORT_SYMBOL(acpi_idle);
+EXPORT_SYMBOL(acpi_power_off);
 
 EXPORT_SYMBOL_NOVERS(__down_failed);
 EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
index 225246d97082d757e41fb0c3dfa80007ddffe2e0..934fb082eae04ede721dd2d3a34e91c099e65a60 100644 (file)
@@ -29,9 +29,6 @@
 #include <linux/delay.h>
 #include <linux/reboot.h>
 #include <linux/init.h>
-#if defined(CONFIG_APM) && defined(CONFIG_APM_POWER_OFF)
-#include <linux/apm_bios.h>
-#endif
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -66,6 +63,11 @@ void enable_hlt(void)
  */
 void (*acpi_idle)(void) = NULL;
 
+/*
+ * Power off function, if any
+ */
+void (*acpi_power_off)(void) = NULL;
+
 /*
  * The idle thread. There's no useful work to be
  * done, so just try to conserve power and have a
@@ -310,9 +312,8 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-#if defined(CONFIG_APM) && defined(CONFIG_APM_POWER_OFF)
-       apm_power_off();
-#endif
+       if (acpi_power_off)
+               acpi_power_off();
 }
 
 
index 6776cdeed438a4c311ed2a891c0a1bacf3ed5617..b9eec6ee2f2f32af5f443ea70fd8edd3a3677ecc 100644 (file)
@@ -9,63 +9,56 @@ comment 'Code maturity level options'
 bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL
 endmenu
 
-mainmenu_option next_comment
-comment 'Loadable module support'
-bool 'Enable loadable module support' CONFIG_MODULES
-if [ "$CONFIG_MODULES" = "y" ]; then
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel module loader' CONFIG_KMOD
-fi
-endmenu
-
 mainmenu_option next_comment
 comment 'General setup'
 
 define_bool CONFIG_VT y
 define_bool CONFIG_VT_CONSOLE y
 
-bool 'Support for AP1000 multicomputer' CONFIG_AP1000
 bool 'Symmetric multi-processing support (does not work on sun4/sun4c)' CONFIG_SMP
 
+bool 'Support for AP1000 multicomputer' CONFIG_AP1000
 if [ "$CONFIG_AP1000" = "y" ]; then
-       define_bool CONFIG_NO_KEYBOARD y
-       define_bool CONFIG_FDDI y
-       define_bool CONFIG_APFDDI y
-       define_bool CONFIG_APBLOCK y
-       define_bool CONFIG_APBIF y
-       tristate 'OPIU DDV Driver' CONFIG_DDV
+   define_bool CONFIG_NO_KEYBOARD y
+   define_bool CONFIG_FDDI y
+   define_bool CONFIG_APFDDI y
+   define_bool CONFIG_APBLOCK y
+   define_bool CONFIG_APBIF y
+   tristate '  OPIU DDV Driver' CONFIG_DDV
 else
-       bool 'Support for SUN4 machines (disables SUN4[CDM] support)' CONFIG_SUN4
-       if [ "$CONFIG_SUN4" != "y" ]; then
-               bool 'Support for PCI and PS/2 keyboard/mouse' CONFIG_PCI
-       fi
-
-       mainmenu_option next_comment
-       comment 'Console drivers'
-       bool 'PROM console' CONFIG_PROM_CONSOLE
-       bool 'Support Frame buffer devices' CONFIG_FB
-       source drivers/video/Config.in
-       endmenu
-
-       # Global things across all Sun machines.
-       define_bool CONFIG_SBUS y
-       define_bool CONFIG_SBUSCHAR y
-       define_bool CONFIG_BUSMOUSE y
-       define_bool CONFIG_SUN_MOUSE y
-       define_bool CONFIG_SERIAL y
-       define_bool CONFIG_SUN_SERIAL y
-       define_bool CONFIG_SERIAL_CONSOLE y
-       define_bool CONFIG_SUN_KEYBOARD y
-       define_bool CONFIG_SUN_CONSOLE y
-       define_bool CONFIG_SUN_AUXIO y
-       define_bool CONFIG_SUN_IO y
-       if [ "$CONFIG_SUN4" != "y" ]; then
-               source drivers/sbus/char/Config.in
-               source drivers/sbus/audio/Config.in
-       fi
+   bool 'Support for SUN4 machines (disables SUN4[CDM] support)' CONFIG_SUN4
+   if [ "$CONFIG_SUN4" != "y" ]; then
+      bool '  Support for PCI and PS/2 keyboard/mouse' CONFIG_PCI
+   fi
+
+   mainmenu_option next_comment
+   comment 'Console drivers'
+   bool 'PROM console' CONFIG_PROM_CONSOLE
+   bool 'Support Frame buffer devices' CONFIG_FB
+   source drivers/video/Config.in
+   endmenu
+
+   # Global things across all Sun machines.
+   define_bool CONFIG_SBUS y
+   define_bool CONFIG_SBUSCHAR y
+   define_bool CONFIG_BUSMOUSE y
+   define_bool CONFIG_SUN_MOUSE y
+   define_bool CONFIG_SERIAL y
+   define_bool CONFIG_SUN_SERIAL y
+   define_bool CONFIG_SERIAL_CONSOLE y
+   define_bool CONFIG_SUN_KEYBOARD y
+   define_bool CONFIG_SUN_CONSOLE y
+   define_bool CONFIG_SUN_AUXIO y
+   define_bool CONFIG_SUN_IO y
+   if [ "$CONFIG_SUN4" != "y" ]; then
+      source drivers/sbus/char/Config.in
+      source drivers/sbus/audio/Config.in
+   fi
 fi
 
-tristate 'Openprom tree appears in /proc/openprom (EXPERIMENTAL)' CONFIG_SUN_OPENPROMFS
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+   tristate 'Openprom tree appears in /proc/openprom (EXPERIMENTAL)' CONFIG_SUN_OPENPROMFS
+fi
 bool 'Networking support' CONFIG_NET
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
@@ -77,6 +70,15 @@ source drivers/parport/Config.in
 dep_tristate '  Parallel printer support' CONFIG_PRINTER $CONFIG_PARPORT
 endmenu
 
+mainmenu_option next_comment
+comment 'Loadable module support'
+bool 'Enable loadable module support' CONFIG_MODULES
+if [ "$CONFIG_MODULES" = "y" ]; then
+   bool '  Set version information on all symbols for modules' CONFIG_MODVERSIONS
+   bool '  Kernel module loader' CONFIG_KMOD
+fi
+endmenu
+
 mainmenu_option next_comment
 comment 'Floppy, IDE, and other block devices'
 
@@ -84,15 +86,15 @@ bool 'Normal floppy disk support' CONFIG_BLK_DEV_FD
 
 bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD
 if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then
-  tristate '   Linear (append) mode' CONFIG_MD_LINEAR
-  tristate '   RAID-0 (striping) mode' CONFIG_MD_STRIPED
-  tristate '   RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
-  tristate '   RAID-4/RAID-5 mode' CONFIG_MD_RAID5
+   tristate '  Linear (append) mode' CONFIG_MD_LINEAR
+   tristate '  RAID-0 (striping) mode' CONFIG_MD_STRIPED
+   tristate '  RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
+   tristate '  RAID-4/RAID-5 mode' CONFIG_MD_RAID5
 fi
 
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
-  bool '   Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
+   bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
 fi
 
 tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
@@ -101,7 +103,7 @@ tristate 'Network block device support' CONFIG_BLK_DEV_NBD
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-       source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -109,7 +111,7 @@ comment 'ISDN subsystem'
 
 tristate 'ISDN support' CONFIG_ISDN
 if [ "$CONFIG_ISDN" != "n" ]; then
-  source drivers/isdn/Config.in
+   source drivers/isdn/Config.in
 fi
 endmenu
 
@@ -119,65 +121,65 @@ comment 'SCSI support'
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-       comment 'SCSI support type (disk, tape, CDrom)'
+   comment 'SCSI support type (disk, tape, CDrom)'
 
-       dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
-       dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
-       dep_tristate 'SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
-       if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then
-         bool '  Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR
-       fi
-       dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
+   dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
+   dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
+   dep_tristate '  SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
+   if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then
+      bool '    Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR
+   fi
+   dep_tristate '  SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
 
-       comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
+   comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
 
-       bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
+   bool '  Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
 
-       bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
+   bool '  Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
 
-       mainmenu_option next_comment
-       comment 'SCSI low-level drivers'
+   mainmenu_option next_comment
+   comment 'SCSI low-level drivers'
 
-       bool 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
-       tristate 'PTI Qlogic,ISP Driver' CONFIG_SCSI_QLOGICPTI $CONFIG_SCSI
-       endmenu
+   bool 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
+   tristate 'PTI Qlogic,ISP Driver' CONFIG_SCSI_QLOGICPTI $CONFIG_SCSI
+   endmenu
 fi
 endmenu
 
 source drivers/fc4/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-       mainmenu_option next_comment
-       comment 'Network device support'
-
-       bool 'Network device support' CONFIG_NETDEVICES
-       if [ "$CONFIG_NETDEVICES" = "y" ]; then
-               tristate 'Dummy net driver support' CONFIG_DUMMY
-               tristate 'PPP (point-to-point) support' CONFIG_PPP
-               if [ ! "$CONFIG_PPP" = "n" ]; then
-                  comment 'CCP compressors for PPP are only built as modules.'
-               fi
-               tristate 'SLIP (serial line) support' CONFIG_SLIP
-               if [ "$CONFIG_SLIP" != "n" ]; then
-                 bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
-                 bool ' Keepalive and linefill' CONFIG_SLIP_SMART
-                 bool ' Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6
-               fi
-               tristate 'Sun LANCE support' CONFIG_SUNLANCE
-               tristate 'Sun Happy Meal 10/100baseT support' CONFIG_HAPPYMEAL
-               if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-                 tristate 'Sun BigMAC 10/100baseT support' CONFIG_SUNBMAC
-               fi
-               tristate 'Sun QuadEthernet support' CONFIG_SUNQE
-               tristate 'MyriCOM Gigabit Ethernet support' CONFIG_MYRI_SBUS
-#              bool 'FDDI driver support' CONFIG_FDDI
-#              if [ "$CONFIG_FDDI" = "y" ]; then
-#              fi
-               if [ "$CONFIG_ATM" = "y" ]; then
-                 source drivers/atm/Config.in
-               fi
-       fi
-       endmenu
+   mainmenu_option next_comment
+   comment 'Network device support'
+
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      tristate '  Dummy net driver support' CONFIG_DUMMY
+      tristate '  PPP (point-to-point) support' CONFIG_PPP
+      if [ ! "$CONFIG_PPP" = "n" ]; then
+        comment 'CCP compressors for PPP are only built as modules.'
+      fi
+      tristate '  SLIP (serial line) support' CONFIG_SLIP
+      if [ "$CONFIG_SLIP" != "n" ]; then
+        bool '    CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
+        bool '    Keepalive and linefill' CONFIG_SLIP_SMART
+        bool '    Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6
+      fi
+      tristate '  Sun LANCE support' CONFIG_SUNLANCE
+      tristate '  Sun Happy Meal 10/100baseT support' CONFIG_HAPPYMEAL
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+        tristate '  Sun BigMAC 10/100baseT support (EXPERIMENTAL)' CONFIG_SUNBMAC
+      fi
+      tristate '  Sun QuadEthernet support' CONFIG_SUNQE
+      tristate '  MyriCOM Gigabit Ethernet support' CONFIG_MYRI_SBUS
+#      bool '  FDDI driver support' CONFIG_FDDI
+#      if [ "$CONFIG_FDDI" = "y" ]; then
+#      fi
+      if [ "$CONFIG_ATM" = "y" ]; then
+        source drivers/atm/Config.in
+      fi
+   fi
+   endmenu
 fi
 
 # This one must be before the filesystem configs. -DaveM
@@ -185,7 +187,7 @@ mainmenu_option next_comment
 comment 'Unix98 PTY support'
 bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS
 if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
-       int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
+   int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
 fi
 endmenu
 
@@ -202,4 +204,3 @@ comment 'Kernel hacking'
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
 endmenu
-
index ee4d1bb99690ad1dd0081e806b7e73cf2cb80e6a..e6c0b5e5ae0666cbf2b61cf1795154a141679bf5 100644 (file)
@@ -9,15 +9,6 @@ comment 'Code maturity level options'
 bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL
 endmenu
 
-mainmenu_option next_comment
-comment 'Loadable module support'
-bool 'Enable loadable module support' CONFIG_MODULES
-if [ "$CONFIG_MODULES" = "y" ]; then
-  bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
-  bool 'Kernel module loader' CONFIG_KMOD
-fi
-endmenu
-
 mainmenu_option next_comment
 comment 'General setup'
 
@@ -49,25 +40,36 @@ bool 'PCI support' CONFIG_PCI
 source drivers/sbus/char/Config.in
 source drivers/sbus/audio/Config.in
 
-tristate 'Openprom tree appears in /proc/openprom (EXPERIMENTAL)' CONFIG_SUN_OPENPROMFS
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+   tristate 'Openprom tree appears in /proc/openprom (EXPERIMENTAL)' CONFIG_SUN_OPENPROMFS
+fi
 bool 'Networking support' CONFIG_NET
 bool 'System V IPC' CONFIG_SYSVIPC
 bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
 bool 'Kernel support for Linux/Sparc 32bit binary compatibility' CONFIG_SPARC32_COMPAT
-tristate 'Kernel support for 64-bit ELF binaries' CONFIG_BINFMT_ELF
 if [ "$CONFIG_SPARC32_COMPAT" != "n" ]; then
-  tristate 'Kernel support for 32-bit ELF binaries' CONFIG_BINFMT_ELF32
-  bool 'Kernel support for 32-bit (ie. SunOS) a.out binaries' CONFIG_BINFMT_AOUT32
+   tristate '  Kernel support for 32-bit ELF binaries' CONFIG_BINFMT_ELF32
+   bool '  Kernel support for 32-bit (ie. SunOS) a.out binaries' CONFIG_BINFMT_AOUT32
 fi
+tristate 'Kernel support for 64-bit ELF binaries' CONFIG_BINFMT_ELF
 tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Solaris binary emulation' CONFIG_SOLARIS_EMUL
+   tristate 'Solaris binary emulation (EXPERIMENTAL)' CONFIG_SOLARIS_EMUL
 fi
 source drivers/parport/Config.in
 dep_tristate '  Parallel printer support' CONFIG_PRINTER $CONFIG_PARPORT
 if [ "$CONFIG_PCI" = "y" ]; then
-  tristate 'SUNW,envctrl support' CONFIG_ENVCTRL
+   tristate 'SUNW, envctrl support' CONFIG_ENVCTRL
+fi
+endmenu
+
+mainmenu_option next_comment
+comment 'Loadable module support'
+bool 'Enable loadable module support' CONFIG_MODULES
+if [ "$CONFIG_MODULES" = "y" ]; then
+   bool '  Set version information on all symbols for modules' CONFIG_MODVERSIONS
+   bool '  Kernel module loader' CONFIG_KMOD
 fi
 endmenu
 
@@ -78,41 +80,41 @@ bool 'Normal floppy disk support' CONFIG_BLK_DEV_FD
 
 bool 'Multiple devices driver support' CONFIG_BLK_DEV_MD
 if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then
-  tristate '   Linear (append) mode' CONFIG_MD_LINEAR
-  tristate '   RAID-0 (striping) mode' CONFIG_MD_STRIPED
-  tristate '   RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
-  tristate '   RAID-4/RAID-5 mode' CONFIG_MD_RAID5
+   tristate '  Linear (append) mode' CONFIG_MD_LINEAR
+   tristate '  RAID-0 (striping) mode' CONFIG_MD_STRIPED
+   tristate '  RAID-1 (mirroring) mode' CONFIG_MD_MIRRORING
+   tristate '  RAID-4/RAID-5 mode' CONFIG_MD_RAID5
 fi
 
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
-  bool '   Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
+   bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD
 fi
 
 tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
 tristate 'Network block device support' CONFIG_BLK_DEV_NBD
 
 if [ "$CONFIG_PCI" = "y" ]; then
-       tristate 'Ultra/PCI IDE disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE
-       if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
-         dep_tristate '   Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE
-         dep_tristate '   Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD $CONFIG_BLK_DEV_IDE
-         dep_tristate '   Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE $CONFIG_BLK_DEV_IDE
-         dep_tristate '   Include IDE/ATAPI FLOPPY support' CONFIG_BLK_DEV_IDEFLOPPY $CONFIG_BLK_DEV_IDE
-         dep_tristate '   SCSI emulation support' CONFIG_BLK_DEV_IDESCSI $CONFIG_BLK_DEV_IDE
-         define_bool CONFIG_BLK_DEV_IDEPCI y
-         define_bool CONFIG_BLK_DEV_IDEDMA y
-         define_bool CONFIG_IDEDMA_AUTO y
-         define_bool IDEDMA_NEW_DRIVE_LISTINGS y
-         define_bool CONFIG_BLK_DEV_NS87415 y
-         define_bool CONFIG_BLK_DEV_CMD646 y
-       fi
+   tristate 'Ultra/PCI IDE disk/cdrom/tape/floppy support' CONFIG_BLK_DEV_IDE
+   if [ "$CONFIG_BLK_DEV_IDE" != "n" ]; then
+      dep_tristate '  Include IDE/ATA-2 DISK support' CONFIG_BLK_DEV_IDEDISK $CONFIG_BLK_DEV_IDE
+      dep_tristate '  Include IDE/ATAPI CDROM support' CONFIG_BLK_DEV_IDECD $CONFIG_BLK_DEV_IDE
+      dep_tristate '  Include IDE/ATAPI TAPE support' CONFIG_BLK_DEV_IDETAPE $CONFIG_BLK_DEV_IDE
+      dep_tristate '  Include IDE/ATAPI FLOPPY support' CONFIG_BLK_DEV_IDEFLOPPY $CONFIG_BLK_DEV_IDE
+      dep_tristate '  SCSI emulation support' CONFIG_BLK_DEV_IDESCSI $CONFIG_BLK_DEV_IDE
+      define_bool CONFIG_BLK_DEV_IDEPCI y
+      define_bool CONFIG_BLK_DEV_IDEDMA y
+      define_bool CONFIG_IDEDMA_AUTO y
+      define_bool CONFIG_IDEDMA_NEW_DRIVE_LISTINGS y
+      define_bool CONFIG_BLK_DEV_NS87415 y
+      define_bool CONFIG_BLK_DEV_CMD646 y
+   fi
 fi
 
 endmenu
 
 if [ "$CONFIG_NET" = "y" ]; then
-       source net/Config.in
+   source net/Config.in
 fi
 
 mainmenu_option next_comment
@@ -121,95 +123,95 @@ comment 'SCSI support'
 tristate 'SCSI support' CONFIG_SCSI
 
 if [ "$CONFIG_SCSI" != "n" ]; then
-       comment 'SCSI support type (disk, tape, CDrom)'
-
-       dep_tristate 'SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
-       dep_tristate 'SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
-       dep_tristate 'SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
-       if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then
-         bool '  Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR
-       fi
-       dep_tristate 'SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
-
-       comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
-
-       bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
-
-       bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
-
-       mainmenu_option next_comment
-       comment 'SCSI low-level drivers'
-
-       bool 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
-       tristate 'PTI Qlogic,ISP Driver' CONFIG_SCSI_QLOGICPTI $CONFIG_SCSI
-
-       if [ "$CONFIG_PCI" != "n" ]; then
-         dep_tristate 'Adaptec AIC7xxx support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI
-         if [ "$CONFIG_SCSI_AIC7XXX" != "n" ]; then
-           bool '   Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT
-           int  '   Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8
-           bool '   Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N
-           int  '   Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5
-         fi
-         dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
-         if [ "$CONFIG_SCSI_NCR53C8XX" != "n" ]; then
-           int  '  default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
-           int  '  maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
-           int  '  synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 10
-           bool '  enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE
-           if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then
-             bool '  not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
-           fi
-           if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-             bool '  assume boards are SYMBIOS compatible' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
-           fi
-         fi
-          dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
-       fi
-
-       endmenu
+   comment 'SCSI support type (disk, tape, CDrom)'
+
+   dep_tristate '  SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI
+   dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
+   dep_tristate '  SCSI CDROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI
+   if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then
+      bool '    Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR
+   fi
+   dep_tristate '  SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI
+
+   comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
+
+   bool '  Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN
+
+   bool '  Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS
+
+   mainmenu_option next_comment
+   comment 'SCSI low-level drivers'
+
+   bool 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
+   tristate 'PTI Qlogic, ISP Driver' CONFIG_SCSI_QLOGICPTI $CONFIG_SCSI
+
+   if [ "$CONFIG_PCI" != "n" ]; then
+      dep_tristate 'Adaptec AIC7xxx support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI
+      if [ "$CONFIG_SCSI_AIC7XXX" != "n" ]; then
+        bool '  Enable tagged command queueing (TCQ) by default' CONFIG_AIC7XXX_TAGGED_QUEUEING Y
+        int  '  Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8
+        bool '  Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS N
+        int  '  Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5
+      fi
+      dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI
+      if [ "$CONFIG_SCSI_NCR53C8XX" != "n" ]; then
+        int 'default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8
+        int 'maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32
+        int 'synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 10
+        bool '  enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE
+        if [ "$CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS" = "0" ]; then
+           bool '  not allow targets to disconnect' CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
+        fi
+        if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+           bool '  assume boards are SYMBIOS compatible (EXPERIMENTAL)' CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
+        fi
+      fi
+      dep_tristate 'Qlogic ISP SCSI support' CONFIG_SCSI_QLOGIC_ISP $CONFIG_SCSI
+   fi
+
+   endmenu
 fi
 endmenu
 
 source drivers/fc4/Config.in
 
 if [ "$CONFIG_NET" = "y" ]; then
-       mainmenu_option next_comment
-       comment 'Network device support'
-
-       bool 'Network device support' CONFIG_NETDEVICES
-       if [ "$CONFIG_NETDEVICES" = "y" ]; then
-               tristate 'Dummy net driver support' CONFIG_DUMMY
-               tristate 'PPP (point-to-point) support' CONFIG_PPP
-               if [ ! "$CONFIG_PPP" = "n" ]; then
-                  comment 'CCP compressors for PPP are only built as modules.'
-               fi
-               tristate 'SLIP (serial line) support' CONFIG_SLIP
-               if [ "$CONFIG_SLIP" != "n" ]; then
-                 bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
-                 bool ' Keepalive and linefill' CONFIG_SLIP_SMART
-                 bool ' Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6
-               fi
-               bool 'Sun LANCE support' CONFIG_SUNLANCE
-               tristate 'Sun Happy Meal 10/100baseT support' CONFIG_HAPPYMEAL
-               if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-                 tristate 'Sun BigMAC 10/100baseT support' CONFIG_SUNBMAC
-               fi
-               tristate 'Sun QuadEthernet support' CONFIG_SUNQE
-               tristate 'MyriCOM Gigabit Ethernet support' CONFIG_MYRI_SBUS
-               if [ "$CONFIG_PCI" = "y" ]; then
-                       tristate 'Generic DECchip & DIGITAL EtherWORKS PCI/EISA' CONFIG_DE4X5
-                       tristate '3c590/3c900 series (592/595/597) "Vortex/Boomerang" support' CONFIG_VORTEX
-                       tristate 'RealTek 8129/8139 (not 8019/8029!) support' CONFIG_RTL8139
-                       tristate 'PCI NE2000 support' CONFIG_NE2K_PCI
-                       tristate 'EtherExpressPro/100 support' CONFIG_EEXPRESS_PRO100
-                       tristate 'Adaptec Starfire support' CONFIG_ADAPTEC_STARFIRE
-               fi
-#              bool 'FDDI driver support' CONFIG_FDDI
-#              if [ "$CONFIG_FDDI" = "y" ]; then
-#              fi
-       fi
-       endmenu
+   mainmenu_option next_comment
+   comment 'Network device support'
+
+   bool 'Network device support' CONFIG_NETDEVICES
+   if [ "$CONFIG_NETDEVICES" = "y" ]; then
+      tristate '  Dummy net driver support' CONFIG_DUMMY
+      tristate '  PPP (point-to-point) support' CONFIG_PPP
+      if [ ! "$CONFIG_PPP" = "n" ]; then
+        comment '    CCP compressors for PPP are only built as modules.'
+      fi
+      tristate '  SLIP (serial line) support' CONFIG_SLIP
+      if [ "$CONFIG_SLIP" != "n" ]; then
+        bool '    CSLIP compressed headers' CONFIG_SLIP_COMPRESSED
+        bool '    Keepalive and linefill' CONFIG_SLIP_SMART
+        bool '    Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6
+      fi
+      bool '  Sun LANCE support' CONFIG_SUNLANCE
+      tristate '  Sun Happy Meal 10/100baseT support' CONFIG_HAPPYMEAL
+      if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+        tristate '  Sun BigMAC 10/100baseT support (EXPERIMENTAL)' CONFIG_SUNBMAC
+      fi
+      tristate '  Sun QuadEthernet support' CONFIG_SUNQE
+      tristate '  MyriCOM Gigabit Ethernet support' CONFIG_MYRI_SBUS
+      if [ "$CONFIG_PCI" = "y" ]; then
+        tristate '  Generic DECchip & DIGITAL EtherWORKS PCI/EISA' CONFIG_DE4X5
+        tristate '  3c590/3c900 series (592/595/597) "Vortex/Boomerang" support' CONFIG_VORTEX
+        tristate '  RealTek 8129/8139 (not 8019/8029!) support' CONFIG_RTL8139
+        tristate '  PCI NE2000 support' CONFIG_NE2K_PCI
+        tristate '  EtherExpressPro/100 support' CONFIG_EEXPRESS_PRO100
+        tristate '  Adaptec Starfire support' CONFIG_ADAPTEC_STARFIRE
+      fi
+#      bool '  FDDI driver support' CONFIG_FDDI
+#      if [ "$CONFIG_FDDI" = "y" ]; then
+#      fi
+   fi
+endmenu
 fi
 
 # This one must be before the filesystem configs. -DaveM
@@ -217,7 +219,7 @@ mainmenu_option next_comment
 comment 'Unix 98 PTY support'
 bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS
 if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
-       int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
+   int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
 fi
 endmenu
 
@@ -225,9 +227,9 @@ mainmenu_option next_comment
 comment 'Video For Linux'
 tristate 'Video For Linux' CONFIG_VIDEO_DEV
 if [ "$CONFIG_VIDEO_DEV" != "n" ]; then
-  if [ "$CONFIG_PCI" != "n" ]; then
-    dep_tristate 'BT848 Video For Linux' CONFIG_VIDEO_BT848 $CONFIG_VIDEO_DEV
-  fi
+   if [ "$CONFIG_PCI" != "n" ]; then
+      dep_tristate '  BT848 Video For Linux' CONFIG_VIDEO_BT848 $CONFIG_VIDEO_DEV
+   fi
 fi
 endmenu
 
index 45f91b2da2a56eb067b2c47a8577d83af8704fcb..d83f2b66a6067e4bb3be65d0a274623f7dcd10c6 100644 (file)
  * Reed H. Petty, rhp@draper.net
  *
  * Maximum number of loop devices now dynamic via max_loop module parameter.
- * Still fixed at 8 devices when compiled into the kernel normally.
  * Russell Kroll <rkroll@exploits.org> 19990701
  * 
+ * Maximum number of loop devices when compiled-in now selectable by passing
+ * max_loop=<1-255> to the kernel on boot.
+ * Erik I. Bolsø, <eriki@himolde.no>, Oct 31, 1999
+ *
  * Still To Fix:
  * - Advisory locking is ignored here. 
  * - Should use an own CAP_* category instead of CAP_SYS_ADMIN 
@@ -723,15 +726,12 @@ int __init loop_init(void)
        }
 
        if ((max_loop < 1) || (max_loop > 255)) {
-               printk (KERN_WARNING "loop: max_loop must be between 1 and 255\n");
-               return -EINVAL;
+               printk (KERN_WARNING "loop: invalid max_loop (must be between 1 and 255), using default (8)\n");
+               max_loop = 8;
        }
 
-#ifndef MODULE
        printk(KERN_INFO "loop: registered device at major %d\n", MAJOR_NR);
-#else
        printk(KERN_INFO "loop: enabling %d loop devices\n", max_loop);
-#endif
 
        loop_dev = kmalloc (max_loop * sizeof(struct loop_device), GFP_KERNEL);
        if (!loop_dev) {
@@ -778,3 +778,13 @@ void cleanup_module(void)
        kfree (loop_blksizes);
 }
 #endif
+
+#ifndef MODULE
+static int __init max_loop_setup(char *str)
+{
+       max_loop = simple_strtol(str,NULL,0);
+       return 1;
+}
+
+__setup("max_loop=", max_loop_setup);
+#endif
index 093a7bbb8b31cf03547dafef97faf7df21acb98c..3538155a581582c2b295f40cf106ef6db26ca64d 100644 (file)
@@ -74,6 +74,7 @@ static struct ctl_table_header *acpi_sysctl = NULL;
 
 static struct acpi_facp *acpi_facp = NULL;
 static int acpi_fake_facp = 0;
+static struct acpi_facs *acpi_facs = NULL;
 static unsigned long acpi_facp_addr = 0;
 static unsigned long acpi_dsdt_addr = 0;
 
@@ -88,8 +89,19 @@ static unsigned long acpi_p_lvl2_lat = ~0UL;
 static unsigned long acpi_p_lvl3_lat = ~0UL;
 
 /* Initialize to guaranteed harmless port read */
-static unsigned long acpi_p_lvl2 = 0x80;
-static unsigned long acpi_p_lvl3 = 0x80;
+static unsigned long acpi_p_lvl2 = ACPI_P_LVL_DISABLED;
+static unsigned long acpi_p_lvl3 = ACPI_P_LVL_DISABLED;
+
+// bits 8-15 are SLP_TYPa, bits 0-7 are SLP_TYPb
+static unsigned long acpi_slp_typ[] = 
+{
+       ACPI_SLP_TYP_DISABLED, /* S0 */
+       ACPI_SLP_TYP_DISABLED, /* S1 */
+       ACPI_SLP_TYP_DISABLED, /* S2 */
+       ACPI_SLP_TYP_DISABLED, /* S3 */
+       ACPI_SLP_TYP_DISABLED, /* S4 */
+       ACPI_SLP_TYP_DISABLED  /* S5 */
+};
 
 static struct ctl_table acpi_table[] =
 {
@@ -125,10 +137,14 @@ static struct ctl_table acpi_table[] =
 
        {ACPI_P_LVL2_LAT, "p_lvl2_lat",
         &acpi_p_lvl2_lat, sizeof(acpi_p_lvl2_lat),
-        0600, NULL, &acpi_do_ulong},
+        0644, NULL, &acpi_do_ulong},
 
        {ACPI_P_LVL3_LAT, "p_lvl3_lat",
         &acpi_p_lvl3_lat, sizeof(acpi_p_lvl3_lat),
+        0644, NULL, &acpi_do_ulong},
+
+       {ACPI_S5_SLP_TYP, "s5_slp_typ",
+        &acpi_slp_typ[5], sizeof(acpi_slp_typ[5]),
         0600, NULL, &acpi_do_ulong},
 
        {0}
@@ -136,7 +152,7 @@ static struct ctl_table acpi_table[] =
 
 static struct ctl_table acpi_dir_table[] =
 {
-       {CTL_ACPI, "acpi", NULL, 0, 0500, acpi_table},
+       {CTL_ACPI, "acpi", NULL, 0, 0555, acpi_table},
        {0}
 };
 
@@ -379,6 +395,11 @@ static int __init acpi_find_tables(void)
                        acpi_facp = (struct acpi_facp*) dt;
                        acpi_facp_addr = *rsdt_entry;
                        acpi_dsdt_addr = acpi_facp->dsdt;
+
+                       if (acpi_facp->facs) {
+                               acpi_facs = (struct acpi_facs*)
+                                       acpi_map_table(acpi_facp->facs);
+                       }
                }
                else {
                        acpi_unmap_table(dt);
@@ -405,6 +426,7 @@ static void acpi_destroy_tables(void)
                acpi_unmap_table((struct acpi_table*) acpi_facp);
        else
                kfree(acpi_facp);
+       acpi_unmap_table((struct acpi_table*) acpi_facs);
 }
 
 /*
@@ -575,8 +597,8 @@ static void acpi_idle_handler(void)
        case 3:
                pm2_cnt = acpi_facp->pm2_cnt;
                if (pm2_cnt) {
-                       /* Disable PCI arbitration while sleeping,
-                          to avoid DMA corruption? */
+                               /* Disable PCI arbitration while sleeping,
+                                  to avoid DMA corruption? */
                        outb(inb(pm2_cnt) | ACPI_ARB_DIS, pm2_cnt);
                        inb(acpi_p_lvl3);
                        outb(inb(pm2_cnt) & ~ACPI_ARB_DIS, pm2_cnt);
@@ -601,6 +623,42 @@ static void acpi_idle_handler(void)
                sleep_level = 1;
 }
 
+/*
+ * Enter system sleep state
+ */
+static void acpi_enter_sx(int state)
+{
+       unsigned long slp_typ = acpi_slp_typ[state];
+       if (slp_typ != ACPI_SLP_TYP_DISABLED) {
+               u16 typa, typb, value;
+
+               // bits 8-15 are SLP_TYPa, bits 0-7 are SLP_TYPb
+               typa = (slp_typ >> 8) & 0xff;
+               typb = slp_typ & 0xff;
+
+               typa = ((typa << ACPI_SLP_TYP_SHIFT) & ACPI_SLP_TYP_MASK);
+               typb = ((typb << ACPI_SLP_TYP_SHIFT) & ACPI_SLP_TYP_MASK);
+
+               // set SLP_TYPa/b and SLP_EN
+               if (acpi_facp->pm1a_cnt) {
+                       value = inw(acpi_facp->pm1a_cnt) & ~ACPI_SLP_TYP_MASK;
+                       outw(value | typa | ACPI_SLP_EN, acpi_facp->pm1a_cnt);
+               }
+               if (acpi_facp->pm1b_cnt) {
+                       value = inw(acpi_facp->pm1b_cnt) & ~ACPI_SLP_TYP_MASK;
+                       outw(value | typb | ACPI_SLP_EN, acpi_facp->pm1b_cnt);
+               }
+       }
+}
+
+/*
+ * Enter soft-off (S5)
+ */
+static void acpi_power_off_handler(void)
+{
+       acpi_enter_sx(5);
+}
+
 /*
  * Claim ACPI I/O ports
  */
@@ -806,7 +864,7 @@ static int acpi_do_event(ctl_table *ctl,
                         size_t *len)
 {
        u32 pm1_status = 0, gpe_status = 0;
-       char str[4 * sizeof(u32) + 6];
+       char str[4 * sizeof(u32) + 7];
        int size;
 
        if (write)
@@ -879,6 +937,7 @@ static int __init acpi_init(void)
                return 0;
 #endif
 
+       acpi_power_off = acpi_power_off_handler;
        acpi_idle = acpi_idle_handler;
 
        return 0;
@@ -890,6 +949,7 @@ static int __init acpi_init(void)
 static void __exit acpi_exit(void)
 {
        acpi_idle = NULL;
+       acpi_power_off = NULL;
 
        unregister_sysctl_table(acpi_sysctl);
        acpi_disable(acpi_facp);
index 34f8124cd77afeddf56b4015b2f8a092435e52bd..b856f47d3db816f5e0058d20b8cef7c198be2041 100644 (file)
@@ -4,11 +4,11 @@
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
 
-  comment 'Linux/SPARC audio subsystem (EXPERIMENTAL)'
+   comment 'Linux/SPARC audio subsystem (EXPERIMENTAL)'
 
-  tristate 'Audio support (EXPERIMENTAL)' CONFIG_SPARCAUDIO
-  dep_tristate '  AMD7930 Lowlevel Driver' CONFIG_SPARCAUDIO_AMD7930 $CONFIG_SPARCAUDIO
-  dep_tristate '  CS4231 Lowlevel Driver' CONFIG_SPARCAUDIO_CS4231 $CONFIG_SPARCAUDIO
-  dep_tristate '  DBRI Lowlevel Driver' CONFIG_SPARCAUDIO_DBRI $CONFIG_SPARCAUDIO
-  dep_tristate '  Dummy Lowlevel Driver' CONFIG_SPARCAUDIO_DUMMY $CONFIG_SPARCAUDIO
+   tristate 'Audio support (EXPERIMENTAL)' CONFIG_SPARCAUDIO
+   dep_tristate '  AMD7930 Lowlevel Driver' CONFIG_SPARCAUDIO_AMD7930 $CONFIG_SPARCAUDIO
+   dep_tristate '  CS4231 Lowlevel Driver' CONFIG_SPARCAUDIO_CS4231 $CONFIG_SPARCAUDIO
+   dep_tristate '  DBRI Lowlevel Driver' CONFIG_SPARCAUDIO_DBRI $CONFIG_SPARCAUDIO
+   dep_tristate '  Dummy Lowlevel Driver' CONFIG_SPARCAUDIO_DUMMY $CONFIG_SPARCAUDIO
 fi
index 7b9cda19c1de6de900912807c73d7c9a7b3ce2d2..010fdcd02b558480f6a8a5b5819d23e2b2edcc70 100644 (file)
@@ -2,21 +2,21 @@ comment 'Misc Linux/SPARC drivers'
 tristate '/dev/openprom device support' CONFIG_SUN_OPENPROMIO
 tristate 'Mostek real time clock support' CONFIG_SUN_MOSTEK_RTC
 if [ "$ARCH" = "sparc64" ]; then
-       if [ "$CONFIG_PCI" = "y" ]; then
-               tristate 'Siemens SAB82532 serial support' CONFIG_SAB82532
-       fi
-       tristate 'OBP Flash Device support' CONFIG_OBP_FLASH
+   if [ "$CONFIG_PCI" = "y" ]; then
+      tristate 'Siemens SAB82532 serial support' CONFIG_SAB82532
+   fi
+   tristate 'OBP Flash Device support' CONFIG_OBP_FLASH
 fi
 
 if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
-  tristate 'Bidirectional parallel port support (obsolete)' CONFIG_SUN_BPP
-  tristate 'Videopix Frame Grabber (EXPERIMENTAL)' CONFIG_SUN_VIDEOPIX
-  tristate 'Aurora Multiboard 1600se (EXPERIMENTAL)' CONFIG_SUN_AURORA
-  tristate 'Tadpole TS102 Microcontroller support' CONFIG_TADPOLE_TS102_UCTRL
+   tristate 'Bidirectional parallel port support (OBSOLETE)' CONFIG_SUN_BPP
+   tristate 'Videopix Frame Grabber (EXPERIMENTAL)' CONFIG_SUN_VIDEOPIX
+   tristate 'Aurora Multiboard 1600se (EXPERIMENTAL)' CONFIG_SUN_AURORA
+   tristate 'Tadpole TS102 Microcontroller support (EXPERIMENTAL)' CONFIG_TADPOLE_TS102_UCTRL
 
-  # XXX Why don't we do "source drivers/char/Config.in" somewhere?
-  if [ "$CONFIG_PCI" = "y" ]; then
-    define_bool CONFIG_APM_RTC_IS_GMT y                # no shit
-    bool 'PC-style RTC' CONFIG_RTC
-  fi
+   # XXX Why don't we do "source drivers/char/Config.in" somewhere?
+   if [ "$CONFIG_PCI" = "y" ]; then
+      define_bool CONFIG_APM_RTC_IS_GMT y              # no shit
+      bool 'PC-style RTC' CONFIG_RTC
+   fi
 fi
index ed26de08f6a544b498c0d262a038e8c9fdca51a9..22e89c58887923115429547c05b70ef9efc0d282 100644 (file)
@@ -263,6 +263,7 @@ static struct dev_info device_list[] =
                                                                 * SCSI code to reset bus.*/
        {"QUANTUM", "LPS525S", "3110", BLIST_NOLUN},            /* Locks sometimes if polled for lun != 0 */
        {"QUANTUM", "PD1225S", "3110", BLIST_NOLUN},            /* Locks sometimes if polled for lun != 0 */
+       {"QUANTUM", "FIREBALL ST4.3S", "0F0C", BLIST_NOLUN},    /* Locks up when polled for lun != 0 */
        {"MEDIAVIS", "CDR-H93MV", "1.31", BLIST_NOLUN},         /* Locks up if polled for lun != 0 */
        {"SANKYO", "CP525", "6.64", BLIST_NOLUN},               /* causes failed REQ SENSE, extra reset */
        {"HP", "C1750A", "3226", BLIST_NOLUN},                  /* scanjet iic */
index 37103e857d5ad220997dcc5e5b380c8fd4dbab72..81663c8db13c119d051b3aac563517e484e9073a 100644 (file)
@@ -1333,7 +1333,7 @@ static int cm_mmap(struct file *file, struct vm_area_struct *vma)
                db = &s->dma_adc;
        } else 
                return -EINVAL;
-       if (vma->vm_offset != 0)
+       if (vma->vm_pgoff != 0)
                return -EINVAL;
        size = vma->vm_end - vma->vm_start;
        if (size > (PAGE_SIZE << db->buforder))
index 07c1dc7b358f87a286bbb707f69500578ccd0c43..464f556a683324baf1a04ceea938cf4439c16bcc 100644 (file)
@@ -2339,7 +2339,7 @@ static int ess_mmap(struct file *file, struct vm_area_struct *vma)
                db = &s->dma_adc;
        } else 
                return -EINVAL;
-       if (vma->vm_offset != 0)
+       if (vma->vm_pgoff != 0)
                return -EINVAL;
        size = vma->vm_end - vma->vm_start;
        if (size > (PAGE_SIZE << db->buforder))
index 7b85d3359cfde74cfc6082b5018ecd3ad634b9ee..1a31979220ce44bb034ea8a83e0e5ea6f23449de 100644 (file)
  *              wants to use an Asynch out pipe. usb_audio_state now basically
  *              only contains lists of mixer and wave devices. We can therefore
  *              now have multiple mixer/wave devices per USB device.
+ * 1999-10-31:  Thomas Sailer
+ *              Audio can now be unloaded if it is not in use by any mixer
+ *              or dsp client (formerly you had to disconnect the audio devices
+ *              from the USB port)
+ *              Finally, about three months after ordering, my "Maxxtro SPK222"
+ *              speakers arrived, isn't disdata a great mail order company 8-)
+ *              Parse class specific endpoint descriptor of the audiostreaming
+ *              interfaces and take the endpoint attributes from there.
+ *              Unbelievably, the Philips USB DAC has a sampling rate range
+ *              of over a decade, yet does not support the sampling rate control!
+ *              No wonder it sounds so bad, has very audible sampling rate
+ *              conversion distortion. Don't try to listen to it using
+ *              decent headphones!
+ *              "Let's make things better" -> but please Philips start with your
+ *              own stuff!!!!
+ *
  *
  */
 
@@ -182,6 +198,7 @@ struct audioformat {
        unsigned int sratelo;
        unsigned int sratehi;
        unsigned char altsetting;
+       unsigned char attributes;
 };
 
 struct dmabuf {
@@ -1530,6 +1547,7 @@ static int set_format_in(struct usb_audiodev *as)
        struct audioformat *fmt;
        unsigned int fmtnr, ep;
        unsigned char data[3];
+       int ret;
 
        if (u->interface < 0 || u->interface >= config->bNumInterfaces)
                return 0;
@@ -1545,7 +1563,7 @@ static int set_format_in(struct usb_audiodev *as)
                    alts->endpoint[1].bmAttributes != 0x01 ||
                    alts->endpoint[1].bSynchAddress != 0 ||
                    alts->endpoint[1].bEndpointAddress != (alts->endpoint[0].bSynchAddress & 0x7f)) {
-                       printk(KERN_ERR "usb_audio: device %d interface %d altsetting %d invalid synch pipe\n",
+                       printk(KERN_ERR "usbaudio: device %d interface %d altsetting %d invalid synch pipe\n",
                               dev->devnum, u->interface, fmt->altsetting);
                        return -1;
                }
@@ -1563,25 +1581,38 @@ static int set_format_in(struct usb_audiodev *as)
        }
        if (fmt->sratelo == fmt->sratehi)
                return 0;
-       data[0] = d->srate;
-       data[1] = d->srate >> 8;
-       data[2] = d->srate >> 16;
        ep = usb_pipeendpoint(u->datapipe) | (u->datapipe & USB_DIR_IN);
-       if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
-                           SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ) < 0) {
-               printk(KERN_ERR "usbaudio: failure to set input sampling frequency device %d endpoint 0x%x to %u\n",
-                      dev->devnum, ep, d->srate);
-               return -1;
+       /* if endpoint has pitch control, enable it */
+       if (fmt->attributes & 0x02) {
+               data[0] = 1;
+               if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
+                                          PITCH_CONTROL << 8, ep, data, 1, HZ)) < 0) {
+                       printk(KERN_ERR "usbaudio: failure (error %d) to set output pitch control device %d interface %u endpoint 0x%x to %u\n",
+                              ret, dev->devnum, u->interface, ep, d->srate);
+                       return -1;
+               }
        }
-       if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
-                           SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ) < 0) {
-               printk(KERN_ERR "usbaudio: failure to get input sampling frequency device %d endpoint 0x%x\n",
-                      dev->devnum, ep);
-               return -1;
+       /* if endpoint has sampling rate control, set it */
+       if (fmt->attributes & 0x01) {
+               data[0] = d->srate;
+               data[1] = d->srate >> 8;
+               data[2] = d->srate >> 16;
+               if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
+                                          SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
+                       printk(KERN_ERR "usbaudio: failure (error %d) to set input sampling frequency device %d interface %u endpoint 0x%x to %u\n",
+                              ret, dev->devnum, u->interface, ep, d->srate);
+                       return -1;
+               }
+               if ((ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
+                                          SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
+                       printk(KERN_ERR "usbaudio: failure (error %d) to get input sampling frequency device %d interface %u endpoint 0x%x\n",
+                              ret, dev->devnum, u->interface, ep);
+                       return -1;
+               }
+               printk(KERN_DEBUG "usbaudio: set_format_in: device %d interface %d altsetting %d srate req: %u real %u\n",
+                      dev->devnum, u->interface, fmt->altsetting, d->srate, data[0] | (data[1] << 8) | (data[2] << 16));
+               d->srate = data[0] | (data[1] << 8) | (data[2] << 16);
        }
-       printk(KERN_DEBUG "usb_audio: set_format_in: device %d interface %d altsetting %d srate req: %u real %u\n",
-              dev->devnum, u->interface, fmt->altsetting, d->srate, data[0] | (data[1] << 8) | (data[2] << 16));
-       d->srate = data[0] | (data[1] << 8) | (data[2] << 16);
        return 0;
 }
 
@@ -1596,6 +1627,7 @@ static int set_format_out(struct usb_audiodev *as)
        struct audioformat *fmt;
        unsigned int fmtnr, ep;
        unsigned char data[3];
+       int ret;
 
        if (u->interface < 0 || u->interface >= config->bNumInterfaces)
                return 0;
@@ -1611,7 +1643,7 @@ static int set_format_out(struct usb_audiodev *as)
                    alts->endpoint[1].bmAttributes != 0x01 ||
                    alts->endpoint[1].bSynchAddress != 0 ||
                    alts->endpoint[1].bEndpointAddress != (alts->endpoint[0].bSynchAddress | 0x80)) {
-                       printk(KERN_ERR "usb_audio: device %d interface %d altsetting %d invalid synch pipe\n",
+                       printk(KERN_ERR "usbaudio: device %d interface %d altsetting %d invalid synch pipe\n",
                               dev->devnum, u->interface, fmt->altsetting);
                        return -1;
                }
@@ -1629,25 +1661,38 @@ static int set_format_out(struct usb_audiodev *as)
        }
        if (fmt->sratelo == fmt->sratehi)
                return 0;
-       data[0] = d->srate;
-       data[1] = d->srate >> 8;
-       data[2] = d->srate >> 16;
        ep = usb_pipeendpoint(u->datapipe) | (u->datapipe & USB_DIR_IN);
-       if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
-                           SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ) < 0) {
-               printk(KERN_ERR "usbaudio: failure to set output sampling frequency device %d endpoint 0x%x to %u\n",
-                      dev->devnum, ep, d->srate);
-               return -1;
+       /* if endpoint has pitch control, enable it */
+       if (fmt->attributes & 0x02) {
+               data[0] = 1;
+               if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
+                                          PITCH_CONTROL << 8, ep, data, 1, HZ)) < 0) {
+                       printk(KERN_ERR "usbaudio: failure (error %d) to set output pitch control device %d interface %u endpoint 0x%x to %u\n",
+                              ret, dev->devnum, u->interface, ep, d->srate);
+                       return -1;
+               }
        }
-       if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
-                           SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ) < 0) {
-               printk(KERN_ERR "usbaudio: failure to get output sampling frequency device %d endpoint 0x%x\n",
-                      dev->devnum, ep);
-               return -1;
+       /* if endpoint has sampling rate control, set it */
+       if (fmt->attributes & 0x01) {
+               data[0] = d->srate;
+               data[1] = d->srate >> 8;
+               data[2] = d->srate >> 16;
+               if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 
+                                          SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
+                       printk(KERN_ERR "usbaudio: failure (error %d) to set output sampling frequency device %d interface %u endpoint 0x%x to %u\n",
+                              ret, dev->devnum, u->interface, ep, d->srate);
+                       return -1;
+               }
+               if ((ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
+                                          SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
+                       printk(KERN_ERR "usbaudio: failure (error %d) to get output sampling frequency device %d interface %u endpoint 0x%x\n",
+                              ret, dev->devnum, u->interface, ep);
+                       return -1;
+               }
+               printk(KERN_DEBUG "usbaudio: set_format_out: device %d interface %d altsetting %d srate req: %u real %u\n",
+                      dev->devnum, u->interface, fmt->altsetting, d->srate, data[0] | (data[1] << 8) | (data[2] << 16));
+               d->srate = data[0] | (data[1] << 8) | (data[2] << 16);
        }
-       printk(KERN_DEBUG "usb_audio: set_format_out: device %d interface %d altsetting %d srate req: %u real %u\n",
-              dev->devnum, u->interface, fmt->altsetting, d->srate, data[0] | (data[1] << 8) | (data[2] << 16));
-       d->srate = data[0] | (data[1] << 8) | (data[2] << 16);
        return 0;
 }
 
@@ -1766,7 +1811,7 @@ static int wrmixer(struct usb_mixerdev *ms, unsigned mixch, unsigned value)
         return 0;
 
  err:
-        printk(KERN_ERR "usb_audio: mixer request device %u if %u unit %u ch %u selector %u failed\n", 
+        printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n", 
                dev->devnum, ms->iface, ch->unitid, ch->chnum, ch->selector);
        return -1;
 }
@@ -1805,7 +1850,6 @@ static void release(struct usb_audio_state *s)
                kfree(ms);
        }
        kfree(s);
-        MOD_DEC_USE_COUNT;
 }
 
 extern inline int prog_dmabuf_in(struct usb_audiodev *as)
@@ -1855,6 +1899,7 @@ static int usb_audio_open_mixdev(struct inode *inode, struct file *file)
        }
         file->private_data = ms;
        s->count++;
+       MOD_INC_USE_COUNT;
        up(&open_sem);
         return 0;
 }
@@ -1866,6 +1911,7 @@ static int usb_audio_release_mixdev(struct inode *inode, struct file *file)
 
        down(&open_sem);
        release(s);
+        MOD_DEC_USE_COUNT;
         return 0;
 }
 
@@ -2201,7 +2247,7 @@ static int usb_audio_mmap(struct file *file, struct vm_area_struct *vma)
                 db = &as->usbin.dma;
         } else
                 return -EINVAL;
-        if (vma->vm_offset != 0)
+        if (vma->vm_pgoff != 0)
                 return -EINVAL;
        return dmabuf_mmap(db,  vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot);
 }
@@ -2510,6 +2556,7 @@ static int usb_audio_open(struct inode *inode, struct file *file)
         file->private_data = as;
         as->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
        s->count++;
+       MOD_INC_USE_COUNT;
         up(&open_sem);
         return 0;
 }
@@ -2539,6 +2586,7 @@ static int usb_audio_release(struct inode *inode, struct file *file)
         as->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
        release(s);
         wake_up(&open_wait);
+        MOD_DEC_USE_COUNT;
         return 0;
 }
 
@@ -2663,7 +2711,7 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b
        struct usb_interface_descriptor *alts;
        struct usb_interface *iface;
        struct audioformat *fp;
-       unsigned char *fmt;
+       unsigned char *fmt, *csep;
        unsigned int i, j, k, format;
 
        if (!(as = kmalloc(sizeof(struct usb_audiodev), GFP_KERNEL)))
@@ -2683,44 +2731,50 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b
                        if (alts->bInterfaceClass != USB_CLASS_AUDIO || alts->bInterfaceSubClass != 2)
                                continue;
                        if (alts->bNumEndpoints < 1) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u does not have an endpoint\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u does not have an endpoint\n", 
                                       dev->devnum, asifin, i);
                                continue;
                        }
                        if ((alts->endpoint[0].bmAttributes & 0x03) != 0x01 ||
                            !(alts->endpoint[0].bEndpointAddress & 0x80)) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u first endpoint not isochronous in\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u first endpoint not isochronous in\n", 
                                       dev->devnum, asifin, i);
                                continue;
                        }
                        fmt = find_csinterface_descriptor(buffer, buflen, NULL, AS_GENERAL, asifin, i);
                        if (!fmt) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
                                       dev->devnum, asifin, i);
                                continue;
                        }
                        if (fmt[0] < 7 || fmt[6] != 0 || (fmt[5] != 1 && fmt[5] != 2)) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u format not supported\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u format not supported\n", 
                                       dev->devnum, asifin, i);
                                continue;
                        }
                        format = (fmt[5] == 2) ? (AFMT_U16_LE | AFMT_U8) : (AFMT_S16_LE | AFMT_S8);
                        fmt = find_csinterface_descriptor(buffer, buflen, NULL, FORMAT_TYPE, asifin, i);
                        if (!fmt) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
                                       dev->devnum, asifin, i);
                                continue;
                        }
                        if (fmt[0] < 8+3*(fmt[7] ? fmt[7] : 2) || fmt[3] != 1) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not supported\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not supported\n", 
                                       dev->devnum, asifin, i);
                                continue;
                        }
                        if (fmt[4] < 1 || fmt[4] > 2 || fmt[5] < 1 || fmt[5] > 2) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u unsupported channels %u framesize %u\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u unsupported channels %u framesize %u\n", 
                                       dev->devnum, asifin, i, fmt[4], fmt[5]);
                                continue;
                        }
+                       csep = find_descriptor(buffer, buflen, NULL, USB_DT_CS_ENDPOINT, asifin, i);
+                       if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u no or invalid class specific endpoint descriptor\n", 
+                                      dev->devnum, asifin, i);
+                               continue;
+                       }
                        if (as->numfmtin >= MAXFORMATS)
                                continue;
                        fp = &as->fmtin[as->numfmtin++];
@@ -2740,8 +2794,9 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b
                                if (k < fp->sratelo)
                                        fp->sratelo = k;
                        }
-                       printk(KERN_INFO "usb_audio: device %u interface %u altsetting %u: format 0x%08x sratelo %u sratehi %u\n", 
-                              dev->devnum, asifin, i, fp->format, fp->sratelo, fp->sratehi);
+                       fp->attributes = csep[3];
+                       printk(KERN_INFO "usbaudio: device %u interface %u altsetting %u: format 0x%08x sratelo %u sratehi %u attributes 0x%02x\n", 
+                              dev->devnum, asifin, i, fp->format, fp->sratelo, fp->sratehi, fp->attributes);
                }
        }
        /* search for output formats */
@@ -2752,44 +2807,50 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b
                        if (alts->bInterfaceClass != USB_CLASS_AUDIO || alts->bInterfaceSubClass != 2)
                                continue;
                        if (alts->bNumEndpoints < 1) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u does not have an endpoint\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u does not have an endpoint\n", 
                                       dev->devnum, asifout, i);
                                continue;
                        }
                        if ((alts->endpoint[0].bmAttributes & 0x03) != 0x01 ||
                            (alts->endpoint[0].bEndpointAddress & 0x80)) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u first endpoint not isochronous out\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u first endpoint not isochronous out\n", 
                                       dev->devnum, asifout, i);
                                continue;
                        }
                        fmt = find_csinterface_descriptor(buffer, buflen, NULL, AS_GENERAL, asifout, i);
                        if (!fmt) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
                                       dev->devnum, asifout, i);
                                continue;
                        }
                        if (fmt[0] < 7 || fmt[6] != 0 || (fmt[5] != 1 && fmt[5] != 2)) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u format not supported\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u format not supported\n", 
                                       dev->devnum, asifout, i);
                                continue;
                        }
                        format = (fmt[5] == 2) ? (AFMT_U16_LE | AFMT_U8) : (AFMT_S16_LE | AFMT_S8);
                        fmt = find_csinterface_descriptor(buffer, buflen, NULL, FORMAT_TYPE, asifout, i);
                        if (!fmt) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n", 
                                       dev->devnum, asifout, i);
                                continue;
                        }
                        if (fmt[0] < 8+3*(fmt[7] ? fmt[7] : 2) || fmt[3] != 1) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not supported\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not supported\n", 
                                       dev->devnum, asifout, i);
                                continue;
                        }
                        if (fmt[4] < 1 || fmt[4] > 2 || fmt[5] < 1 || fmt[5] > 2) {
-                               printk(KERN_ERR "usb_audio: device %u interface %u altsetting %u unsupported channels %u framesize %u\n", 
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u unsupported channels %u framesize %u\n", 
                                       dev->devnum, asifout, i, fmt[4], fmt[5]);
                                continue;
                        }
+                       csep = find_descriptor(buffer, buflen, NULL, USB_DT_CS_ENDPOINT, asifout, i);
+                       if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
+                               printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u no or invalid class specific endpoint descriptor\n", 
+                                      dev->devnum, asifout, i);
+                               continue;
+                       }
                        if (as->numfmtout >= MAXFORMATS)
                                continue;
                        fp = &as->fmtout[as->numfmtout++];
@@ -2809,8 +2870,9 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b
                                if (k < fp->sratelo)
                                        fp->sratelo = k;
                        }
-                       printk(KERN_INFO "usb_audio: device %u interface %u altsetting %u: format 0x%08x sratelo %u sratehi %u\n", 
-                              dev->devnum, asifout, i, fp->format, fp->sratelo, fp->sratehi);
+                       fp->attributes = csep[3];
+                       printk(KERN_INFO "usbaudio: device %u interface %u altsetting %u: format 0x%08x sratelo %u sratehi %u attributes 0x%02x\n", 
+                              dev->devnum, asifout, i, fp->format, fp->sratelo, fp->sratehi, fp->attributes);
                }
        }
        if (as->numfmtin == 0 && as->numfmtout == 0) {
@@ -2818,7 +2880,7 @@ static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *b
                return;
        }
        if ((as->dev_audio = register_sound_dsp(&usb_audio_fops, -1)) < 0) {
-               printk(KERN_ERR "usb_audio: cannot register dsp\n");
+               printk(KERN_ERR "usbaudio: cannot register dsp\n");
                kfree(as);
                return;
        }
@@ -2846,11 +2908,11 @@ static struct mixerchannel *getmixchannel(struct consmixstate *state, unsigned i
        struct mixerchannel *c;
 
        if (nr >= SOUND_MIXER_NRDEVICES) {
-               printk(KERN_ERR "usb_audio: invalid OSS mixer channel %u\n", nr);
+               printk(KERN_ERR "usbaudio: invalid OSS mixer channel %u\n", nr);
                return NULL;
        }
        if (!(state->mixchmask & (1 << nr))) {
-               printk(KERN_WARNING "usb_audio: OSS mixer channel %u already in use\n", nr);
+               printk(KERN_WARNING "usbaudio: OSS mixer channel %u already in use\n", nr);
                return NULL;
        }
        c = &state->mixch[state->nrmixch++];
@@ -3016,7 +3078,7 @@ static void prepmixch(struct consmixstate *state)
        return;
 
  err:
-       printk(KERN_ERR "usb_audio: mixer request device %u if %u unit %u ch %u selector %u failed\n", 
+       printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n", 
               dev->devnum, state->ctrlif, ch->unitid, ch->chnum, ch->selector);
        if (state->nrmixch)
                state->nrmixch--;
@@ -3052,11 +3114,11 @@ static void usb_audio_mixerunit(struct consmixstate *state, unsigned char *mixer
        unsigned int i;
 
        if (!mixer[4]) {
-               printk(KERN_ERR "usb_audio: unit %u invalid MIXER_UNIT descriptor\n", mixer[3]);
+               printk(KERN_ERR "usbaudio: unit %u invalid MIXER_UNIT descriptor\n", mixer[3]);
                return;
        }
        if (mixer[4] > SOUND_MIXER_NRDEVICES) {
-               printk(KERN_ERR "usb_audio: mixer unit %u: too many input pins\n", mixer[3]);
+               printk(KERN_ERR "usbaudio: mixer unit %u: too many input pins\n", mixer[3]);
                return;
        }
        chidx[0] = 0;
@@ -3070,7 +3132,7 @@ static void usb_audio_mixerunit(struct consmixstate *state, unsigned char *mixer
        bmapsize = (nroutch * chidx[mixer[4]] + 7) >> 3;
        bmap += bmapsize - 1;
        if (mixer[0] < 10+mixer[4]+bmapsize) {
-               printk(KERN_ERR "usb_audio: unit %u invalid MIXER_UNIT descriptor (bitmap too small)\n", mixer[3]);
+               printk(KERN_ERR "usbaudio: unit %u invalid MIXER_UNIT descriptor (bitmap too small)\n", mixer[3]);
                return;
        }
        for (i = 0; i < mixer[4]; i++) {
@@ -3109,7 +3171,7 @@ static void usb_audio_selectorunit(struct consmixstate *state, unsigned char *se
        unsigned int chnum, i;
 
        if (!selector[4]) {
-               printk(KERN_ERR "usb_audio: unit %u invalid SELECTOR_UNIT descriptor\n", selector[3]);
+               printk(KERN_ERR "usbaudio: unit %u invalid SELECTOR_UNIT descriptor\n", selector[3]);
                return;
        }
        usb_audio_recurseunit(state, selector[5]);
@@ -3117,7 +3179,7 @@ static void usb_audio_selectorunit(struct consmixstate *state, unsigned char *se
        for (i = 1; i < selector[4]; i++) {
                usb_audio_recurseunit(state, selector[5+i]);
                if (chnum != state->nrchannels) {
-                       printk(KERN_ERR "usb_audio: selector unit %u: input pins with varying channel numbers\n", selector[3]);
+                       printk(KERN_ERR "usbaudio: selector unit %u: input pins with varying channel numbers\n", selector[3]);
                        state->termtype = 0;
                        state->chconfig = 0;
                        state->nrchannels = 0;
@@ -3143,18 +3205,20 @@ static void usb_audio_processingunit(struct consmixstate *state, unsigned char *
 
 static void usb_audio_featureunit(struct consmixstate *state, unsigned char *ftr)
 {
+       struct usb_device *dev = state->s->usbdev;
        struct mixerchannel *ch;
        unsigned short chftr, mchftr;
+       unsigned char data[1];
 
        usb_audio_recurseunit(state, ftr[4]);
        if (state->nrchannels == 0) {
-               printk(KERN_ERR "usb_audio: feature unit %u source has no channels\n", ftr[3]);
+               printk(KERN_ERR "usbaudio: feature unit %u source has no channels\n", ftr[3]);
                return;
        }
        if (state->nrchannels > 2)
-               printk(KERN_WARNING "usb_audio: feature unit %u: OSS mixer interface does not support more than 2 channels\n", ftr[3]);
+               printk(KERN_WARNING "usbaudio: feature unit %u: OSS mixer interface does not support more than 2 channels\n", ftr[3]);
        if (ftr[0] < 7+ftr[5]*(1+state->nrchannels)) {
-               printk(KERN_ERR "usb_audio: unit %u: invalid FEATURE_UNIT descriptor\n", ftr[3]);
+               printk(KERN_ERR "usbaudio: unit %u: invalid FEATURE_UNIT descriptor\n", ftr[3]);
                return;
        }
        mchftr = ftr[6];
@@ -3192,7 +3256,7 @@ static void usb_audio_featureunit(struct consmixstate *state, unsigned char *ftr
                        prepmixch(state);
                }
        } else if (mchftr & 4) {
-               ch = getmixchannel(state, getvolchannel(state));
+               ch = getmixchannel(state, SOUND_MIXER_BASS);
                if (ch) {
                        ch->unitid = ftr[3];
                        ch->selector = BASS_CONTROL;
@@ -3212,7 +3276,7 @@ static void usb_audio_featureunit(struct consmixstate *state, unsigned char *ftr
                        prepmixch(state);
                }
        } else if (mchftr & 16) {
-               ch = getmixchannel(state, getvolchannel(state));
+               ch = getmixchannel(state, SOUND_MIXER_TREBLE);
                if (ch) {
                        ch->unitid = ftr[3];
                        ch->selector = TREBLE_CONTROL;
@@ -3221,6 +3285,14 @@ static void usb_audio_featureunit(struct consmixstate *state, unsigned char *ftr
                        prepmixch(state);
                }
        }
+       /* if there are mute controls, unmute them */
+       if ((chftr & 1) || (mchftr & 1)) {
+               printk(KERN_DEBUG "usbaudio: unmuting feature unit %u interface %u\n", ftr[3], state->ctrlif);
+               data[0] = 0;
+               if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+                                    (MUTE_CONTROL << 8) | 0xff, state->ctrlif | (ftr[3] << 8), data, 1, HZ) < 0)
+                       printk(KERN_WARNING "usbaudio: failure to unmute feature unit %u interface %u\n", ftr[3], state->ctrlif);
+       }
 }
 
 static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unitid)
@@ -3229,12 +3301,12 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
        unsigned int i, j;
 
        if (test_and_set_bit(unitid, &state->unitbitmap)) {
-               printk(KERN_ERR "usb_audio: mixer path recursion detected, unit %d!\n", unitid);
+               printk(KERN_ERR "usbaudio: mixer path recursion detected, unit %d!\n", unitid);
                return;
        }
        p1 = find_audiocontrol_unit(state->buffer, state->buflen, NULL, unitid, state->ctrlif);
        if (!p1) {
-               printk(KERN_ERR "usb_audio: unit %d not found!\n", unitid);
+               printk(KERN_ERR "usbaudio: unit %d not found!\n", unitid);
                return;
        }
        state->nrchannels = 0;
@@ -3243,7 +3315,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
        switch (p1[2]) {
        case INPUT_TERMINAL:
                if (p1[0] < 12) {
-                       printk(KERN_ERR "usb_audio: unit %u: invalid INPUT_TERMINAL descriptor\n", unitid);
+                       printk(KERN_ERR "usbaudio: unit %u: invalid INPUT_TERMINAL descriptor\n", unitid);
                        return;
                }
                state->nrchannels = p1[7];
@@ -3253,7 +3325,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
 
        case MIXER_UNIT:
                if (p1[0] < 10 || p1[0] < 10+p1[4]) {
-                       printk(KERN_ERR "usb_audio: unit %u: invalid MIXER_UNIT descriptor\n", unitid);
+                       printk(KERN_ERR "usbaudio: unit %u: invalid MIXER_UNIT descriptor\n", unitid);
                        return;
                }
                usb_audio_mixerunit(state, p1);
@@ -3261,7 +3333,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
 
        case SELECTOR_UNIT:
                if (p1[0] < 6 || p1[0] < 6+p1[4]) {
-                       printk(KERN_ERR "usb_audio: unit %u: invalid SELECTOR_UNIT descriptor\n", unitid);
+                       printk(KERN_ERR "usbaudio: unit %u: invalid SELECTOR_UNIT descriptor\n", unitid);
                        return;
                }
                usb_audio_selectorunit(state, p1);
@@ -3269,7 +3341,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
 
        case FEATURE_UNIT:
                if (p1[0] < 7 || p1[0] < 7+p1[5]) {
-                       printk(KERN_ERR "usb_audio: unit %u: invalid FEATURE_UNIT descriptor\n", unitid);
+                       printk(KERN_ERR "usbaudio: unit %u: invalid FEATURE_UNIT descriptor\n", unitid);
                        return;
                }
                usb_audio_featureunit(state, p1);
@@ -3277,7 +3349,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
 
        case PROCESSING_UNIT:
                if (p1[0] < 13 || p1[0] < 13+p1[6] || p1[0] < 13+p1[6]+p1[11+p1[6]] || p1[0] < 13+p1[6]+p1[11+p1[6]]+p1[13+p1[6]+p1[11+p1[6]]]) {
-                       printk(KERN_ERR "usb_audio: unit %u: invalid PROCESSING_UNIT descriptor\n", unitid);
+                       printk(KERN_ERR "usbaudio: unit %u: invalid PROCESSING_UNIT descriptor\n", unitid);
                        return;
                }
                usb_audio_processingunit(state, p1);
@@ -3285,7 +3357,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
 
        case EXTENSION_UNIT:
                if (p1[0] < 13 || p1[0] < 13+p1[6] || p1[0] < 13+p1[6]+p1[11+p1[6]]) {
-                       printk(KERN_ERR "usb_audio: unit %u: invalid EXTENSION_UNIT descriptor\n", unitid);
+                       printk(KERN_ERR "usbaudio: unit %u: invalid EXTENSION_UNIT descriptor\n", unitid);
                        return;
                }
                for (j = i = 0; i < p1[6]; i++) {
@@ -3301,7 +3373,7 @@ static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unit
                return;
 
        default:
-               printk(KERN_ERR "usb_audio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]);
+               printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]);
                return;
        }
 }
@@ -3319,11 +3391,11 @@ static void usb_audio_constructmixer(struct usb_audio_state *s, unsigned char *b
        state.buflen = buflen;
        state.ctrlif = ctrlif;
        set_bit(oterm[3], &state.unitbitmap);  /* mark terminal ID as visited */
-       printk(KERN_INFO "usb_audio: constructing mixer for Terminal %u type 0x%04x\n",
+       printk(KERN_INFO "usbaudio: constructing mixer for Terminal %u type 0x%04x\n",
               oterm[3], oterm[4] | (oterm[5] << 8));
        usb_audio_recurseunit(&state, oterm[7]);
        if (!state.nrmixch) {
-               printk(KERN_INFO "usb_audio: no mixer controls found for Terminal %u\n", oterm[3]);
+               printk(KERN_INFO "usbaudio: no mixer controls found for Terminal %u\n", oterm[3]);
                return;
        }
        if (!(ms = kmalloc(sizeof(struct usb_mixerdev)+state.nrmixch*sizeof(struct mixerchannel), GFP_KERNEL)))
@@ -3334,7 +3406,7 @@ static void usb_audio_constructmixer(struct usb_audio_state *s, unsigned char *b
        ms->iface = ctrlif;
        ms->numch = state.nrmixch;
        if ((ms->dev_mixer = register_sound_mixer(&usb_mixer_fops, -1)) < 0) {
-               printk(KERN_ERR "usb_audio: cannot register mixer\n");
+               printk(KERN_ERR "usbaudio: cannot register mixer\n");
                kfree(ms);
                return;
        }
@@ -3359,49 +3431,49 @@ static void * usb_audio_parsecontrol(struct usb_device *dev, unsigned char *buff
        s->count = 1;
        /* find audiocontrol interface */
        if (!(p1 = find_csinterface_descriptor(buffer, buflen, NULL, HEADER, ctrlif, -1))) {
-               printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u no HEADER found\n",
+               printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u no HEADER found\n",
                       dev->devnum, ctrlif);
                goto ret;
        }
        if (p1[0] < 8 + p1[7]) {
-               printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u HEADER error\n",
+               printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u HEADER error\n",
                       dev->devnum, ctrlif);
                goto ret;
        }
        if (!p1[7])
-               printk(KERN_INFO "usb_audio: device %d audiocontrol interface %u has no AudioStreaming and MidiStreaming interfaces\n",
+               printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u has no AudioStreaming and MidiStreaming interfaces\n",
                       dev->devnum, ctrlif);
        for (i = 0; i < p1[7]; i++) {
                j = p1[8+i];
                if (j >= config->bNumInterfaces) {
-                       printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u interface %u does not exist\n",
+                       printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u does not exist\n",
                               dev->devnum, ctrlif, j);
                        continue;
                }
                iface = &config->interface[j];
                if (iface->altsetting[0].bInterfaceClass != USB_CLASS_AUDIO) {
-                       printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u interface %u is not an AudioClass interface\n",
+                       printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u is not an AudioClass interface\n",
                               dev->devnum, ctrlif, j);
                        continue;
                }
                if (iface->altsetting[0].bInterfaceSubClass == 3) {
-                       printk(KERN_INFO "usb_audio: device %d audiocontrol interface %u interface %u MIDIStreaming not supported\n",
+                       printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u interface %u MIDIStreaming not supported\n",
                               dev->devnum, ctrlif, j);
                        continue;
                }
                if (iface->altsetting[0].bInterfaceSubClass != 2) {
-                       printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u interface %u invalid AudioClass subtype\n",
+                       printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u invalid AudioClass subtype\n",
                               dev->devnum, ctrlif, j);
                        continue;
                }
                if (iface->num_altsetting < 2 ||
                    iface->altsetting[0].bNumEndpoints > 0) {
-                       printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u altsetting 0 not zero bandwidth\n",
+                       printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u altsetting 0 not zero bandwidth\n",
                               dev->devnum, ctrlif);
                        continue;
                }
                if (iface->altsetting[1].bNumEndpoints < 1) {
-                       printk(KERN_ERR "usb_audio: device %d audiocontrol interface %u interface %u has no endpoint\n",
+                       printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u has no endpoint\n",
                               dev->devnum, ctrlif, j);
                        continue;
                }
@@ -3419,7 +3491,7 @@ static void * usb_audio_parsecontrol(struct usb_device *dev, unsigned char *buff
                        }
                }
        }
-       printk(KERN_INFO "usb_audio: device %d audiocontrol interface %u has %u input and %u output AudioStreaming interfaces\n",
+       printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u has %u input and %u output AudioStreaming interfaces\n",
               dev->devnum, ctrlif, numifin, numifout);
        for (i = 0; i < numifin && i < numifout; i++)
                usb_audio_parsestreaming(s, buffer, buflen, ifin[i], ifout[i]);
@@ -3444,7 +3516,6 @@ static void * usb_audio_parsecontrol(struct usb_device *dev, unsigned char *buff
        down(&open_sem);
        list_add_tail(&s->audiodev, &audiodevs);
        up(&open_sem);
-       MOD_INC_USE_COUNT;
        return s;
 }
 
@@ -3462,7 +3533,7 @@ static void * usb_audio_probe(struct usb_device *dev, unsigned int ifnum)
                if (config->interface[i].altsetting[0].bInterfaceClass == USB_CLASS_AUDIO &&
                    config->interface[i].altsetting[0].bInterfaceSubClass == 1)  /* audiocontrol interface found */
                        goto audioctrlfound;
-       printk(KERN_DEBUG "usb_audio: vendor id 0x%04x, product id 0x%04x contains no AudioControl interface\n",
+       printk(KERN_DEBUG "usbaudio: vendor id 0x%04x, product id 0x%04x contains no AudioControl interface\n",
               dev->descriptor.idVendor, dev->descriptor.idProduct);
        return NULL;
 
@@ -3471,17 +3542,17 @@ static void * usb_audio_probe(struct usb_device *dev, unsigned int ifnum)
        for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
                if (dev->config+i == config)
                        goto configfound;
-       printk(KERN_ERR "usb_audio: cannot find active configuration number of device %d\n", dev->devnum);
+       printk(KERN_ERR "usbaudio: cannot find active configuration number of device %d\n", dev->devnum);
        return NULL;
 
  configfound:
        ret = usb_get_descriptor(dev, USB_DT_CONFIG, i, buf, 8);
        if (ret) {
-               printk(KERN_ERR "usb_audio: cannot get first 8 bytes of config descriptor %d of device %d\n", i, dev->devnum);
+               printk(KERN_ERR "usbaudio: cannot get first 8 bytes of config descriptor %d of device %d\n", i, dev->devnum);
                return NULL;
        }
        if (buf[1] != USB_DT_CONFIG || buf[0] < 9) {
-               printk(KERN_ERR "usb_audio: invalid config descriptor %d of device %d\n", i, dev->devnum);
+               printk(KERN_ERR "usbaudio: invalid config descriptor %d of device %d\n", i, dev->devnum);
                return NULL;
        }
        buflen = buf[2] | (buf[3] << 8);
@@ -3490,7 +3561,7 @@ static void * usb_audio_probe(struct usb_device *dev, unsigned int ifnum)
        ret = usb_get_descriptor(dev, USB_DT_CONFIG, i, buffer, buflen);
        if (ret) {
                kfree(buffer);
-               printk(KERN_ERR "usb_audio: cannot get config descriptor %d of device %d\n", i, dev->devnum);
+               printk(KERN_ERR "usbaudio: cannot get config descriptor %d of device %d\n", i, dev->devnum);
                return NULL;
        }
        /* find first audio control interface; we currently cannot handle more than one */
index a7536d6fe1ea4e8b85e436d2dc0f309aeddafa5a..6c842068ff069c70659508196eadf4207121a366 100644 (file)
@@ -29,6 +29,7 @@
 #define CPIA_DEBUG     /* Gobs of debugging info */
 
 /* Video Size 384 x 288 x 3 bytes for RGB */
+/* 384 because xawtv tries to grab 384 even though we tell it 352 is our max */
 #define MAX_FRAME_SIZE (384 * 288 * 3)
 
 /*******************************/
@@ -209,8 +210,8 @@ static int usb_cpia_grab_frame(struct usb_device *dev, int streamstartline)
 static int usb_cpia_upload_frame(struct usb_device *dev, int forceupload)
 {
        return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
-               USB_REQ_CPIA_UPLOAD_FRAME,
-               USB_TYPE_VENDOR | USB_RECIP_DEVICE, forceupload, 0, NULL, 0, HZ);
+               USB_REQ_CPIA_UPLOAD_FRAME, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+               forceupload, 0, NULL, 0, HZ);
 }
 
 static int usb_cpia_set_grab_mode(struct usb_device *dev, int continuousgrab)
@@ -246,6 +247,16 @@ static int usb_cpia_set_compression(struct usb_device *dev, int compmode, int de
                (decimation << 8) + compmode, 0, NULL, 0, HZ);
 }
 
+#ifdef NOTUSED
+static int usb_cpia_set_compression_target(struct usb_device *dev, int target, int targetfr, int targetq)
+{
+       return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+               USB_REQ_CPIA_SET_COMPRESSION_TARGET,
+               USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+               (targetfr << 8) + target, targetq, NULL, 0, HZ);
+}
+#endif
+
 #ifdef NOTUSED
 static int usb_cpia_initstreamcap(struct usb_device *dev, int skipframes, int streamstartline)
 {
@@ -286,6 +297,7 @@ static void cpia_parse_data(struct usb_cpia *cpia)
        unsigned char *data = cpia->scratch;
        unsigned long l;
 
+       /* Grab the current frame and the previous frame */
        frame = &cpia->frame[cpia->curframe];
        pframe = &cpia->frame[(cpia->curframe - 1 + CPIA_NUMFRAMES) % CPIA_NUMFRAMES];
 
@@ -316,9 +328,9 @@ static void cpia_parse_data(struct usb_cpia *cpia)
                        /* See if we found the end of the frame */
                        while (scratch_left(data) >= 4) {
                                if (*((__u32 *)data) == 0xFFFFFFFF) {
-printk("found end of frame\n");
                                        data += 4;
-goto error;
+                                       printk(KERN_INFO "cpia: EOF while scanning for magic\n");
+                                       goto error;
                                }
                                data++;
                        }
@@ -349,7 +361,6 @@ goto error;
 
                        frame->scanstate = STATE_LINES;
                        frame->curline = 0;
-
                        break;
                case STATE_LINES:
                {
@@ -365,10 +376,9 @@ goto error;
                        /* Grab the length */
                        len = data[0] + (data[1] << 8);
 
-printk("line %d, %d bytes long\n", frame->curline, len);
                        /* Check to make sure it's nothing outrageous */
                        if (len > (frame->hdrwidth * 2) + 1) {
-                               printk(KERN_INFO "cpia: bad length, resynching\n");
+                               printk(KERN_INFO "cpia: bad length, resynching (expected %d, got %d)\n", (frame->hdrwidth * 2) + 1, len);
                                goto error;
                        }
 
@@ -382,12 +392,6 @@ printk("line %d, %d bytes long\n", frame->curline, len);
                        /* Is the end of the line there */
                        if (data[len - 1] != 0xFD) {
                                printk(KERN_INFO "cpia: lost synch\n");
-end = data + len - 1 - 4;
-printk("%02X %02X %02X %02X %02X %02X %02X %02X\n",
-end[0], end[1],
-end[2], end[3],
-end[4], end[5],
-end[6], end[7]);
                                goto error;
                        }
 
@@ -428,12 +432,6 @@ y1 *= 76310;
 *f++ = LIMIT(b + y); *f++ = LIMIT(g + y); *f++ = LIMIT(r + y);
 *f++ = LIMIT(b + y1); *f++ = LIMIT(g + y1); *f++ = LIMIT(r + y1);
                                                fp += 6;
-/*
-                                               f[0] = f[1] = f[2] = *data;
-                                               f += 3;
-                                               data += 2;
-                                               fp += 3;
-*/
                                        }
                                }
                        } else {
@@ -471,10 +469,11 @@ y1 *= 76310;
        }
 
 nextframe:
-       if (scratch_left(data) >= 4 && *((__u32 *)data) == 0xFFFFFFFF) {
+#ifdef CPIA_DEBUG
+       printk("cpia: marking as success\n");
+#endif
+       if (scratch_left(data) >= 4 && *((__u32 *)data) == 0xFFFFFFFF)
                data += 4;
-printk("end of frame found normally\n");
-}
 
        frame->grabstate = FRAME_DONE;
        cpia->curframe = -1;
@@ -486,6 +485,9 @@ printk("end of frame found normally\n");
        goto out;
 
 error:
+#ifdef CPIA_DEBUG
+       printk("cpia: marking as error\n");
+#endif
        frame->grabstate = FRAME_ERROR;
        cpia->curframe = -1;
        cpia->compress = 0;
@@ -495,7 +497,6 @@ error:
                wake_up_interruptible(&frame->wq);
 
 out:
-printk("scanned %d bytes, %d left\n", data - cpia->scratch, scratch_left(data));
        /* Grab the remaining */
        l = scratch_left(data);
        memmove(cpia->scratch, data, l);
@@ -546,7 +547,7 @@ static int cpia_isoc_irq(int status, void *__buffer, int len, void *isocdesc)
        int i;
 
        if (!cpia->streaming) {
-               printk("oops, not streaming, but interrupt\n");
+               printk("cpia: oops, not streaming, but interrupt\n");
                return 0;
        }
        
@@ -556,7 +557,6 @@ static int cpia_isoc_irq(int status, void *__buffer, int len, void *isocdesc)
        /* Copy the data received into our scratch buffer */
        len = cpia_compress_isochronous(cpia, sbuf->isodesc);
 
-printk("%d bytes received\n", len);
        /* If we don't have a frame we're current working on, complain */
        if (len) {
                if (cpia->curframe < 0)
@@ -589,7 +589,7 @@ static int cpia_init_isoc(struct usb_cpia *cpia)
 
        /* Alternate interface 3 is is the biggest frame size */
        if (usb_set_interface(cpia->dev, 1, 3) < 0) {
-               printk("usb_set_interface error\n");
+               printk(KERN_ERR "usb_set_interface error\n");
                return -EBUSY;
        }
 
@@ -644,21 +644,7 @@ static int cpia_init_isoc(struct usb_cpia *cpia)
        if (err)
                printk(KERN_ERR "CPiA USB driver error (%d) on usb_run_isoc\n", err);
 
-#ifdef CPIA_DEBUG
-       printk("done scheduling\n");
-#endif
-
-#if 0
-       if (usb_cpia_grab_frame(dev, 120) < 0) {
-               printk(KERN_INFO "cpia_grab_frame error\n");
-               return -EBUSY;
-       }
-#endif
-
        cpia->streaming = 1;
-#ifdef CPIA_DEBUG
-       printk("now streaming\n");
-#endif
 
        return 0;
 }
@@ -668,21 +654,12 @@ static void cpia_stop_isoc(struct usb_cpia *cpia)
        if (!cpia->streaming)
                return;
 
-       cpia->streaming = 0;
-
        /* Turn off continuous grab */
        if (usb_cpia_set_grab_mode(cpia->dev, 0) < 0) {
                printk(KERN_INFO "cpia_set_grab_mode error\n");
                return /* -EBUSY */;
        }
 
-#if 0
-       if (usb_cpia_grab_frame(cpia->dev, 0) < 0) {
-               printk(KERN_INFO "cpia_grab_frame error\n");
-               return /* -EBUSY */;
-       }
-#endif
-
        /* Set packet size to 0 */
        if (usb_set_interface(cpia->dev, 1, 0) < 0) {
                printk(KERN_INFO "usb_set_interface error\n");
@@ -693,6 +670,8 @@ static void cpia_stop_isoc(struct usb_cpia *cpia)
        usb_kill_isoc(cpia->sbuf[1].isodesc);
        usb_kill_isoc(cpia->sbuf[0].isodesc);
 
+       cpia->streaming = 0;
+
        /* Delete them all */
        usb_free_isoc(cpia->sbuf[1].isodesc);
        usb_free_isoc(cpia->sbuf[0].isodesc);
@@ -703,29 +682,23 @@ static int cpia_new_frame(struct usb_cpia *cpia, int framenum)
        struct cpia_frame *frame;
        int width, height;
 
-printk("new frame %d\n", framenum);
-       if (framenum == -1) {
-               int i;
-               for (i = 0; i < CPIA_NUMFRAMES; i++)
-                       if (cpia->frame[i].grabstate == FRAME_READY)
-                               break;
-
-               if (i >= CPIA_NUMFRAMES) {
-                       printk("no frame ready\n");
-                       return 0;
-               }
-
-               framenum = i;
-printk("using frame %d\n", framenum);
-       }
-
-       if (cpia->curframe != -1 && cpia->curframe != framenum)
+       /* If we're not grabbing a frame right now and the other frame is */
+       /*  ready to be grabbed into, then use it instead */
+       if (cpia->curframe == -1) {
+               if (cpia->frame[(framenum - 1 + CPIA_NUMFRAMES) % CPIA_NUMFRAMES].grabstate == FRAME_READY)
+                       framenum = (framenum - 1 + CPIA_NUMFRAMES) % CPIA_NUMFRAMES;
+       } else
                return 0;
 
        frame = &cpia->frame[framenum];
        width = frame->width;
        height = frame->height;
 
+       frame->grabstate = FRAME_GRABBING;
+       frame->scanstate = STATE_SCANNING;
+
+       cpia->curframe = framenum;
+
        /* Make sure it's not too big */
        if (width > 352)
                width = 352;
@@ -739,7 +712,8 @@ printk("using frame %d\n", framenum);
        if (usb_cpia_set_roi(cpia->dev, 0, width / 8, 0, height / 4) < 0)
                return -EBUSY;
 
-       if (usb_cpia_set_compression(cpia->dev, cpia->compress ? 1 : 0, 0) < 0) {
+       if (usb_cpia_set_compression(cpia->dev, cpia->compress ?
+                       COMP_AUTO : COMP_DISABLED, DONT_DECIMATE) < 0) {
                printk(KERN_INFO "cpia_set_compression error\n");
                return -EBUSY;
        }
@@ -748,16 +722,11 @@ printk("using frame %d\n", framenum);
        cpia->compress = (cpia->compress + 1) % 30;
 
        /* Grab the frame */
-       if (usb_cpia_upload_frame(cpia->dev, 1) < 0) {
+       if (usb_cpia_upload_frame(cpia->dev, WAIT_FOR_NEXT_FRAME) < 0) {
                printk(KERN_INFO "cpia_upload_frame error\n");
                return -EBUSY;
        }
 
-       frame->grabstate = FRAME_GRABBING;
-       frame->scanstate = STATE_SCANNING;
-
-       cpia->curframe = framenum;
-
        return 0;
 }
 
@@ -864,8 +833,8 @@ static int cpia_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        b.audios = 0;
                        b.maxwidth = 352;       /* CIF */
                        b.maxheight = 288;      /*  "  */
-                       b.minwidth = 176;       /* QCIF */
-                       b.minheight = 144;      /*  "   */
+                       b.minwidth = 8;
+                       b.minheight = 4;
 
                        if (copy_to_user(arg, &b, sizeof(b)))
                                return -EFAULT;
@@ -1067,11 +1036,11 @@ static int cpia_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                                return -EINVAL;
                        case FRAME_READY:
                        case FRAME_GRABBING:
+                       case FRAME_ERROR:
 redo:
                                do {
-printk("enter sleeping\n");
+                                       init_waitqueue_head(&cpia->frame[frame].wq);
                                        interruptible_sleep_on(&cpia->frame[frame].wq);
-printk("back from sleeping\n");
                                        if (signal_pending(current))
                                                return -EINTR;
                                } while (cpia->frame[frame].grabstate ==
@@ -1093,8 +1062,9 @@ printk("back from sleeping\n");
 #ifdef CPIA_DEBUG
                        printk("cpia: finished, synced to frame %d\n", frame);
 #endif
+                       cpia->frame[frame].grabstate = FRAME_UNUSED;
 
-                       return cpia_new_frame(cpia, -1);
+                       return 0;
                }
                case VIDIOCGFBUF:
                {
@@ -1212,7 +1182,7 @@ static int usb_cpia_configure(struct usb_cpia *cpia)
                return -EBUSY;
        }
 
-       printk("cpia: Firmware v%d.%d, VC Hardware v%d.%d\n",
+       printk(KERN_DEBUG "cpia: Firmware v%d.%d, VC Hardware v%d.%d\n",
                version[0], version[1], version[2], version[3]);
 
        memcpy(&cpia->vdev, &cpia_template, sizeof(cpia_template));
@@ -1235,8 +1205,8 @@ static int usb_cpia_configure(struct usb_cpia *cpia)
                goto error;
        }
 
-       printk("cpia: VP v%d rev %d\n", version[0], version[1]);
-       printk("cpia: Camera Head ID %04X\n", (version[3] << 8) + version[2]);
+       printk(KERN_DEBUG "cpia: VP v%d rev %d\n", version[0], version[1]);
+       printk(KERN_DEBUG "cpia: Camera Head ID %04X\n", (version[3] << 8) + version[2]);
 
        /* Turn on continuous grab */
        if (usb_cpia_set_grab_mode(dev, 1) < 0) {
@@ -1251,13 +1221,14 @@ static int usb_cpia_configure(struct usb_cpia *cpia)
        }
 
        /* Set video into CIF mode, and order into YUYV mode */
-       if (usb_cpia_set_format(dev, CPIA_CIF, 1, CPIA_YUYV) < 0) {
+       if (usb_cpia_set_format(dev, FORMAT_CIF, FORMAT_422,
+                       FORMAT_YUYV) < 0) {
                printk(KERN_INFO "cpia_set_format error\n");
                goto error;
        }
 
        /* Turn off compression */
-       if (usb_cpia_set_compression(dev, 0, 0) < 0) {
+       if (usb_cpia_set_compression(dev, COMP_DISABLED, DONT_DECIMATE) < 0) {
                printk(KERN_INFO "cpia_set_compression error\n");
                goto error;
        }
@@ -1300,10 +1271,10 @@ static void * cpia_probe(struct usb_device *dev, unsigned int ifnum)
                return NULL;
 
        /* We found a CPiA */
-       printk("USB CPiA camera found\n");
+       printk(KERN_INFO "USB CPiA camera found\n");
 
        if ((cpia = kmalloc(sizeof(*cpia), GFP_KERNEL)) == NULL) {
-               printk("couldn't kmalloc cpia struct\n");
+               printk(KERN_ERR "couldn't kmalloc cpia struct\n");
                return NULL;
        }
 
index f1d9ed7cd24f68208bc23eb4ff1118c6469bffc6..9261c55954dd443e0cf7c4ea73a88ec8f15c0209 100644 (file)
 
 #define USB_REQ_CPIA_GRAB_FRAME                        0xC1
 #define USB_REQ_CPIA_UPLOAD_FRAME              0xC2
+#define  WAIT_FOR_NEXT_FRAME                   0
+#define  FORCE_FRAME_UPLOAD                    1
 #define USB_REQ_CPIA_SET_GRAB_MODE             0xC3
 #define USB_REQ_CPIA_INIT_STREAM_CAP           0xC4
 #define USB_REQ_CPIA_FINI_STREAM_CAP           0xC5
 #define USB_REQ_CPIA_START_STREAM_CAP          0xC6
 #define USB_REQ_CPIA_END_STREAM_CAP            0xC7
 #define USB_REQ_CPIA_SET_FORMAT                        0xC8
+#define  FORMAT_QCIF   0
+#define  FORMAT_CIF    1
+#define  FORMAT_YUYV   0
+#define  FORMAT_UYVY   1
+#define  FORMAT_420    0
+#define  FORMAT_422    1
 #define USB_REQ_CPIA_SET_ROI                   0xC9
 #define USB_REQ_CPIA_SET_COMPRESSION           0xCA
+#define  COMP_DISABLED 0
+#define  COMP_AUTO     1
+#define  COMP_MANUAL   2
+#define  DONT_DECIMATE 0
+#define  DECIMATE      1
 #define USB_REQ_CPIA_SET_COMPRESSION_TARGET    0xCB
+#define  TARGET_QUALITY                0
+#define  TARGET_FRAMERATE      1
 #define USB_REQ_CPIA_SET_YUV_THRESH            0xCC
 #define USB_REQ_CPIA_SET_COMPRESSION_PARAMS    0xCD
 #define USB_REQ_CPIA_DISCARD_FRAME             0xCE
 #define USB_REQ_CPIA_DOWNLOAD_DRAM             0xEA
 /* #define USB_REQ_CPIA_NULL_CMD               0x?? */
 
-#define CPIA_QCIF      0
-#define CPIA_CIF       1
-
-#define CPIA_YUYV      0
-#define CPIA_UYVY      1
-
 #define STREAM_BUF_SIZE                (PAGE_SIZE * 4)
 /* #define STREAM_BUF_SIZE     (FRAMES_PER_DESC * FRAME_SIZE_PER_DESC) */
 
index 23e0f64dc916a43f74cb0c33deac640cec8fb3a7..48e27945bbfea3f652033e9f83b1b6c842c6d805 100644 (file)
@@ -2476,7 +2476,7 @@ static void __init get_of_addrs (const struct device_node *dp,
        for (i = 0; i < dp->n_addrs; ++i) {
                unsigned long addr = dp->addrs[i].address;
                unsigned long size = dp->addrs[i].size;
-               printk ("dp->addrs[%d].address = $lx, dp->addrs[%d].size = %lx\n",
+               printk ("dp->addrs[%d].address = %lx, dp->addrs[%d].size = %lx\n",
                        i, addr, i, size);
                if (size >= 0x800000) {
                        *display = addr;
index 58deaff5458e2b2f711eea2e1b5b9d9ec64d0d5a..77adb63956fa9d50b12a9ae3540a79a11a07e588 100644 (file)
@@ -455,7 +455,7 @@ static int get_pixel_mac(struct display *p, int pixel_x, int pixel_y)
   u8 *dest, bit;
   u16 *dest16;
   u32 *dest32;
-  u8 pixel;
+  u8 pixel=0;
 
   switch (p->var.bits_per_pixel) {
   case 1:
index 0016f759af54f879d60fdeb2eee3f202ee110ab8..ec2a068ffa9fe9f4d773914b1109a9073e05f424 100644 (file)
@@ -823,7 +823,7 @@ static int balance_dirty_state(kdev_t dev)
        unsigned long dirty, tot, hard_dirty_limit, soft_dirty_limit;
 
        dirty = size_buffers_type[BUF_DIRTY] >> PAGE_SHIFT;
-       tot = nr_lru_pages + nr_free_pages + nr_free_highpages;
+       tot = nr_lru_pages + nr_free_pages - nr_free_highpages;
        hard_dirty_limit = tot * bdf_prm.b_un.nfract / 100;
        soft_dirty_limit = hard_dirty_limit >> 1;
 
@@ -1294,7 +1294,9 @@ static void unmap_underlying_metadata(struct buffer_head * bh)
 {
 #if 0
        if (buffer_new(bh)) {
-               struct old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
+               struct buffer_head *old_bh;
+
+               old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
                if (old_bh) {
                        unmap_buffer(old_bh);
                        /* Here we could run brelse or bforget. We use
index f9a178cc6dead7d03b0cfc27199ed883d67fc035..984f300c180c1716c6d882238d8d7097079ca798 100644 (file)
@@ -470,20 +470,14 @@ out:
 static time_t ncp_obtain_mtime(struct dentry *dentry)
 {
        struct inode *inode = dentry->d_inode;
-       struct inode *parent = dentry->d_parent->d_inode;
        struct ncp_server *server = NCP_SERVER(inode);
        struct nw_info_struct i;
-       int len = dentry->d_name.len;
-       __u8 __name[len + 1];
 
        if (!ncp_conn_valid(server) ||
-           (inode == inode->i_sb->s_root->d_inode) ||
-           ncp_is_server_root(parent))
+           ncp_is_server_root(inode))
                return 0;
 
-       memcpy(__name, dentry->d_name.name, len);
-       io2vol(server, __name, !ncp_preserve_case(parent));
-       if (ncp_obtain_info(server, parent, __name, &i))
+       if (ncp_obtain_info(server, inode, NULL, &i))
                return 0;
 
        return ncp_date_dos2unix(le16_to_cpu(i.modifyTime),
@@ -498,7 +492,8 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
        struct ncp_server *server = NCP_SERVER(inode);
        union  ncp_dir_cache *cache = NULL;
        struct ncp_cache_control ctl;
-       int result;
+       int result, mtime_valid = 0;
+       time_t mtime = 0;
 
        ctl.page  = NULL;
        ctl.cache = NULL;
@@ -535,12 +530,11 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir)
                goto init_cache;
 
        if (filp->f_pos == 2) {
-               time_t mtime;
-
                if (jiffies - ctl.head.time >= NCP_MAX_AGE(server))
                        goto init_cache;
 
                mtime = ncp_obtain_mtime(dentry);
+               mtime_valid = 1;
                if ((!mtime) || (mtime != ctl.head.mtime))
                        goto init_cache;
        }
@@ -599,7 +593,11 @@ invalid_cache:
        ctl.cache = cache;
 init_cache:
        ncp_invalidate_dircache_entries(dentry);
-       ctl.head.mtime = ncp_obtain_mtime(dentry);
+       if (!mtime_valid) {
+               mtime = ncp_obtain_mtime(dentry);
+               mtime_valid = 1;
+       }
+       ctl.head.mtime = mtime;
        ctl.head.time = jiffies;
        ctl.head.eof = 0;
        ctl.fpos = 2;
index 8f77f7b62946b0b95fa618a53326d823c0378bbf..5dbd0c55ad181c3e47d51c2e15cd174abd05a99b 100644 (file)
@@ -387,7 +387,7 @@ ncp_ObtainSpecificDirBase(struct ncp_server *server,
        ncp_add_byte(server, 6); /* subfunction */
        ncp_add_byte(server, nsSrc);
        ncp_add_byte(server, nsDst);
-       ncp_add_word(server, 0x8006); /* get all */
+       ncp_add_word(server, htons(0x0680)); /* get all */
        ncp_add_dword(server, RIM_ALL);
        ncp_add_handle_path(server, vol_num, dir_base, 1, path);
 
index 139e0585d5686e788a99df26d63dfc89beabab1b..8c8d5698d7550c2c5d5af94091c1f14d8f420a90 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -707,7 +707,7 @@ repeat:
 
        /* Do we need to expand the fdset array? */
        if (fd >= current->files->max_fdset) {
-               error = expand_fdset(files, 0);
+               error = expand_fdset(files, fd);
                if (!error) {
                        error = -EMFILE;
                        goto repeat;
index d5a195ee614866e296d435c15c2ecfaf80bcc317..7826d9fa913de4750c6614dbb38e3ff2ec54b5c6 100644 (file)
@@ -140,16 +140,16 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
  * display in kilobytes.
  */
 #define K(x) ((x) << (PAGE_SHIFT - 10))
-
+#define B(x) ((x) << PAGE_SHIFT)
         si_meminfo(&i);
         si_swapinfo(&i);
         len = sprintf(page, "        total:    used:    free:  shared: buffers:  cached:\n"
                 "Mem:  %8lu %8lu %8lu %8lu %8lu %8u\n"
                 "Swap: %8lu %8lu %8lu\n",
-                K(i.totalram), K(i.totalram-i.freeram), K(i.freeram),
-                K(i.sharedram), K(i.bufferram),
-                K(atomic_read(&page_cache_size)), K(i.totalswap),
-                K(i.totalswap-i.freeswap), K(i.freeswap));
+                B(i.totalram), B(i.totalram-i.freeram), B(i.freeram),
+                B(i.sharedram), B(i.bufferram),
+                B(atomic_read(&page_cache_size)), B(i.totalswap),
+                B(i.totalswap-i.freeswap), B(i.freeswap));
         /*
          * Tagged format, for easy grepping and expansion.
          * The above will go away eventually, once the tools
@@ -181,7 +181,7 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
        if (len>count) len = count;
        if (len<0) len = 0;
        return len;
-
+#undef B
 #undef K
 }
 
index 5b53842be57587117409fad325c7780e5550a339..36b4818c3ffedee2e36f74c7e51461baa56b2d4c 100644 (file)
@@ -53,6 +53,9 @@
 #define ACPI_SLP_TYP2 0x1000
 #define ACPI_SLP_EN   0x2000
 
+#define ACPI_SLP_TYP_MASK  0x1c00
+#define ACPI_SLP_TYP_SHIFT 10
+
 /* PM_TMR masks */
 #define ACPI_TMR_MASK  0x00ffffff
 #define ACPI_TMR_HZ    3580000 /* 3.58 MHz */
@@ -82,6 +85,9 @@
 #define ACPI_TMR_VAL_EXT  0x00000100
 #define ACPI_DCK_CAP     0x00000200
 
+/* FACS flags */
+#define ACPI_S4BIOS      0x00000001
+
 struct acpi_rsdp {
        __u32 signature[2];
        __u8 checksum;
@@ -145,6 +151,15 @@ struct acpi_facp {
        __u32 flags;
 };
 
+struct acpi_facs {
+       __u32 signature;
+       __u32 length;
+       __u32 hw_signature;
+       __u32 fw_wake_vector;
+       __u32 global_lock;
+       __u32 flags;
+};
+
 /*
  * Sysctl declarations
  */
@@ -166,8 +181,12 @@ enum
        ACPI_P_LVL3,
        ACPI_P_LVL2_LAT,
        ACPI_P_LVL3_LAT,
+       ACPI_S5_SLP_TYP
 };
 
+#define ACPI_P_LVL_DISABLED    0x80
+#define ACPI_SLP_TYP_DISABLED  (~0UL)
+
 /*
  * PIIX4-specific ACPI info (for systems with PIIX4 but no ACPI tables)
  */
@@ -208,6 +227,7 @@ enum
 #ifdef __KERNEL__
 
 extern void (*acpi_idle)(void);
+extern void (*acpi_power_off)(void);
 
 #endif
 
index fb8e0bc96b0b6a0ad38312fc75ffba2597a40d22..8c008b8de2ede3f86592e2d943b834228174ce2b 100644 (file)
@@ -83,6 +83,7 @@
 #define FB_ACCEL_NV5           29      /* nVidia RIVA TNT2             */
 #define FB_ACCEL_CT_6555x      30      /* C&T 6555x                    */
 #define FB_ACCEL_3DFX_BANSHEE  31      /* 3Dfx Banshee                 */
+#define FB_ACCEL_ATI_RAGE128   32      /* ATI Rage128 family           */
 
 struct fb_fix_screeninfo {
        char id[16];                    /* identification string eg "TT Builtin" */
index 85d042adaae682ec35dd943d441a9886bf33ce61..db0d1f1fa83f7e0906b42b0c8a0ed40ce2336916 100644 (file)
@@ -455,6 +455,7 @@ asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struc
        add_wait_queue(&current->wait_chldexit,&wait);
 repeat:
        flag = 0;
+       current->state = TASK_INTERRUPTIBLE;
        read_lock(&tasklist_lock);
        for (p = current->p_cptr ; p ; p = p->p_osptr) {
                if (pid>0) {
@@ -521,12 +522,12 @@ repeat:
                retval = -ERESTARTSYS;
                if (signal_pending(current))
                        goto end_wait4;
-               current->state=TASK_INTERRUPTIBLE;
                schedule();
                goto repeat;
        }
        retval = -ECHILD;
 end_wait4:
+       current->state = TASK_RUNNING;
        remove_wait_queue(&current->wait_chldexit,&wait);
        return retval;
 }
index dc4b800733c89365aa9965c9b6e0b24f5fd02df8..fc1c5ee51dd10ada8570d837a2bf59432a9b67cc 100644 (file)
@@ -243,7 +243,7 @@ static inline void unuse_pte(struct vm_area_struct * vma, unsigned long address,
                return;
        set_pte(dir, pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
        swap_free(entry);
-       get_page(mem_map + MAP_NR(page));
+       get_page(page);
        ++vma->vm_mm->rss;
 }
 
index 3a26e6a2cc3e01a265187d821d0e93ce82334dab..df722997f6f4b880c3229cbf42dce84da664038f 100644 (file)
@@ -545,6 +545,7 @@ call_status(struct rpc_task *task)
 
        if (status >= 0) {
                task->tk_action = call_decode;
+               return;
        }
 
        task->tk_status = 0;