Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Apr 2008 22:15:48 +0000 (15:15 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Apr 2008 22:15:48 +0000 (15:15 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/selinux-2.6:
  SELinux fixups needed for preemptable RCU from -rt
  SELinux: no BUG_ON(!ss_initialized) in selinux_clone_mnt_opts

187 files changed:
Documentation/feature-removal-schedule.txt
Documentation/highuid.txt
Documentation/magic-number.txt
arch/sparc/Kconfig
arch/sparc/defconfig
arch/sparc/kernel/Makefile
arch/sparc/kernel/entry.S
arch/sparc/kernel/errtbls.c [deleted file]
arch/sparc/kernel/head.S
arch/sparc/kernel/sclow.S [deleted file]
arch/sparc/kernel/signal.c
arch/sparc/kernel/sparc_ksyms.c
arch/sparc/kernel/sunos_asm.S [deleted file]
arch/sparc/kernel/sunos_ioctl.c [deleted file]
arch/sparc/kernel/sys_solaris.c [deleted file]
arch/sparc/kernel/sys_sunos.c [deleted file]
arch/sparc/kernel/systbls.S
arch/sparc64/Kconfig
arch/sparc64/Makefile
arch/sparc64/defconfig
arch/sparc64/kernel/Makefile
arch/sparc64/kernel/binfmt_aout32.c [deleted file]
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/signal.c
arch/sparc64/kernel/signal32.c
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sunos_ioctl32.c [deleted file]
arch/sparc64/kernel/sys_sparc.c
arch/sparc64/kernel/sys_sunos32.c [deleted file]
arch/sparc64/kernel/systbls.S
arch/sparc64/kernel/systbls.h
arch/sparc64/kernel/ttable.S
arch/sparc64/solaris/Makefile [deleted file]
arch/sparc64/solaris/conv.h [deleted file]
arch/sparc64/solaris/entry64.S [deleted file]
arch/sparc64/solaris/fs.c [deleted file]
arch/sparc64/solaris/ioctl.c [deleted file]
arch/sparc64/solaris/ipc.c [deleted file]
arch/sparc64/solaris/misc.c [deleted file]
arch/sparc64/solaris/signal.c [deleted file]
arch/sparc64/solaris/signal.h [deleted file]
arch/sparc64/solaris/socket.c [deleted file]
arch/sparc64/solaris/socksys.c [deleted file]
arch/sparc64/solaris/socksys.h [deleted file]
arch/sparc64/solaris/systbl.S [deleted file]
arch/sparc64/solaris/timod.c [deleted file]
drivers/block/brd.c
drivers/hid/hid-core.c
drivers/hid/hid-debug.c
drivers/hid/hid-input-quirks.c
drivers/hid/usbhid/Kconfig
drivers/hid/usbhid/Makefile
drivers/hid/usbhid/hid-core.c
drivers/hid/usbhid/hid-ff.c
drivers/hid/usbhid/hid-lg2ff.c [new file with mode: 0644]
drivers/hid/usbhid/hid-quirks.c
drivers/hid/usbhid/hiddev.c
drivers/hid/usbhid/usbhid.h
drivers/i2c/algos/Kconfig
drivers/i2c/algos/i2c-algo-pca.c
drivers/i2c/algos/i2c-algo-pca.h [deleted file]
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Makefile
drivers/i2c/busses/i2c-at91.c
drivers/i2c/busses/i2c-au1550.c
drivers/i2c/busses/i2c-bfin-twi.c
drivers/i2c/busses/i2c-davinci.c
drivers/i2c/busses/i2c-gpio.c
drivers/i2c/busses/i2c-ibm_iic.c
drivers/i2c/busses/i2c-iop3xx.c
drivers/i2c/busses/i2c-ixp2000.c
drivers/i2c/busses/i2c-mpc.c
drivers/i2c/busses/i2c-ocores.c
drivers/i2c/busses/i2c-omap.c
drivers/i2c/busses/i2c-pca-isa.c
drivers/i2c/busses/i2c-pca-platform.c [new file with mode: 0644]
drivers/i2c/busses/i2c-pmcmsp.c
drivers/i2c/busses/i2c-pnx.c
drivers/i2c/busses/i2c-powermac.c
drivers/i2c/busses/i2c-pxa.c
drivers/i2c/busses/i2c-s3c2410.c
drivers/i2c/busses/i2c-sh7760.c [new file with mode: 0644]
drivers/i2c/busses/i2c-sh_mobile.c [new file with mode: 0644]
drivers/i2c/busses/i2c-simtec.c
drivers/i2c/busses/i2c-versatile.c
drivers/i2c/busses/scx200_acb.c
drivers/i2c/chips/isp1301_omap.c
drivers/i2c/i2c-core.c
drivers/i2c/i2c-dev.c
drivers/infiniband/hw/ipath/Kconfig
drivers/infiniband/hw/ipath/Makefile
drivers/infiniband/hw/ipath/ipath_driver.c
drivers/infiniband/hw/ipath/ipath_iba7220.c
drivers/infiniband/hw/ipath/ipath_verbs.c
drivers/infiniband/hw/nes/nes.c
drivers/infiniband/hw/nes/nes_nic.c
drivers/mmc/core/core.c
drivers/mmc/core/core.h
drivers/mmc/core/host.c
drivers/mmc/core/sdio_irq.c
drivers/mmc/core/sdio_ops.c
drivers/mmc/host/omap.c
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h
fs/Kconfig
fs/Kconfig.binfmt
fs/dlm/Makefile
fs/dlm/config.c
fs/dlm/config.h
fs/dlm/dlm_internal.h
fs/dlm/lock.c
fs/dlm/lock.h
fs/dlm/main.c
fs/dlm/member.c
fs/dlm/plock.c [new file with mode: 0644]
fs/dlm/recoverd.c
fs/gfs2/locking/dlm/Makefile
fs/gfs2/locking/dlm/lock_dlm.h
fs/gfs2/locking/dlm/main.c
fs/gfs2/locking/dlm/mount.c
fs/gfs2/locking/dlm/plock.c [deleted file]
fs/udf/Makefile
fs/udf/balloc.c
fs/udf/crc.c [deleted file]
fs/udf/dir.c
fs/udf/ecma_167.h
fs/udf/file.c
fs/udf/ialloc.c
fs/udf/inode.c
fs/udf/lowlevel.c
fs/udf/misc.c
fs/udf/namei.c
fs/udf/partition.c
fs/udf/super.c
fs/udf/symlink.c
fs/udf/truncate.c
fs/udf/udf_i.h
fs/udf/udf_sb.h
fs/udf/udfdecl.h
fs/udf/udfend.h
fs/udf/udftime.c
fs/udf/unicode.c
include/asm-arm/arch-omap/mmc.h
include/asm-sh/i2c-sh7760.h [new file with mode: 0644]
include/asm-sparc/Kbuild
include/asm-sparc/a.out-core.h [deleted file]
include/asm-sparc/a.out.h [deleted file]
include/asm-sparc/head.h
include/asm-sparc/ioctls.h
include/asm-sparc/mman.h
include/asm-sparc/namei.h
include/asm-sparc/pconf.h [deleted file]
include/asm-sparc/processor.h
include/asm-sparc/socket.h
include/asm-sparc/solerrno.h [deleted file]
include/asm-sparc/svr4.h [deleted file]
include/asm-sparc/termios.h
include/asm-sparc/user.h
include/asm-sparc64/Kbuild
include/asm-sparc64/a.out-core.h [deleted file]
include/asm-sparc64/a.out.h [deleted file]
include/asm-sparc64/ioctls.h
include/asm-sparc64/mman.h
include/asm-sparc64/namei.h
include/asm-sparc64/pconf.h [deleted file]
include/asm-sparc64/socket.h
include/asm-sparc64/solerrno.h [deleted file]
include/asm-sparc64/svr4.h [deleted file]
include/asm-sparc64/termios.h
include/asm-sparc64/ttable.h
include/asm-sparc64/unistd.h
include/asm-sparc64/user.h
include/linux/Kbuild
include/linux/dlm.h
include/linux/dlm_device.h
include/linux/dlm_plock.h [new file with mode: 0644]
include/linux/dlmconstants.h
include/linux/hid.h
include/linux/hidraw.h
include/linux/i2c-algo-pca.h
include/linux/i2c-pca-platform.h [new file with mode: 0644]
include/linux/lock_dlm_plock.h [deleted file]
include/linux/udf_fs.h [deleted file]
include/linux/udf_fs_i.h
include/linux/udf_fs_sb.h [deleted file]
kernel/sched.c
net/core/sock.c

index b45ea28abc997c5269f20fdaa331f9a558cb4705..448729fcaeb1d0b9557333d54cef7ef7f1628fe5 100644 (file)
@@ -261,17 +261,6 @@ Who:       Michael Buesch <mb@bu3sch.de>
 
 ---------------------------
 
-What:  Solaris/SunOS syscall and binary support on Sparc
-When:  2.6.26
-Why:   Largely unmaintained and almost entirely unused.  File system
-       layering used to divert library and dynamic linker searches to
-       /usr/gnemul is extremely buggy and unfixable.  Making it work
-       is largely pointless as without a lot of work only the most
-       trivial of Solaris binaries can work with the emulation code.
-Who:   David S. Miller <davem@davemloft.net>
-
----------------------------
-
 What:  init_mm export
 When:  2.6.26
 Why:   Not used in-tree. The current out-of-tree users used it to
index 76034d9dbfc084ad01a8952ac1f80db26892bfc6..6bad6f1d1cac4c16e513c491a5a6fb6df0c94786 100644 (file)
@@ -28,8 +28,6 @@ What's left to be done for 32-bit UIDs on all Linux architectures:
   uses the 32-bit UID system calls properly otherwise.
 
   This affects at least:
-       SunOS emulation
-       Solaris emulation
        iBCS on Intel
 
        sparc32 emulation on sparc64
index bd450e797558f5df225f4d7de661e166275e41e4..95070028d15eeae7e0bfb13993932eb40e2b84b1 100644 (file)
@@ -95,7 +95,6 @@ RFCOMM_TTY_MAGIC      0x6d02                        net/bluetooth/rfcomm/tty.c
 USB_SERIAL_PORT_MAGIC 0x7301      usb_serial_port   drivers/usb/serial/usb-serial.h
 CG_MAGIC              0x00090255  ufs_cylinder_group include/linux/ufs_fs.h
 A2232_MAGIC           0x000a2232  gs_port           drivers/char/ser_a2232.h
-SOLARIS_SOCKET_MAGIC  0x000ADDED  sol_socket_struct arch/sparc64/solaris/socksys.h
 RPORT_MAGIC           0x00525001  r_port            drivers/char/rocket_int.h
 LSEMAGIC              0x05091998  lse               drivers/fc4/fc.c
 GDTIOCTL_MAGIC        0x06030f07  gdth_iowr_str     drivers/scsi/gdth_ioctl.h
index c40343c5492085c203bbb553d113a970ec65c918..49590f8fe98cc60f26be4661f74a8d6574e4fd48 100644 (file)
@@ -27,9 +27,6 @@ config ARCH_NO_VIRT_TO_BUS
 config OF
        def_bool y
 
-config ARCH_SUPPORTS_AOUT
-       def_bool y
-
 config HZ
        int
        default 100
@@ -257,15 +254,6 @@ config SPARC_LED
 
 source "fs/Kconfig.binfmt"
 
-config SUNOS_EMUL
-       bool "SunOS binary emulation"
-       help
-         This allows you to run most SunOS binaries.  If you want to do this,
-         say Y here and place appropriate files in /usr/gnemul/sunos. See
-         <http://www.ultralinux.org/faq.html> for more information.  If you
-         want to run SunOS binaries on an Ultra you must also say Y to
-         "Kernel support for 32-bit a.out binaries" above.
-
 source "mm/Kconfig"
 
 endmenu
index f7a509149199f06a46f3d3b4860ca4dc9c92feb9..6a2c57a2fe71ae1d56f3af7071f26e7da5859bba 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.23-rc1
-# Wed Jul 25 15:30:21 2007
+# Linux kernel version: 2.6.25
+# Sun Apr 20 01:49:51 2008
 #
 CONFIG_MMU=y
 CONFIG_HIGHMEM=y
@@ -9,18 +9,15 @@ CONFIG_ZONE_DMA=y
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_ARCH_NO_VIRT_TO_BUS=y
 CONFIG_OF=y
+CONFIG_HZ=100
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
-# Code maturity level options
+# General setup
 #
 CONFIG_EXPERIMENTAL=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
 CONFIG_LOCALVERSION=""
 CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
@@ -29,12 +26,23 @@ CONFIG_SYSVIPC_SYSCTL=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 # CONFIG_TASKSTATS is not set
-# CONFIG_USER_NS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+CONFIG_GROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_USER_SCHED=y
+# CONFIG_CGROUP_SCHED is not set
 CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
 # CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -49,6 +57,7 @@ CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
 CONFIG_ELF_CORE=y
+CONFIG_COMPAT_BRK=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_ANON_INODES=y
@@ -61,6 +70,13 @@ CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_SLAB=y
 # CONFIG_SLUB is not set
 # CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_HAVE_KPROBES is not set
+# CONFIG_HAVE_KRETPROBES is not set
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
@@ -88,6 +104,7 @@ CONFIG_IOSCHED_CFQ=y
 CONFIG_DEFAULT_CFQ=y
 # CONFIG_DEFAULT_NOOP is not set
 CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_CLASSIC_RCU=y
 
 #
 # General machine setup
@@ -113,14 +130,13 @@ CONFIG_SUN_PM=y
 CONFIG_PCI=y
 CONFIG_PCI_SYSCALL=y
 # CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCI_LEGACY=y
 # CONFIG_PCI_DEBUG is not set
 # CONFIG_NO_DMA is not set
 CONFIG_SUN_OPENPROMFS=m
 # CONFIG_SPARC_LED is not set
 CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_AOUT=y
 CONFIG_BINFMT_MISC=m
-CONFIG_SUNOS_EMUL=y
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -128,6 +144,7 @@ CONFIG_FLATMEM_MANUAL=y
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
 CONFIG_ZONE_DMA_FLAG=1
@@ -148,6 +165,7 @@ CONFIG_XFRM=y
 CONFIG_XFRM_USER=m
 # CONFIG_XFRM_SUB_POLICY is not set
 # CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
 CONFIG_NET_KEY=m
 # CONFIG_NET_KEY_MIGRATE is not set
 CONFIG_INET=y
@@ -170,6 +188,7 @@ CONFIG_INET_TUNNEL=y
 CONFIG_INET_XFRM_MODE_TRANSPORT=y
 CONFIG_INET_XFRM_MODE_TUNNEL=y
 CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_LRO is not set
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
@@ -191,8 +210,10 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=m
 CONFIG_INET6_XFRM_MODE_BEET=m
 # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
 CONFIG_IPV6_SIT=m
+CONFIG_IPV6_NDISC_NODETYPE=y
 CONFIG_IPV6_TUNNEL=m
 # CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
 # CONFIG_IP_DCCP is not set
@@ -214,10 +235,6 @@ CONFIG_SCTP_HMAC_MD5=y
 # CONFIG_LAPB is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
-
-#
-# QoS and/or fair queueing
-#
 # CONFIG_NET_SCHED is not set
 
 #
@@ -225,6 +242,7 @@ CONFIG_SCTP_HMAC_MD5=y
 #
 CONFIG_NET_PKTGEN=m
 # CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
 CONFIG_AF_RXRPC=m
@@ -248,6 +266,7 @@ CONFIG_AF_RXRPC=m
 #
 # Generic Driver Options
 #
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
@@ -271,7 +290,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_BLK_DEV_XIP is not set
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
 CONFIG_MISC_DEVICES=y
@@ -279,6 +298,8 @@ CONFIG_MISC_DEVICES=y
 # CONFIG_EEPROM_93CX6 is not set
 # CONFIG_SGI_IOC4 is not set
 # CONFIG_TIFM_CORE is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+CONFIG_HAVE_IDE=y
 # CONFIG_IDE is not set
 
 #
@@ -318,6 +339,7 @@ CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
 # CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
 CONFIG_SCSI_LOWLEVEL=y
 # CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
@@ -338,6 +360,7 @@ CONFIG_SCSI_LOWLEVEL=y
 # CONFIG_SCSI_IPS is not set
 # CONFIG_SCSI_INITIO is not set
 # CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_MVSAS is not set
 # CONFIG_SCSI_STEX is not set
 # CONFIG_SCSI_SYM53C8XX_2 is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
@@ -353,14 +376,7 @@ CONFIG_SCSI_SUNESP=y
 # CONFIG_SCSI_SRP is not set
 # CONFIG_ATA is not set
 # CONFIG_MD is not set
-
-#
-# Fusion MPT device support
-#
 # CONFIG_FUSION is not set
-# CONFIG_FUSION_SPI is not set
-# CONFIG_FUSION_FC is not set
-# CONFIG_FUSION_SAS is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -375,6 +391,7 @@ CONFIG_DUMMY=m
 # CONFIG_MACVLAN is not set
 # CONFIG_EQUALIZER is not set
 CONFIG_TUN=m
+# CONFIG_VETH is not set
 # CONFIG_ARCNET is not set
 # CONFIG_PHYLIB is not set
 CONFIG_NET_ETHERNET=y
@@ -388,11 +405,20 @@ CONFIG_SUNQE=m
 # CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_NET_TULIP is not set
 # CONFIG_HP100 is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
 # CONFIG_NET_PCI is not set
+# CONFIG_B44 is not set
 CONFIG_NETDEV_1000=y
 # CONFIG_ACENIC is not set
 # CONFIG_DL2K is not set
 # CONFIG_E1000 is not set
+# CONFIG_E1000E is not set
+# CONFIG_E1000E_ENABLED is not set
+# CONFIG_IP1000 is not set
+# CONFIG_IGB is not set
 # CONFIG_MYRI_SBUS is not set
 # CONFIG_NS83820 is not set
 # CONFIG_HAMACHI is not set
@@ -409,11 +435,15 @@ CONFIG_NETDEV_1000=y
 CONFIG_NETDEV_10000=y
 # CONFIG_CHELSIO_T1 is not set
 # CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGBE is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
 # CONFIG_NETXEN_NIC is not set
+# CONFIG_NIU is not set
 # CONFIG_MLX4_CORE is not set
+# CONFIG_TEHUTI is not set
+# CONFIG_BNX2X is not set
 # CONFIG_TR is not set
 
 #
@@ -421,13 +451,13 @@ CONFIG_NETDEV_10000=y
 #
 # CONFIG_WLAN_PRE80211 is not set
 # CONFIG_WLAN_80211 is not set
+# CONFIG_IWLWIFI_LEDS is not set
 # CONFIG_WAN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
 # CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
 # CONFIG_NETCONSOLE is not set
 # CONFIG_NETPOLL is not set
 # CONFIG_NET_POLL_CONTROLLER is not set
@@ -449,7 +479,6 @@ CONFIG_INPUT_MOUSEDEV_PSAUX=y
 CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 CONFIG_INPUT_JOYDEV=m
-# CONFIG_INPUT_TSDEV is not set
 CONFIG_INPUT_EVDEV=m
 CONFIG_INPUT_EVBUG=m
 
@@ -498,6 +527,7 @@ CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
 # CONFIG_VT_HW_CONSOLE_BINDING is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_NOZOMI is not set
 
 #
 # Serial drivers
@@ -519,7 +549,6 @@ CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
 # CONFIG_IPMI_HANDLER is not set
-# CONFIG_WATCHDOG is not set
 CONFIG_HW_RANDOM=m
 CONFIG_JS_RTC=m
 # CONFIG_R3964 is not set
@@ -538,9 +567,9 @@ CONFIG_DEVPORT=y
 # CONFIG_POWER_SUPPLY is not set
 CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_I5K_AMB is not set
 # CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
 # CONFIG_SENSORS_IT87 is not set
 # CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_PC87427 is not set
@@ -553,6 +582,14 @@ CONFIG_HWMON=y
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
 
 #
 # Multifunction device drivers
@@ -569,15 +606,15 @@ CONFIG_HWMON=y
 #
 # Graphics support
 #
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Display device support
 #
 # CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_VGASTATE is not set
-# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-# CONFIG_FB is not set
 
 #
 # Console display driver support
@@ -592,6 +629,7 @@ CONFIG_DUMMY_CONSOLE=y
 CONFIG_HID_SUPPORT=y
 CONFIG_HID=y
 # CONFIG_HID_DEBUG is not set
+# CONFIG_HIDRAW is not set
 CONFIG_USB_SUPPORT=y
 CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
@@ -601,33 +639,13 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 #
 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
 #
-
-#
-# USB Gadget Support
-#
 # CONFIG_USB_GADGET is not set
 # CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
 # CONFIG_NEW_LEDS is not set
 # CONFIG_INFINIBAND is not set
-
-#
-# Real Time Clock
-#
 # CONFIG_RTC_CLASS is not set
 
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
 #
 # Userspace I/O
 #
@@ -664,18 +682,14 @@ CONFIG_FS_MBCACHE=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_QUOTA=y
-CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
 CONFIG_XFS_RT=y
-# CONFIG_GFS2_FS is not set
 # CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-CONFIG_ROMFS_FS=m
+CONFIG_DNOTIFY=y
 CONFIG_INOTIFY=y
 CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_QUOTACTL=y
-CONFIG_DNOTIFY=y
 CONFIG_AUTOFS_FS=m
 CONFIG_AUTOFS4_FS=m
 # CONFIG_FUSE_FS is not set
@@ -704,7 +718,6 @@ CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
 # CONFIG_TMPFS is not set
 # CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
 # CONFIG_CONFIGFS_FS is not set
 
 #
@@ -721,14 +734,13 @@ CONFIG_BEFS_FS=m
 # CONFIG_EFS_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
+CONFIG_ROMFS_FS=m
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
+CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 # CONFIG_NFS_V3 is not set
 # CONFIG_NFS_V4 is not set
@@ -760,10 +772,6 @@ CONFIG_AFS_FS=m
 # CONFIG_PARTITION_ADVANCED is not set
 CONFIG_MSDOS_PARTITION=y
 CONFIG_SUN_PARTITION=y
-
-#
-# Native Language Support
-#
 CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="iso8859-1"
 # CONFIG_NLS_CODEPAGE_437 is not set
@@ -804,21 +812,14 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # CONFIG_NLS_KOI8_R is not set
 # CONFIG_NLS_KOI8_U is not set
 # CONFIG_NLS_UTF8 is not set
-
-#
-# Distributed Lock Manager
-#
 # CONFIG_DLM is not set
 
-#
-# Instrumentation Support
-#
-# CONFIG_PROFILING is not set
-
 #
 # Kernel hacking
 #
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
 CONFIG_ENABLE_MUST_CHECK=y
 CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
@@ -842,9 +843,12 @@ CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_LIST is not set
-CONFIG_FORCED_INLINING=y
+# CONFIG_DEBUG_SG is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
 # CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
 # CONFIG_FAULT_INJECTION is not set
+# CONFIG_SAMPLES is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
 
 #
@@ -853,9 +857,12 @@ CONFIG_FORCED_INLINING=y
 CONFIG_KEYS=y
 # CONFIG_KEYS_DEBUG_PROC_KEYS is not set
 # CONFIG_SECURITY is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
 CONFIG_CRYPTO=y
 CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_AEAD=y
 CONFIG_CRYPTO_BLKCIPHER=y
+# CONFIG_CRYPTO_SEQIV is not set
 CONFIG_CRYPTO_HASH=y
 CONFIG_CRYPTO_MANAGER=y
 CONFIG_CRYPTO_HMAC=y
@@ -873,6 +880,10 @@ CONFIG_CRYPTO_ECB=m
 CONFIG_CRYPTO_CBC=y
 CONFIG_CRYPTO_PCBC=m
 # CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_CCM is not set
 # CONFIG_CRYPTO_CRYPTD is not set
 CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_FCRYPT is not set
@@ -887,11 +898,15 @@ CONFIG_CRYPTO_CAST6=m
 CONFIG_CRYPTO_ARC4=m
 # CONFIG_CRYPTO_KHAZAD is not set
 # CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SALSA20 is not set
 CONFIG_CRYPTO_DEFLATE=y
 CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_CRC32C=m
 # CONFIG_CRYPTO_CAMELLIA is not set
 # CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_AUTHENC=y
+# CONFIG_CRYPTO_LZO is not set
 # CONFIG_CRYPTO_HW is not set
 
 #
index 2712bb166f6f1612582bebea275585d8b8fd5e56..59700aaaae93253fa0e4cfec0dede2f29a94a93a 100644 (file)
@@ -9,9 +9,9 @@ EXTRA_AFLAGS    := -ansi
 IRQ_OBJS := irq.o sun4m_irq.o sun4c_irq.o sun4d_irq.o
 obj-y    := entry.o wof.o wuf.o etrap.o rtrap.o traps.o $(IRQ_OBJS) \
            process.o signal.o ioport.o setup.o idprom.o \
-           sys_sparc.o sunos_asm.o systbls.o \
-           time.o windows.o cpu.o devices.o sclow.o \
-           tadpole.o tick14.o ptrace.o sys_solaris.o \
+           sys_sparc.o systbls.o \
+           time.o windows.o cpu.o devices.o \
+           tadpole.o tick14.o ptrace.o \
            unaligned.o una_asm.o muldiv.o \
            prom.o of_device.o devres.o
 
@@ -25,7 +25,3 @@ obj-$(CONFIG_PCI) += ebus.o
 obj-$(CONFIG_SUN_PM) += apc.o pmc.o
 obj-$(CONFIG_MODULES) += module.o sparc_ksyms.o
 obj-$(CONFIG_SPARC_LED) += led.o
-
-ifdef CONFIG_SUNOS_EMUL
-obj-y += sys_sunos.o sunos_ioctl.o
-endif
index c2eed8f71516b80e7dd71a048f44cc2c174e399f..135644f8add772c785f1afb84b4d5f5e86e83b33 100644 (file)
@@ -1186,36 +1186,6 @@ srmmu_fault:
 
        RESTORE_ALL
 
-#ifdef CONFIG_SUNOS_EMUL
-       /* SunOS uses syscall zero as the 'indirect syscall' it looks
-        * like indir_syscall(scall_num, arg0, arg1, arg2...);  etc.
-        * This is complete brain damage.
-        */
-       .globl  sunos_indir
-sunos_indir:
-       mov     %o7, %l4
-       cmp     %o0, NR_SYSCALLS
-       blu,a   1f
-        sll    %o0, 0x2, %o0
-
-       sethi   %hi(sunos_nosys), %l6
-       b       2f
-        or     %l6, %lo(sunos_nosys), %l6
-
-1:
-       set     sunos_sys_table, %l7
-       ld      [%l7 + %o0], %l6
-
-2:     
-       mov     %o1, %o0
-       mov     %o2, %o1
-       mov     %o3, %o2
-       mov     %o4, %o3
-       mov     %o5, %o4
-       call    %l6
-        mov    %l4, %o7
-#endif
-
        .align  4
        .globl  sys_nis_syscall
 sys_nis_syscall:
@@ -1232,6 +1202,16 @@ sys_execve:
        call    sparc_execve
         mov    %l5, %o7
 
+       .globl  sunos_execv
+sunos_execv:
+       st      %g0, [%sp + STACKFRAME_SZ + PT_I2]
+
+       call    sparc_execve
+        add    %sp, STACKFRAME_SZ, %o0
+
+       b       ret_sys_call
+        ld     [%sp + STACKFRAME_SZ + PT_I0], %o0
+
        .align  4
        .globl  sys_pipe
 sys_pipe:
@@ -1394,7 +1374,7 @@ ret_from_fork:
        b       ret_sys_call
         ld     [%sp + STACKFRAME_SZ + PT_I0], %o0
 
-       /* Linux native and SunOS system calls enter here... */
+       /* Linux native system calls enter here... */
        .align  4
        .globl  linux_sparc_syscall
 linux_sparc_syscall:
@@ -1472,170 +1452,6 @@ linux_syscall_trace2:
         st     %l2, [%sp + STACKFRAME_SZ + PT_NPC]
 
 
-       /*
-        * Solaris system calls and indirect system calls enter here.
-         *
-        * I have named the solaris indirect syscalls like that because
-        * it seems like Solaris has some fast path syscalls that can
-        * be handled as indirect system calls. - mig
-        */
-
-linux_syscall_for_solaris:
-       sethi   %hi(sys_call_table), %l7
-       b       linux_sparc_syscall
-        or     %l7, %lo(sys_call_table), %l7
-       
-       .align  4
-       .globl  solaris_syscall
-solaris_syscall:
-       cmp     %g1,59
-       be      linux_syscall_for_solaris
-        cmp    %g1,2
-       be      linux_syscall_for_solaris
-        cmp    %g1,42
-       be      linux_syscall_for_solaris
-        cmp    %g1,119
-       be,a    linux_syscall_for_solaris
-        mov    2, %g1
-1:     
-       SAVE_ALL_HEAD
-        rd     %wim, %l3
-
-       wr      %l0, PSR_ET, %psr
-       nop
-       nop
-       mov     %i0, %l5
-
-       call    do_solaris_syscall
-        add    %sp, STACKFRAME_SZ, %o0
-
-       st      %o0, [%sp + STACKFRAME_SZ + PT_I0]
-       set     PSR_C, %g2
-       cmp     %o0, -ERESTART_RESTARTBLOCK
-       bgeu    1f
-        ld     [%sp + STACKFRAME_SZ + PT_PSR], %g3
-
-       /* System call success, clear Carry condition code. */          
-       andn    %g3, %g2, %g3
-       clr     %l6
-       b       2f
-        st     %g3, [%sp + STACKFRAME_SZ + PT_PSR]     
-
-1:
-       /* System call failure, set Carry condition code.
-        * Also, get abs(errno) to return to the process.
-        */
-       sub     %g0, %o0, %o0
-       mov     1, %l6
-       st      %o0, [%sp + STACKFRAME_SZ + PT_I0]
-       or      %g3, %g2, %g3
-       st      %g3, [%sp + STACKFRAME_SZ + PT_PSR]
-
-       /* Advance the pc and npc over the trap instruction.
-        * If the npc is unaligned (has a 1 in the lower byte), it means
-        * the kernel does not want us to play magic (ie, skipping over
-        * traps).  Mainly when the Solaris code wants to set some PC and
-        * nPC (setcontext).
-        */
-2:
-       ld      [%sp + STACKFRAME_SZ + PT_NPC], %l1     /* pc  = npc   */
-       andcc   %l1, 1, %g0
-       bne     1f
-        add    %l1, 0x4, %l2                   /* npc = npc+4 */
-       st      %l1, [%sp + STACKFRAME_SZ + PT_PC]
-       b       ret_trap_entry
-        st     %l2, [%sp + STACKFRAME_SZ + PT_NPC]
-
-       /* kernel knows what it is doing, fixup npc and continue */
-1:
-       sub     %l1, 1, %l1
-       b       ret_trap_entry  
-        st     %l1, [%sp + STACKFRAME_SZ + PT_NPC]
-
-#ifndef CONFIG_SUNOS_EMUL
-       .align  4
-       .globl  sunos_syscall
-sunos_syscall:
-       SAVE_ALL_HEAD
-        rd     %wim, %l3
-       wr      %l0, PSR_ET, %psr
-       nop
-       nop
-       mov     %i0, %l5
-       call    do_sunos_syscall
-        add    %sp, STACKFRAME_SZ, %o0
-#endif
-
-       /* {net, open}bsd system calls enter here... */
-       .align  4
-       .globl  bsd_syscall
-bsd_syscall:
-       /* Direct access to user regs, must faster. */
-       cmp     %g1, NR_SYSCALLS
-       blu,a   1f
-        sll    %g1, 2, %l4
-
-       set     sys_ni_syscall, %l7
-       b       bsd_is_too_hard
-        nop
-
-1:
-       ld      [%l7 + %l4], %l7
-
-       .globl  bsd_is_too_hard
-bsd_is_too_hard:
-       rd      %wim, %l3
-       SAVE_ALL
-
-       wr      %l0, PSR_ET, %psr
-       WRITE_PAUSE
-
-2:
-       mov     %i0, %o0
-       mov     %i1, %o1
-       mov     %i2, %o2
-       mov     %i0, %l5
-       mov     %i3, %o3
-       mov     %i4, %o4
-       call    %l7
-        mov    %i5, %o5
-
-       st      %o0, [%sp + STACKFRAME_SZ + PT_I0]
-       set     PSR_C, %g2
-       cmp     %o0, -ERESTART_RESTARTBLOCK
-       bgeu    1f
-        ld     [%sp + STACKFRAME_SZ + PT_PSR], %g3
-
-       /* System call success, clear Carry condition code. */          
-       andn    %g3, %g2, %g3
-       clr     %l6
-       b       2f
-        st     %g3, [%sp + STACKFRAME_SZ + PT_PSR]     
-
-1:
-       /* System call failure, set Carry condition code.
-        * Also, get abs(errno) to return to the process.
-        */
-       sub     %g0, %o0, %o0
-#if 0 /* XXX todo XXX */
-       sethi   %hi(bsd_xlatb_rorl), %o3
-       or      %o3, %lo(bsd_xlatb_rorl), %o3
-       sll     %o0, 2, %o0
-       ld      [%o3 + %o0], %o0
-#endif
-       mov     1, %l6
-       st      %o0, [%sp + STACKFRAME_SZ + PT_I0]
-       or      %g3, %g2, %g3
-       st      %g3, [%sp + STACKFRAME_SZ + PT_PSR]
-
-       /* Advance the pc and npc over the trap instruction. */
-2:
-       ld      [%sp + STACKFRAME_SZ + PT_NPC], %l1     /* pc  = npc   */
-       add     %l1, 0x4, %l2                   /* npc = npc+4 */
-       st      %l1, [%sp + STACKFRAME_SZ + PT_PC]
-       b       ret_trap_entry
-        st     %l2, [%sp + STACKFRAME_SZ + PT_NPC]
-
 /* Saving and restoring the FPU state is best done from lowlevel code.
  *
  * void fpsave(unsigned long *fpregs, unsigned long *fsr,
diff --git a/arch/sparc/kernel/errtbls.c b/arch/sparc/kernel/errtbls.c
deleted file mode 100644 (file)
index ed14df7..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/* errtbls.c: Error number conversion tables.
- *
- * Copyright (C) 1995, 2007 David S. Miller (davem@davemloft.net)
- *
- * Based upon preliminary work which is:
- *
- * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
- */
-
-#include <asm/solerrno.h>        /* Solaris errnos */
-
-/* Here is the table which converts between Linux error number values
- * to the equivalent under Solaris.  Note that since the Linux ones
- * have been set up to match exactly those of SunOS, no translation
- * table is needed for that OS.
- */
-
-int solaris_errno[] = {
-       0,
-       SOL_EPERM,
-       SOL_ENOENT,
-       SOL_ESRCH,
-       SOL_EINTR,
-       SOL_EIO,
-       SOL_ENXIO,
-       SOL_E2BIG,
-       SOL_ENOEXEC,
-       SOL_EBADF,
-       SOL_ECHILD,
-       SOL_EAGAIN,
-       SOL_ENOMEM,
-       SOL_EACCES,
-       SOL_EFAULT,
-       SOL_NOTBLK,
-       SOL_EBUSY,
-       SOL_EEXIST,
-       SOL_EXDEV,
-       SOL_ENODEV,
-       SOL_ENOTDIR,
-       SOL_EISDIR,
-       SOL_EINVAL,
-       SOL_ENFILE,
-       SOL_EMFILE,
-       SOL_ENOTTY,
-       SOL_ETXTBSY,
-       SOL_EFBIG,
-       SOL_ENOSPC,
-       SOL_ESPIPE,
-       SOL_EROFS,
-       SOL_EMLINK,
-       SOL_EPIPE,
-       SOL_EDOM,
-       SOL_ERANGE,
-       SOL_EWOULDBLOCK,
-       SOL_EINPROGRESS,
-       SOL_EALREADY,
-       SOL_ENOTSOCK,
-       SOL_EDESTADDRREQ,
-       SOL_EMSGSIZE,
-       SOL_EPROTOTYPE,
-       SOL_ENOPROTOOPT,
-       SOL_EPROTONOSUPPORT,
-       SOL_ESOCKTNOSUPPORT,
-       SOL_EOPNOTSUPP,
-       SOL_EPFNOSUPPORT,
-       SOL_EAFNOSUPPORT,
-       SOL_EADDRINUSE,
-       SOL_EADDRNOTAVAIL,
-       SOL_ENETDOWN,
-       SOL_ENETUNREACH,
-       SOL_ENETRESET,
-       SOL_ECONNABORTED,
-       SOL_ECONNRESET,
-       SOL_ENOBUFS,
-       SOL_EISCONN,
-       SOL_ENOTONN,
-       SOL_ESHUTDOWN,
-       SOL_ETOOMANYREFS,
-       SOL_ETIMEDOUT,
-       SOL_ECONNREFUSED,
-       SOL_ELOOP,
-       SOL_ENAMETOOLONG,
-       SOL_EHOSTDOWN,
-       SOL_EHOSTUNREACH,
-       SOL_ENOTEMPTY,
-       SOL_EPROCLIM,
-       SOL_EUSERS,
-       SOL_EDQUOT,
-       SOL_ESTALE,
-       SOL_EREMOTE,
-       SOL_ENOSTR,
-       SOL_ETIME,
-       SOL_ENOSR,
-       SOL_ENOMSG,
-       SOL_EBADMSG,
-       SOL_IDRM,
-       SOL_EDEADLK,
-       SOL_ENOLCK,
-       SOL_ENONET,
-       SOL_ERREMOTE,
-       SOL_ENOLINK,
-       SOL_EADV,
-       SOL_ESRMNT,
-       SOL_ECOMM,
-       SOL_EPROTO,
-       SOL_EMULTIHOP,
-       SOL_EINVAL,    /* EDOTDOT XXX??? */
-       SOL_REMCHG,
-       SOL_NOSYS,
-       SOL_STRPIPE,
-       SOL_EOVERFLOW,
-       SOL_EBADFD,
-       SOL_ECHRNG,
-       SOL_EL2NSYNC,
-       SOL_EL3HLT,
-       SOL_EL3RST,
-       SOL_NRNG,
-       SOL_EUNATCH,
-       SOL_ENOCSI,
-       SOL_EL2HLT,
-       SOL_EBADE,
-       SOL_EBADR,
-       SOL_EXFULL,
-       SOL_ENOANO,
-       SOL_EBADRQC,
-       SOL_EBADSLT,
-       SOL_EDEADLOCK,
-       SOL_EBFONT,
-       SOL_ELIBEXEC,
-       SOL_ENODATA,
-       SOL_ELIBBAD,
-       SOL_ENOPKG,
-       SOL_ELIBACC,
-       SOL_ENOTUNIQ,
-       SOL_ERESTART,
-       SOL_EUCLEAN,
-       SOL_ENOTNAM,
-       SOL_ENAVAIL,
-       SOL_EISNAM,
-       SOL_EREMOTEIO,
-       SOL_EILSEQ,
-       SOL_ELIBMAX,
-       SOL_ELIBSCN,
-};
index 9a219e8b5ddb3edb8f6726764b7cff7cf43a8f86..b7f1e81c8ff29e4d1b8672dbadbf4305db170e93 100644 (file)
@@ -78,11 +78,6 @@ sun4e_notsup:
         .asciz  "Sparc-Linux sun4e support does not exist\n\n"
        .align 4
 
-#ifndef CONFIG_SUNOS_EMUL
-#undef SUNOS_SYSCALL_TRAP
-#define SUNOS_SYSCALL_TRAP SUNOS_NO_SYSCALL_TRAP
-#endif
-
        /* The Sparc trap table, bootloader gives us control at _start. */
        .text
        .globl  start, _stext, _start, __stext
@@ -158,7 +153,7 @@ t_bad6f:BAD_TRAP(0x6f) BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x7
 t_bad74:BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78)
 t_bad79:BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d)
 t_bad7e:BAD_TRAP(0x7e) BAD_TRAP(0x7f)
-t_sunos:SUNOS_SYSCALL_TRAP                  /* SunOS System Call             */
+t_bad80:BAD_TRAP(0x80)                      /* SunOS System Call             */
 t_sbkpt:BREAKPOINT_TRAP                     /* Software Breakpoint/KGDB      */
 t_divz:        TRAP_ENTRY(0x82, do_hw_divzero)     /* Divide by zero trap           */
 t_flwin:TRAP_ENTRY(0x83, do_flush_windows)  /* Flush Windows Trap            */
@@ -166,8 +161,8 @@ t_clwin:BAD_TRAP(0x84)                      /* Clean Windows Trap            */
 t_rchk:        BAD_TRAP(0x85)                      /* Range Check                   */
 t_funal:BAD_TRAP(0x86)                      /* Fix Unaligned Access Trap     */
 t_iovf:        BAD_TRAP(0x87)                      /* Integer Overflow Trap         */
-t_slowl:SOLARIS_SYSCALL_TRAP                /* Slowaris System Call          */
-t_netbs:NETBSD_SYSCALL_TRAP                 /* Net-B.S. System Call          */
+t_bad88:BAD_TRAP(0x88)                      /* Slowaris System Call          */
+t_bad89:BAD_TRAP(0x89)                      /* Net-B.S. System Call          */
 t_bad8a:BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) BAD_TRAP(0x8d) BAD_TRAP(0x8e)
 t_bad8f:BAD_TRAP(0x8f)
 t_linux:LINUX_SYSCALL_TRAP                  /* Linux System Call             */
@@ -178,7 +173,7 @@ t_getcc:GETCC_TRAP                          /* Get Condition Codes           */
 t_setcc:SETCC_TRAP                          /* Set Condition Codes           */
 t_getpsr:GETPSR_TRAP                        /* Get PSR Register              */
 t_bada3:BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6)
-t_slowi:INDIRECT_SOLARIS_SYSCALL(156)
+t_bada7:BAD_TRAP(0xa7)
 t_bada8:BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
 t_badac:BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0)
 t_badb1:BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5)
@@ -243,19 +238,19 @@ trapbase_cpu1:
        BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78)
        BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d)
        BAD_TRAP(0x7e) BAD_TRAP(0x7f)
-       SUNOS_SYSCALL_TRAP 
+       BAD_TRAP(0x80)
        BREAKPOINT_TRAP
        TRAP_ENTRY(0x82, do_hw_divzero)
        TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85)
-       BAD_TRAP(0x86) BAD_TRAP(0x87) SOLARIS_SYSCALL_TRAP
-       NETBSD_SYSCALL_TRAP BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c)
+       BAD_TRAP(0x86) BAD_TRAP(0x87) BAD_TRAP(0x88)
+       BAD_TRAP(0x89) BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c)
        BAD_TRAP(0x8d) BAD_TRAP(0x8e) BAD_TRAP(0x8f)
        LINUX_SYSCALL_TRAP BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94)
        BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99)
        BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e)
        BAD_TRAP(0x9f) GETCC_TRAP SETCC_TRAP GETPSR_TRAP
        BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6)
-       INDIRECT_SOLARIS_SYSCALL(156) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
+       BAD_TRAP(0xa7) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
        BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0)
        BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5)
        BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba)
@@ -311,19 +306,19 @@ trapbase_cpu2:
        BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78)
        BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d)
        BAD_TRAP(0x7e) BAD_TRAP(0x7f)
-       SUNOS_SYSCALL_TRAP 
+       BAD_TRAP(0x80)
        BREAKPOINT_TRAP
        TRAP_ENTRY(0x82, do_hw_divzero)
        TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85)
-       BAD_TRAP(0x86) BAD_TRAP(0x87) SOLARIS_SYSCALL_TRAP
-       NETBSD_SYSCALL_TRAP BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c)
+       BAD_TRAP(0x86) BAD_TRAP(0x87) BAD_TRAP(0x88)
+       BAD_TRAP(0x89) BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c)
        BAD_TRAP(0x8d) BAD_TRAP(0x8e) BAD_TRAP(0x8f)
        LINUX_SYSCALL_TRAP BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94)
        BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99)
        BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e)
        BAD_TRAP(0x9f) GETCC_TRAP SETCC_TRAP GETPSR_TRAP
        BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6)
-       INDIRECT_SOLARIS_SYSCALL(156) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
+       BAD_TRAP(0xa7) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
        BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0)
        BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5)
        BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba)
@@ -379,19 +374,19 @@ trapbase_cpu3:
        BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77) BAD_TRAP(0x78)
        BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b) BAD_TRAP(0x7c) BAD_TRAP(0x7d)
        BAD_TRAP(0x7e) BAD_TRAP(0x7f)
-       SUNOS_SYSCALL_TRAP  
+       BAD_TRAP(0x80)
        BREAKPOINT_TRAP
        TRAP_ENTRY(0x82, do_hw_divzero)
        TRAP_ENTRY(0x83, do_flush_windows) BAD_TRAP(0x84) BAD_TRAP(0x85)
-       BAD_TRAP(0x86) BAD_TRAP(0x87) SOLARIS_SYSCALL_TRAP
-       NETBSD_SYSCALL_TRAP BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c)
+       BAD_TRAP(0x86) BAD_TRAP(0x87) BAD_TRAP(0x88)
+       BAD_TRAP(0x89) BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c)
        BAD_TRAP(0x8d) BAD_TRAP(0x8e) BAD_TRAP(0x8f)
        LINUX_SYSCALL_TRAP BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93) BAD_TRAP(0x94)
        BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97) BAD_TRAP(0x98) BAD_TRAP(0x99)
        BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e)
        BAD_TRAP(0x9f) GETCC_TRAP SETCC_TRAP GETPSR_TRAP
        BAD_TRAP(0xa3) BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6)
-       INDIRECT_SOLARIS_SYSCALL(156) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
+       BAD_TRAP(0xa7) BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
        BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf) BAD_TRAP(0xb0)
        BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3) BAD_TRAP(0xb4) BAD_TRAP(0xb5)
        BAD_TRAP(0xb6) BAD_TRAP(0xb7) BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba)
diff --git a/arch/sparc/kernel/sclow.S b/arch/sparc/kernel/sclow.S
deleted file mode 100644 (file)
index 136e37c..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/* sclow.S: Low level special syscall handling.
- *          Basically these are cases where we can completely
- *          handle the system call without saving any state
- *          because we know that the process will not sleep.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <asm/ptrace.h>
-#include <asm/asm-offsets.h>
-#include <asm/errno.h>
-#include <asm/winmacro.h>
-#include <asm/thread_info.h>
-#include <asm/psr.h>
-#include <asm/page.h>
-
-#define CC_AND_RETT  \
-       set     PSR_C, %l4; \
-       andn    %l0, %l4, %l4; \
-       wr      %l4, 0x0, %psr; \
-       nop; nop; nop; \
-       jmp     %l2; \
-       rett    %l2 + 4;
-
-#define SC_AND_RETT  \
-       set     PSR_C, %l4; \
-       or      %l0, %l4, %l4; \
-       wr      %l4, 0x0, %psr; \
-       nop; nop; nop; \
-       jmp     %l2; \
-       rett    %l2 + 4;
-
-#define LABEL(func)  func##_low
-
-       .globl  LABEL(sunosnop)
-LABEL(sunosnop):
-       CC_AND_RETT
-
-#if (ASIZ_task_uid == 2 && ASIZ_task_euid == 2)
-       .globl  LABEL(sunosgetuid)
-LABEL(sunosgetuid):
-       LOAD_CURRENT(l4, l5)
-       ld      [%l4 + TI_TASK], %l4
-       lduh    [%l4 + AOFF_task_uid], %i0
-       lduh    [%l4 + AOFF_task_euid], %i1
-       CC_AND_RETT
-#endif
-
-#if (ASIZ_task_gid == 2 && ASIZ_task_egid == 2)
-       .globl  LABEL(sunosgetgid)
-LABEL(sunosgetgid):
-       LOAD_CURRENT(l4, l5)
-       ld      [%l4 + TI_TASK], %l4
-       lduh    [%l4 + AOFF_task_gid], %i0
-       lduh    [%l4 + AOFF_task_egid], %i1
-       CC_AND_RETT
-#endif
-
-       .globl  LABEL(sunosmctl)
-LABEL(sunosmctl):
-       mov     0, %i0
-       CC_AND_RETT
-
-       .globl  LABEL(sunosgdtsize)
-LABEL(sunosgdtsize):   
-       mov     256, %i0
-       CC_AND_RETT
-
-       .globl  LABEL(getpagesize)
-LABEL(getpagesize):
-       set     PAGE_SIZE, %i0
-       CC_AND_RETT
-
-       /* XXX sys_nice() XXX */
-       /* XXX sys_setpriority() XXX */
-       /* XXX sys_getpriority() XXX */
-       /* XXX sys_setregid() XXX */
-       /* XXX sys_setgid() XXX */
-       /* XXX sys_setreuid() XXX */
-       /* XXX sys_setuid() XXX */
-       /* XXX sys_setfsuid() XXX */
-       /* XXX sys_setfsgid() XXX */
-       /* XXX sys_setpgid() XXX */
-       /* XXX sys_getpgid() XXX */
-       /* XXX sys_setsid() XXX */
-       /* XXX sys_getsid() XXX */
index 9994cac950789a265d8c1db23b010c228adefa98..1f730619a24ad048ed341845fc2c5d3128d4b8a2 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
-#include <asm/svr4.h>
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/cacheflush.h>    /* flush_sig_insns */
@@ -454,7 +453,6 @@ setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *old
                        break;
                case SIGSYS:
                        if (info->si_code == (__SI_FAULT|0x100)) {
-                               /* See sys_sunos.c */
                                sig_code = info->si_trapno;
                                break;
                        }
@@ -676,291 +674,17 @@ sigsegv:
        force_sigsegv(signo, current);
 }
 
-/* Setup a Solaris stack frame */
-static inline void
-setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
-                struct pt_regs *regs, int signr, sigset_t *oldset)
-{
-       svr4_signal_frame_t __user *sfp;
-       svr4_gregset_t  __user *gr;
-       svr4_siginfo_t  __user *si;
-       svr4_mcontext_t __user *mc;
-       svr4_gwindows_t __user *gw;
-       svr4_ucontext_t __user *uc;
-       svr4_sigset_t   setv;
-       struct thread_info *tp = current_thread_info();
-       int window = 0, err;
-
-       synchronize_user_stack();
-       sfp = (svr4_signal_frame_t __user *)
-               get_sigframe(sa, regs, SVR4_SF_ALIGNED + sizeof(struct reg_window));
-
-       if (invalid_frame_pointer(sfp, sizeof(*sfp)))
-               goto sigill_and_return;
-
-       /* Start with a clean frame pointer and fill it */
-       err = __clear_user(sfp, sizeof(*sfp));
-
-       /* Setup convenience variables */
-       si = &sfp->si;
-       uc = &sfp->uc;
-       gw = &sfp->gw;
-       mc = &uc->mcontext;
-       gr = &mc->greg;
-       
-       /* FIXME: where am I supposed to put this?
-        * sc->sigc_onstack = old_status;
-        * anyways, it does not look like it is used for anything at all.
-        */
-       setv.sigbits[0] = oldset->sig[0];
-       setv.sigbits[1] = oldset->sig[1];
-       if (_NSIG_WORDS >= 4) {
-               setv.sigbits[2] = oldset->sig[2];
-               setv.sigbits[3] = oldset->sig[3];
-               err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
-       } else
-               err |= __copy_to_user(&uc->sigmask, &setv,
-                                     2 * sizeof(unsigned int));
-
-       /* Store registers */
-       err |= __put_user(regs->pc, &((*gr)[SVR4_PC]));
-       err |= __put_user(regs->npc, &((*gr)[SVR4_NPC]));
-       err |= __put_user(regs->psr, &((*gr)[SVR4_PSR]));
-       err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
-       
-       /* Copy g[1..7] and o[0..7] registers */
-       err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs[UREG_G1],
-                             sizeof(long) * 7);
-       err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs[UREG_I0],
-                             sizeof(long) * 8);
-
-       /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
-       err |= __put_user(current->sas_ss_size, &uc->stack.size);
-
-       /* Save the currently window file: */
-
-       /* 1. Link sfp->uc->gwins to our windows */
-       err |= __put_user(gw, &mc->gwin);
-           
-       /* 2. Number of windows to restore at setcontext(): */
-       err |= __put_user(tp->w_saved, &gw->count);
-
-       /* 3. Save each valid window
-        *    Currently, it makes a copy of the windows from the kernel copy.
-        *    David's code for SunOS, makes the copy but keeps the pointer to
-        *    the kernel.  My version makes the pointer point to a userland 
-        *    copy of those.  Mhm, I wonder if I shouldn't just ignore those
-        *    on setcontext and use those that are on the kernel, the signal
-        *    handler should not be modyfing those, mhm.
-        *
-        *    These windows are just used in case synchronize_user_stack failed
-        *    to flush the user windows.
-        */
-       for (window = 0; window < tp->w_saved; window++) {
-               err |= __put_user((int __user *) &(gw->win[window]), &gw->winptr[window]);
-               err |= __copy_to_user(&gw->win[window],
-                                     &tp->reg_window[window],
-                                     sizeof(svr4_rwindow_t));
-               err |= __put_user(0, gw->winptr[window]);
-       }
-
-       /* 4. We just pay attention to the gw->count field on setcontext */
-       tp->w_saved = 0; /* So process is allowed to execute. */
-
-       /* Setup the signal information.  Solaris expects a bunch of
-        * information to be passed to the signal handler, we don't provide
-        * that much currently, should use siginfo.
-        */
-       err |= __put_user(signr, &si->siginfo.signo);
-       err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
-       if (err)
-               goto sigsegv;
-
-       regs->u_regs[UREG_FP] = (unsigned long) sfp;
-       regs->pc = (unsigned long) sa->sa_handler;
-       regs->npc = (regs->pc + 4);
-
-       /* Arguments passed to signal handler */
-       if (regs->u_regs[14]){
-               struct reg_window __user *rw = (struct reg_window __user *)
-                       regs->u_regs[14];
-
-               err |= __put_user(signr, &rw->ins[0]);
-               err |= __put_user(si, &rw->ins[1]);
-               err |= __put_user(uc, &rw->ins[2]);
-               err |= __put_user(sfp, &rw->ins[6]);    /* frame pointer */
-               if (err)
-                       goto sigsegv;
-
-               regs->u_regs[UREG_I0] = signr;
-               regs->u_regs[UREG_I1] = (unsigned long) si;
-               regs->u_regs[UREG_I2] = (unsigned long) uc;
-       }
-       return;
-
-sigill_and_return:
-       do_exit(SIGILL);
-sigsegv:
-       force_sigsegv(signr, current);
-}
-
-asmlinkage int svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
-{
-       svr4_gregset_t  __user *gr;
-       svr4_mcontext_t __user *mc;
-       svr4_sigset_t   setv;
-       int err = 0;
-
-       synchronize_user_stack();
-
-       if (current_thread_info()->w_saved)
-               return -EFAULT;
-
-       err = clear_user(uc, sizeof(*uc));
-       if (err)
-               return -EFAULT;
-
-       /* Setup convenience variables */
-       mc = &uc->mcontext;
-       gr = &mc->greg;
-
-       setv.sigbits[0] = current->blocked.sig[0];
-       setv.sigbits[1] = current->blocked.sig[1];
-       if (_NSIG_WORDS >= 4) {
-               setv.sigbits[2] = current->blocked.sig[2];
-               setv.sigbits[3] = current->blocked.sig[3];
-               err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
-       } else
-               err |= __copy_to_user(&uc->sigmask, &setv,
-                                     2 * sizeof(unsigned int));
-
-       /* Store registers */
-       err |= __put_user(regs->pc, &uc->mcontext.greg[SVR4_PC]);
-       err |= __put_user(regs->npc, &uc->mcontext.greg[SVR4_NPC]);
-       err |= __put_user(regs->psr, &uc->mcontext.greg[SVR4_PSR]);
-       err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
-       
-       /* Copy g[1..7] and o[0..7] registers */
-       err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs[UREG_G1],
-                             sizeof(uint) * 7);
-       err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs[UREG_I0],
-                             sizeof(uint) * 8);
-
-       /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
-       err |= __put_user(current->sas_ss_size, &uc->stack.size);
-
-       /* The register file is not saved
-        * we have already stuffed all of it with sync_user_stack
-        */
-       return (err ? -EFAULT : 0);
-}
-
-/* Set the context for a svr4 application, this is Solaris way to sigreturn */
-asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
-{
-       svr4_gregset_t  __user *gr;
-       unsigned long pc, npc, psr;
-       mm_segment_t old_fs;
-       sigset_t set;
-       svr4_sigset_t setv;
-       int err;
-       stack_t st;
-       
-       /* Fixme: restore windows, or is this already taken care of in
-        * svr4_setup_frame when sync_user_windows is done?
-        */
-       flush_user_windows();
-
-       if (current_thread_info()->w_saved)
-               goto sigsegv_and_return;
-
-       if (((unsigned long) c) & 3)
-               goto sigsegv_and_return;
-
-       if (!__access_ok((unsigned long)c, sizeof(*c)))
-               goto sigsegv_and_return;
-
-       /* Check for valid PC and nPC */
-       gr = &c->mcontext.greg;
-       err = __get_user(pc, &((*gr)[SVR4_PC]));
-       err |= __get_user(npc, &((*gr)[SVR4_NPC]));
-
-       if ((pc | npc) & 3)
-               goto sigsegv_and_return;
-
-       /* Retrieve information from passed ucontext */
-       /* note that nPC is ored a 1, this is used to inform entry.S */
-       /* that we don't want it to mess with our PC and nPC */
-
-       /* This is pretty much atomic, no amount locking would prevent
-        * the races which exist anyways.
-        */
-       err |= __copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
-       
-       err |= __get_user(st.ss_sp, &c->stack.sp);
-       err |= __get_user(st.ss_flags, &c->stack.flags);
-       err |= __get_user(st.ss_size, &c->stack.size);
-       
-       if (err)
-               goto sigsegv_and_return;
-               
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       do_sigaltstack((const stack_t __user *) &st, NULL,
-                      regs->u_regs[UREG_I6]);
-       set_fs(old_fs);
-       
-       set.sig[0] = setv.sigbits[0];
-       set.sig[1] = setv.sigbits[1];
-       if (_NSIG_WORDS >= 4) {
-               set.sig[2] = setv.sigbits[2];
-               set.sig[3] = setv.sigbits[3];
-       }
-       sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       regs->pc = pc;
-       regs->npc = npc | 1;
-       err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
-       err |= __get_user(psr, &((*gr)[SVR4_PSR]));
-       regs->psr &= ~(PSR_ICC);
-       regs->psr |= (psr & PSR_ICC);
-
-       /* Restore g[1..7] and o[0..7] registers */
-       err |= __copy_from_user(&regs->u_regs[UREG_G1], &(*gr)[SVR4_G1],
-                             sizeof(long) * 7);
-       err |= __copy_from_user(&regs->u_regs[UREG_I0], &(*gr)[SVR4_O0],
-                             sizeof(long) * 8);
-       return (err ? -EFAULT : 0);
-
-sigsegv_and_return:
-       force_sig(SIGSEGV, current);
-       return -EFAULT;
-}
-
 static inline void
 handle_signal(unsigned long signr, struct k_sigaction *ka,
-             siginfo_t *info, sigset_t *oldset, struct pt_regs *regs,
-             int svr4_signal)
+             siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
 {
-       if (svr4_signal)
-               setup_svr4_frame(&ka->sa, regs->pc, regs->npc, regs, signr, oldset);
-       else {
-               if (ka->sa.sa_flags & SA_SIGINFO)
-                       new_setup_rt_frame(ka, regs, signr, oldset, info);
-               else if (current->thread.new_signal)
-                       new_setup_frame(ka, regs, signr, oldset);
-               else
-                       setup_frame(&ka->sa, regs, signr, oldset, info);
-       }
+       if (ka->sa.sa_flags & SA_SIGINFO)
+               new_setup_rt_frame(ka, regs, signr, oldset, info);
+       else if (current->thread.new_signal)
+               new_setup_frame(ka, regs, signr, oldset);
+       else
+               setup_frame(&ka->sa, regs, signr, oldset, info);
+
        spin_lock_irq(&current->sighand->siglock);
        sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
        if (!(ka->sa.sa_flags & SA_NOMASK))
@@ -1002,17 +726,6 @@ asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int rest
        int signr;
        sigset_t *oldset;
 
-       /*
-        * XXX Disable svr4 signal handling until solaris emulation works.
-        * It is buggy - Anton
-        */
-#define SVR4_SIGNAL_BROKEN 1
-#ifdef SVR4_SIGNAL_BROKEN
-       int svr4_signal = 0;
-#else
-       int svr4_signal = current->personality == PER_SVR4;
-#endif
-
        cookie.restart_syscall = restart_syscall;
        cookie.orig_i0 = orig_i0;
 
@@ -1025,8 +738,8 @@ asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int rest
        if (signr > 0) {
                if (cookie.restart_syscall)
                        syscall_restart(cookie.orig_i0, regs, &ka.sa);
-               handle_signal(signr, &ka, &info, oldset,
-                             regs, svr4_signal);
+               handle_signal(signr, &ka, &info, oldset, regs);
+
                /* a signal was successfully delivered; the saved
                 * sigmask will have been stored in the signal frame,
                 * and will be restored by sigreturn, so we can simply
index 97b1de0e90941fbbed11275a172c44601245a9d5..0bcf98a7ef389b83f0ae4fb937823864a776f221 100644 (file)
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/idprom.h>
-#include <asm/svr4.h>
 #include <asm/head.h>
 #include <asm/smp.h>
 #include <asm/mostek.h>
 #include <asm/ptrace.h>
-#include <asm/user.h>
 #include <asm/uaccess.h>
 #include <asm/checksum.h>
 #ifdef CONFIG_SBUS
@@ -62,8 +60,6 @@ struct poll {
        short revents;
 };
 
-extern int svr4_getcontext (svr4_ucontext_t *, struct pt_regs *);
-extern int svr4_setcontext (svr4_ucontext_t *, struct pt_regs *);
 extern void (*__copy_1page)(void *, const void *);
 extern void __memmove(void *, const void *, __kernel_size_t);
 extern void (*bzero_1page)(void *);
@@ -204,10 +200,6 @@ EXPORT_SYMBOL(kmap_atomic);
 EXPORT_SYMBOL(kunmap_atomic);
 #endif
 
-/* Solaris/SunOS binary compatibility */
-EXPORT_SYMBOL(svr4_setcontext);
-EXPORT_SYMBOL(svr4_getcontext);
-
 /* prom symbols */
 EXPORT_SYMBOL(idprom);
 EXPORT_SYMBOL(prom_root_node);
diff --git a/arch/sparc/kernel/sunos_asm.S b/arch/sparc/kernel/sunos_asm.S
deleted file mode 100644 (file)
index 07fe860..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/* $Id: sunos_asm.S,v 1.15 2000/01/11 17:33:21 jj Exp $
- * sunos_asm.S: SunOS system calls which must have a low-level
- *              entry point to operate correctly.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- *
- * Based upon preliminary work which is:
- *
- * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
- */
-
-#include <asm/ptrace.h>
-
-       .text
-       .align 4
-
-       /* When calling ret_sys_call, %o0 should contain the same
-        * value as in [%sp + STACKFRAME_SZ + PT_I0] */
-
-       /* SunOS getpid() returns pid in %o0 and ppid in %o1 */
-       .globl  sunos_getpid
-sunos_getpid:
-       call    sys_getppid
-        nop
-
-       call    sys_getpid
-        st     %o0, [%sp + STACKFRAME_SZ + PT_I1]
-
-       b       ret_sys_call
-        st     %o0, [%sp + STACKFRAME_SZ + PT_I0]
-
-       /* SunOS getuid() returns uid in %o0 and euid in %o1 */
-       .globl  sunos_getuid
-sunos_getuid:
-       call    sys_geteuid16
-        nop
-
-       call    sys_getuid16
-        st     %o0, [%sp + STACKFRAME_SZ + PT_I1]
-
-       b       ret_sys_call
-        st     %o0, [%sp + STACKFRAME_SZ + PT_I0]
-
-       /* SunOS getgid() returns gid in %o0 and egid in %o1 */
-       .globl  sunos_getgid
-sunos_getgid:
-       call    sys_getegid16
-        nop
-
-       call    sys_getgid16
-        st     %o0, [%sp + STACKFRAME_SZ + PT_I1]
-
-       b       ret_sys_call
-        st     %o0, [%sp + STACKFRAME_SZ + PT_I0]
-
-       /* SunOS's execv() call only specifies the argv argument, the
-        * environment settings are the same as the calling processes.
-        */
-       .globl  sunos_execv
-sunos_execv:
-       st      %g0, [%sp + STACKFRAME_SZ + PT_I2]
-
-       call    sparc_execve
-        add    %sp, STACKFRAME_SZ, %o0
-
-       b       ret_sys_call
-        ld     [%sp + STACKFRAME_SZ + PT_I0], %o0
diff --git a/arch/sparc/kernel/sunos_ioctl.c b/arch/sparc/kernel/sunos_ioctl.c
deleted file mode 100644 (file)
index e613cc6..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/* $Id: sunos_ioctl.c,v 1.34 2000/09/03 14:10:56 anton Exp $
- * sunos_ioctl.c: The Linux Operating system: SunOS ioctl compatibility.
- * 
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <asm/uaccess.h>
-
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/termios.h>
-#include <linux/tty.h>
-#include <linux/ioctl.h>
-#include <linux/route.h>
-#include <linux/sockios.h>
-#include <linux/if.h>
-#include <linux/netdevice.h>
-#include <linux/if_arp.h>
-#include <linux/fs.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/syscalls.h>
-#include <linux/file.h>
-
-#if 0
-extern char sunkbd_type;
-extern char sunkbd_layout;
-#endif
-
-/* NR_OPEN is now larger and dynamic in recent kernels. */
-#define SUNOS_NR_OPEN  256
-
-asmlinkage int sunos_ioctl (int fd, unsigned long cmd, unsigned long arg)
-{
-       int ret = -EBADF;
-
-       if (fd >= SUNOS_NR_OPEN || !fcheck(fd))
-               goto out;
-
-       /* First handle an easy compat. case for tty ldisc. */
-       if (cmd == TIOCSETD) {
-               int __user *p;
-               int ntty = N_TTY, tmp;
-               mm_segment_t oldfs;
-
-               p = (int __user *) arg;
-               ret = -EFAULT;
-               if (get_user(tmp, p))
-                       goto out;
-               if (tmp == 2) {
-                       oldfs = get_fs();
-                       set_fs(KERNEL_DS);
-                       ret = sys_ioctl(fd, cmd, (unsigned long) &ntty);
-                       set_fs(oldfs);
-                       ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
-                       goto out;
-               }
-       }
-
-       /* Binary compatibility is good American knowhow fuckin' up. */
-       if (cmd == TIOCNOTTY) {
-               ret = sys_setsid();
-               goto out;
-       }
-
-       /* SunOS networking ioctls. */
-       switch (cmd) {
-       case _IOW('r', 10, struct rtentry):
-               ret = sys_ioctl(fd, SIOCADDRT, arg);
-               goto out;
-       case _IOW('r', 11, struct rtentry):
-               ret = sys_ioctl(fd, SIOCDELRT, arg);
-               goto out;
-       case _IOW('i', 12, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFADDR, arg);
-               goto out;
-       case _IOWR('i', 13, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFADDR, arg);
-               goto out;
-       case _IOW('i', 14, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFDSTADDR, arg);
-               goto out;
-       case _IOWR('i', 15, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFDSTADDR, arg);
-               goto out;
-       case _IOW('i', 16, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFFLAGS, arg);
-               goto out;
-       case _IOWR('i', 17, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFFLAGS, arg);
-               goto out;
-       case _IOW('i', 18, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFMEM, arg);
-               goto out;
-       case _IOWR('i', 19, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFMEM, arg);
-               goto out;
-       case _IOWR('i', 20, struct ifconf):
-               ret = sys_ioctl(fd, SIOCGIFCONF, arg);
-               goto out;
-       case _IOW('i', 21, struct ifreq): /* SIOCSIFMTU */
-               ret = sys_ioctl(fd, SIOCSIFMTU, arg);
-               goto out;
-       case _IOWR('i', 22, struct ifreq): /* SIOCGIFMTU */
-               ret = sys_ioctl(fd, SIOCGIFMTU, arg);
-               goto out;
-
-       case _IOWR('i', 23, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFBRDADDR, arg);
-               goto out;
-       case _IOW('i', 24, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFBRDADDR, arg);
-               goto out;
-       case _IOWR('i', 25, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFNETMASK, arg);
-               goto out;
-       case _IOW('i', 26, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFNETMASK, arg);
-               goto out;
-       case _IOWR('i', 27, struct ifreq):
-               ret = sys_ioctl(fd, SIOCGIFMETRIC, arg);
-               goto out;
-       case _IOW('i', 28, struct ifreq):
-               ret = sys_ioctl(fd, SIOCSIFMETRIC, arg);
-               goto out;
-
-       case _IOW('i', 30, struct arpreq):
-               ret = sys_ioctl(fd, SIOCSARP, arg);
-               goto out;
-       case _IOWR('i', 31, struct arpreq):
-               ret = sys_ioctl(fd, SIOCGARP, arg);
-               goto out;
-       case _IOW('i', 32, struct arpreq):
-               ret = sys_ioctl(fd, SIOCDARP, arg);
-               goto out;
-
-       case _IOW('i', 40, struct ifreq): /* SIOCUPPER */
-       case _IOW('i', 41, struct ifreq): /* SIOCLOWER */
-       case _IOW('i', 44, struct ifreq): /* SIOCSETSYNC */
-       case _IOW('i', 45, struct ifreq): /* SIOCGETSYNC */
-       case _IOW('i', 46, struct ifreq): /* SIOCSSDSTATS */
-       case _IOW('i', 47, struct ifreq): /* SIOCSSESTATS */
-       case _IOW('i', 48, struct ifreq): /* SIOCSPROMISC */
-               ret = -EOPNOTSUPP;
-               goto out;
-
-       case _IOW('i', 49, struct ifreq):
-               ret = sys_ioctl(fd, SIOCADDMULTI, arg);
-               goto out;
-       case _IOW('i', 50, struct ifreq):
-               ret = sys_ioctl(fd, SIOCDELMULTI, arg);
-               goto out;
-
-       /* FDDI interface ioctls, unsupported. */
-               
-       case _IOW('i', 51, struct ifreq): /* SIOCFDRESET */
-       case _IOW('i', 52, struct ifreq): /* SIOCFDSLEEP */
-       case _IOW('i', 53, struct ifreq): /* SIOCSTRTFMWAR */
-       case _IOW('i', 54, struct ifreq): /* SIOCLDNSTRTFW */
-       case _IOW('i', 55, struct ifreq): /* SIOCGETFDSTAT */
-       case _IOW('i', 56, struct ifreq): /* SIOCFDNMIINT */
-       case _IOW('i', 57, struct ifreq): /* SIOCFDEXUSER */
-       case _IOW('i', 58, struct ifreq): /* SIOCFDGNETMAP */
-       case _IOW('i', 59, struct ifreq): /* SIOCFDGIOCTL */
-               printk("FDDI ioctl, returning EOPNOTSUPP\n");
-               ret = -EOPNOTSUPP;
-               goto out;
-
-       case _IOW('t', 125, int):
-               /* More stupid tty sunos ioctls, just
-                * say it worked.
-                */
-               ret = 0;
-               goto out;
-       /* Non posix grp */
-       case _IOW('t', 118, int): {
-               int oldval, newval, __user *ptr;
-
-               cmd = TIOCSPGRP;
-               ptr = (int __user *) arg;
-               ret = -EFAULT;
-               if (get_user(oldval, ptr))
-                       goto out;
-               ret = sys_ioctl(fd, cmd, arg);
-               __get_user(newval, ptr);
-               if (newval == -1) {
-                       __put_user(oldval, ptr);
-                       ret = -EIO;
-               }
-               if (ret == -ENOTTY)
-                       ret = -EIO;
-               goto out;
-       }
-
-       case _IOR('t', 119, int): {
-               int oldval, newval, __user *ptr;
-
-               cmd = TIOCGPGRP;
-               ptr = (int __user *) arg;
-               ret = -EFAULT;
-               if (get_user(oldval, ptr))
-                       goto out;
-               ret = sys_ioctl(fd, cmd, arg);
-               __get_user(newval, ptr);
-               if (newval == -1) {
-                       __put_user(oldval, ptr);
-                       ret = -EIO;
-               }
-               if (ret == -ENOTTY)
-                       ret = -EIO;
-               goto out;
-       }
-       }
-
-#if 0
-       if ((cmd & 0xff00) == ('k' << 8)) {
-               printk ("[[KBIO: %8.8x\n", (unsigned int) cmd);
-       }
-#endif
-
-       ret = sys_ioctl(fd, cmd, arg);
-       /* so stupid... */
-       ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
-out:
-       return ret;
-}
-
-
diff --git a/arch/sparc/kernel/sys_solaris.c b/arch/sparc/kernel/sys_solaris.c
deleted file mode 100644 (file)
index 2226a59..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * linux/arch/sparc/kernel/sys_solaris.c
- *
- * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
- */
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/personality.h>
-#include <linux/ptrace.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/module.h>
-
-asmlinkage int
-do_solaris_syscall (struct pt_regs *regs)
-{
-       static int cnt = 0;
-       if (++cnt < 10) printk ("No solaris handler\n");
-       force_sig(SIGSEGV, current);
-       return 0;
-}
-
-#ifndef CONFIG_SUNOS_EMUL
-asmlinkage int
-do_sunos_syscall (struct pt_regs *regs)
-{
-       static int cnt = 0;
-       if (++cnt < 10) printk ("SunOS binary emulation not compiled in\n");
-       force_sig (SIGSEGV, current);
-       return 0;
-}
-#endif
diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c
deleted file mode 100644 (file)
index f5b608b..0000000
+++ /dev/null
@@ -1,1210 +0,0 @@
-/* $Id: sys_sunos.c,v 1.137 2002/02/08 03:57:14 davem Exp $
- * sys_sunos.c: SunOS specific syscall compatibility support.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- *
- * Based upon preliminary work which is:
- *
- * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/resource.h>
-#include <linux/ipc.h>
-#include <linux/shm.h>
-#include <linux/msg.h>
-#include <linux/sem.h>
-#include <linux/signal.h>
-#include <linux/uio.h>
-#include <linux/utsname.h>
-#include <linux/major.h>
-#include <linux/stat.h>
-#include <linux/slab.h>
-#include <linux/pagemap.h>
-#include <linux/capability.h>
-#include <linux/errno.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/syscalls.h>
-
-#include <net/sock.h>
-
-#include <asm/uaccess.h>
-#ifndef KERNEL_DS
-#include <linux/segment.h>
-#endif
-
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/pconf.h>
-#include <asm/idprom.h> /* for gethostid() */
-#include <asm/unistd.h>
-#include <asm/system.h>
-
-/* For the nfs mount emulation */
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/nfs.h>
-#include <linux/nfs2.h>
-#include <linux/nfs_mount.h>
-
-/* for sunos_select */
-#include <linux/time.h>
-#include <linux/personality.h>
-
-/* NR_OPEN is now larger and dynamic in recent kernels. */
-#define SUNOS_NR_OPEN  256
-
-/* We use the SunOS mmap() semantics. */
-asmlinkage unsigned long sunos_mmap(unsigned long addr, unsigned long len,
-                                   unsigned long prot, unsigned long flags,
-                                   unsigned long fd, unsigned long off)
-{
-       struct file * file = NULL;
-       unsigned long retval, ret_type;
-
-       if (flags & MAP_NORESERVE) {
-               static int cnt;
-               if (cnt++ < 10)
-                       printk("%s: unimplemented SunOS MAP_NORESERVE mmap() flag\n",
-                              current->comm);
-               flags &= ~MAP_NORESERVE;
-       }
-       retval = -EBADF;
-       if (!(flags & MAP_ANONYMOUS)) {
-               if (fd >= SUNOS_NR_OPEN)
-                       goto out;
-               file = fget(fd);
-               if (!file)
-                       goto out;
-       }
-
-       retval = -EINVAL;
-       /* If this is ld.so or a shared library doing an mmap
-        * of /dev/zero, transform it into an anonymous mapping.
-        * SunOS is so stupid some times... hmph!
-        */
-       if (file) {
-               if (imajor(file->f_path.dentry->d_inode) == MEM_MAJOR &&
-                   iminor(file->f_path.dentry->d_inode) == 5) {
-                       flags |= MAP_ANONYMOUS;
-                       fput(file);
-                       file = NULL;
-               }
-       }
-       ret_type = flags & _MAP_NEW;
-       flags &= ~_MAP_NEW;
-
-       if (!(flags & MAP_FIXED))
-               addr = 0;
-       else {
-               if (ARCH_SUN4C_SUN4 &&
-                   (len > 0x20000000 ||
-                    ((flags & MAP_FIXED) &&
-                     addr < 0xe0000000 && addr + len > 0x20000000)))
-                       goto out_putf;
-
-               /* See asm-sparc/uaccess.h */
-               if (len > TASK_SIZE - PAGE_SIZE ||
-                   addr + len > TASK_SIZE - PAGE_SIZE)
-                       goto out_putf;
-       }
-
-       flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-       down_write(&current->mm->mmap_sem);
-       retval = do_mmap(file, addr, len, prot, flags, off);
-       up_write(&current->mm->mmap_sem);
-       if (!ret_type)
-               retval = ((retval < PAGE_OFFSET) ? 0 : retval);
-
-out_putf:
-       if (file)
-               fput(file);
-out:
-       return retval;
-}
-
-/* lmbench calls this, just say "yeah, ok" */
-asmlinkage int sunos_mctl(unsigned long addr, unsigned long len, int function, char *arg)
-{
-       return 0;
-}
-
-/* SunOS is completely broken... it returns 0 on success, otherwise
- * ENOMEM.  For sys_sbrk() it wants the old brk value as a return
- * on success and ENOMEM as before on failure.
- */
-asmlinkage int sunos_brk(unsigned long brk)
-{
-       int freepages, retval = -ENOMEM;
-       unsigned long rlim;
-       unsigned long newbrk, oldbrk;
-
-       down_write(&current->mm->mmap_sem);
-       if (ARCH_SUN4C_SUN4) {
-               if (brk >= 0x20000000 && brk < 0xe0000000) {
-                       goto out;
-               }
-       }
-
-       if (brk < current->mm->end_code)
-               goto out;
-
-       newbrk = PAGE_ALIGN(brk);
-       oldbrk = PAGE_ALIGN(current->mm->brk);
-       retval = 0;
-       if (oldbrk == newbrk) {
-               current->mm->brk = brk;
-               goto out;
-       }
-
-       /*
-        * Always allow shrinking brk
-        */
-       if (brk <= current->mm->brk) {
-               current->mm->brk = brk;
-               do_munmap(current->mm, newbrk, oldbrk-newbrk);
-               goto out;
-       }
-       /*
-        * Check against rlimit and stack..
-        */
-       retval = -ENOMEM;
-       rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
-       if (rlim >= RLIM_INFINITY)
-               rlim = ~0;
-       if (brk - current->mm->end_code > rlim)
-               goto out;
-
-       /*
-        * Check against existing mmap mappings.
-        */
-       if (find_vma_intersection(current->mm, oldbrk, newbrk+PAGE_SIZE))
-               goto out;
-
-       /*
-        * stupid algorithm to decide if we have enough memory: while
-        * simple, it hopefully works in most obvious cases.. Easy to
-        * fool it, but this should catch most mistakes.
-        */
-       freepages = global_page_state(NR_FILE_PAGES);
-       freepages >>= 1;
-       freepages += nr_free_pages();
-       freepages += nr_swap_pages;
-       freepages -= num_physpages >> 4;
-       freepages -= (newbrk-oldbrk) >> PAGE_SHIFT;
-       if (freepages < 0)
-               goto out;
-       /*
-        * Ok, we have probably got enough memory - let it rip.
-        */
-       current->mm->brk = brk;
-       do_brk(oldbrk, newbrk-oldbrk);
-       retval = 0;
-out:
-       up_write(&current->mm->mmap_sem);
-       return retval;
-}
-
-asmlinkage unsigned long sunos_sbrk(int increment)
-{
-       int error;
-       unsigned long oldbrk;
-
-       /* This should do it hopefully... */
-       lock_kernel();
-       oldbrk = current->mm->brk;
-       error = sunos_brk(((int) current->mm->brk) + increment);
-       if (!error)
-               error = oldbrk;
-       unlock_kernel();
-       return error;
-}
-
-/* XXX Completely undocumented, and completely magic...
- * XXX I believe it is to increase the size of the stack by
- * XXX argument 'increment' and return the new end of stack
- * XXX area.  Wheee...
- */
-asmlinkage unsigned long sunos_sstk(int increment)
-{
-       lock_kernel();
-       printk("%s: Call to sunos_sstk(increment<%d>) is unsupported\n",
-              current->comm, increment);
-       unlock_kernel();
-       return -1;
-}
-
-/* Give hints to the kernel as to what paging strategy to use...
- * Completely bogus, don't remind me.
- */
-#define VA_NORMAL     0 /* Normal vm usage expected */
-#define VA_ABNORMAL   1 /* Abnormal/random vm usage probable */
-#define VA_SEQUENTIAL 2 /* Accesses will be of a sequential nature */
-#define VA_INVALIDATE 3 /* Page table entries should be flushed ??? */
-static char *vstrings[] = {
-       "VA_NORMAL",
-       "VA_ABNORMAL",
-       "VA_SEQUENTIAL",
-       "VA_INVALIDATE",
-};
-
-asmlinkage void sunos_vadvise(unsigned long strategy)
-{
-       /* I wanna see who uses this... */
-       lock_kernel();
-       printk("%s: Advises us to use %s paging strategy\n",
-              current->comm,
-              strategy <= 3 ? vstrings[strategy] : "BOGUS");
-       unlock_kernel();
-}
-
-/* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE
- * resource limit and is for backwards compatibility with older sunos
- * revs.
- */
-asmlinkage long sunos_getdtablesize(void)
-{
-       return SUNOS_NR_OPEN;
-}
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
-asmlinkage unsigned long sunos_sigblock(unsigned long blk_mask)
-{
-       unsigned long old;
-
-       spin_lock_irq(&current->sighand->siglock);
-       old = current->blocked.sig[0];
-       current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       return old;
-}
-
-asmlinkage unsigned long sunos_sigsetmask(unsigned long newmask)
-{
-       unsigned long retval;
-
-       spin_lock_irq(&current->sighand->siglock);
-       retval = current->blocked.sig[0];
-       current->blocked.sig[0] = (newmask & _BLOCKABLE);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       return retval;
-}
-
-/* SunOS getdents is very similar to the newer Linux (iBCS2 compliant)    */
-/* getdents system call, the format of the structure just has a different */
-/* layout (d_off+d_ino instead of d_ino+d_off) */
-struct sunos_dirent {
-    long           d_off;
-    unsigned long  d_ino;
-    unsigned short d_reclen;
-    unsigned short d_namlen;
-    char           d_name[1];
-};
-
-struct sunos_dirent_callback {
-    struct sunos_dirent __user *curr;
-    struct sunos_dirent __user *previous;
-    int count;
-    int error;
-};
-
-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
-#define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1))
-
-static int sunos_filldir(void * __buf, const char * name, int namlen,
-                        loff_t offset, u64 ino, unsigned int d_type)
-{
-       struct sunos_dirent __user *dirent;
-       struct sunos_dirent_callback * buf = __buf;
-       unsigned long d_ino;
-       int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-
-       buf->error = -EINVAL;   /* only used if we fail.. */
-       if (reclen > buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       dirent = buf->previous;
-       if (dirent)
-               put_user(offset, &dirent->d_off);
-       dirent = buf->curr;
-       buf->previous = dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(namlen, &dirent->d_namlen);
-       put_user(reclen, &dirent->d_reclen);
-       copy_to_user(dirent->d_name, name, namlen);
-       put_user(0, dirent->d_name + namlen);
-       dirent = (void __user *) dirent + reclen;
-       buf->curr = dirent;
-       buf->count -= reclen;
-       return 0;
-}
-
-asmlinkage int sunos_getdents(unsigned int fd, void __user *dirent, int cnt)
-{
-       struct file * file;
-       struct sunos_dirent __user *lastdirent;
-       struct sunos_dirent_callback buf;
-       int error = -EBADF;
-
-       if (fd >= SUNOS_NR_OPEN)
-               goto out;
-
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       error = -EINVAL;
-       if (cnt < (sizeof(struct sunos_dirent) + 255))
-               goto out_putf;
-
-       buf.curr = (struct sunos_dirent __user *) dirent;
-       buf.previous = NULL;
-       buf.count = cnt;
-       buf.error = 0;
-
-       error = vfs_readdir(file, sunos_filldir, &buf);
-       if (error < 0)
-               goto out_putf;
-
-       lastdirent = buf.previous;
-       error = buf.error;
-       if (lastdirent) {
-               put_user(file->f_pos, &lastdirent->d_off);
-               error = cnt - buf.count;
-       }
-
-out_putf:
-       fput(file);
-out:
-       return error;
-}
-
-/* Old sunos getdirentries, severely broken compatibility stuff here. */
-struct sunos_direntry {
-    unsigned long  d_ino;
-    unsigned short d_reclen;
-    unsigned short d_namlen;
-    char           d_name[1];
-};
-
-struct sunos_direntry_callback {
-    struct sunos_direntry __user *curr;
-    struct sunos_direntry __user *previous;
-    int count;
-    int error;
-};
-
-static int sunos_filldirentry(void * __buf, const char * name, int namlen,
-                             loff_t offset, u64 ino, unsigned int d_type)
-{
-       struct sunos_direntry __user *dirent;
-       struct sunos_direntry_callback *buf = __buf;
-       unsigned long d_ino;
-       int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-
-       buf->error = -EINVAL;   /* only used if we fail.. */
-       if (reclen > buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       dirent = buf->previous;
-       dirent = buf->curr;
-       buf->previous = dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(namlen, &dirent->d_namlen);
-       put_user(reclen, &dirent->d_reclen);
-       copy_to_user(dirent->d_name, name, namlen);
-       put_user(0, dirent->d_name + namlen);
-       dirent = (void __user *) dirent + reclen;
-       buf->curr = dirent;
-       buf->count -= reclen;
-       return 0;
-}
-
-asmlinkage int sunos_getdirentries(unsigned int fd, void __user *dirent,
-                                  int cnt, unsigned int __user *basep)
-{
-       struct file * file;
-       struct sunos_direntry __user *lastdirent;
-       struct sunos_direntry_callback buf;
-       int error = -EBADF;
-
-       if (fd >= SUNOS_NR_OPEN)
-               goto out;
-
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       error = -EINVAL;
-       if (cnt < (sizeof(struct sunos_direntry) + 255))
-               goto out_putf;
-
-       buf.curr = (struct sunos_direntry __user *) dirent;
-       buf.previous = NULL;
-       buf.count = cnt;
-       buf.error = 0;
-
-       error = vfs_readdir(file, sunos_filldirentry, &buf);
-       if (error < 0)
-               goto out_putf;
-
-       lastdirent = buf.previous;
-       error = buf.error;
-       if (lastdirent) {
-               put_user(file->f_pos, basep);
-               error = cnt - buf.count;
-       }
-
-out_putf:
-       fput(file);
-out:
-       return error;
-}
-
-struct sunos_utsname {
-       char sname[9];
-       char nname[9];
-       char nnext[56];
-       char rel[9];
-       char ver[9];
-       char mach[9];
-};
-
-asmlinkage int sunos_uname(struct sunos_utsname __user *name)
-{
-       int ret;
-       down_read(&uts_sem);
-       ret = copy_to_user(&name->sname[0], &utsname()->sysname[0],
-                          sizeof(name->sname) - 1);
-       if (!ret) {
-               ret |= __copy_to_user(&name->nname[0], &utsname()->nodename[0],
-                                     sizeof(name->nname) - 1);
-               ret |= __put_user('\0', &name->nname[8]);
-               ret |= __copy_to_user(&name->rel[0], &utsname()->release[0],
-                                     sizeof(name->rel) - 1);
-               ret |= __copy_to_user(&name->ver[0], &utsname()->version[0],
-                                     sizeof(name->ver) - 1);
-               ret |= __copy_to_user(&name->mach[0], &utsname()->machine[0],
-                                     sizeof(name->mach) - 1);
-       }
-       up_read(&uts_sem);
-       return ret ? -EFAULT : 0;
-}
-
-asmlinkage int sunos_nosys(void)
-{
-       struct pt_regs *regs;
-       siginfo_t info;
-       static int cnt;
-
-       lock_kernel();
-       regs = current->thread.kregs;
-       info.si_signo = SIGSYS;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT|0x100;
-       info.si_addr = (void __user *)regs->pc;
-       info.si_trapno = regs->u_regs[UREG_G1];
-       send_sig_info(SIGSYS, &info, current);
-       if (cnt++ < 4) {
-               printk("Process makes ni_syscall number %d, register dump:\n",
-                      (int) regs->u_regs[UREG_G1]);
-               show_regs(regs);
-       }
-       unlock_kernel();
-       return -ENOSYS;
-}
-
-/* This is not a real and complete implementation yet, just to keep
- * the easy SunOS binaries happy.
- */
-asmlinkage int sunos_fpathconf(int fd, int name)
-{
-       int ret;
-
-       switch(name) {
-       case _PCONF_LINK:
-               ret = LINK_MAX;
-               break;
-       case _PCONF_CANON:
-               ret = MAX_CANON;
-               break;
-       case _PCONF_INPUT:
-               ret = MAX_INPUT;
-               break;
-       case _PCONF_NAME:
-               ret = NAME_MAX;
-               break;
-       case _PCONF_PATH:
-               ret = PATH_MAX;
-               break;
-       case _PCONF_PIPE:
-               ret = PIPE_BUF;
-               break;
-       case _PCONF_CHRESTRICT:         /* XXX Investigate XXX */
-               ret = 1;
-               break;
-       case _PCONF_NOTRUNC:            /* XXX Investigate XXX */
-       case _PCONF_VDISABLE:
-               ret = 0;
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       }
-       return ret;
-}
-
-asmlinkage int sunos_pathconf(char __user *path, int name)
-{
-       int ret;
-
-       ret = sunos_fpathconf(0, name); /* XXX cheese XXX */
-       return ret;
-}
-
-/* SunOS mount system call emulation */
-
-asmlinkage int sunos_select(int width, fd_set __user *inp, fd_set __user *outp,
-                           fd_set __user *exp, struct timeval __user *tvp)
-{
-       int ret;
-
-       /* SunOS binaries expect that select won't change the tvp contents */
-       ret = sys_select (width, inp, outp, exp, tvp);
-       if (ret == -EINTR && tvp) {
-               time_t sec, usec;
-
-               __get_user(sec, &tvp->tv_sec);
-               __get_user(usec, &tvp->tv_usec);
-
-               if (sec == 0 && usec == 0)
-                       ret = 0;
-       }
-       return ret;
-}
-
-asmlinkage void sunos_nop(void)
-{
-       return;
-}
-
-/* SunOS mount/umount. */
-#define SMNT_RDONLY       1
-#define SMNT_NOSUID       2
-#define SMNT_NEWTYPE      4
-#define SMNT_GRPID        8
-#define SMNT_REMOUNT      16
-#define SMNT_NOSUB        32
-#define SMNT_MULTI        64
-#define SMNT_SYS5         128
-
-struct sunos_fh_t {
-       char fh_data [NFS_FHSIZE];
-};
-
-struct sunos_nfs_mount_args {
-       struct sockaddr_in  __user *addr; /* file server address */
-       struct nfs_fh __user *fh;     /* File handle to be mounted */
-       int        flags;      /* flags */
-       int        wsize;      /* write size in bytes */
-       int        rsize;      /* read size in bytes */
-       int        timeo;      /* initial timeout in .1 secs */
-       int        retrans;    /* times to retry send */
-       char       __user *hostname;  /* server's hostname */
-       int        acregmin;   /* attr cache file min secs */
-       int        acregmax;   /* attr cache file max secs */
-       int        acdirmin;   /* attr cache dir min secs */
-       int        acdirmax;   /* attr cache dir max secs */
-       char       __user *netname;   /* server's netname */
-};
-
-
-/* Bind the socket on a local reserved port and connect it to the
- * remote server.  This on Linux/i386 is done by the mount program,
- * not by the kernel.
- */
-static int
-sunos_nfs_get_server_fd (int fd, struct sockaddr_in *addr)
-{
-       struct sockaddr_in local;
-       struct sockaddr_in server;
-       int    try_port;
-       struct socket *socket;
-       struct inode  *inode;
-       struct file   *file;
-       int    ret, result = 0;
-
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       inode = file->f_path.dentry->d_inode;
-
-       socket = SOCKET_I(inode);
-       local.sin_family = AF_INET;
-       local.sin_addr.s_addr = htonl(INADDR_ANY);
-
-       /* IPPORT_RESERVED = 1024, can't find the definition in the kernel */
-       try_port = 1024;
-       do {
-               local.sin_port = htons (--try_port);
-               ret = socket->ops->bind(socket, (struct sockaddr*)&local,
-                                       sizeof(local));
-       } while (ret && try_port > (1024 / 2));
-
-       if (ret)
-               goto out_putf;
-
-       server.sin_family = AF_INET;
-       server.sin_addr = addr->sin_addr;
-       server.sin_port = NFS_PORT;
-
-       /* Call sys_connect */
-       ret = socket->ops->connect (socket, (struct sockaddr *) &server,
-                                   sizeof (server), file->f_flags);
-       if (ret >= 0)
-               result = 1;
-
-out_putf:
-       fput(file);
-out:
-       return result;
-}
-
-static int get_default (int value, int def_value)
-{
-    if (value)
-       return value;
-    else
-       return def_value;
-}
-
-static int sunos_nfs_mount(char *dir_name, int linux_flags, void __user *data)
-{
-       int  server_fd, err;
-       char *the_name, *mount_page;
-       struct nfs_mount_data linux_nfs_mount;
-       struct sunos_nfs_mount_args sunos_mount;
-
-       /* Ok, here comes the fun part: Linux's nfs mount needs a
-        * socket connection to the server, but SunOS mount does not
-        * require this, so we use the information on the destination
-        * address to create a socket and bind it to a reserved
-        * port on this system
-        */
-       if (copy_from_user(&sunos_mount, data, sizeof(sunos_mount)))
-               return -EFAULT;
-
-       server_fd = sys_socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-       if (server_fd < 0)
-               return -ENXIO;
-
-       if (copy_from_user(&linux_nfs_mount.addr,sunos_mount.addr,
-                               sizeof(*sunos_mount.addr)) ||
-           copy_from_user(&linux_nfs_mount.root,sunos_mount.fh,
-                               sizeof(*sunos_mount.fh))) {
-               sys_close (server_fd);
-               return -EFAULT;
-       }
-
-       if (!sunos_nfs_get_server_fd (server_fd, &linux_nfs_mount.addr)){
-               sys_close (server_fd);
-               return -ENXIO;
-       }
-
-       /* Now, bind it to a locally reserved port */
-       linux_nfs_mount.version  = NFS_MOUNT_VERSION;
-       linux_nfs_mount.flags    = sunos_mount.flags;
-       linux_nfs_mount.fd       = server_fd;
-       
-       linux_nfs_mount.rsize    = get_default (sunos_mount.rsize, 8192);
-       linux_nfs_mount.wsize    = get_default (sunos_mount.wsize, 8192);
-       linux_nfs_mount.timeo    = get_default (sunos_mount.timeo, 10);
-       linux_nfs_mount.retrans  = sunos_mount.retrans;
-       
-       linux_nfs_mount.acregmin = sunos_mount.acregmin;
-       linux_nfs_mount.acregmax = sunos_mount.acregmax;
-       linux_nfs_mount.acdirmin = sunos_mount.acdirmin;
-       linux_nfs_mount.acdirmax = sunos_mount.acdirmax;
-
-       the_name = getname(sunos_mount.hostname);
-       if (IS_ERR(the_name))
-               return PTR_ERR(the_name);
-
-       strlcpy(linux_nfs_mount.hostname, the_name,
-               sizeof(linux_nfs_mount.hostname));
-       putname (the_name);
-       
-       mount_page = (char *) get_zeroed_page(GFP_KERNEL);
-       if (!mount_page)
-               return -ENOMEM;
-
-       memcpy(mount_page, &linux_nfs_mount, sizeof(linux_nfs_mount));
-
-       err = do_mount("", dir_name, "nfs", linux_flags, mount_page);
-
-       free_page((unsigned long) mount_page);
-       return err;
-}
-
-asmlinkage int
-sunos_mount(char __user *type, char __user *dir, int flags, void __user *data)
-{
-       int linux_flags = 0;
-       int ret = -EINVAL;
-       char *dev_fname = NULL;
-       char *dir_page, *type_page;
-
-       if (!capable (CAP_SYS_ADMIN))
-               return -EPERM;
-               
-       lock_kernel();
-       /* We don't handle the integer fs type */
-       if ((flags & SMNT_NEWTYPE) == 0)
-               goto out;
-
-       /* Do not allow for those flags we don't support */
-       if (flags & (SMNT_GRPID|SMNT_NOSUB|SMNT_MULTI|SMNT_SYS5))
-               goto out;
-
-       if (flags & SMNT_REMOUNT)
-               linux_flags |= MS_REMOUNT;
-       if (flags & SMNT_RDONLY)
-               linux_flags |= MS_RDONLY;
-       if (flags & SMNT_NOSUID)
-               linux_flags |= MS_NOSUID;
-
-       dir_page = getname(dir);
-       ret = PTR_ERR(dir_page);
-       if (IS_ERR(dir_page))
-               goto out;
-
-       type_page = getname(type);
-       ret = PTR_ERR(type_page);
-       if (IS_ERR(type_page))
-               goto out1;
-
-       if (strcmp(type_page, "ext2") == 0) {
-               dev_fname = getname(data);
-       } else if (strcmp(type_page, "iso9660") == 0) {
-               dev_fname = getname(data);
-       } else if (strcmp(type_page, "minix") == 0) {
-               dev_fname = getname(data);
-       } else if (strcmp(type_page, "nfs") == 0) {
-               ret = sunos_nfs_mount (dir_page, flags, data);
-               goto out2;
-        } else if (strcmp(type_page, "ufs") == 0) {
-               printk("Warning: UFS filesystem mounts unsupported.\n");
-               ret = -ENODEV;
-               goto out2;
-       } else if (strcmp(type_page, "proc")) {
-               ret = -ENODEV;
-               goto out2;
-       }
-       ret = PTR_ERR(dev_fname);
-       if (IS_ERR(dev_fname))
-               goto out2;
-       ret = do_mount(dev_fname, dir_page, type_page, linux_flags, NULL);
-       if (dev_fname)
-               putname(dev_fname);
-out2:
-       putname(type_page);
-out1:
-       putname(dir_page);
-out:
-       unlock_kernel();
-       return ret;
-}
-
-
-asmlinkage int sunos_setpgrp(pid_t pid, pid_t pgid)
-{
-       int ret;
-
-       /* So stupid... */
-       if ((!pid || pid == current->pid) &&
-           !pgid) {
-               sys_setsid();
-               ret = 0;
-       } else {
-               ret = sys_setpgid(pid, pgid);
-       }
-       return ret;
-}
-
-/* So stupid... */
-asmlinkage int sunos_wait4(pid_t pid, unsigned int __user *stat_addr,
-                          int options, struct rusage __user*ru)
-{
-       int ret;
-
-       ret = sys_wait4((pid ? pid : -1), stat_addr, options, ru);
-       return ret;
-}
-
-asmlinkage int sunos_killpg(int pgrp, int sig)
-{
-       int ret;
-
-       rcu_read_lock();
-       ret = -EINVAL;
-       if (pgrp > 0)
-               ret = kill_pgrp(find_vpid(pgrp), sig, 0);
-       rcu_read_unlock();
-
-       return ret;
-}
-
-asmlinkage int sunos_audit(void)
-{
-       lock_kernel();
-       printk ("sys_audit\n");
-       unlock_kernel();
-       return -1;
-}
-
-asmlinkage unsigned long sunos_gethostid(void)
-{
-       unsigned long ret;
-
-       lock_kernel();
-       ret = ((unsigned long)idprom->id_machtype << 24) |
-               (unsigned long)idprom->id_sernum;
-       unlock_kernel();
-       return ret;
-}
-
-/* sysconf options, for SunOS compatibility */
-#define   _SC_ARG_MAX             1
-#define   _SC_CHILD_MAX           2
-#define   _SC_CLK_TCK             3
-#define   _SC_NGROUPS_MAX         4
-#define   _SC_OPEN_MAX            5
-#define   _SC_JOB_CONTROL         6
-#define   _SC_SAVED_IDS           7
-#define   _SC_VERSION             8
-
-asmlinkage long sunos_sysconf (int name)
-{
-       long ret;
-
-       switch (name){
-       case _SC_ARG_MAX:
-               ret = ARG_MAX;
-               break;
-       case _SC_CHILD_MAX:
-               ret = current->signal->rlim[RLIMIT_NPROC].rlim_cur;
-               break;
-       case _SC_CLK_TCK:
-               ret = HZ;
-               break;
-       case _SC_NGROUPS_MAX:
-               ret = NGROUPS_MAX;
-               break;
-       case _SC_OPEN_MAX:
-               ret = current->signal->rlim[RLIMIT_NOFILE].rlim_cur;
-               break;
-       case _SC_JOB_CONTROL:
-               ret = 1;        /* yes, we do support job control */
-               break;
-       case _SC_SAVED_IDS:
-               ret = 1;        /* yes, we do support saved uids  */
-               break;
-       case _SC_VERSION:
-               /* mhm, POSIX_VERSION is in /usr/include/unistd.h
-                * should it go on /usr/include/linux?
-                */
-               ret = 199009L; 
-               break;
-       default:
-               ret = -1;
-               break;
-       };
-       return ret;
-}
-
-asmlinkage int sunos_semsys(int op, unsigned long arg1, unsigned long arg2,
-                           unsigned long arg3, void *ptr)
-{
-       union semun arg4;
-       int ret;
-
-       switch (op) {
-       case 0:
-               /* Most arguments match on a 1:1 basis but cmd doesn't */
-               switch(arg3) {
-               case 4:
-                       arg3=GETPID; break;
-               case 5:
-                       arg3=GETVAL; break;
-               case 6:
-                       arg3=GETALL; break;
-               case 3:
-                       arg3=GETNCNT; break;
-               case 7:
-                       arg3=GETZCNT; break;
-               case 8:
-                       arg3=SETVAL; break;
-               case 9:
-                       arg3=SETALL; break;
-               }
-               /* sys_semctl(): */
-               /* value to modify semaphore to */
-               arg4.__pad = (void __user *) ptr;
-               ret = sys_semctl((int)arg1, (int)arg2, (int)arg3, arg4 );
-               break;
-       case 1:
-               /* sys_semget(): */
-               ret = sys_semget((key_t)arg1, (int)arg2, (int)arg3);
-               break;
-       case 2:
-               /* sys_semop(): */
-               ret = sys_semop((int)arg1, (struct sembuf __user *)arg2, (unsigned)arg3);
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       };
-       return ret;
-}
-
-asmlinkage int sunos_msgsys(int op, unsigned long arg1, unsigned long arg2,
-                           unsigned long arg3, unsigned long arg4)
-{
-       struct sparc_stackf *sp;
-       unsigned long arg5;
-       int rval;
-
-       switch(op) {
-       case 0:
-               rval = sys_msgget((key_t)arg1, (int)arg2);
-               break;
-       case 1:
-               rval = sys_msgctl((int)arg1, (int)arg2,
-                                 (struct msqid_ds __user *)arg3);
-               break;
-       case 2:
-               lock_kernel();
-               sp = (struct sparc_stackf *)current->thread.kregs->u_regs[UREG_FP];
-               arg5 = sp->xxargs[0];
-               unlock_kernel();
-               rval = sys_msgrcv((int)arg1, (struct msgbuf __user *)arg2,
-                                 (size_t)arg3, (long)arg4, (int)arg5);
-               break;
-       case 3:
-               rval = sys_msgsnd((int)arg1, (struct msgbuf __user *)arg2,
-                                 (size_t)arg3, (int)arg4);
-               break;
-       default:
-               rval = -EINVAL;
-               break;
-       }
-       return rval;
-}
-
-asmlinkage int sunos_shmsys(int op, unsigned long arg1, unsigned long arg2,
-                           unsigned long arg3)
-{
-       unsigned long raddr;
-       int rval;
-
-       switch(op) {
-       case 0:
-               /* do_shmat(): attach a shared memory area */
-               rval = do_shmat((int)arg1,(char __user *)arg2,(int)arg3,&raddr);
-               if (!rval)
-                       rval = (int) raddr;
-               break;
-       case 1:
-               /* sys_shmctl(): modify shared memory area attr. */
-               rval = sys_shmctl((int)arg1,(int)arg2,(struct shmid_ds __user *)arg3);
-               break;
-       case 2:
-               /* sys_shmdt(): detach a shared memory area */
-               rval = sys_shmdt((char __user *)arg1);
-               break;
-       case 3:
-               /* sys_shmget(): get a shared memory area */
-               rval = sys_shmget((key_t)arg1,(int)arg2,(int)arg3);
-               break;
-       default:
-               rval = -EINVAL;
-               break;
-       };
-       return rval;
-}
-
-#define SUNOS_EWOULDBLOCK 35
-
-/* see the sunos man page read(2v) for an explanation
-   of this garbage. We use O_NDELAY to mark
-   file descriptors that have been set non-blocking 
-   using 4.2BSD style calls. (tridge) */
-
-static inline int check_nonblock(int ret, int fd)
-{
-       if (ret == -EAGAIN) {
-               struct file * file = fget(fd);
-               if (file) {
-                       if (file->f_flags & O_NDELAY)
-                               ret = -SUNOS_EWOULDBLOCK;
-                       fput(file);
-               }
-       }
-       return ret;
-}
-
-asmlinkage int sunos_read(unsigned int fd, char __user *buf, int count)
-{
-       int ret;
-
-       ret = check_nonblock(sys_read(fd,buf,count),fd);
-       return ret;
-}
-
-asmlinkage int sunos_readv(unsigned long fd, const struct iovec __user *vector,
-                          long count)
-{
-       int ret;
-
-       ret = check_nonblock(sys_readv(fd,vector,count),fd);
-       return ret;
-}
-
-asmlinkage int sunos_write(unsigned int fd, char __user *buf, int count)
-{
-       int ret;
-
-       ret = check_nonblock(sys_write(fd,buf,count),fd);
-       return ret;
-}
-
-asmlinkage int sunos_writev(unsigned long fd,
-                           const struct iovec __user *vector, long count)
-{
-       int ret;
-
-       ret = check_nonblock(sys_writev(fd,vector,count),fd);
-       return ret;
-}
-
-asmlinkage int sunos_recv(int fd, void __user *ubuf, int size, unsigned flags)
-{
-       int ret;
-
-       ret = check_nonblock(sys_recv(fd,ubuf,size,flags),fd);
-       return ret;
-}
-
-asmlinkage int sunos_send(int fd, void __user *buff, int len, unsigned flags)
-{
-       int ret;
-
-       ret = check_nonblock(sys_send(fd,buff,len,flags),fd);
-       return ret;
-}
-
-asmlinkage int sunos_accept(int fd, struct sockaddr __user *sa,
-                           int __user *addrlen)
-{
-       int ret;
-
-       while (1) {
-               ret = check_nonblock(sys_accept(fd,sa,addrlen),fd);     
-               if (ret != -ENETUNREACH && ret != -EHOSTUNREACH)
-                       break;
-       }
-
-       return ret;
-}
-
-#define SUNOS_SV_INTERRUPT 2
-
-asmlinkage int
-sunos_sigaction(int sig, const struct old_sigaction __user *act,
-               struct old_sigaction __user *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       if (act) {
-               old_sigset_t mask;
-
-               if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
-                   __get_user(new_ka.sa.sa_flags, &act->sa_flags))
-                       return -EFAULT;
-               __get_user(mask, &act->sa_mask);
-               new_ka.sa.sa_restorer = NULL;
-               new_ka.ka_restorer = NULL;
-               siginitset(&new_ka.sa.sa_mask, mask);
-               new_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               /* In the clone() case we could copy half consistent
-                * state to the user, however this could sleep and
-                * deadlock us if we held the signal lock on SMP.  So for
-                * now I take the easy way out and do no locking.
-                * But then again we don't support SunOS lwp's anyways ;-)
-                */
-               old_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-               if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
-                   __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
-                        return -EFAULT;
-               __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-       }
-
-       return ret;
-}
-
-
-asmlinkage int sunos_setsockopt(int fd, int level, int optname,
-                               char __user *optval, int optlen)
-{
-       int tr_opt = optname;
-       int ret;
-
-       if (level == SOL_IP) {
-               /* Multicast socketopts (ttl, membership) */
-               if (tr_opt >=2 && tr_opt <= 6)
-                       tr_opt += 30;
-       }
-       ret = sys_setsockopt(fd, level, tr_opt, optval, optlen);
-       return ret;
-}
-
-asmlinkage int sunos_getsockopt(int fd, int level, int optname,
-                               char __user *optval, int __user *optlen)
-{
-       int tr_opt = optname;
-       int ret;
-
-       if (level == SOL_IP) {
-               /* Multicast socketopts (ttl, membership) */
-               if (tr_opt >=2 && tr_opt <= 6)
-                       tr_opt += 30;
-       }
-       ret = sys_getsockopt(fd, level, tr_opt, optval, optlen);
-       return ret;
-}
index 9064485dc40be66266882a5fd3a13531344610d1..5a7c4c8345c3193b144c087b6820bbb32c238729 100644 (file)
@@ -81,124 +81,3 @@ sys_call_table:
 /*305*/        .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait
 /*310*/        .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
 /*315*/        .long sys_timerfd_settime, sys_timerfd_gettime
-
-#ifdef CONFIG_SUNOS_EMUL
-       /* Now the SunOS syscall table. */
-
-       .align 4
-       .globl sunos_sys_table
-sunos_sys_table:
-/*0*/  .long sunos_indir, sys_exit, sys_fork
-       .long sunos_read, sunos_write, sys_open
-       .long sys_close, sunos_wait4, sys_creat
-       .long sys_link, sys_unlink, sunos_execv
-       .long sys_chdir, sunos_nosys, sys_mknod
-       .long sys_chmod, sys_lchown16, sunos_brk
-       .long sunos_nosys, sys_lseek, sunos_getpid
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_getuid, sunos_nosys, sys_ptrace
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sys_access, sunos_nosys, sunos_nosys
-       .long sys_sync, sys_kill, sys_newstat
-       .long sunos_nosys, sys_newlstat, sys_dup
-       .long sys_pipe, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_getgid
-       .long sunos_nosys, sunos_nosys
-/*50*/ .long sunos_nosys, sys_acct, sunos_nosys
-       .long sunos_mctl, sunos_ioctl, sys_reboot
-       .long sunos_nosys, sys_symlink, sys_readlink
-       .long sys_execve, sys_umask, sys_chroot
-       .long sys_newfstat, sunos_nosys, sys_getpagesize
-       .long sys_msync, sys_vfork, sunos_nosys
-       .long sunos_nosys, sunos_sbrk, sunos_sstk
-       .long sunos_mmap, sunos_vadvise, sys_munmap
-       .long sys_mprotect, sys_madvise, sys_vhangup
-       .long sunos_nosys, sys_mincore, sys_getgroups16
-       .long sys_setgroups16, sys_getpgrp, sunos_setpgrp
-       .long sys_setitimer, sunos_nosys, sys_swapon
-       .long sys_getitimer, sys_gethostname, sys_sethostname
-       .long sunos_getdtablesize, sys_dup2, sunos_nop
-       .long sys_fcntl, sunos_select, sunos_nop
-       .long sys_fsync, sys_setpriority, sys_socket
-       .long sys_connect, sunos_accept
-/*100*/        .long sys_getpriority, sunos_send, sunos_recv
-       .long sunos_nosys, sys_bind, sunos_setsockopt
-       .long sys_listen, sunos_nosys, sunos_sigaction
-       .long sunos_sigblock, sunos_sigsetmask, sys_sigpause
-       .long sys_sigstack, sys_recvmsg, sys_sendmsg
-       .long sunos_nosys, sys_gettimeofday, sys_getrusage
-       .long sunos_getsockopt, sunos_nosys, sunos_readv
-       .long sunos_writev, sys_settimeofday, sys_fchown16
-       .long sys_fchmod, sys_recvfrom, sys_setreuid16
-       .long sys_setregid16, sys_rename, sys_truncate
-       .long sys_ftruncate, sys_flock, sunos_nosys
-       .long sys_sendto, sys_shutdown, sys_socketpair
-       .long sys_mkdir, sys_rmdir, sys_utimes
-       .long sys_sigreturn, sunos_nosys, sys_getpeername
-       .long sunos_gethostid, sunos_nosys, sys_getrlimit
-       .long sys_setrlimit, sunos_killpg, sunos_nosys
-       .long sunos_nosys, sunos_nosys
-/*150*/        .long sys_getsockname, sunos_nosys, sunos_nosys
-       .long sys_poll, sunos_nosys, sunos_nosys
-       .long sunos_getdirentries, sys_statfs, sys_fstatfs
-       .long sys_oldumount, sunos_nosys, sunos_nosys
-       .long sys_getdomainname, sys_setdomainname
-       .long sunos_nosys, sys_quotactl, sunos_nosys
-       .long sunos_mount, sys_ustat, sunos_semsys
-       .long sunos_msgsys, sunos_shmsys, sunos_audit
-       .long sunos_nosys, sunos_getdents, sys_setsid
-       .long sys_fchdir, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sys_sigpending, sunos_nosys
-       .long sys_setpgid, sunos_pathconf, sunos_fpathconf
-       .long sunos_sysconf, sunos_uname, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-/*200*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys
-/*250*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-/*260*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-/*270*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-/*280*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-/*290*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-/*300*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-/*310*/        .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys, sunos_nosys, sunos_nosys
-       .long sunos_nosys
-
-#endif
index 2667a9dee11d943cd2f018a2eec489034c0fd07d..df3eacb5ca15dcaf1f716148d1dcdcc1e7c33195 100644 (file)
@@ -88,9 +88,6 @@ config GENERIC_HARDIRQS_NO__DO_IRQ
        bool
        def_bool y
 
-config ARCH_SUPPORTS_AOUT
-       def_bool y
-
 choice
        prompt "Kernel page size"
        default SPARC64_PAGE_SIZE_8KB
@@ -148,11 +145,6 @@ config HOTPLUG_CPU
 
 source "init/Kconfig"
 
-config SYSVIPC_COMPAT
-       bool
-       depends on COMPAT && SYSVIPC
-       default y
-
 config GENERIC_HARDIRQS
        bool
        default y
@@ -380,6 +372,10 @@ config SUN_OPENPROMFS
          To compile the /proc/openprom support as a module, choose M here: the
          module will be called openpromfs.  If unsure, choose M.
 
+menu "Executable file formats"
+
+source "fs/Kconfig.binfmt"
+
 config SPARC32_COMPAT
        bool "Kernel support for Linux/Sparc 32bit binary compatibility"
        help
@@ -392,37 +388,10 @@ config COMPAT
        default y
        select COMPAT_BINFMT_ELF
 
-config BINFMT_AOUT32
-       bool "Kernel support for 32-bit (ie. SunOS) a.out binaries"
-       depends on SPARC32_COMPAT && ARCH_SUPPORTS_AOUT
-       help
-         This allows you to run 32-bit a.out format binaries on your Ultra.
-         If you want to run SunOS binaries (see SunOS binary emulation below)
-         or other a.out binaries, say Y. If unsure, say N.
-
-menu "Executable file formats"
-
-source "fs/Kconfig.binfmt"
-
-config SUNOS_EMUL
-       bool "SunOS binary emulation"
-       depends on BINFMT_AOUT32
-       help
-         This allows you to run most SunOS binaries.  If you want to do this,
-         say Y here and place appropriate files in /usr/gnemul/sunos. See
-         <http://www.ultralinux.org/faq.html> for more information.  If you
-         want to run SunOS binaries on an Ultra you must also say Y to
-         "Kernel support for 32-bit a.out binaries" above.
-
-config SOLARIS_EMUL
-       tristate "Solaris binary emulation (EXPERIMENTAL)"
-       depends on SPARC32_COMPAT && NET && EXPERIMENTAL
-       help
-         This is experimental code which will enable you to run (many)
-         Solaris binaries on your SPARC Linux machine.
-
-         To compile this code as a module, choose M here: the
-         module will be called solaris.
+config SYSVIPC_COMPAT
+       bool
+       depends on COMPAT && SYSVIPC
+       default y
 
 endmenu
 
index f0c22f82698299c0143b263848828d7fd0834016..9cb75c852b45833848455b1a69dd9c03b631d313 100644 (file)
@@ -27,7 +27,6 @@ endif
 head-y := arch/sparc64/kernel/head.o arch/sparc64/kernel/init_task.o
 
 core-y                         += arch/sparc64/kernel/ arch/sparc64/mm/
-core-$(CONFIG_SOLARIS_EMUL)    += arch/sparc64/solaris/
 core-y                         += arch/sparc64/math-emu/
 libs-y                         += arch/sparc64/prom/ arch/sparc64/lib/
 drivers-$(CONFIG_OPROFILE)     += arch/sparc64/oprofile/
index 9d4bd222949345a5b43daa16b72ea63052616782..e1835868ad36f5e30b383a31c5d0f26193dc1785 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.25-rc3
-# Wed Mar 26 04:33:35 2008
+# Linux kernel version: 2.6.25
+# Sun Apr 20 01:33:21 2008
 #
 CONFIG_SPARC=y
 CONFIG_SPARC64=y
@@ -22,7 +22,6 @@ CONFIG_HAVE_SETUP_PER_CPU_AREA=y
 CONFIG_ARCH_NO_VIRT_TO_BUS=y
 CONFIG_OF=y
 CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
-CONFIG_ARCH_SUPPORTS_AOUT=y
 CONFIG_SPARC64_PAGE_SIZE_8KB=y
 # CONFIG_SPARC64_PAGE_SIZE_64KB is not set
 # CONFIG_SPARC64_PAGE_SIZE_512KB is not set
@@ -61,6 +60,7 @@ CONFIG_RT_GROUP_SCHED=y
 CONFIG_USER_SCHED=y
 # CONFIG_CGROUP_SCHED is not set
 CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
 CONFIG_RELAY=y
 CONFIG_NAMESPACES=y
 # CONFIG_UTS_NS is not set
@@ -100,7 +100,9 @@ CONFIG_PROFILING=y
 CONFIG_OPROFILE=m
 CONFIG_HAVE_OPROFILE=y
 CONFIG_KPROBES=y
+CONFIG_KRETPROBES=y
 CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
 CONFIG_PROC_PAGE_MONITOR=y
 CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
@@ -131,8 +133,6 @@ CONFIG_DEFAULT_AS=y
 # CONFIG_DEFAULT_NOOP is not set
 CONFIG_DEFAULT_IOSCHED="anticipatory"
 CONFIG_CLASSIC_RCU=y
-# CONFIG_PREEMPT_RCU is not set
-CONFIG_SYSVIPC_COMPAT=y
 CONFIG_GENERIC_HARDIRQS=y
 
 #
@@ -182,9 +182,6 @@ CONFIG_PCI_MSI=y
 # CONFIG_PCI_LEGACY is not set
 # CONFIG_PCI_DEBUG is not set
 CONFIG_SUN_OPENPROMFS=m
-CONFIG_SPARC32_COMPAT=y
-CONFIG_COMPAT=y
-# CONFIG_BINFMT_AOUT32 is not set
 
 #
 # Executable file formats
@@ -192,13 +189,14 @@ CONFIG_COMPAT=y
 CONFIG_BINFMT_ELF=y
 CONFIG_COMPAT_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=m
-CONFIG_SOLARIS_EMUL=y
+CONFIG_SPARC32_COMPAT=y
+CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_SCHED_SMT=y
 CONFIG_SCHED_MC=y
 # CONFIG_PREEMPT_NONE is not set
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
-# CONFIG_RCU_TRACE is not set
 # CONFIG_CMDLINE_BOOL is not set
 
 #
@@ -263,8 +261,10 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=m
 CONFIG_INET6_XFRM_MODE_BEET=m
 # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
 CONFIG_IPV6_SIT=m
+CONFIG_IPV6_NDISC_NODETYPE=y
 CONFIG_IPV6_TUNNEL=m
 # CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
 CONFIG_IP_DCCP=m
@@ -368,7 +368,7 @@ CONFIG_IDE=y
 CONFIG_BLK_DEV_IDE=y
 
 #
-# Please see Documentation/ide.txt for help/info on IDE drives
+# Please see Documentation/ide/ide.txt for help/info on IDE drives
 #
 # CONFIG_BLK_DEV_IDE_SATA is not set
 CONFIG_BLK_DEV_IDEDISK=y
@@ -384,7 +384,6 @@ CONFIG_IDE_PROC_FS=y
 #
 # IDE chipset support/bugfixes
 #
-CONFIG_IDE_GENERIC=y
 # CONFIG_BLK_DEV_PLATFORM is not set
 CONFIG_BLK_DEV_IDEDMA_SFF=y
 
@@ -422,7 +421,7 @@ CONFIG_BLK_DEV_ALI15X3=y
 # CONFIG_BLK_DEV_VIA82CXXX is not set
 # CONFIG_BLK_DEV_TC86C001 is not set
 CONFIG_BLK_DEV_IDEDMA=y
-CONFIG_IDE_ARCH_OBSOLETE_INIT=y
+# CONFIG_BLK_DEV_HD_ONLY is not set
 # CONFIG_BLK_DEV_HD is not set
 
 #
@@ -588,7 +587,6 @@ CONFIG_E1000_NAPI=y
 # CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 CONFIG_TIGON3=m
 CONFIG_BNX2=m
@@ -613,6 +611,7 @@ CONFIG_NIU=m
 #
 # CONFIG_WLAN_PRE80211 is not set
 # CONFIG_WLAN_80211 is not set
+# CONFIG_IWLWIFI_LEDS is not set
 
 #
 # USB Network Adapters
@@ -1472,7 +1471,7 @@ CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_CRC32C=m
 CONFIG_CRYPTO_CAMELLIA=m
 CONFIG_CRYPTO_TEST=m
-CONFIG_CRYPTO_AUTHENC=m
+CONFIG_CRYPTO_AUTHENC=y
 # CONFIG_CRYPTO_LZO is not set
 CONFIG_CRYPTO_HW=y
 # CONFIG_CRYPTO_DEV_HIFN_795X is not set
index 459462e80a12c273114ab87e844c995c385385aa..63c6ae0dd273ee9ad078de8d93eea015847aac3e 100644 (file)
@@ -21,7 +21,6 @@ obj-$(CONFIG_PCI)      += ebus.o isa.o pci_common.o \
 obj-$(CONFIG_PCI_MSI)  += pci_msi.o
 obj-$(CONFIG_SMP)       += smp.o trampoline.o hvtramp.o
 obj-$(CONFIG_SPARC32_COMPAT) += sys32.o sys_sparc32.o signal32.o
-obj-$(CONFIG_BINFMT_AOUT32) += binfmt_aout32.o
 obj-$(CONFIG_MODULES) += module.o
 obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
 obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
@@ -30,11 +29,3 @@ obj-$(CONFIG_SUN_LDOMS) += ldc.o vio.o viohs.o ds.o
 obj-$(CONFIG_AUDIT) += audit.o
 obj-$(CONFIG_AUDIT)$(CONFIG_SPARC32_COMPAT) += compat_audit.o
 obj-y += $(obj-yy)
-
-ifdef CONFIG_SUNOS_EMUL
-  obj-y += sys_sunos32.o sunos_ioctl32.o
-else
-  ifdef CONFIG_SOLARIS_EMUL
-    obj-y += sys_sunos32.o sunos_ioctl32.o
-  endif
-endif
diff --git a/arch/sparc64/kernel/binfmt_aout32.c b/arch/sparc64/kernel/binfmt_aout32.c
deleted file mode 100644 (file)
index 9877f2d..0000000
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- *  linux/fs/binfmt_aout.c
- *
- *  Copyright (C) 1991, 1992, 1996  Linus Torvalds
- *
- *  Hacked a bit by DaveM to make it work with 32-bit SunOS
- *  binaries on the sparc64 port.
- */
-
-#include <linux/module.h>
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/a.out.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/ptrace.h>
-#include <linux/user.h>
-#include <linux/slab.h>
-#include <linux/binfmts.h>
-#include <linux/personality.h>
-#include <linux/init.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/mmu_context.h>
-#include <asm/a.out-core.h>
-
-static int load_aout32_binary(struct linux_binprm *, struct pt_regs * regs);
-static int load_aout32_library(struct file*);
-static int aout32_core_dump(long signr, struct pt_regs *regs, struct file *file, unsigned long limit);
-
-static struct linux_binfmt aout32_format = {
-       .module         = THIS_MODULE,
-       .load_binary    = load_aout32_binary,
-       .load_shlib     = load_aout32_library,
-       .core_dump      = aout32_core_dump,
-       .min_coredump   = PAGE_SIZE,
-};
-
-static void set_brk(unsigned long start, unsigned long end)
-{
-       start = PAGE_ALIGN(start);
-       end = PAGE_ALIGN(end);
-       if (end <= start)
-               return;
-       down_write(&current->mm->mmap_sem);
-       do_brk(start, end - start);
-       up_write(&current->mm->mmap_sem);
-}
-
-/*
- * These are the only things you should do on a core-file: use only these
- * macros to write out all the necessary info.
- */
-
-static int dump_write(struct file *file, const void *addr, int nr)
-{
-       return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
-}
-
-#define DUMP_WRITE(addr, nr)   \
-       if (!dump_write(file, (void *)(addr), (nr))) \
-               goto end_coredump;
-
-#define DUMP_SEEK(offset) \
-if (file->f_op->llseek) { \
-       if (file->f_op->llseek(file,(offset),0) != (offset)) \
-               goto end_coredump; \
-} else file->f_pos = (offset)
-
-/*
- * Routine writes a core dump image in the current directory.
- * Currently only a stub-function.
- *
- * Note that setuid/setgid files won't make a core-dump if the uid/gid
- * changed due to the set[u|g]id. It's enforced by the "current->mm->dumpable"
- * field, which also makes sure the core-dumps won't be recursive if the
- * dumping of the process results in another error..
- */
-
-static int aout32_core_dump(long signr, struct pt_regs *regs, struct file *file, unsigned long limit)
-{
-       mm_segment_t fs;
-       int has_dumped = 0;
-       unsigned long dump_start, dump_size;
-       struct user dump;
-#       define START_DATA(u)    (u.u_tsize)
-#       define START_STACK(u)   ((regs->u_regs[UREG_FP]) & ~(PAGE_SIZE - 1))
-
-       fs = get_fs();
-       set_fs(KERNEL_DS);
-       has_dumped = 1;
-       current->flags |= PF_DUMPCORE;
-               strncpy(dump.u_comm, current->comm, sizeof(dump.u_comm));
-       dump.signal = signr;
-       aout_dump_thread(regs, &dump);
-
-/* If the size of the dump file exceeds the rlimit, then see what would happen
-   if we wrote the stack, but not the data area.  */
-       if (dump.u_dsize + dump.u_ssize > limit)
-               dump.u_dsize = 0;
-
-/* Make sure we have enough room to write the stack and data areas. */
-       if (dump.u_ssize > limit)
-               dump.u_ssize = 0;
-
-/* make sure we actually have a data and stack area to dump */
-       set_fs(USER_DS);
-       if (!access_ok(VERIFY_READ, (void __user *) START_DATA(dump), dump.u_dsize))
-               dump.u_dsize = 0;
-       if (!access_ok(VERIFY_READ, (void __user *) START_STACK(dump), dump.u_ssize))
-               dump.u_ssize = 0;
-
-       set_fs(KERNEL_DS);
-/* struct user */
-       DUMP_WRITE(&dump,sizeof(dump));
-/* now we start writing out the user space info */
-       set_fs(USER_DS);
-/* Dump the data area */
-       if (dump.u_dsize != 0) {
-               dump_start = START_DATA(dump);
-               dump_size = dump.u_dsize;
-               DUMP_WRITE(dump_start,dump_size);
-       }
-/* Now prepare to dump the stack area */
-       if (dump.u_ssize != 0) {
-               dump_start = START_STACK(dump);
-               dump_size = dump.u_ssize;
-               DUMP_WRITE(dump_start,dump_size);
-       }
-/* Finally dump the task struct.  Not be used by gdb, but could be useful */
-       set_fs(KERNEL_DS);
-       DUMP_WRITE(current,sizeof(*current));
-end_coredump:
-       set_fs(fs);
-       return has_dumped;
-}
-
-/*
- * create_aout32_tables() parses the env- and arg-strings in new user
- * memory and creates the pointer tables from them, and puts their
- * addresses on the "stack", returning the new stack pointer value.
- */
-
-static u32 __user *create_aout32_tables(char __user *p, struct linux_binprm *bprm)
-{
-       u32 __user *argv;
-       u32 __user *envp;
-       u32 __user *sp;
-       int argc = bprm->argc;
-       int envc = bprm->envc;
-
-       sp = (u32 __user *)((-(unsigned long)sizeof(char *))&(unsigned long)p);
-
-       /* This imposes the proper stack alignment for a new process. */
-       sp = (u32 __user *) (((unsigned long) sp) & ~7);
-       if ((envc+argc+3)&1)
-               --sp;
-
-       sp -= envc+1;
-       envp = sp;
-       sp -= argc+1;
-       argv = sp;
-       put_user(argc,--sp);
-       current->mm->arg_start = (unsigned long) p;
-       while (argc-->0) {
-               char c;
-               put_user(((u32)(unsigned long)(p)),argv++);
-               do {
-                       get_user(c,p++);
-               } while (c);
-       }
-       put_user(0,argv);
-       current->mm->arg_end = current->mm->env_start = (unsigned long) p;
-       while (envc-->0) {
-               char c;
-               put_user(((u32)(unsigned long)(p)),envp++);
-               do {
-                       get_user(c,p++);
-               } while (c);
-       }
-       put_user(0,envp);
-       current->mm->env_end = (unsigned long) p;
-       return sp;
-}
-
-/*
- * These are the functions used to load a.out style executables and shared
- * libraries.  There is no binary dependent code anywhere else.
- */
-
-static int load_aout32_binary(struct linux_binprm * bprm, struct pt_regs * regs)
-{
-       struct exec ex;
-       unsigned long error;
-       unsigned long fd_offset;
-       unsigned long rlim;
-       unsigned long orig_thr_flags;
-       int retval;
-
-       ex = *((struct exec *) bprm->buf);              /* exec-header */
-       if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != OMAGIC &&
-            N_MAGIC(ex) != QMAGIC && N_MAGIC(ex) != NMAGIC) ||
-           N_TRSIZE(ex) || N_DRSIZE(ex) ||
-           bprm->file->f_path.dentry->d_inode->i_size < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
-               return -ENOEXEC;
-       }
-
-       fd_offset = N_TXTOFF(ex);
-
-       /* Check initial limits. This avoids letting people circumvent
-        * size limits imposed on them by creating programs with large
-        * arrays in the data or bss.
-        */
-       rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
-       if (rlim >= RLIM_INFINITY)
-               rlim = ~0;
-       if (ex.a_data + ex.a_bss > rlim)
-               return -ENOMEM;
-
-       /* Flush all traces of the currently running executable */
-       retval = flush_old_exec(bprm);
-       if (retval)
-               return retval;
-
-       /* OK, This is the point of no return */
-       set_personality(PER_SUNOS);
-
-       current->mm->end_code = ex.a_text +
-               (current->mm->start_code = N_TXTADDR(ex));
-       current->mm->end_data = ex.a_data +
-               (current->mm->start_data = N_DATADDR(ex));
-       current->mm->brk = ex.a_bss +
-               (current->mm->start_brk = N_BSSADDR(ex));
-       current->mm->free_area_cache = current->mm->mmap_base;
-       current->mm->cached_hole_size = 0;
-
-       current->mm->mmap = NULL;
-       compute_creds(bprm);
-       current->flags &= ~PF_FORKNOEXEC;
-       if (N_MAGIC(ex) == NMAGIC) {
-               loff_t pos = fd_offset;
-               /* Fuck me plenty... */
-               down_write(&current->mm->mmap_sem);     
-               error = do_brk(N_TXTADDR(ex), ex.a_text);
-               up_write(&current->mm->mmap_sem);
-               bprm->file->f_op->read(bprm->file, (char __user *)N_TXTADDR(ex),
-                         ex.a_text, &pos);
-               down_write(&current->mm->mmap_sem);
-               error = do_brk(N_DATADDR(ex), ex.a_data);
-               up_write(&current->mm->mmap_sem);
-               bprm->file->f_op->read(bprm->file, (char __user *)N_DATADDR(ex),
-                         ex.a_data, &pos);
-               goto beyond_if;
-       }
-
-       if (N_MAGIC(ex) == OMAGIC) {
-               loff_t pos = fd_offset;
-               down_write(&current->mm->mmap_sem);
-               do_brk(N_TXTADDR(ex) & PAGE_MASK,
-                       ex.a_text+ex.a_data + PAGE_SIZE - 1);
-               up_write(&current->mm->mmap_sem);
-               bprm->file->f_op->read(bprm->file, (char __user *)N_TXTADDR(ex),
-                         ex.a_text+ex.a_data, &pos);
-       } else {
-               static unsigned long error_time;
-               if ((ex.a_text & 0xfff || ex.a_data & 0xfff) &&
-                   (N_MAGIC(ex) != NMAGIC) && (jiffies-error_time) > 5*HZ)
-               {
-                       printk(KERN_NOTICE "executable not page aligned\n");
-                       error_time = jiffies;
-               }
-
-               if (!bprm->file->f_op->mmap) {
-                       loff_t pos = fd_offset;
-                       down_write(&current->mm->mmap_sem);
-                       do_brk(0, ex.a_text+ex.a_data);
-                       up_write(&current->mm->mmap_sem);
-                       bprm->file->f_op->read(bprm->file,
-                                 (char __user *)N_TXTADDR(ex),
-                                 ex.a_text+ex.a_data, &pos);
-                       goto beyond_if;
-               }
-
-               down_write(&current->mm->mmap_sem);
-               error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
-                       PROT_READ | PROT_EXEC,
-                       MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
-                       fd_offset);
-               up_write(&current->mm->mmap_sem);
-
-               if (error != N_TXTADDR(ex)) {
-                       send_sig(SIGKILL, current, 0);
-                       return error;
-               }
-
-               down_write(&current->mm->mmap_sem);
-               error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
-                               PROT_READ | PROT_WRITE | PROT_EXEC,
-                               MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
-                               fd_offset + ex.a_text);
-               up_write(&current->mm->mmap_sem);
-               if (error != N_DATADDR(ex)) {
-                       send_sig(SIGKILL, current, 0);
-                       return error;
-               }
-       }
-beyond_if:
-       set_binfmt(&aout32_format);
-
-       set_brk(current->mm->start_brk, current->mm->brk);
-
-       /* Make sure STACK_TOP returns the right thing.  */
-       orig_thr_flags = current_thread_info()->flags;
-       current_thread_info()->flags |= _TIF_32BIT;
-
-       retval = setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT);
-       if (retval < 0) { 
-               current_thread_info()->flags = orig_thr_flags;
-
-               /* Someone check-me: is this error path enough? */ 
-               send_sig(SIGKILL, current, 0); 
-               return retval;
-       }
-
-       current->mm->start_stack =
-               (unsigned long) create_aout32_tables((char __user *)bprm->p, bprm);
-       tsb_context_switch(current->mm);
-
-       start_thread32(regs, ex.a_entry, current->mm->start_stack);
-       if (current->ptrace & PT_PTRACED)
-               send_sig(SIGTRAP, current, 0);
-       return 0;
-}
-
-/* N.B. Move to .h file and use code in fs/binfmt_aout.c? */
-static int load_aout32_library(struct file *file)
-{
-       struct inode * inode;
-       unsigned long bss, start_addr, len;
-       unsigned long error;
-       int retval;
-       struct exec ex;
-
-       inode = file->f_path.dentry->d_inode;
-
-       retval = -ENOEXEC;
-       error = kernel_read(file, 0, (char *) &ex, sizeof(ex));
-       if (error != sizeof(ex))
-               goto out;
-
-       /* We come in here for the regular a.out style of shared libraries */
-       if ((N_MAGIC(ex) != ZMAGIC && N_MAGIC(ex) != QMAGIC) || N_TRSIZE(ex) ||
-           N_DRSIZE(ex) || ((ex.a_entry & 0xfff) && N_MAGIC(ex) == ZMAGIC) ||
-           inode->i_size < ex.a_text+ex.a_data+N_SYMSIZE(ex)+N_TXTOFF(ex)) {
-               goto out;
-       }
-
-       if (N_MAGIC(ex) == ZMAGIC && N_TXTOFF(ex) &&
-           (N_TXTOFF(ex) < inode->i_sb->s_blocksize)) {
-               printk("N_TXTOFF < BLOCK_SIZE. Please convert library\n");
-               goto out;
-       }
-
-       if (N_FLAGS(ex))
-               goto out;
-
-       /* For  QMAGIC, the starting address is 0x20 into the page.  We mask
-          this off to get the starting address for the page */
-
-       start_addr =  ex.a_entry & 0xfffff000;
-
-       /* Now use mmap to map the library into memory. */
-       down_write(&current->mm->mmap_sem);
-       error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
-                       PROT_READ | PROT_WRITE | PROT_EXEC,
-                       MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
-                       N_TXTOFF(ex));
-       up_write(&current->mm->mmap_sem);
-       retval = error;
-       if (error != start_addr)
-               goto out;
-
-       len = PAGE_ALIGN(ex.a_text + ex.a_data);
-       bss = ex.a_text + ex.a_data + ex.a_bss;
-       if (bss > len) {
-               down_write(&current->mm->mmap_sem);
-               error = do_brk(start_addr + len, bss - len);
-               up_write(&current->mm->mmap_sem);
-               retval = error;
-               if (error != start_addr + len)
-                       goto out;
-       }
-       retval = 0;
-out:
-       return retval;
-}
-
-static int __init init_aout32_binfmt(void)
-{
-       return register_binfmt(&aout32_format);
-}
-
-static void __exit exit_aout32_binfmt(void)
-{
-       unregister_binfmt(&aout32_format);
-}
-
-module_init(init_aout32_binfmt);
-module_exit(exit_aout32_binfmt);
index 49eca4b1cf25d41c44a7f165dc97b50e2974136f..fb43c76bdc261b5be56428305d8192f8e1a03504 100644 (file)
@@ -1353,63 +1353,6 @@ breakpoint_trap:
        ba,pt           %xcc, rtrap
         nop
 
-#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
-    defined(CONFIG_SOLARIS_EMUL_MODULE)
-       /* SunOS uses syscall zero as the 'indirect syscall' it looks
-        * like indir_syscall(scall_num, arg0, arg1, arg2...);  etc.
-        * This is complete brain damage.
-        */
-       .globl  sunos_indir
-sunos_indir:
-       srl             %o0, 0, %o0
-       mov             %o7, %l4
-       cmp             %o0, NR_SYSCALLS
-       blu,a,pt        %icc, 1f
-        sll            %o0, 0x2, %o0
-       sethi           %hi(sunos_nosys), %l6
-       b,pt            %xcc, 2f
-        or             %l6, %lo(sunos_nosys), %l6
-1:     sethi           %hi(sunos_sys_table), %l7
-       or              %l7, %lo(sunos_sys_table), %l7
-       lduw            [%l7 + %o0], %l6
-2:     mov             %o1, %o0
-       mov             %o2, %o1
-       mov             %o3, %o2
-       mov             %o4, %o3
-       mov             %o5, %o4
-       call            %l6
-        mov            %l4, %o7
-
-       .globl  sunos_getpid
-sunos_getpid:
-       call    sys_getppid
-        nop
-       call    sys_getpid
-        stx    %o0, [%sp + PTREGS_OFF + PT_V9_I1]
-       b,pt    %xcc, ret_sys_call
-        stx    %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-
-       /* SunOS getuid() returns uid in %o0 and euid in %o1 */
-       .globl  sunos_getuid
-sunos_getuid:
-       call    sys32_geteuid16
-        nop
-       call    sys32_getuid16
-        stx    %o0, [%sp + PTREGS_OFF + PT_V9_I1]
-       b,pt    %xcc, ret_sys_call
-        stx    %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-
-       /* SunOS getgid() returns gid in %o0 and egid in %o1 */
-       .globl  sunos_getgid
-sunos_getgid:
-       call    sys32_getegid16
-        nop
-       call    sys32_getgid16
-        stx    %o0, [%sp + PTREGS_OFF + PT_V9_I1]
-       b,pt    %xcc, ret_sys_call
-        stx    %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-#endif
-
        /* SunOS's execv() call only specifies the argv argument, the
         * environment settings are the same as the calling processes.
         */
@@ -1591,7 +1534,7 @@ linux_syscall_trace:
         mov            %i4, %o4
 
 
-       /* Linux 32-bit and SunOS system calls enter here... */
+       /* Linux 32-bit system calls enter here... */
        .align  32
        .globl  linux_sparc_syscall32
 linux_sparc_syscall32:
@@ -1614,7 +1557,7 @@ linux_sparc_syscall32:
         srl            %i3, 0, %o3                             ! IEU0
        ba,a,pt         %xcc, 3f
 
-       /* Linux native and SunOS system calls enter here... */
+       /* Linux native system calls enter here... */
        .align  32
        .globl  linux_sparc_syscall, ret_sys_call
 linux_sparc_syscall:
index 9d51956e8e2f6737057c99c3d5e01e31dc9a67a3..1c47009eb5ec09068e7417d4c158c97c841c230d 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
-#include <asm/svr4.h>
 #include <asm/pgtable.h>
 #include <asm/fpumacro.h>
 #include <asm/uctx.h>
index 8c1c121330fba5b57687e5e3deca87c9d39ed1d7..74e0512f135c9380d35f06f98aed5a5949406b98 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
-#include <asm/svr4.h>
 #include <asm/pgtable.h>
 #include <asm/psrcompat.h>
 #include <asm/fpumacro.h>
@@ -798,281 +797,6 @@ sigsegv:
        force_sigsegv(signo, current);
 }
 
-/* Setup a Solaris stack frame */
-static void
-setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
-                  struct pt_regs *regs, int signr, sigset_t *oldset)
-{
-       svr4_signal_frame_t __user *sfp;
-       svr4_gregset_t  __user *gr;
-       svr4_siginfo_t  __user *si;
-       svr4_mcontext_t __user *mc;
-       svr4_gwindows_t __user *gw;
-       svr4_ucontext_t __user *uc;
-       svr4_sigset_t setv;
-       unsigned int psr;
-       int i, err;
-
-       synchronize_user_stack();
-       save_and_clear_fpu();
-       
-       regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
-       sfp = (svr4_signal_frame_t __user *)
-               get_sigframe(sa, regs,
-                            sizeof(struct reg_window32) + SVR4_SF_ALIGNED);
-
-       if (invalid_frame_pointer(sfp, sizeof(*sfp)))
-               do_exit(SIGILL);
-
-       /* Start with a clean frame pointer and fill it */
-       err = clear_user(sfp, sizeof(*sfp));
-
-       /* Setup convenience variables */
-       si = &sfp->si;
-       uc = &sfp->uc;
-       gw = &sfp->gw;
-       mc = &uc->mcontext;
-       gr = &mc->greg;
-       
-       /* FIXME: where am I supposed to put this?
-        * sc->sigc_onstack = old_status;
-        * anyways, it does not look like it is used for anything at all.
-        */
-       setv.sigbits[0] = oldset->sig[0];
-       setv.sigbits[1] = (oldset->sig[0] >> 32);
-       if (_NSIG_WORDS >= 2) {
-               setv.sigbits[2] = oldset->sig[1];
-               setv.sigbits[3] = (oldset->sig[1] >> 32);
-               err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
-       } else
-               err |= __copy_to_user(&uc->sigmask, &setv,
-                                     2 * sizeof(unsigned int));
-       
-       /* Store registers */
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-       err |= __put_user(regs->tpc, &((*gr)[SVR4_PC]));
-       err |= __put_user(regs->tnpc, &((*gr)[SVR4_NPC]));
-       psr = tstate_to_psr(regs->tstate);
-       if (current_thread_info()->fpsaved[0] & FPRS_FEF)
-               psr |= PSR_EF;
-       err |= __put_user(psr, &((*gr)[SVR4_PSR]));
-       err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
-       
-       /* Copy g[1..7] and o[0..7] registers */
-       for (i = 0; i < 7; i++)
-               err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
-       for (i = 0; i < 8; i++)
-               err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
-
-       /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
-       err |= __put_user(current->sas_ss_size, &uc->stack.size);
-
-       /* Save the currently window file: */
-
-       /* 1. Link sfp->uc->gwins to our windows */
-       err |= __put_user(ptr_to_compat(gw), &mc->gwin);
-           
-       /* 2. Number of windows to restore at setcontext (): */
-       err |= __put_user(get_thread_wsaved(), &gw->count);
-
-       /* 3. We just pay attention to the gw->count field on setcontext */
-       set_thread_wsaved(0); /* So process is allowed to execute. */
-
-       /* Setup the signal information.  Solaris expects a bunch of
-        * information to be passed to the signal handler, we don't provide
-        * that much currently, should use siginfo.
-        */
-       err |= __put_user(signr, &si->siginfo.signo);
-       err |= __put_user(SVR4_SINOINFO, &si->siginfo.code);
-       if (err)
-               goto sigsegv;
-
-       regs->u_regs[UREG_FP] = (unsigned long) sfp;
-       regs->tpc = (unsigned long) sa->sa_handler;
-       regs->tnpc = (regs->tpc + 4);
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-
-       /* Arguments passed to signal handler */
-       if (regs->u_regs[14]){
-               struct reg_window32 __user *rw = (struct reg_window32 __user *)
-                       (regs->u_regs[14] & 0x00000000ffffffffUL);
-
-               err |= __put_user(signr, &rw->ins[0]);
-               err |= __put_user((u64)si, &rw->ins[1]);
-               err |= __put_user((u64)uc, &rw->ins[2]);
-               err |= __put_user((u64)sfp, &rw->ins[6]);       /* frame pointer */
-               if (err)
-                       goto sigsegv;
-
-               regs->u_regs[UREG_I0] = signr;
-               regs->u_regs[UREG_I1] = (u32)(u64) si;
-               regs->u_regs[UREG_I2] = (u32)(u64) uc;
-       }
-       return;
-
-sigsegv:
-       force_sigsegv(signr, current);
-}
-
-asmlinkage int
-svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
-{
-       svr4_gregset_t  __user *gr;
-       svr4_mcontext_t __user *mc;
-       svr4_sigset_t setv;
-       int i, err;
-       u32 psr;
-
-       synchronize_user_stack();
-       save_and_clear_fpu();
-       
-       if (get_thread_wsaved())
-               do_exit(SIGSEGV);
-
-       err = clear_user(uc, sizeof(*uc));
-
-       /* Setup convenience variables */
-       mc = &uc->mcontext;
-       gr = &mc->greg;
-
-       setv.sigbits[0] = current->blocked.sig[0];
-       setv.sigbits[1] = (current->blocked.sig[0] >> 32);
-       if (_NSIG_WORDS >= 2) {
-               setv.sigbits[2] = current->blocked.sig[1];
-               setv.sigbits[3] = (current->blocked.sig[1] >> 32);
-               err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
-       } else
-               err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned));
-
-       /* Store registers */
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-       err |= __put_user(regs->tpc, &uc->mcontext.greg[SVR4_PC]);
-       err |= __put_user(regs->tnpc, &uc->mcontext.greg[SVR4_NPC]);
-
-       psr = tstate_to_psr(regs->tstate) & ~PSR_EF;               
-       if (current_thread_info()->fpsaved[0] & FPRS_FEF)
-               psr |= PSR_EF;
-       err |= __put_user(psr, &uc->mcontext.greg[SVR4_PSR]);
-
-       err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
-       
-       /* Copy g[1..7] and o[0..7] registers */
-       for (i = 0; i < 7; i++)
-               err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
-       for (i = 0; i < 8; i++)
-               err |= __put_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
-
-       /* Setup sigaltstack */
-       err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
-       err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &uc->stack.flags);
-       err |= __put_user(current->sas_ss_size, &uc->stack.size);
-
-       /* The register file is not saved
-        * we have already stuffed all of it with sync_user_stack
-        */
-       return (err ? -EFAULT : 0);
-}
-
-
-/* Set the context for a svr4 application, this is Solaris way to sigreturn */
-asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
-{
-       svr4_gregset_t  __user *gr;
-       mm_segment_t old_fs;
-       u32 pc, npc, psr, u_ss_sp;
-       sigset_t set;
-       svr4_sigset_t setv;
-       int i, err;
-       stack_t st;
-       
-       /* Fixme: restore windows, or is this already taken care of in
-        * svr4_setup_frame when sync_user_windows is done?
-        */
-       flush_user_windows();
-       
-       if (get_thread_wsaved())
-               goto sigsegv;
-
-       if (((unsigned long) c) & 3){
-               printk("Unaligned structure passed\n");
-               goto sigsegv;
-       }
-
-       if (!__access_ok(c, sizeof(*c))) {
-               /* Miguel, add nice debugging msg _here_. ;-) */
-               goto sigsegv;
-       }
-
-       /* Check for valid PC and nPC */
-       gr = &c->mcontext.greg;
-       err = __get_user(pc, &((*gr)[SVR4_PC]));
-       err |= __get_user(npc, &((*gr)[SVR4_NPC]));
-       if ((pc | npc) & 3)
-               goto sigsegv;
-       
-       /* Retrieve information from passed ucontext */
-       /* note that nPC is ored a 1, this is used to inform entry.S */
-       /* that we don't want it to mess with our PC and nPC */
-       
-       err |= copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
-       set.sig[0] = setv.sigbits[0] | (((long)setv.sigbits[1]) << 32);
-       if (_NSIG_WORDS >= 2)
-               set.sig[1] = setv.sigbits[2] | (((long)setv.sigbits[3]) << 32);
-       
-       err |= __get_user(u_ss_sp, &c->stack.sp);
-       st.ss_sp = compat_ptr(u_ss_sp);
-       err |= __get_user(st.ss_flags, &c->stack.flags);
-       err |= __get_user(st.ss_size, &c->stack.size);
-       if (err)
-               goto sigsegv;
-               
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       old_fs = get_fs();
-       set_fs(KERNEL_DS);
-       do_sigaltstack((stack_t __user *) &st, NULL, regs->u_regs[UREG_I6]);
-       set_fs(old_fs);
-       
-       sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sighand->siglock);
-       current->blocked = set;
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       regs->tpc = pc;
-       regs->tnpc = npc | 1;
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-       err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
-       err |= __get_user(psr, &((*gr)[SVR4_PSR]));
-       regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
-       regs->tstate |= psr_to_tstate_icc(psr);
-
-       /* Restore g[1..7] and o[0..7] registers */
-       for (i = 0; i < 7; i++)
-               err |= __get_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
-       for (i = 0; i < 8; i++)
-               err |= __get_user(regs->u_regs[UREG_I0+i], (&(*gr)[SVR4_O0])+i);
-       if (err)
-               goto sigsegv;
-
-       return -EINTR;
-sigsegv:
-       return -EFAULT;
-}
-
 static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                             unsigned long signr, sigset_t *oldset,
                             siginfo_t *info)
@@ -1216,20 +940,14 @@ sigsegv:
 
 static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
                                   siginfo_t *info,
-                                  sigset_t *oldset, struct pt_regs *regs,
-                                  int svr4_signal)
+                                  sigset_t *oldset, struct pt_regs *regs)
 {
-       if (svr4_signal)
-               setup_svr4_frame32(&ka->sa, regs->tpc, regs->tnpc,
-                                  regs, signr, oldset);
-       else {
-               if (ka->sa.sa_flags & SA_SIGINFO)
-                       setup_rt_frame32(ka, regs, signr, oldset, info);
-               else if (test_thread_flag(TIF_NEWSIGNALS))
-                       new_setup_frame32(ka, regs, signr, oldset);
-               else
-                       setup_frame32(&ka->sa, regs, signr, oldset, info);
-       }
+       if (ka->sa.sa_flags & SA_SIGINFO)
+               setup_rt_frame32(ka, regs, signr, oldset, info);
+       else if (test_thread_flag(TIF_NEWSIGNALS))
+               new_setup_frame32(ka, regs, signr, oldset);
+       else
+               setup_frame32(&ka->sa, regs, signr, oldset, info);
        spin_lock_irq(&current->sighand->siglock);
        sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
        if (!(ka->sa.sa_flags & SA_NOMASK))
@@ -1270,7 +988,6 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs,
        struct signal_deliver_cookie cookie;
        struct k_sigaction ka;
        int signr;
-       int svr4_signal = current->personality == PER_SVR4;
        
        cookie.restart_syscall = restart_syscall;
        cookie.orig_i0 = orig_i0;
@@ -1279,8 +996,7 @@ void do_signal32(sigset_t *oldset, struct pt_regs * regs,
        if (signr > 0) {
                if (cookie.restart_syscall)
                        syscall_restart32(orig_i0, regs, &ka.sa);
-               handle_signal32(signr, &ka, &info, oldset,
-                               regs, svr4_signal);
+               handle_signal32(signr, &ka, &info, oldset, regs);
 
                /* a signal was successfully delivered; the saved
                 * sigmask will have been stored in the signal frame,
index 051b8d9cb9891e1fc804b674ac29704207e49b52..38736460b8dbc86a76c7af4be6220fbe6d64e760 100644 (file)
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/idprom.h>
-#include <asm/svr4.h>
 #include <asm/elf.h>
 #include <asm/head.h>
 #include <asm/smp.h>
 #include <asm/mostek.h>
 #include <asm/ptrace.h>
-#include <asm/user.h>
 #include <asm/uaccess.h>
 #include <asm/checksum.h>
 #include <asm/fpumacro.h>
@@ -73,13 +71,8 @@ extern __kernel_size_t strlen(const char *);
 extern void linux_sparc_syscall(void);
 extern void rtrap(void);
 extern void show_regs(struct pt_regs *);
-extern void solaris_syscall(void);
 extern void syscall_trace(struct pt_regs *, int);
-extern u32 sunos_sys_table[], sys_call_table32[];
-extern void tl0_solaris(void);
 extern void sys_sigsuspend(void);
-extern int svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
-extern int svr4_setcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
 extern int compat_sys_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
 extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *);
 extern long sparc32_open(const char __user * filename, int flags, int mode);
@@ -90,8 +83,6 @@ extern int __ashrdi3(int, int);
 
 extern int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs);
 
-extern unsigned int sys_call_table[];
-
 extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);
 extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,
                      unsigned long *);
@@ -213,11 +204,6 @@ EXPORT_SYMBOL(pci_dma_supported);
 /* I/O device mmaping on Sparc64. */
 EXPORT_SYMBOL(io_remap_pfn_range);
 
-#if defined(CONFIG_COMPAT) && defined(CONFIG_NET)
-/* Solaris/SunOS binary compatibility */
-EXPORT_SYMBOL(verify_compat_iovec);
-#endif
-
 EXPORT_SYMBOL(dump_fpu);
 EXPORT_SYMBOL(put_fs_struct);
 
@@ -254,30 +240,6 @@ EXPORT_SYMBOL(strlen);
 EXPORT_SYMBOL(__strlen_user);
 EXPORT_SYMBOL(__strnlen_user);
 
-#ifdef CONFIG_SOLARIS_EMUL_MODULE
-EXPORT_SYMBOL(linux_sparc_syscall);
-EXPORT_SYMBOL(rtrap);
-EXPORT_SYMBOL(show_regs);
-EXPORT_SYMBOL(solaris_syscall);
-EXPORT_SYMBOL(syscall_trace);
-EXPORT_SYMBOL(sunos_sys_table);
-EXPORT_SYMBOL(sys_call_table32);
-EXPORT_SYMBOL(tl0_solaris);
-EXPORT_SYMBOL(sys_sigsuspend);
-EXPORT_SYMBOL(sys_getppid);
-EXPORT_SYMBOL(sys_getpid);
-EXPORT_SYMBOL(sys_geteuid);
-EXPORT_SYMBOL(sys_getuid);
-EXPORT_SYMBOL(sys_getegid);
-EXPORT_SYMBOL(sysctl_nr_open);
-EXPORT_SYMBOL(sys_getgid);
-EXPORT_SYMBOL(svr4_getcontext);
-EXPORT_SYMBOL(svr4_setcontext);
-EXPORT_SYMBOL(compat_sys_ioctl);
-EXPORT_SYMBOL(sys_ioctl);
-EXPORT_SYMBOL(sparc32_open);
-#endif
-
 /* Special internal versions of library functions. */
 EXPORT_SYMBOL(_clear_page);
 EXPORT_SYMBOL(clear_user_page);
@@ -334,9 +296,6 @@ EXPORT_SYMBOL(do_BUG);
 /* for ns8703 */
 EXPORT_SYMBOL(ns87303_lock);
 
-/* for solaris compat module */
-EXPORT_SYMBOL_GPL(sys_call_table);
-
 EXPORT_SYMBOL(tick_ops);
 
 EXPORT_SYMBOL(xor_vis_2);
diff --git a/arch/sparc64/kernel/sunos_ioctl32.c b/arch/sparc64/kernel/sunos_ioctl32.c
deleted file mode 100644 (file)
index 75d2bad..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-/* $Id: sunos_ioctl32.c,v 1.11 2000/07/30 23:12:24 davem Exp $
- * sunos_ioctl32.c: SunOS ioctl compatibility on sparc64.
- *
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <asm/uaccess.h>
-
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/termios.h>
-#include <linux/tty.h>
-#include <linux/ioctl.h>
-#include <linux/route.h>
-#include <linux/sockios.h>
-#include <linux/if.h>
-#include <linux/netdevice.h>
-#include <linux/if_arp.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/syscalls.h>
-#include <linux/compat.h>
-
-#define SUNOS_NR_OPEN  256
-
-struct rtentry32 {
-        u32            rt_pad1;
-        struct sockaddr rt_dst;         /* target address               */
-        struct sockaddr rt_gateway;     /* gateway addr (RTF_GATEWAY)   */
-        struct sockaddr rt_genmask;     /* target network mask (IP)     */
-        unsigned short  rt_flags;
-        short           rt_pad2;
-        u32            rt_pad3;
-        unsigned char   rt_tos;
-        unsigned char   rt_class;
-        short           rt_pad4;
-        short           rt_metric;      /* +1 for binary compatibility! */
-        /* char * */ u32 rt_dev;        /* forcing the device at add    */
-        u32            rt_mtu;         /* per route MTU/Window         */
-        u32            rt_window;      /* Window clamping              */
-        unsigned short  rt_irtt;        /* Initial RTT                  */
-
-};
-
-struct ifmap32 {
-       u32 mem_start;
-       u32 mem_end;
-       unsigned short base_addr;
-       unsigned char irq;
-       unsigned char dma;
-       unsigned char port;
-};
-
-struct ifreq32 {
-#define IFHWADDRLEN     6
-#define IFNAMSIZ        16
-        union {
-                char    ifrn_name[IFNAMSIZ];            /* if name, e.g. "en0" */
-        } ifr_ifrn;
-        union {
-                struct  sockaddr ifru_addr;
-                struct  sockaddr ifru_dstaddr;
-                struct  sockaddr ifru_broadaddr;
-                struct  sockaddr ifru_netmask;
-                struct  sockaddr ifru_hwaddr;
-                short   ifru_flags;
-                int     ifru_ivalue;
-                int     ifru_mtu;
-                struct  ifmap32 ifru_map;
-                char    ifru_slave[IFNAMSIZ];   /* Just fits the size */
-                compat_caddr_t ifru_data;
-        } ifr_ifru;
-};
-
-struct ifconf32 {
-        int     ifc_len;                        /* size of buffer       */
-        compat_caddr_t  ifcbuf;
-};
-
-extern asmlinkage int compat_sys_ioctl(unsigned int, unsigned int, u32);
-
-asmlinkage int sunos_ioctl (int fd, u32 cmd, u32 arg)
-{
-       int ret = -EBADF;
-
-       if(fd >= SUNOS_NR_OPEN)
-               goto out;
-       if(!fcheck(fd))
-               goto out;
-
-       if(cmd == TIOCSETD) {
-               mm_segment_t old_fs = get_fs();
-               int __user *p;
-               int ntty = N_TTY;
-               int tmp;
-
-               p = (int __user *) (unsigned long) arg;
-               ret = -EFAULT;
-               if(get_user(tmp, p))
-                       goto out;
-               if(tmp == 2) {
-                       set_fs(KERNEL_DS);
-                       ret = sys_ioctl(fd, cmd, (unsigned long) &ntty);
-                       set_fs(old_fs);
-                       ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
-                       goto out;
-               }
-       }
-       if(cmd == TIOCNOTTY) {
-               ret = sys_setsid();
-               goto out;
-       }
-       switch(cmd) {
-       case _IOW('r', 10, struct rtentry32):
-               ret = compat_sys_ioctl(fd, SIOCADDRT, arg);
-               goto out;
-       case _IOW('r', 11, struct rtentry32):
-               ret = compat_sys_ioctl(fd, SIOCDELRT, arg);
-               goto out;
-
-       case _IOW('i', 12, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFADDR, arg);
-               goto out;
-       case _IOWR('i', 13, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFADDR, arg);
-               goto out;
-       case _IOW('i', 14, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFDSTADDR, arg);
-               goto out;
-       case _IOWR('i', 15, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFDSTADDR, arg);
-               goto out;
-       case _IOW('i', 16, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFFLAGS, arg);
-               goto out;
-       case _IOWR('i', 17, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFFLAGS, arg);
-               goto out;
-       case _IOW('i', 18, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFMEM, arg);
-               goto out;
-       case _IOWR('i', 19, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFMEM, arg);
-               goto out;
-
-       case _IOWR('i', 20, struct ifconf32):
-               ret = compat_sys_ioctl(fd, SIOCGIFCONF, arg);
-               goto out;
-
-       case _IOW('i', 21, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFMTU, arg);
-               goto out;
-
-       case _IOWR('i', 22, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFMTU, arg);
-               goto out;
-
-       case _IOWR('i', 23, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFBRDADDR, arg);
-               goto out;
-       case _IOW('i', 24, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFBRDADDR, arg);
-               goto out;
-       case _IOWR('i', 25, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFNETMASK, arg);
-               goto out;
-       case _IOW('i', 26, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFNETMASK, arg);
-               goto out;
-       case _IOWR('i', 27, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCGIFMETRIC, arg);
-               goto out;
-       case _IOW('i', 28, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCSIFMETRIC, arg);
-               goto out;
-
-       case _IOW('i', 30, struct arpreq):
-               ret = compat_sys_ioctl(fd, SIOCSARP, arg);
-               goto out;
-       case _IOWR('i', 31, struct arpreq):
-               ret = compat_sys_ioctl(fd, SIOCGARP, arg);
-               goto out;
-       case _IOW('i', 32, struct arpreq):
-               ret = compat_sys_ioctl(fd, SIOCDARP, arg);
-               goto out;
-
-       case _IOW('i', 40, struct ifreq32): /* SIOCUPPER */
-       case _IOW('i', 41, struct ifreq32): /* SIOCLOWER */
-       case _IOW('i', 44, struct ifreq32): /* SIOCSETSYNC */
-       case _IOW('i', 45, struct ifreq32): /* SIOCGETSYNC */
-       case _IOW('i', 46, struct ifreq32): /* SIOCSSDSTATS */
-       case _IOW('i', 47, struct ifreq32): /* SIOCSSESTATS */
-       case _IOW('i', 48, struct ifreq32): /* SIOCSPROMISC */
-               ret = -EOPNOTSUPP;
-               goto out;
-
-       case _IOW('i', 49, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCADDMULTI, arg);
-               goto out;
-       case _IOW('i', 50, struct ifreq32):
-               ret = compat_sys_ioctl(fd, SIOCDELMULTI, arg);
-               goto out;
-
-       /* FDDI interface ioctls, unsupported. */
-               
-       case _IOW('i', 51, struct ifreq32): /* SIOCFDRESET */
-       case _IOW('i', 52, struct ifreq32): /* SIOCFDSLEEP */
-       case _IOW('i', 53, struct ifreq32): /* SIOCSTRTFMWAR */
-       case _IOW('i', 54, struct ifreq32): /* SIOCLDNSTRTFW */
-       case _IOW('i', 55, struct ifreq32): /* SIOCGETFDSTAT */
-       case _IOW('i', 56, struct ifreq32): /* SIOCFDNMIINT */
-       case _IOW('i', 57, struct ifreq32): /* SIOCFDEXUSER */
-       case _IOW('i', 58, struct ifreq32): /* SIOCFDGNETMAP */
-       case _IOW('i', 59, struct ifreq32): /* SIOCFDGIOCTL */
-               printk("FDDI ioctl, returning EOPNOTSUPP\n");
-               ret = -EOPNOTSUPP;
-               goto out;
-
-       case _IOW('t', 125, int):
-               /* More stupid tty sunos ioctls, just
-                * say it worked.
-                */
-               ret = 0;
-               goto out;
-
-       /* Non posix grp */
-       case _IOW('t', 118, int): {
-               int oldval, newval, __user *ptr;
-
-               cmd = TIOCSPGRP;
-               ptr = (int __user *) (unsigned long) arg;
-               ret = -EFAULT;
-               if(get_user(oldval, ptr))
-                       goto out;
-               ret = compat_sys_ioctl(fd, cmd, arg);
-               __get_user(newval, ptr);
-               if(newval == -1) {
-                       __put_user(oldval, ptr);
-                       ret = -EIO;
-               }
-               if(ret == -ENOTTY)
-                       ret = -EIO;
-               goto out;
-       }
-
-       case _IOR('t', 119, int): {
-               int oldval, newval, __user *ptr;
-
-               cmd = TIOCGPGRP;
-               ptr = (int __user *) (unsigned long) arg;
-               ret = -EFAULT;
-               if(get_user(oldval, ptr))
-                       goto out;
-               ret = compat_sys_ioctl(fd, cmd, arg);
-               __get_user(newval, ptr);
-               if(newval == -1) {
-                       __put_user(oldval, ptr);
-                       ret = -EIO;
-               }
-               if(ret == -ENOTTY)
-                       ret = -EIO;
-               goto out;
-       }
-       };
-
-       ret = compat_sys_ioctl(fd, cmd, arg);
-       /* so stupid... */
-       ret = (ret == -EINVAL ? -EOPNOTSUPP : ret);
-out:
-       return ret;
-}
index f952745d0f3d964605e6008f6f567de72a49855e..73ed01ba40dc340951508ff819a296914efeaad7 100644 (file)
@@ -720,44 +720,6 @@ out:
        return err;
 }
 
-asmlinkage long solaris_syscall(struct pt_regs *regs)
-{
-       static int count;
-
-       regs->tpc = regs->tnpc;
-       regs->tnpc += 4;
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-       if (++count <= 5) {
-               printk ("For Solaris binary emulation you need solaris module loaded\n");
-               show_regs (regs);
-       }
-       send_sig(SIGSEGV, current, 1);
-
-       return -ENOSYS;
-}
-
-#ifndef CONFIG_SUNOS_EMUL
-asmlinkage long sunos_syscall(struct pt_regs *regs)
-{
-       static int count;
-
-       regs->tpc = regs->tnpc;
-       regs->tnpc += 4;
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-       if (++count <= 20)
-               printk ("SunOS binary emulation not compiled in\n");
-       force_sig(SIGSEGV, current);
-
-       return -ENOSYS;
-}
-#endif
-
 asmlinkage long sys_utrap_install(utrap_entry_t type,
                                  utrap_handler_t new_p,
                                  utrap_handler_t new_d,
diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c
deleted file mode 100644 (file)
index e91194f..0000000
+++ /dev/null
@@ -1,1359 +0,0 @@
-/* $Id: sys_sunos32.c,v 1.64 2002/02/09 19:49:31 davem Exp $
- * sys_sunos32.c: SunOS binary compatibility layer on sparc64.
- *
- * Copyright (C) 1995, 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- *
- * Based upon preliminary work which is:
- *
- * Copyright (C) 1995 Adrian M. Rodriguez (adrian@remus.rutgers.edu)
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/capability.h>
-#include <linux/compat.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/resource.h>
-#include <linux/ipc.h>
-#include <linux/shm.h>
-#include <linux/msg.h>
-#include <linux/sem.h>
-#include <linux/signal.h>
-#include <linux/uio.h>
-#include <linux/utsname.h>
-#include <linux/major.h>
-#include <linux/stat.h>
-#include <linux/slab.h>
-#include <linux/pagemap.h>
-#include <linux/errno.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/syscalls.h>
-
-#include <asm/uaccess.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/pconf.h>
-#include <asm/idprom.h> /* for gethostid() */
-#include <asm/unistd.h>
-#include <asm/system.h>
-#include <asm/compat_signal.h>
-
-/* For the nfs mount emulation */
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/nfs.h>
-#include <linux/nfs2.h>
-#include <linux/nfs_mount.h>
-
-/* for sunos_select */
-#include <linux/time.h>
-#include <linux/personality.h>
-
-/* For SOCKET_I */
-#include <net/sock.h>
-#include <net/compat.h>
-
-#define SUNOS_NR_OPEN  256
-
-asmlinkage u32 sunos_mmap(u32 addr, u32 len, u32 prot, u32 flags, u32 fd, u32 off)
-{
-       struct file *file = NULL;
-       unsigned long retval, ret_type;
-
-       if (flags & MAP_NORESERVE) {
-               static int cnt;
-               if (cnt++ < 10)
-                       printk("%s:  unimplemented SunOS MAP_NORESERVE mmap() flag\n",
-                              current->comm);
-               flags &= ~MAP_NORESERVE;
-       }
-       retval = -EBADF;
-       if (!(flags & MAP_ANONYMOUS)) {
-               struct inode * inode;
-               if (fd >= SUNOS_NR_OPEN)
-                       goto out;
-               file = fget(fd);
-               if (!file)
-                       goto out;
-               inode = file->f_path.dentry->d_inode;
-               if (imajor(inode) == MEM_MAJOR && iminor(inode) == 5) {
-                       flags |= MAP_ANONYMOUS;
-                       fput(file);
-                       file = NULL;
-               }
-       }
-
-       retval = -EINVAL;
-       if (!(flags & MAP_FIXED))
-               addr = 0;
-       else if (len > 0xf0000000 || addr > 0xf0000000 - len)
-               goto out_putf;
-       ret_type = flags & _MAP_NEW;
-       flags &= ~_MAP_NEW;
-
-       flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-       down_write(&current->mm->mmap_sem);
-       retval = do_mmap(file,
-                        (unsigned long) addr, (unsigned long) len,
-                        (unsigned long) prot, (unsigned long) flags,
-                        (unsigned long) off);
-       up_write(&current->mm->mmap_sem);
-       if (!ret_type)
-               retval = ((retval < 0xf0000000) ? 0 : retval);
-out_putf:
-       if (file)
-               fput(file);
-out:
-       return (u32) retval;
-}
-
-asmlinkage int sunos_mctl(u32 addr, u32 len, int function, u32 arg)
-{
-       return 0;
-}
-
-asmlinkage int sunos_brk(u32 baddr)
-{
-       int freepages, retval = -ENOMEM;
-       unsigned long rlim;
-       unsigned long newbrk, oldbrk, brk = (unsigned long) baddr;
-
-       down_write(&current->mm->mmap_sem);
-       if (brk < current->mm->end_code)
-               goto out;
-       newbrk = PAGE_ALIGN(brk);
-       oldbrk = PAGE_ALIGN(current->mm->brk);
-       retval = 0;
-       if (oldbrk == newbrk) {
-               current->mm->brk = brk;
-               goto out;
-       }
-       /* Always allow shrinking brk. */
-       if (brk <= current->mm->brk) {
-               current->mm->brk = brk;
-               do_munmap(current->mm, newbrk, oldbrk-newbrk);
-               goto out;
-       }
-       /* Check against rlimit and stack.. */
-       retval = -ENOMEM;
-       rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
-       if (rlim >= RLIM_INFINITY)
-               rlim = ~0;
-       if (brk - current->mm->end_code > rlim)
-               goto out;
-       /* Check against existing mmap mappings. */
-       if (find_vma_intersection(current->mm, oldbrk, newbrk+PAGE_SIZE))
-               goto out;
-       /* stupid algorithm to decide if we have enough memory: while
-        * simple, it hopefully works in most obvious cases.. Easy to
-        * fool it, but this should catch most mistakes.
-        */
-       freepages = global_page_state(NR_FILE_PAGES);
-       freepages >>= 1;
-       freepages += nr_free_pages();
-       freepages += nr_swap_pages;
-       freepages -= num_physpages >> 4;
-       freepages -= (newbrk-oldbrk) >> PAGE_SHIFT;
-       if (freepages < 0)
-               goto out;
-       /* Ok, we have probably got enough memory - let it rip. */
-       current->mm->brk = brk;
-       do_brk(oldbrk, newbrk-oldbrk);
-       retval = 0;
-out:
-       up_write(&current->mm->mmap_sem);
-       return retval;
-}
-
-asmlinkage u32 sunos_sbrk(int increment)
-{
-       int error, oldbrk;
-
-       /* This should do it hopefully... */
-       oldbrk = (int)current->mm->brk;
-       error = sunos_brk(((int) current->mm->brk) + increment);
-       if (!error)
-               error = oldbrk;
-       return error;
-}
-
-asmlinkage u32 sunos_sstk(int increment)
-{
-       printk("%s: Call to sunos_sstk(increment<%d>) is unsupported\n",
-              current->comm, increment);
-
-       return (u32)-1;
-}
-
-/* Give hints to the kernel as to what paging strategy to use...
- * Completely bogus, don't remind me.
- */
-#define VA_NORMAL     0 /* Normal vm usage expected */
-#define VA_ABNORMAL   1 /* Abnormal/random vm usage probable */
-#define VA_SEQUENTIAL 2 /* Accesses will be of a sequential nature */
-#define VA_INVALIDATE 3 /* Page table entries should be flushed ??? */
-static char *vstrings[] = {
-       "VA_NORMAL",
-       "VA_ABNORMAL",
-       "VA_SEQUENTIAL",
-       "VA_INVALIDATE",
-};
-
-asmlinkage void sunos_vadvise(u32 strategy)
-{
-       static int count;
-
-       /* I wanna see who uses this... */
-       if (count++ < 5)
-               printk("%s: Advises us to use %s paging strategy\n",
-                      current->comm,
-                      strategy <= 3 ? vstrings[strategy] : "BOGUS");
-}
-
-/* This just wants the soft limit (ie. rlim_cur element) of the RLIMIT_NOFILE
- * resource limit and is for backwards compatibility with older sunos
- * revs.
- */
-asmlinkage int sunos_getdtablesize(void)
-{
-       return SUNOS_NR_OPEN;
-}
-
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
-asmlinkage u32 sunos_sigblock(u32 blk_mask)
-{
-       u32 old;
-
-       spin_lock_irq(&current->sighand->siglock);
-       old = (u32) current->blocked.sig[0];
-       current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       return old;
-}
-
-asmlinkage u32 sunos_sigsetmask(u32 newmask)
-{
-       u32 retval;
-
-       spin_lock_irq(&current->sighand->siglock);
-       retval = (u32) current->blocked.sig[0];
-       current->blocked.sig[0] = (newmask & _BLOCKABLE);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       return retval;
-}
-
-/* SunOS getdents is very similar to the newer Linux (iBCS2 compliant)    */
-/* getdents system call, the format of the structure just has a different */
-/* layout (d_off+d_ino instead of d_ino+d_off) */
-struct sunos_dirent {
-    s32                d_off;
-    u32                d_ino;
-    u16                d_reclen;
-    u16                d_namlen;
-    char       d_name[1];
-};
-
-struct sunos_dirent_callback {
-    struct sunos_dirent __user *curr;
-    struct sunos_dirent __user *previous;
-    int count;
-    int error;
-};
-
-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
-#define ROUND_UP(x) (((x)+sizeof(s32)-1) & ~(sizeof(s32)-1))
-
-static int sunos_filldir(void * __buf, const char * name, int namlen,
-                        loff_t offset, ino_t ino, unsigned int d_type)
-{
-       struct sunos_dirent __user *dirent;
-       struct sunos_dirent_callback * buf = (struct sunos_dirent_callback *) __buf;
-       int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-       u32 d_ino;
-
-       buf->error = -EINVAL;   /* only used if we fail.. */
-       if (reclen > buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       dirent = buf->previous;
-       if (dirent)
-               put_user(offset, &dirent->d_off);
-       dirent = buf->curr;
-       buf->previous = dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(namlen, &dirent->d_namlen);
-       put_user(reclen, &dirent->d_reclen);
-       if (copy_to_user(dirent->d_name, name, namlen))
-               return -EFAULT;
-       put_user(0, dirent->d_name + namlen);
-       dirent = (void __user *) dirent + reclen;
-       buf->curr = dirent;
-       buf->count -= reclen;
-       return 0;
-}
-
-asmlinkage int sunos_getdents(unsigned int fd, void __user *dirent, int cnt)
-{
-       struct file * file;
-       struct sunos_dirent __user *lastdirent;
-       struct sunos_dirent_callback buf;
-       int error = -EBADF;
-
-       if (fd >= SUNOS_NR_OPEN)
-               goto out;
-
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       error = -EINVAL;
-       if (cnt < (sizeof(struct sunos_dirent) + 255))
-               goto out_putf;
-
-       buf.curr = (struct sunos_dirent __user *) dirent;
-       buf.previous = NULL;
-       buf.count = cnt;
-       buf.error = 0;
-
-       error = vfs_readdir(file, sunos_filldir, &buf);
-       if (error < 0)
-               goto out_putf;
-
-       lastdirent = buf.previous;
-       error = buf.error;
-       if (lastdirent) {
-               put_user(file->f_pos, &lastdirent->d_off);
-               error = cnt - buf.count;
-       }
-
-out_putf:
-       fput(file);
-out:
-       return error;
-}
-
-/* Old sunos getdirentries, severely broken compatibility stuff here. */
-struct sunos_direntry {
-    u32                d_ino;
-    u16                d_reclen;
-    u16                d_namlen;
-    char       d_name[1];
-};
-
-struct sunos_direntry_callback {
-    struct sunos_direntry __user *curr;
-    struct sunos_direntry __user *previous;
-    int count;
-    int error;
-};
-
-static int sunos_filldirentry(void * __buf, const char * name, int namlen,
-                             loff_t offset, ino_t ino, unsigned int d_type)
-{
-       struct sunos_direntry __user *dirent;
-       struct sunos_direntry_callback * buf =
-               (struct sunos_direntry_callback *) __buf;
-       int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-       u32 d_ino;
-
-       buf->error = -EINVAL;   /* only used if we fail.. */
-       if (reclen > buf->count)
-               return -EINVAL;
-       d_ino = ino;
-       if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
-               return -EOVERFLOW;
-       dirent = buf->previous;
-       dirent = buf->curr;
-       buf->previous = dirent;
-       put_user(d_ino, &dirent->d_ino);
-       put_user(namlen, &dirent->d_namlen);
-       put_user(reclen, &dirent->d_reclen);
-       if (copy_to_user(dirent->d_name, name, namlen))
-               return -EFAULT;
-       put_user(0, dirent->d_name + namlen);
-       dirent = (void __user *) dirent + reclen;
-       buf->curr = dirent;
-       buf->count -= reclen;
-       return 0;
-}
-
-asmlinkage int sunos_getdirentries(unsigned int fd,
-                                  void __user *dirent,
-                                  int cnt,
-                                  unsigned int __user *basep)
-{
-       struct file * file;
-       struct sunos_direntry __user *lastdirent;
-       int error = -EBADF;
-       struct sunos_direntry_callback buf;
-
-       if (fd >= SUNOS_NR_OPEN)
-               goto out;
-
-       file = fget(fd);
-       if (!file)
-               goto out;
-
-       error = -EINVAL;
-       if (cnt < (sizeof(struct sunos_direntry) + 255))
-               goto out_putf;
-
-       buf.curr = (struct sunos_direntry __user *) dirent;
-       buf.previous = NULL;
-       buf.count = cnt;
-       buf.error = 0;
-
-       error = vfs_readdir(file, sunos_filldirentry, &buf);
-       if (error < 0)
-               goto out_putf;
-
-       lastdirent = buf.previous;
-       error = buf.error;
-       if (lastdirent) {
-               put_user(file->f_pos, basep);
-               error = cnt - buf.count;
-       }
-
-out_putf:
-       fput(file);
-out:
-       return error;
-}
-
-struct sunos_utsname {
-       char sname[9];
-       char nname[9];
-       char nnext[56];
-       char rel[9];
-       char ver[9];
-       char mach[9];
-};
-
-asmlinkage int sunos_uname(struct sunos_utsname __user *name)
-{
-       int ret;
-
-       down_read(&uts_sem);
-       ret = copy_to_user(&name->sname[0], &utsname()->sysname[0],
-                          sizeof(name->sname) - 1);
-       ret |= copy_to_user(&name->nname[0], &utsname()->nodename[0],
-                           sizeof(name->nname) - 1);
-       ret |= put_user('\0', &name->nname[8]);
-       ret |= copy_to_user(&name->rel[0], &utsname()->release[0],
-                           sizeof(name->rel) - 1);
-       ret |= copy_to_user(&name->ver[0], &utsname()->version[0],
-                           sizeof(name->ver) - 1);
-       ret |= copy_to_user(&name->mach[0], &utsname()->machine[0],
-                           sizeof(name->mach) - 1);
-       up_read(&uts_sem);
-       return (ret ? -EFAULT : 0);
-}
-
-asmlinkage int sunos_nosys(void)
-{
-       struct pt_regs *regs;
-       siginfo_t info;
-       static int cnt;
-
-       regs = current_thread_info()->kregs;
-       if (test_thread_flag(TIF_32BIT)) {
-               regs->tpc &= 0xffffffff;
-               regs->tnpc &= 0xffffffff;
-       }
-       info.si_signo = SIGSYS;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT|0x100;
-       info.si_addr = (void __user *)regs->tpc;
-       info.si_trapno = regs->u_regs[UREG_G1];
-       send_sig_info(SIGSYS, &info, current);
-       if (cnt++ < 4) {
-               printk("Process makes ni_syscall number %d, register dump:\n",
-                      (int) regs->u_regs[UREG_G1]);
-               show_regs(regs);
-       }
-       return -ENOSYS;
-}
-
-/* This is not a real and complete implementation yet, just to keep
- * the easy SunOS binaries happy.
- */
-asmlinkage int sunos_fpathconf(int fd, int name)
-{
-       int ret;
-
-       switch(name) {
-       case _PCONF_LINK:
-               ret = LINK_MAX;
-               break;
-       case _PCONF_CANON:
-               ret = MAX_CANON;
-               break;
-       case _PCONF_INPUT:
-               ret = MAX_INPUT;
-               break;
-       case _PCONF_NAME:
-               ret = NAME_MAX;
-               break;
-       case _PCONF_PATH:
-               ret = PATH_MAX;
-               break;
-       case _PCONF_PIPE:
-               ret = PIPE_BUF;
-               break;
-       case _PCONF_CHRESTRICT:         /* XXX Investigate XXX */
-               ret = 1;
-               break;
-       case _PCONF_NOTRUNC:            /* XXX Investigate XXX */
-       case _PCONF_VDISABLE:
-               ret = 0;
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       }
-       return ret;
-}
-
-asmlinkage int sunos_pathconf(u32 u_path, int name)
-{
-       int ret;
-
-       ret = sunos_fpathconf(0, name); /* XXX cheese XXX */
-       return ret;
-}
-
-asmlinkage int sunos_select(int width, u32 inp, u32 outp, u32 exp, u32 tvp_x)
-{
-       int ret;
-
-       /* SunOS binaries expect that select won't change the tvp contents */
-       ret = compat_sys_select(width, compat_ptr(inp), compat_ptr(outp),
-                               compat_ptr(exp), compat_ptr(tvp_x));
-       if (ret == -EINTR && tvp_x) {
-               struct compat_timeval __user *tvp = compat_ptr(tvp_x);
-               time_t sec, usec;
-
-               __get_user(sec, &tvp->tv_sec);
-               __get_user(usec, &tvp->tv_usec);
-               if (sec == 0 && usec == 0)
-                       ret = 0;
-       }
-       return ret;
-}
-
-asmlinkage void sunos_nop(void)
-{
-       return;
-}
-
-#if 0 /* This code doesn't translate user pointers correctly,
-       * disable for now. -DaveM
-       */
-
-/* XXXXXXXXXX SunOS mount/umount. XXXXXXXXXXX */
-#define SMNT_RDONLY       1
-#define SMNT_NOSUID       2
-#define SMNT_NEWTYPE      4
-#define SMNT_GRPID        8
-#define SMNT_REMOUNT      16
-#define SMNT_NOSUB        32
-#define SMNT_MULTI        64
-#define SMNT_SYS5         128
-
-struct sunos_fh_t {
-       char fh_data [NFS_FHSIZE];
-};
-
-struct sunos_nfs_mount_args {
-       struct sockaddr_in  *addr; /* file server address */
-       struct nfs_fh *fh;     /* File handle to be mounted */
-       int        flags;      /* flags */
-       int        wsize;      /* write size in bytes */
-       int        rsize;      /* read size in bytes */
-       int        timeo;      /* initial timeout in .1 secs */
-       int        retrans;    /* times to retry send */
-       char       *hostname;  /* server's hostname */
-       int        acregmin;   /* attr cache file min secs */
-       int        acregmax;   /* attr cache file max secs */
-       int        acdirmin;   /* attr cache dir min secs */
-       int        acdirmax;   /* attr cache dir max secs */
-       char       *netname;   /* server's netname */
-};
-
-
-/* Bind the socket on a local reserved port and connect it to the
- * remote server.  This on Linux/i386 is done by the mount program,
- * not by the kernel. 
- */
-/* XXXXXXXXXXXXXXXXXXXX */
-static int
-sunos_nfs_get_server_fd (int fd, struct sockaddr_in *addr)
-{
-       struct sockaddr_in local;
-       struct sockaddr_in server;
-       int    try_port;
-       int    ret;
-       struct socket *socket;
-       struct inode  *inode;
-       struct file   *file;
-
-       file = fget(fd);
-       if (!file)
-               return 0;
-
-       inode = file->f_path.dentry->d_inode;
-
-       socket = SOCKET_I(inode);
-       local.sin_family = AF_INET;
-       local.sin_addr.s_addr = htonl(INADDR_ANY);
-
-       /* IPPORT_RESERVED = 1024, can't find the definition in the kernel */
-       try_port = 1024;
-       do {
-               local.sin_port = htons (--try_port);
-               ret = socket->ops->bind(socket, (struct sockaddr*)&local,
-                                       sizeof(local));
-       } while (ret && try_port > (1024 / 2));
-
-       if (ret) {
-               fput(file);
-               return 0;
-       }
-
-       server.sin_family = AF_INET;
-       server.sin_addr = addr->sin_addr;
-       server.sin_port = NFS_PORT;
-
-       /* Call sys_connect */
-       ret = socket->ops->connect (socket, (struct sockaddr *) &server,
-                                   sizeof (server), file->f_flags);
-       fput(file);
-       if (ret < 0)
-               return 0;
-       return 1;
-}
-
-/* XXXXXXXXXXXXXXXXXXXX */
-static int get_default (int value, int def_value)
-{
-    if (value)
-       return value;
-    else
-       return def_value;
-}
-
-/* XXXXXXXXXXXXXXXXXXXX */
-static int sunos_nfs_mount(char *dir_name, int linux_flags, void __user *data)
-{
-       int  server_fd, err;
-       char *the_name, *mount_page;
-       struct nfs_mount_data linux_nfs_mount;
-       struct sunos_nfs_mount_args sunos_mount;
-
-       /* Ok, here comes the fun part: Linux's nfs mount needs a
-        * socket connection to the server, but SunOS mount does not
-        * require this, so we use the information on the destination
-        * address to create a socket and bind it to a reserved
-        * port on this system
-        */
-       if (copy_from_user(&sunos_mount, data, sizeof(sunos_mount)))
-               return -EFAULT;
-
-       server_fd = sys_socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-       if (server_fd < 0)
-               return -ENXIO;
-
-       if (copy_from_user(&linux_nfs_mount.addr, sunos_mount.addr,
-                          sizeof(*sunos_mount.addr)) ||
-           copy_from_user(&linux_nfs_mount.root, sunos_mount.fh,
-                          sizeof(*sunos_mount.fh))) {
-               sys_close (server_fd);
-               return -EFAULT;
-       }
-
-       if (!sunos_nfs_get_server_fd (server_fd, &linux_nfs_mount.addr)){
-               sys_close (server_fd);
-               return -ENXIO;
-       }
-
-       /* Now, bind it to a locally reserved port */
-       linux_nfs_mount.version  = NFS_MOUNT_VERSION;
-       linux_nfs_mount.flags    = sunos_mount.flags;
-       linux_nfs_mount.fd       = server_fd;
-       
-       linux_nfs_mount.rsize    = get_default (sunos_mount.rsize, 8192);
-       linux_nfs_mount.wsize    = get_default (sunos_mount.wsize, 8192);
-       linux_nfs_mount.timeo    = get_default (sunos_mount.timeo, 10);
-       linux_nfs_mount.retrans  = sunos_mount.retrans;
-       
-       linux_nfs_mount.acregmin = sunos_mount.acregmin;
-       linux_nfs_mount.acregmax = sunos_mount.acregmax;
-       linux_nfs_mount.acdirmin = sunos_mount.acdirmin;
-       linux_nfs_mount.acdirmax = sunos_mount.acdirmax;
-
-       the_name = getname(sunos_mount.hostname);
-       if (IS_ERR(the_name))
-               return PTR_ERR(the_name);
-
-       strlcpy(linux_nfs_mount.hostname, the_name,
-               sizeof(linux_nfs_mount.hostname));
-       putname (the_name);
-       
-       mount_page = (char *) get_zeroed_page(GFP_KERNEL);
-       if (!mount_page)
-               return -ENOMEM;
-
-       memcpy(mount_page, &linux_nfs_mount, sizeof(linux_nfs_mount));
-
-       err = do_mount("", dir_name, "nfs", linux_flags, mount_page);
-
-       free_page((unsigned long) mount_page);
-       return err;
-}
-
-/* XXXXXXXXXXXXXXXXXXXX */
-asmlinkage int
-sunos_mount(char *type, char *dir, int flags, void *data)
-{
-       int linux_flags = 0;
-       int ret = -EINVAL;
-       char *dev_fname = 0;
-       char *dir_page, *type_page;
-
-       if (!capable (CAP_SYS_ADMIN))
-               return -EPERM;
-
-       /* We don't handle the integer fs type */
-       if ((flags & SMNT_NEWTYPE) == 0)
-               goto out;
-
-       /* Do not allow for those flags we don't support */
-       if (flags & (SMNT_GRPID|SMNT_NOSUB|SMNT_MULTI|SMNT_SYS5))
-               goto out;
-
-       if (flags & SMNT_REMOUNT)
-               linux_flags |= MS_REMOUNT;
-       if (flags & SMNT_RDONLY)
-               linux_flags |= MS_RDONLY;
-       if (flags & SMNT_NOSUID)
-               linux_flags |= MS_NOSUID;
-
-       dir_page = getname(dir);
-       ret = PTR_ERR(dir_page);
-       if (IS_ERR(dir_page))
-               goto out;
-
-       type_page = getname(type);
-       ret = PTR_ERR(type_page);
-       if (IS_ERR(type_page))
-               goto out1;
-
-       if (strcmp(type_page, "ext2") == 0) {
-               dev_fname = getname(data);
-       } else if (strcmp(type_page, "iso9660") == 0) {
-               dev_fname = getname(data);
-       } else if (strcmp(type_page, "minix") == 0) {
-               dev_fname = getname(data);
-       } else if (strcmp(type_page, "nfs") == 0) {
-               ret = sunos_nfs_mount (dir_page, flags, data);
-               goto out2;
-        } else if (strcmp(type_page, "ufs") == 0) {
-               printk("Warning: UFS filesystem mounts unsupported.\n");
-               ret = -ENODEV;
-               goto out2;
-       } else if (strcmp(type_page, "proc")) {
-               ret = -ENODEV;
-               goto out2;
-       }
-       ret = PTR_ERR(dev_fname);
-       if (IS_ERR(dev_fname))
-               goto out2;
-       lock_kernel();
-       ret = do_mount(dev_fname, dir_page, type_page, linux_flags, NULL);
-       unlock_kernel();
-       if (dev_fname)
-               putname(dev_fname);
-out2:
-       putname(type_page);
-out1:
-       putname(dir_page);
-out:
-       return ret;
-}
-#endif
-
-asmlinkage int sunos_setpgrp(pid_t pid, pid_t pgid)
-{
-       int ret;
-
-       /* So stupid... */
-       if ((!pid || pid == current->pid) &&
-           !pgid) {
-               sys_setsid();
-               ret = 0;
-       } else {
-               ret = sys_setpgid(pid, pgid);
-       }
-       return ret;
-}
-
-/* So stupid... */
-extern long compat_sys_wait4(compat_pid_t, compat_uint_t __user *, int,
-                            struct compat_rusage __user *);
-
-asmlinkage int sunos_wait4(compat_pid_t pid, compat_uint_t __user *stat_addr, int options, struct compat_rusage __user *ru)
-{
-       int ret;
-
-       ret = compat_sys_wait4((pid ? pid : ((compat_pid_t)-1)),
-                              stat_addr, options, ru);
-       return ret;
-}
-
-asmlinkage int sunos_killpg(int pgrp, int sig)
-{
-       int ret;
-
-       rcu_read_lock();
-       ret = -EINVAL;
-       if (pgrp > 0)
-               ret = kill_pgrp(find_vpid(pgrp), sig, 0);
-       rcu_read_unlock();
-
-       return ret;
-}
-
-asmlinkage int sunos_audit(void)
-{
-       printk ("sys_audit\n");
-       return -1;
-}
-
-asmlinkage u32 sunos_gethostid(void)
-{
-       u32 ret;
-
-       ret = (((u32)idprom->id_machtype << 24) | ((u32)idprom->id_sernum));
-
-       return ret;
-}
-
-/* sysconf options, for SunOS compatibility */
-#define   _SC_ARG_MAX             1
-#define   _SC_CHILD_MAX           2
-#define   _SC_CLK_TCK             3
-#define   _SC_NGROUPS_MAX         4
-#define   _SC_OPEN_MAX            5
-#define   _SC_JOB_CONTROL         6
-#define   _SC_SAVED_IDS           7
-#define   _SC_VERSION             8
-
-asmlinkage s32 sunos_sysconf (int name)
-{
-       s32 ret;
-
-       switch (name){
-       case _SC_ARG_MAX:
-               ret = ARG_MAX;
-               break;
-       case _SC_CHILD_MAX:
-               ret = current->signal->rlim[RLIMIT_NPROC].rlim_cur;
-               break;
-       case _SC_CLK_TCK:
-               ret = HZ;
-               break;
-       case _SC_NGROUPS_MAX:
-               ret = NGROUPS_MAX;
-               break;
-       case _SC_OPEN_MAX:
-               ret = current->signal->rlim[RLIMIT_NOFILE].rlim_cur;
-               break;
-       case _SC_JOB_CONTROL:
-               ret = 1;        /* yes, we do support job control */
-               break;
-       case _SC_SAVED_IDS:
-               ret = 1;        /* yes, we do support saved uids  */
-               break;
-       case _SC_VERSION:
-               /* mhm, POSIX_VERSION is in /usr/include/unistd.h
-                * should it go on /usr/include/linux?
-                */
-               ret = 199009;
-               break;
-       default:
-               ret = -1;
-               break;
-       };
-       return ret;
-}
-
-asmlinkage int sunos_semsys(int op, u32 arg1, u32 arg2, u32 arg3, void __user *ptr)
-{
-       union semun arg4;
-       int ret;
-
-       switch (op) {
-       case 0:
-               /* Most arguments match on a 1:1 basis but cmd doesn't */
-               switch(arg3) {
-               case 4:
-                       arg3=GETPID; break;
-               case 5:
-                       arg3=GETVAL; break;
-               case 6:
-                       arg3=GETALL; break;
-               case 3:
-                       arg3=GETNCNT; break;
-               case 7:
-                       arg3=GETZCNT; break;
-               case 8:
-                       arg3=SETVAL; break;
-               case 9:
-                       arg3=SETALL; break;
-               }
-               /* sys_semctl(): */
-               /* value to modify semaphore to */
-               arg4.__pad = ptr;
-               ret = sys_semctl((int)arg1, (int)arg2, (int)arg3, arg4);
-               break;
-       case 1:
-               /* sys_semget(): */
-               ret = sys_semget((key_t)arg1, (int)arg2, (int)arg3);
-               break;
-       case 2:
-               /* sys_semop(): */
-               ret = sys_semop((int)arg1, (struct sembuf __user *)(unsigned long)arg2,
-                               (unsigned int) arg3);
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       };
-       return ret;
-}
-
-struct msgbuf32 {
-       s32 mtype;
-       char mtext[1];
-};
-
-struct ipc_perm32
-{
-       key_t             key;
-        compat_uid_t  uid;
-        compat_gid_t  gid;
-        compat_uid_t  cuid;
-        compat_gid_t  cgid;
-        compat_mode_t mode;
-        unsigned short  seq;
-};
-
-struct msqid_ds32
-{
-        struct ipc_perm32 msg_perm;
-        u32 msg_first;
-        u32 msg_last;
-        compat_time_t msg_stime;
-        compat_time_t msg_rtime;
-        compat_time_t msg_ctime;
-        u32 wwait;
-        u32 rwait;
-        unsigned short msg_cbytes;
-        unsigned short msg_qnum;  
-        unsigned short msg_qbytes;
-        compat_ipc_pid_t msg_lspid;
-        compat_ipc_pid_t msg_lrpid;
-};
-
-static inline int sunos_msqid_get(struct msqid_ds32 __user *user,
-                                 struct msqid_ds *kern)
-{
-       if (get_user(kern->msg_perm.key, &user->msg_perm.key)           ||
-           __get_user(kern->msg_perm.uid, &user->msg_perm.uid)         ||
-           __get_user(kern->msg_perm.gid, &user->msg_perm.gid)         ||
-           __get_user(kern->msg_perm.cuid, &user->msg_perm.cuid)       ||
-           __get_user(kern->msg_perm.cgid, &user->msg_perm.cgid)       ||
-           __get_user(kern->msg_stime, &user->msg_stime)               ||
-           __get_user(kern->msg_rtime, &user->msg_rtime)               ||
-           __get_user(kern->msg_ctime, &user->msg_ctime)               ||
-           __get_user(kern->msg_ctime, &user->msg_cbytes)              ||
-           __get_user(kern->msg_ctime, &user->msg_qnum)                ||
-           __get_user(kern->msg_ctime, &user->msg_qbytes)              ||
-           __get_user(kern->msg_ctime, &user->msg_lspid)               ||
-           __get_user(kern->msg_ctime, &user->msg_lrpid))
-               return -EFAULT;
-       return 0;
-}
-
-static inline int sunos_msqid_put(struct msqid_ds32 __user *user,
-                                 struct msqid_ds *kern)
-{
-       if (put_user(kern->msg_perm.key, &user->msg_perm.key)           ||
-           __put_user(kern->msg_perm.uid, &user->msg_perm.uid)         ||
-           __put_user(kern->msg_perm.gid, &user->msg_perm.gid)         ||
-           __put_user(kern->msg_perm.cuid, &user->msg_perm.cuid)       ||
-           __put_user(kern->msg_perm.cgid, &user->msg_perm.cgid)       ||
-           __put_user(kern->msg_stime, &user->msg_stime)               ||
-           __put_user(kern->msg_rtime, &user->msg_rtime)               ||
-           __put_user(kern->msg_ctime, &user->msg_ctime)               ||
-           __put_user(kern->msg_ctime, &user->msg_cbytes)              ||
-           __put_user(kern->msg_ctime, &user->msg_qnum)                ||
-           __put_user(kern->msg_ctime, &user->msg_qbytes)              ||
-           __put_user(kern->msg_ctime, &user->msg_lspid)               ||
-           __put_user(kern->msg_ctime, &user->msg_lrpid))
-               return -EFAULT;
-       return 0;
-}
-
-static inline int sunos_msgbuf_get(struct msgbuf32 __user *user, struct msgbuf *kern, int len)
-{
-       if (get_user(kern->mtype, &user->mtype) ||
-           __copy_from_user(kern->mtext, &user->mtext, len))
-               return -EFAULT;
-       return 0;
-}
-
-static inline int sunos_msgbuf_put(struct msgbuf32 __user *user, struct msgbuf *kern, int len)
-{
-       if (put_user(kern->mtype, &user->mtype) ||
-           __copy_to_user(user->mtext, kern->mtext, len))
-               return -EFAULT;
-       return 0;
-}
-
-asmlinkage int sunos_msgsys(int op, u32 arg1, u32 arg2, u32 arg3, u32 arg4)
-{
-       struct sparc_stackf32 __user *sp;
-       struct msqid_ds kds;
-       struct msgbuf *kmbuf;
-       mm_segment_t old_fs = get_fs();
-       u32 arg5;
-       int rval;
-
-       switch(op) {
-       case 0:
-               rval = sys_msgget((key_t)arg1, (int)arg2);
-               break;
-       case 1:
-               if (!sunos_msqid_get((struct msqid_ds32 __user *)(unsigned long)arg3, &kds)) {
-                       set_fs(KERNEL_DS);
-                       rval = sys_msgctl((int)arg1, (int)arg2,
-                                         (struct msqid_ds __user *)(unsigned long)arg3);
-                       set_fs(old_fs);
-                       if (!rval)
-                               rval = sunos_msqid_put((struct msqid_ds32 __user *)(unsigned long)arg3,
-                                                      &kds);
-               } else
-                       rval = -EFAULT;
-               break;
-       case 2:
-               rval = -EFAULT;
-               kmbuf = kmalloc(sizeof(struct msgbuf) + arg3,
-                                                GFP_KERNEL);
-               if (!kmbuf)
-                       break;
-               sp = (struct sparc_stackf32 __user *)
-                       (current_thread_info()->kregs->u_regs[UREG_FP] & 0xffffffffUL);
-               if (get_user(arg5, &sp->xxargs[0])) {
-                       rval = -EFAULT;
-                       kfree(kmbuf);
-                       break;
-               }
-               set_fs(KERNEL_DS);
-               rval = sys_msgrcv((int)arg1, (struct msgbuf __user *) kmbuf,
-                                 (size_t)arg3,
-                                 (long)arg4, (int)arg5);
-               set_fs(old_fs);
-               if (!rval)
-                       rval = sunos_msgbuf_put((struct msgbuf32 __user *)(unsigned long)arg2,
-                                               kmbuf, arg3);
-               kfree(kmbuf);
-               break;
-       case 3:
-               rval = -EFAULT;
-               kmbuf = kmalloc(sizeof(struct msgbuf) + arg3,
-                                                GFP_KERNEL);
-               if (!kmbuf || sunos_msgbuf_get((struct msgbuf32 __user *)(unsigned long)arg2,
-                                              kmbuf, arg3))
-                       break;
-               set_fs(KERNEL_DS);
-               rval = sys_msgsnd((int)arg1, (struct msgbuf __user *) kmbuf,
-                                 (size_t)arg3, (int)arg4);
-               set_fs(old_fs);
-               kfree(kmbuf);
-               break;
-       default:
-               rval = -EINVAL;
-               break;
-       }
-       return rval;
-}
-
-struct shmid_ds32 {
-        struct ipc_perm32       shm_perm;
-        int                     shm_segsz;
-        compat_time_t         shm_atime;
-        compat_time_t         shm_dtime;
-        compat_time_t         shm_ctime;
-        compat_ipc_pid_t    shm_cpid; 
-        compat_ipc_pid_t    shm_lpid; 
-        unsigned short          shm_nattch;
-};
-                                                        
-static inline int sunos_shmid_get(struct shmid_ds32 __user *user,
-                                 struct shmid_ds *kern)
-{
-       if (get_user(kern->shm_perm.key, &user->shm_perm.key)           ||
-           __get_user(kern->shm_perm.uid, &user->shm_perm.uid)         ||
-           __get_user(kern->shm_perm.gid, &user->shm_perm.gid)         ||
-           __get_user(kern->shm_perm.cuid, &user->shm_perm.cuid)       ||
-           __get_user(kern->shm_perm.cgid, &user->shm_perm.cgid)       ||
-           __get_user(kern->shm_segsz, &user->shm_segsz)               ||
-           __get_user(kern->shm_atime, &user->shm_atime)               ||
-           __get_user(kern->shm_dtime, &user->shm_dtime)               ||
-           __get_user(kern->shm_ctime, &user->shm_ctime)               ||
-           __get_user(kern->shm_cpid, &user->shm_cpid)                 ||
-           __get_user(kern->shm_lpid, &user->shm_lpid)                 ||
-           __get_user(kern->shm_nattch, &user->shm_nattch))
-               return -EFAULT;
-       return 0;
-}
-
-static inline int sunos_shmid_put(struct shmid_ds32 __user *user,
-                                 struct shmid_ds *kern)
-{
-       if (put_user(kern->shm_perm.key, &user->shm_perm.key)           ||
-           __put_user(kern->shm_perm.uid, &user->shm_perm.uid)         ||
-           __put_user(kern->shm_perm.gid, &user->shm_perm.gid)         ||
-           __put_user(kern->shm_perm.cuid, &user->shm_perm.cuid)       ||
-           __put_user(kern->shm_perm.cgid, &user->shm_perm.cgid)       ||
-           __put_user(kern->shm_segsz, &user->shm_segsz)               ||
-           __put_user(kern->shm_atime, &user->shm_atime)               ||
-           __put_user(kern->shm_dtime, &user->shm_dtime)               ||
-           __put_user(kern->shm_ctime, &user->shm_ctime)               ||
-           __put_user(kern->shm_cpid, &user->shm_cpid)                 ||
-           __put_user(kern->shm_lpid, &user->shm_lpid)                 ||
-           __put_user(kern->shm_nattch, &user->shm_nattch))
-               return -EFAULT;
-       return 0;
-}
-
-asmlinkage int sunos_shmsys(int op, u32 arg1, u32 arg2, u32 arg3)
-{
-       struct shmid_ds ksds;
-       unsigned long raddr;
-       mm_segment_t old_fs = get_fs();
-       int rval;
-
-       switch(op) {
-       case 0:
-               /* do_shmat(): attach a shared memory area */
-               rval = do_shmat((int)arg1,(char __user *)(unsigned long)arg2,(int)arg3,&raddr);
-               if (!rval)
-                       rval = (int) raddr;
-               break;
-       case 1:
-               /* sys_shmctl(): modify shared memory area attr. */
-               if (!sunos_shmid_get((struct shmid_ds32 __user *)(unsigned long)arg3, &ksds)) {
-                       set_fs(KERNEL_DS);
-                       rval = sys_shmctl((int) arg1,(int) arg2,
-                                         (struct shmid_ds __user *) &ksds);
-                       set_fs(old_fs);
-                       if (!rval)
-                               rval = sunos_shmid_put((struct shmid_ds32 __user *)(unsigned long)arg3,
-                                                      &ksds);
-               } else
-                       rval = -EFAULT;
-               break;
-       case 2:
-               /* sys_shmdt(): detach a shared memory area */
-               rval = sys_shmdt((char __user *)(unsigned long)arg1);
-               break;
-       case 3:
-               /* sys_shmget(): get a shared memory area */
-               rval = sys_shmget((key_t)arg1,(int)arg2,(int)arg3);
-               break;
-       default:
-               rval = -EINVAL;
-               break;
-       };
-       return rval;
-}
-
-extern asmlinkage long sparc32_open(const char __user * filename, int flags, int mode);
-
-asmlinkage int sunos_open(u32 fname, int flags, int mode)
-{
-       const char __user *filename = compat_ptr(fname);
-
-       return sparc32_open(filename, flags, mode);
-}
-
-#define SUNOS_EWOULDBLOCK 35
-
-/* see the sunos man page read(2v) for an explanation
-   of this garbage. We use O_NDELAY to mark
-   file descriptors that have been set non-blocking 
-   using 4.2BSD style calls. (tridge) */
-
-static inline int check_nonblock(int ret, int fd)
-{
-       if (ret == -EAGAIN) {
-               struct file * file = fget(fd);
-               if (file) {
-                       if (file->f_flags & O_NDELAY)
-                               ret = -SUNOS_EWOULDBLOCK;
-                       fput(file);
-               }
-       }
-       return ret;
-}
-
-asmlinkage int sunos_read(unsigned int fd, char __user *buf, u32 count)
-{
-       int ret;
-
-       ret = check_nonblock(sys_read(fd, buf, count), fd);
-       return ret;
-}
-
-asmlinkage int sunos_readv(u32 fd, void __user *vector, s32 count)
-{
-       int ret;
-
-       ret = check_nonblock(compat_sys_readv(fd, vector, count), fd);
-       return ret;
-}
-
-asmlinkage int sunos_write(unsigned int fd, char __user *buf, u32 count)
-{
-       int ret;
-
-       ret = check_nonblock(sys_write(fd, buf, count), fd);
-       return ret;
-}
-
-asmlinkage int sunos_writev(u32 fd, void __user *vector, s32 count)
-{
-       int ret;
-
-       ret = check_nonblock(compat_sys_writev(fd, vector, count), fd);
-       return ret;
-}
-
-asmlinkage int sunos_recv(u32 __fd, void __user *ubuf, int size, unsigned flags)
-{
-       int ret, fd = (int) __fd;
-
-       ret = check_nonblock(sys_recv(fd, ubuf, size, flags), fd);
-       return ret;
-}
-
-asmlinkage int sunos_send(u32 __fd, void __user *buff, int len, unsigned flags)
-{
-       int ret, fd = (int) __fd;
-
-       ret = check_nonblock(sys_send(fd, buff, len, flags), fd);
-       return ret;
-}
-
-asmlinkage int sunos_accept(u32 __fd, struct sockaddr __user *sa, int __user *addrlen)
-{
-       int ret, fd = (int) __fd;
-
-       while (1) {
-               ret = check_nonblock(sys_accept(fd, sa, addrlen), fd);
-               if (ret != -ENETUNREACH && ret != -EHOSTUNREACH)
-                       break;
-       }
-       return ret;
-}
-
-#define SUNOS_SV_INTERRUPT 2
-
-asmlinkage int sunos_sigaction (int sig,
-                               struct old_sigaction32 __user *act,
-                               struct old_sigaction32 __user *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       if (act) {
-               compat_old_sigset_t mask;
-               u32 u_handler;
-
-               if (get_user(u_handler, &act->sa_handler) ||
-                   __get_user(new_ka.sa.sa_flags, &act->sa_flags))
-                       return -EFAULT;
-               new_ka.sa.sa_handler = compat_ptr(u_handler);
-               __get_user(mask, &act->sa_mask);
-               new_ka.sa.sa_restorer = NULL;
-               new_ka.ka_restorer = NULL;
-               siginitset(&new_ka.sa.sa_mask, mask);
-               new_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               old_ka.sa.sa_flags ^= SUNOS_SV_INTERRUPT;
-               if (put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler) ||
-                   __put_user(old_ka.sa.sa_flags, &oact->sa_flags))
-                       return -EFAULT;
-               __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-       }
-
-       return ret;
-}
-
-asmlinkage int sunos_setsockopt(u32 __fd, u32 __level, u32 __optname,
-                               char __user *optval, u32 __optlen)
-{
-       int fd = (int) __fd;
-       int level = (int) __level;
-       int optname = (int) __optname;
-       int optlen = (int) __optlen;
-       int tr_opt = optname;
-       int ret;
-
-       if (level == SOL_IP) {
-               /* Multicast socketopts (ttl, membership) */
-               if (tr_opt >=2 && tr_opt <= 6)
-                       tr_opt += 30;
-       }
-       ret = sys_setsockopt(fd, level, tr_opt,
-                            optval, optlen);
-       return ret;
-}
-
-asmlinkage int sunos_getsockopt(u32 __fd, u32 __level, u32 __optname,
-                               char __user *optval, int __user *optlen)
-{
-       int fd = (int) __fd;
-       int level = (int) __level;
-       int optname = (int) __optname;
-       int tr_opt = optname;
-       int ret;
-
-       if (level == SOL_IP) {
-               /* Multicast socketopts (ttl, membership) */
-               if (tr_opt >=2 && tr_opt <= 6)
-                       tr_opt += 30;
-       }
-       ret = compat_sys_getsockopt(fd, level, tr_opt,
-                                   optval, optlen);
-       return ret;
-}
index 6b9b718e24afde2ca6170950d8a56be381ab41f0..a4fef2ba1ae162848d801034f7cf18008b10b8de 100644 (file)
@@ -155,125 +155,3 @@ sys_call_table:
        .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait
 /*310*/        .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
        .word sys_timerfd_settime, sys_timerfd_gettime
-
-#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
-    defined(CONFIG_SOLARIS_EMUL_MODULE)
-       /* Now the 32-bit SunOS syscall table. */
-
-       .align 4
-       .globl sunos_sys_table
-sunos_sys_table:
-/*0*/  .word sunos_indir, sys32_exit, sys_fork
-       .word sunos_read, sunos_write, sunos_open
-       .word sys_close, sunos_wait4, sys_creat
-       .word sys_link, sys_unlink, sunos_execv
-       .word sys_chdir, sunos_nosys, sys32_mknod
-       .word sys_chmod, sys32_lchown16, sunos_brk
-       .word sunos_nosys, sys32_lseek, sunos_getpid
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_getuid, sunos_nosys, sys_ptrace
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sys_access, sunos_nosys, sunos_nosys
-       .word sys_sync, sys_kill, compat_sys_newstat
-       .word sunos_nosys, compat_sys_newlstat, sys_dup
-       .word sys_pipe, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_getgid
-       .word sunos_nosys, sunos_nosys
-/*50*/ .word sunos_nosys, sys_acct, sunos_nosys
-       .word sunos_mctl, sunos_ioctl, sys_reboot
-       .word sunos_nosys, sys_symlink, sys_readlink
-       .word sys32_execve, sys_umask, sys_chroot
-       .word compat_sys_newfstat, sunos_nosys, sys_getpagesize
-       .word sys_msync, sys_vfork, sunos_nosys
-       .word sunos_nosys, sunos_sbrk, sunos_sstk
-       .word sunos_mmap, sunos_vadvise, sys_munmap
-       .word sys_mprotect, sys_madvise, sys_vhangup
-       .word sunos_nosys, sys_mincore, sys32_getgroups16
-       .word sys32_setgroups16, sys_getpgrp, sunos_setpgrp
-       .word compat_sys_setitimer, sunos_nosys, sys_swapon
-       .word compat_sys_getitimer, sys_gethostname, sys_sethostname
-       .word sunos_getdtablesize, sys_dup2, sunos_nop
-       .word compat_sys_fcntl, sunos_select, sunos_nop
-       .word sys_fsync, sys32_setpriority, sys32_socket
-       .word sys32_connect, sunos_accept
-/*100*/        .word sys_getpriority, sunos_send, sunos_recv
-       .word sunos_nosys, sys32_bind, sunos_setsockopt
-       .word sys32_listen, sunos_nosys, sunos_sigaction
-       .word sunos_sigblock, sunos_sigsetmask, sys_sigpause
-       .word sys32_sigstack, sys32_recvmsg, sys32_sendmsg
-       .word sunos_nosys, sys32_gettimeofday, compat_sys_getrusage
-       .word sunos_getsockopt, sunos_nosys, sunos_readv
-       .word sunos_writev, sys32_settimeofday, sys32_fchown16
-       .word sys_fchmod, sys32_recvfrom, sys32_setreuid16
-       .word sys32_setregid16, sys_rename, sys_truncate
-       .word sys_ftruncate, sys_flock, sunos_nosys
-       .word sys32_sendto, sys32_shutdown, sys32_socketpair
-       .word sys_mkdir, sys_rmdir, sys32_utimes
-       .word sys32_sigreturn, sunos_nosys, sys32_getpeername
-       .word sunos_gethostid, sunos_nosys, compat_sys_getrlimit
-       .word compat_sys_setrlimit, sunos_killpg, sunos_nosys
-       .word sunos_nosys, sunos_nosys
-/*150*/        .word sys32_getsockname, sunos_nosys, sunos_nosys
-       .word sys_poll, sunos_nosys, sunos_nosys
-       .word sunos_getdirentries, compat_sys_statfs, compat_sys_fstatfs
-       .word sys_oldumount, sunos_nosys, sunos_nosys
-       .word sys_getdomainname, sys_setdomainname
-       .word sunos_nosys, sys_quotactl, sunos_nosys
-       .word sunos_nosys, sys_ustat, sunos_semsys
-       .word sunos_nosys, sunos_shmsys, sunos_audit
-       .word sunos_nosys, sunos_getdents, sys_setsid
-       .word sys_fchdir, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, compat_sys_sigpending, sunos_nosys
-       .word sys_setpgid, sunos_pathconf, sunos_fpathconf
-       .word sunos_sysconf, sunos_uname, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-/*200*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys
-/*250*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-/*260*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-/*270*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-/*280*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-/*290*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-/*300*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-/*310*/        .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys, sunos_nosys, sunos_nosys
-       .word sunos_nosys
-
-#endif
index 8a0d20a35d0cd15ea5aa8fd195e04c7ad8d54185..bc9f5dac4069f43ae79e9a0ef0942eeda065fde4 100644 (file)
@@ -27,8 +27,6 @@ extern asmlinkage unsigned long sys64_mremap(unsigned long addr,
                                             unsigned long new_addr);
 extern asmlinkage unsigned long c_sys_nis_syscall(struct pt_regs *regs);
 extern asmlinkage long sys_getdomainname(char __user *name, int len);
-extern asmlinkage long solaris_syscall(struct pt_regs *regs);
-extern asmlinkage long sunos_syscall(struct pt_regs *regs);
 extern asmlinkage long sys_utrap_install(utrap_entry_t type,
                                         utrap_handler_t new_p,
                                         utrap_handler_t new_d,
index 7575aa371da823b8234a50102986b76c57fddee6..b0de4c00b11a5cbcdaf2fd9277e8b3b27a3fc357 100644 (file)
@@ -117,16 +117,13 @@ tl0_f4o:  FILL_4_OTHER
 tl0_f5o:       FILL_5_OTHER
 tl0_f6o:       FILL_6_OTHER
 tl0_f7o:       FILL_7_OTHER
-tl0_sunos:     SUNOS_SYSCALL_TRAP
+tl0_resv100:   BTRAP(0x100)
 tl0_bkpt:      BREAKPOINT_TRAP
 tl0_divz:      TRAP(do_div0)
 tl0_flushw:    FLUSH_WINDOW_TRAP
-tl0_resv104:   BTRAP(0x104) BTRAP(0x105) BTRAP(0x106) BTRAP(0x107)
-               .globl tl0_solaris
-tl0_solaris:   SOLARIS_SYSCALL_TRAP
-tl0_resv109:   BTRAP(0x109)
-tl0_resv10a:   BTRAP(0x10a) BTRAP(0x10b) BTRAP(0x10c) BTRAP(0x10d) BTRAP(0x10e)
-tl0_resv10f:   BTRAP(0x10f)
+tl0_resv104:   BTRAP(0x104) BTRAP(0x105) BTRAP(0x106) BTRAP(0x107) BTRAP(0x108)
+tl0_resv109:   BTRAP(0x109) BTRAP(0x10a) BTRAP(0x10b) BTRAP(0x10c) BTRAP(0x10d)
+tl0_resv10e:   BTRAP(0x10e) BTRAP(0x10f)
 tl0_linux32:   LINUX_32BIT_SYSCALL_TRAP
 tl0_oldlinux64:        LINUX_64BIT_SYSCALL_TRAP
 tl0_resv112:   TRAP_UTRAP(UT_TRAP_INSTRUCTION_18,0x112) TRAP_UTRAP(UT_TRAP_INSTRUCTION_19,0x113)
@@ -139,8 +136,7 @@ tl0_resv11e:        TRAP_UTRAP(UT_TRAP_INSTRUCTION_30,0x11e) TRAP_UTRAP(UT_TRAP_INSTRUC
 tl0_getcc:     GETCC_TRAP
 tl0_setcc:     SETCC_TRAP
 tl0_getpsr:    TRAP(do_getpsr)
-tl0_resv123:   BTRAP(0x123) BTRAP(0x124) BTRAP(0x125) BTRAP(0x126)
-tl0_solindir:  INDIRECT_SOLARIS_SYSCALL(156)
+tl0_resv123:   BTRAP(0x123) BTRAP(0x124) BTRAP(0x125) BTRAP(0x126) BTRAP(0x127)
 tl0_resv128:   BTRAP(0x128) BTRAP(0x129) BTRAP(0x12a) BTRAP(0x12b) BTRAP(0x12c)
 tl0_resv12d:   BTRAP(0x12d) BTRAP(0x12e) BTRAP(0x12f) BTRAP(0x130) BTRAP(0x131)
 tl0_resv132:   BTRAP(0x132) BTRAP(0x133) BTRAP(0x134) BTRAP(0x135) BTRAP(0x136)
diff --git a/arch/sparc64/solaris/Makefile b/arch/sparc64/solaris/Makefile
deleted file mode 100644 (file)
index 8c86630..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# Makefile for the Solaris binary emulation.
-#
-
-EXTRA_AFLAGS := -ansi
-
-solaris-objs := entry64.o fs.o misc.o signal.o systbl.o socket.o \
-               ioctl.o ipc.o socksys.o timod.o
-
-obj-$(CONFIG_SOLARIS_EMUL) += solaris.o
diff --git a/arch/sparc64/solaris/conv.h b/arch/sparc64/solaris/conv.h
deleted file mode 100644 (file)
index 50e5823..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* $Id: conv.h,v 1.4 1998/08/15 20:42:51 davem Exp $
- * conv.h: Utility macros for Solaris emulation
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-/* #define DEBUG_SOLARIS */
-#define DEBUG_SOLARIS_KMALLOC
-
-#ifndef __ASSEMBLY__
-
-#include <asm/unistd.h>
-
-/* Use this to get at 32-bit user passed pointers. */
-#define A(__x)                         \
-({     unsigned long __ret;            \
-       __asm__ ("srl   %0, 0, %0"      \
-                : "=r" (__ret)         \
-                : "0" (__x));          \
-       (void __user *)__ret;           \
-})
-
-extern unsigned sys_call_table[];
-extern unsigned sys_call_table32[];
-extern unsigned sunos_sys_table[];
-
-#define SYS(name) ((long)sys_call_table[__NR_##name])
-#define SUNOS(x) ((long)sunos_sys_table[x])
-
-#ifdef DEBUG_SOLARIS
-#define SOLD(s) printk("%s,%d,%s(): %s\n",__FILE__,__LINE__,__func__,(s))
-#define SOLDD(s) printk("solaris: "); printk s
-#else
-#define SOLD(s)
-#define SOLDD(s)
-#endif
-
-#endif /* __ASSEMBLY__ */
diff --git a/arch/sparc64/solaris/entry64.S b/arch/sparc64/solaris/entry64.S
deleted file mode 100644 (file)
index f170324..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-/* $Id: entry64.S,v 1.7 2002/02/09 19:49:31 davem Exp $
- * entry64.S:  Solaris syscall emulation entry point.
- *
- * Copyright (C) 1996,1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
- * Copyright (C) 1995,1997 David S. Miller (davem@caip.rutgers.edu)
- * Copyright (C) 1996 Miguel de Icaza      (miguel@nuclecu.unam.mx)
- */
-
-#include <linux/errno.h>
-
-#include <asm/head.h>
-#include <asm/asi.h>
-#include <asm/smp.h>
-#include <asm/ptrace.h>
-#include <asm/page.h>
-#include <asm/signal.h>
-#include <asm/pgtable.h>
-#include <asm/processor.h>
-#include <asm/thread_info.h>
-
-#include "conv.h"
-
-#define NR_SYSCALLS    256
-
-       .text
-solaris_syscall_trace:
-       add             %sp, PTREGS_OFF, %o0
-       call            syscall_trace
-        mov            0, %o1
-       srl             %i0, 0, %o0
-       mov             %i4, %o4
-       srl             %i1, 0, %o1
-       mov             %i5, %o5
-       andcc           %l3, 1, %g0
-       be,pt           %icc, 2f
-        srl            %i2, 0, %o2
-       b,pt            %xcc, 2f
-        add            %sp, PTREGS_OFF, %o0
-
-solaris_sucks:
-/* Solaris is a big system which needs to be able to do all the things
- * in Inf+1 different ways */
-       add             %i6, 0x5c, %o0
-       mov             %i0, %g1
-       mov             %i1, %i0
-       mov             %i2, %i1
-       srl             %o0, 0, %o0
-       mov             %i3, %i2
-       movrz           %g1, 256, %g1 /* Ensure we don't loop forever */
-       mov             %i4, %i3
-       mov             %i5, %i4
-       ba,pt           %xcc, solaris_sparc_syscall
-exen:   lduwa          [%o0] ASI_S, %i5
-
-exenf: ba,pt           %xcc, solaris_sparc_syscall
-        clr            %i5
-
-/* For shared binaries, binfmt_elf32 already sets up personality
-   and exec_domain. This is to handle static binaries as well */
-solaris_reg:
-       call            solaris_register
-        nop
-       ba,pt           %xcc, 1f
-        mov            %i4, %o4
-
-linux_syscall_for_solaris:
-       sethi           %hi(sys_call_table32), %l6
-       or              %l6, %lo(sys_call_table32), %l6
-       sll             %l3, 2, %l4
-       ba,pt           %xcc, 10f
-        lduw           [%l6 + %l4], %l3
-
-       /* Solaris system calls enter here... */
-       .align  32
-       .globl  solaris_sparc_syscall, entry64_personality_patch
-solaris_sparc_syscall:
-entry64_personality_patch:
-       ldub            [%g4 + 0x0], %l0
-       cmp             %g1, 255
-       bg,pn           %icc, solaris_unimplemented
-        srl            %g1, 0, %g1
-       sethi           %hi(solaris_sys_table), %l7
-       or              %l7, %lo(solaris_sys_table), %l7
-       brz,pn          %g1, solaris_sucks
-        mov            %i4, %o4
-       sll             %g1, 2, %l4
-       cmp             %l0, 1
-       bne,pn          %icc, solaris_reg
-1:      srl            %i0, 0, %o0
-       lduw            [%l7 + %l4], %l3
-       srl             %i1, 0, %o1
-       ldx             [%g6 + TI_FLAGS], %l5
-       cmp             %l3, NR_SYSCALLS
-       bleu,a,pn       %xcc, linux_syscall_for_solaris
-        nop
-       andcc           %l3, 1, %g0
-       bne,a,pn        %icc, 10f
-        add            %sp, PTREGS_OFF, %o0
-10:    srl             %i2, 0, %o2
-       mov             %i5, %o5
-       andn            %l3, 3, %l7
-       andcc           %l5, _TIF_SYSCALL_TRACE, %g0                            
-       bne,pn          %icc, solaris_syscall_trace             
-        mov            %i0, %l5
-2:     call            %l7
-        srl            %i3, 0, %o3
-ret_from_solaris:
-       stx             %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-       ldx             [%g6 + TI_FLAGS], %l6
-       sra             %o0, 0, %o0
-       mov             %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
-       ldx             [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
-       cmp             %o0, -ERESTART_RESTARTBLOCK
-       sllx            %g2, 32, %g2
-       bgeu,pn         %xcc, 1f
-        andcc          %l6, _TIF_SYSCALL_TRACE, %l6    
-
-       /* System call success, clear Carry condition code. */
-       andn            %g3, %g2, %g3
-       stx             %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]  
-       bne,pn          %icc, solaris_syscall_trace2
-        ldx            [%sp + PTREGS_OFF + PT_V9_TNPC], %l1
-       andcc           %l1, 1, %g0
-       bne,pn          %icc, 2f
-        clr            %l6
-       add             %l1, 0x4, %l2                                    
-       stx             %l1, [%sp + PTREGS_OFF + PT_V9_TPC]      ! pc = npc
-       call            rtrap
-        stx            %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] !npc = npc+4
-
-       /* When tnpc & 1, this comes from setcontext and we don't want to advance pc */
-2:     andn            %l1, 3, %l1
-       call            rtrap
-        stx            %l1, [%sp + PTREGS_OFF + PT_V9_TNPC] !npc = npc&~3
-
-1:
-       /* System call failure, set Carry condition code.
-        * Also, get abs(errno) to return to the process.
-        */
-       sub             %g0, %o0, %o0
-       or              %g3, %g2, %g3
-       cmp             %o0, ERANGE     /* 0-ERANGE are identity mapped */
-       bleu,pt         %icc, 1f
-        cmp            %o0, EMEDIUMTYPE
-       bgu,pn          %icc, 1f
-        sethi          %hi(solaris_err_table), %l6
-       sll             %o0, 2, %o0
-       or              %l6, %lo(solaris_err_table), %l6
-       ldsw            [%l6 + %o0], %o0
-1:     stx             %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-       mov             1, %l6
-       stx             %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
-       bne,pn          %icc, solaris_syscall_trace2
-        ldx            [%sp + PTREGS_OFF + PT_V9_TNPC], %l1
-       andcc           %l1, 1, %g0
-       bne,pn          %icc, 2b
-        add            %l1, 0x4, %l2
-       stx             %l1, [%sp + PTREGS_OFF + PT_V9_TPC]  ! pc = npc
-       call            rtrap
-        stx            %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] !npc = npc+4 
-
-solaris_syscall_trace2:
-       add             %sp, PTREGS_OFF, %o0
-       call            syscall_trace
-        mov            1, %o1
-       add             %l1, 0x4, %l2                   /* npc = npc+4 */
-       andcc           %l1, 1, %g0
-       bne,pn          %icc, 2b
-        nop
-       stx             %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
-       call            rtrap
-        stx            %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
-
-       /* This one is tricky, so that's why we do it in assembly */
-       .globl          solaris_sigsuspend
-solaris_sigsuspend:
-       call            do_sol_sigsuspend
-        nop
-       brlz,pn         %o0, ret_from_solaris
-        nop
-       call            sys_sigsuspend
-        stx            %o0, [%sp + PTREGS_OFF + PT_V9_I0]
-       b,pt            %xcc, ret_from_solaris
-        nop
-
-       .globl          solaris_getpid
-solaris_getpid:
-       call            sys_getppid
-        nop
-       call            sys_getpid
-        stx            %o0, [%sp + PTREGS_OFF + PT_V9_I1]
-       b,pt            %xcc, ret_from_solaris
-        nop
-
-       .globl  solaris_getuid
-solaris_getuid:
-       call            sys_geteuid
-        nop
-       call            sys_getuid
-        stx            %o1, [%sp + PTREGS_OFF + PT_V9_I1]
-       b,pt            %xcc, ret_from_solaris
-        nop
-
-       .globl  solaris_getgid
-solaris_getgid:
-       call            sys_getegid
-        nop
-       call            sys_getgid
-        stx            %o1, [%sp + PTREGS_OFF + PT_V9_I1]
-       b,pt            %xcc, ret_from_solaris
-        nop
-
-       .globl          solaris_unimplemented
-solaris_unimplemented:
-       call            do_sol_unimplemented
-        add            %sp, PTREGS_OFF, %o0
-       ba,pt           %xcc, ret_from_solaris
-        nop
-
-       .section        __ex_table,"a"
-       .align          4
-       .word           exen, exenf
-
diff --git a/arch/sparc64/solaris/fs.c b/arch/sparc64/solaris/fs.c
deleted file mode 100644 (file)
index 7d035f0..0000000
+++ /dev/null
@@ -1,745 +0,0 @@
-/* $Id: fs.c,v 1.27 2002/02/08 03:57:14 davem Exp $
- * fs.c: fs related syscall emulation for Solaris
- *
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- *
- * 1999-08-19 Implemented solaris F_FREESP (truncate)
- *            fcntl, by Jason Rappleye (rappleye@ccr.buffalo.edu)
- */
-
-#include <linux/types.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/capability.h>
-#include <linux/fs.h>
-#include <linux/namei.h>
-#include <linux/mm.h>
-#include <linux/file.h>
-#include <linux/stat.h>
-#include <linux/smp_lock.h>
-#include <linux/limits.h>
-#include <linux/resource.h>
-#include <linux/quotaops.h>
-#include <linux/mount.h>
-#include <linux/vfs.h>
-
-#include <asm/uaccess.h>
-#include <asm/string.h>
-#include <asm/ptrace.h>
-
-#include "conv.h"
-
-#define R3_VERSION     1
-#define R4_VERSION     2
-
-typedef struct {
-       s32     tv_sec;
-       s32     tv_nsec;
-} timestruct_t;
-
-struct sol_stat {
-       u32             st_dev;
-       s32             st_pad1[3];     /* network id */
-       u32             st_ino;
-       u32             st_mode;
-       u32             st_nlink;
-       u32             st_uid;
-       u32             st_gid;
-       u32             st_rdev;
-       s32             st_pad2[2];
-       s32             st_size;
-       s32             st_pad3;        /* st_size, off_t expansion */
-       timestruct_t    st_atime;
-       timestruct_t    st_mtime;
-       timestruct_t    st_ctime;
-       s32             st_blksize;
-       s32             st_blocks;
-       char            st_fstype[16];
-       s32             st_pad4[8];     /* expansion area */
-};
-
-struct sol_stat64 {
-       u32             st_dev;
-       s32             st_pad1[3];     /* network id */
-       u64             st_ino;
-       u32             st_mode;
-       u32             st_nlink;
-       u32             st_uid;
-       u32             st_gid;
-       u32             st_rdev;
-       s32             st_pad2[2];
-       s64             st_size;
-       timestruct_t    st_atime;
-       timestruct_t    st_mtime;
-       timestruct_t    st_ctime;
-       s64             st_blksize;
-       s32             st_blocks;
-       char            st_fstype[16];
-       s32             st_pad4[4];     /* expansion area */
-};
-
-#define UFSMAGIC (((unsigned)'u'<<24)||((unsigned)'f'<<16)||((unsigned)'s'<<8))
-
-static inline int putstat(struct sol_stat __user *ubuf, struct kstat *kbuf)
-{
-       u32 ino;
-
-       if (kbuf->size > MAX_NON_LFS ||
-           !sysv_valid_dev(kbuf->dev) ||
-           !sysv_valid_dev(kbuf->rdev))
-               return -EOVERFLOW;
-       ino = kbuf->ino;
-       if (sizeof(ino) < sizeof(kbuf->ino) && ino != kbuf->ino)
-               return -EOVERFLOW;
-       if (put_user (sysv_encode_dev(kbuf->dev), &ubuf->st_dev)        ||
-           __put_user (ino, &ubuf->st_ino)                             ||
-           __put_user (kbuf->mode, &ubuf->st_mode)             ||
-           __put_user (kbuf->nlink, &ubuf->st_nlink)   ||
-           __put_user (kbuf->uid, &ubuf->st_uid)               ||
-           __put_user (kbuf->gid, &ubuf->st_gid)               ||
-           __put_user (sysv_encode_dev(kbuf->rdev), &ubuf->st_rdev)    ||
-           __put_user (kbuf->size, &ubuf->st_size)             ||
-           __put_user (kbuf->atime.tv_sec, &ubuf->st_atime.tv_sec)     ||
-           __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime.tv_nsec)   ||
-           __put_user (kbuf->mtime.tv_sec, &ubuf->st_mtime.tv_sec)     ||
-           __put_user (kbuf->mtime.tv_nsec, &ubuf->st_mtime.tv_nsec)   ||
-           __put_user (kbuf->ctime.tv_sec, &ubuf->st_ctime.tv_sec)     ||
-           __put_user (kbuf->ctime.tv_nsec, &ubuf->st_ctime.tv_nsec)   ||
-           __put_user (kbuf->blksize, &ubuf->st_blksize)       ||
-           __put_user (kbuf->blocks, &ubuf->st_blocks) ||
-           __put_user (UFSMAGIC, (unsigned __user *)ubuf->st_fstype))
-               return -EFAULT;
-       return 0;
-}
-
-static inline int putstat64(struct sol_stat64 __user *ubuf, struct kstat *kbuf)
-{
-       if (!sysv_valid_dev(kbuf->dev) || !sysv_valid_dev(kbuf->rdev))
-               return -EOVERFLOW;
-       if (put_user (sysv_encode_dev(kbuf->dev), &ubuf->st_dev)        ||
-           __put_user (kbuf->ino, &ubuf->st_ino)               ||
-           __put_user (kbuf->mode, &ubuf->st_mode)             ||
-           __put_user (kbuf->nlink, &ubuf->st_nlink)   ||
-           __put_user (kbuf->uid, &ubuf->st_uid)               ||
-           __put_user (kbuf->gid, &ubuf->st_gid)               ||
-           __put_user (sysv_encode_dev(kbuf->rdev), &ubuf->st_rdev)    ||
-           __put_user (kbuf->size, &ubuf->st_size)             ||
-           __put_user (kbuf->atime.tv_sec, &ubuf->st_atime.tv_sec)     ||
-           __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime.tv_nsec)   ||
-           __put_user (kbuf->mtime.tv_sec, &ubuf->st_mtime.tv_sec)     ||
-           __put_user (kbuf->mtime.tv_nsec, &ubuf->st_mtime.tv_nsec)   ||
-           __put_user (kbuf->ctime.tv_sec, &ubuf->st_ctime.tv_sec)     ||
-           __put_user (kbuf->ctime.tv_nsec, &ubuf->st_ctime.tv_nsec)   ||
-           __put_user (kbuf->blksize, &ubuf->st_blksize)       ||
-           __put_user (kbuf->blocks, &ubuf->st_blocks) ||
-           __put_user (UFSMAGIC, (unsigned __user *)ubuf->st_fstype))
-               return -EFAULT;
-       return 0;
-}
-
-asmlinkage int solaris_stat(u32 filename, u32 statbuf)
-{
-       struct kstat s;
-       int ret = vfs_stat(A(filename), &s);
-       if (!ret)
-               return putstat(A(statbuf), &s);
-       return ret;
-}
-
-asmlinkage int solaris_xstat(int vers, u32 filename, u32 statbuf)
-{
-       /* Solaris doesn't bother with looking at vers, so we do neither */
-       return solaris_stat(filename, statbuf);
-}
-
-asmlinkage int solaris_stat64(u32 filename, u32 statbuf)
-{
-       struct kstat s;
-       int ret = vfs_stat(A(filename), &s);
-       if (!ret)
-               return putstat64(A(statbuf), &s);
-       return ret;
-}
-
-asmlinkage int solaris_lstat(u32 filename, u32 statbuf)
-{
-       struct kstat s;
-       int ret = vfs_lstat(A(filename), &s);
-       if (!ret)
-               return putstat(A(statbuf), &s);
-       return ret;
-}
-
-asmlinkage int solaris_lxstat(int vers, u32 filename, u32 statbuf)
-{
-       return solaris_lstat(filename, statbuf);
-}
-
-asmlinkage int solaris_lstat64(u32 filename, u32 statbuf)
-{
-       struct kstat s;
-       int ret = vfs_lstat(A(filename), &s);
-       if (!ret)
-               return putstat64(A(statbuf), &s);
-       return ret;
-}
-
-asmlinkage int solaris_fstat(unsigned int fd, u32 statbuf)
-{
-       struct kstat s;
-       int ret = vfs_fstat(fd, &s);
-       if (!ret)
-               return putstat(A(statbuf), &s);
-       return ret;
-}
-
-asmlinkage int solaris_fxstat(int vers, u32 fd, u32 statbuf)
-{
-       return solaris_fstat(fd, statbuf);
-}
-
-asmlinkage int solaris_fstat64(unsigned int fd, u32 statbuf)
-{
-       struct kstat s;
-       int ret = vfs_fstat(fd, &s);
-       if (!ret)
-               return putstat64(A(statbuf), &s);
-       return ret;
-}
-
-asmlinkage int solaris_mknod(u32 path, u32 mode, s32 dev)
-{
-       int (*sys_mknod)(const char __user *,int,unsigned) = 
-               (int (*)(const char __user *,int,unsigned))SYS(mknod);
-       int major = sysv_major(dev);
-       int minor = sysv_minor(dev);
-
-       /* minor is guaranteed to be OK for MKDEV, major might be not */
-       if (major > 0xfff)
-               return -EINVAL;
-       return sys_mknod(A(path), mode, new_encode_dev(MKDEV(major,minor)));
-}
-
-asmlinkage int solaris_xmknod(int vers, u32 path, u32 mode, s32 dev)
-{
-       return solaris_mknod(path, mode, dev);
-}
-
-asmlinkage int solaris_getdents64(unsigned int fd, void __user *dirent, unsigned int count)
-{
-       int (*sys_getdents)(unsigned int, void __user *, unsigned int) =
-               (int (*)(unsigned int, void __user *, unsigned int))SYS(getdents);
-               
-       return sys_getdents(fd, dirent, count);
-}
-
-/* This statfs thingie probably will go in the near future, but... */
-
-struct sol_statfs {
-       short   f_type;
-       s32     f_bsize;
-       s32     f_frsize;
-       s32     f_blocks;
-       s32     f_bfree;
-       u32     f_files;
-       u32     f_ffree;
-       char    f_fname[6];
-       char    f_fpack[6];
-};
-
-asmlinkage int solaris_statfs(u32 path, u32 buf, int len, int fstype)
-{
-       int ret;
-       struct statfs s;
-       mm_segment_t old_fs = get_fs();
-       int (*sys_statfs)(const char __user *,struct statfs __user *) = 
-               (int (*)(const char __user *,struct statfs __user *))SYS(statfs);
-       struct sol_statfs __user *ss = A(buf);
-       
-       if (len != sizeof(struct sol_statfs)) return -EINVAL;
-       if (!fstype) {
-               /* FIXME: mixing userland and kernel pointers */
-               set_fs (KERNEL_DS);
-               ret = sys_statfs(A(path), &s);
-               set_fs (old_fs);
-               if (!ret) {
-                       if (put_user (s.f_type, &ss->f_type)            ||
-                           __put_user (s.f_bsize, &ss->f_bsize)        ||
-                           __put_user (0, &ss->f_frsize)               ||
-                           __put_user (s.f_blocks, &ss->f_blocks)      ||
-                           __put_user (s.f_bfree, &ss->f_bfree)        ||
-                           __put_user (s.f_files, &ss->f_files)        ||
-                           __put_user (s.f_ffree, &ss->f_ffree)        ||
-                           __clear_user (&ss->f_fname, 12))
-                               return -EFAULT;
-               }
-               return ret;
-       }
-/* Linux can't stat unmounted filesystems so we
- * simply lie and claim 100MB of 1GB is free. Sorry.
- */
-       if (put_user (fstype, &ss->f_type)              ||
-           __put_user (1024, &ss->f_bsize)             ||
-           __put_user (0, &ss->f_frsize)               ||
-           __put_user (1024*1024, &ss->f_blocks)       ||
-           __put_user (100*1024, &ss->f_bfree)         ||
-           __put_user (60000, &ss->f_files)            ||
-           __put_user (50000, &ss->f_ffree)            ||
-           __clear_user (&ss->f_fname, 12))
-               return -EFAULT;
-       return 0;
-}
-
-asmlinkage int solaris_fstatfs(u32 fd, u32 buf, int len, int fstype)
-{
-       int ret;
-       struct statfs s;
-       mm_segment_t old_fs = get_fs();
-       int (*sys_fstatfs)(unsigned,struct statfs __user *) = 
-               (int (*)(unsigned,struct statfs __user *))SYS(fstatfs);
-       struct sol_statfs __user *ss = A(buf);
-       
-       if (len != sizeof(struct sol_statfs)) return -EINVAL;
-       if (!fstype) {
-               set_fs (KERNEL_DS);
-               ret = sys_fstatfs(fd, &s);
-               set_fs (old_fs);
-               if (!ret) {
-                       if (put_user (s.f_type, &ss->f_type)            ||
-                           __put_user (s.f_bsize, &ss->f_bsize)        ||
-                           __put_user (0, &ss->f_frsize)               ||
-                           __put_user (s.f_blocks, &ss->f_blocks)      ||
-                           __put_user (s.f_bfree, &ss->f_bfree)        ||
-                           __put_user (s.f_files, &ss->f_files)        ||
-                           __put_user (s.f_ffree, &ss->f_ffree)        ||
-                           __clear_user (&ss->f_fname, 12))
-                               return -EFAULT;
-               }
-               return ret;
-       }
-       /* Otherwise fstatfs is the same as statfs */
-       return solaris_statfs(0, buf, len, fstype);
-}
-
-struct sol_statvfs {
-       u32     f_bsize;
-       u32     f_frsize;
-       u32     f_blocks;
-       u32     f_bfree;
-       u32     f_bavail;
-       u32     f_files;
-       u32     f_ffree;
-       u32     f_favail;
-       u32     f_fsid;
-       char    f_basetype[16];
-       u32     f_flag;
-       u32     f_namemax;
-       char    f_fstr[32];
-       u32     f_filler[16];
-};
-
-struct sol_statvfs64 {
-       u32     f_bsize;
-       u32     f_frsize;
-       u64     f_blocks;
-       u64     f_bfree;
-       u64     f_bavail;
-       u64     f_files;
-       u64     f_ffree;
-       u64     f_favail;
-       u32     f_fsid;
-       char    f_basetype[16];
-       u32     f_flag;
-       u32     f_namemax;
-       char    f_fstr[32];
-       u32     f_filler[16];
-};
-
-static int report_statvfs(struct vfsmount *mnt, struct inode *inode, u32 buf)
-{
-       struct kstatfs s;
-       int error;
-       struct sol_statvfs __user *ss = A(buf);
-
-       error = vfs_statfs(mnt->mnt_root, &s);
-       if (!error) {
-               const char *p = mnt->mnt_sb->s_type->name;
-               int i = 0;
-               int j = strlen (p);
-               
-               if (j > 15) j = 15;
-               if (IS_RDONLY(inode)) i = 1;
-               if (mnt->mnt_flags & MNT_NOSUID) i |= 2;
-               if (!sysv_valid_dev(inode->i_sb->s_dev))
-                       return -EOVERFLOW;
-               if (put_user (s.f_bsize, &ss->f_bsize)          ||
-                   __put_user (0, &ss->f_frsize)               ||
-                   __put_user (s.f_blocks, &ss->f_blocks)      ||
-                   __put_user (s.f_bfree, &ss->f_bfree)        ||
-                   __put_user (s.f_bavail, &ss->f_bavail)      ||
-                   __put_user (s.f_files, &ss->f_files)        ||
-                   __put_user (s.f_ffree, &ss->f_ffree)        ||
-                   __put_user (s.f_ffree, &ss->f_favail)       ||
-                   __put_user (sysv_encode_dev(inode->i_sb->s_dev), &ss->f_fsid) ||
-                   __copy_to_user (ss->f_basetype,p,j)         ||
-                   __put_user (0, (char __user *)&ss->f_basetype[j])   ||
-                   __put_user (s.f_namelen, &ss->f_namemax)    ||
-                   __put_user (i, &ss->f_flag)                 ||                  
-                   __clear_user (&ss->f_fstr, 32))
-                       return -EFAULT;
-       }
-       return error;
-}
-
-static int report_statvfs64(struct vfsmount *mnt, struct inode *inode, u32 buf)
-{
-       struct kstatfs s;
-       int error;
-       struct sol_statvfs64 __user *ss = A(buf);
-                       
-       error = vfs_statfs(mnt->mnt_root, &s);
-       if (!error) {
-               const char *p = mnt->mnt_sb->s_type->name;
-               int i = 0;
-               int j = strlen (p);
-               
-               if (j > 15) j = 15;
-               if (IS_RDONLY(inode)) i = 1;
-               if (mnt->mnt_flags & MNT_NOSUID) i |= 2;
-               if (!sysv_valid_dev(inode->i_sb->s_dev))
-                       return -EOVERFLOW;
-               if (put_user (s.f_bsize, &ss->f_bsize)          ||
-                   __put_user (0, &ss->f_frsize)               ||
-                   __put_user (s.f_blocks, &ss->f_blocks)      ||
-                   __put_user (s.f_bfree, &ss->f_bfree)        ||
-                   __put_user (s.f_bavail, &ss->f_bavail)      ||
-                   __put_user (s.f_files, &ss->f_files)        ||
-                   __put_user (s.f_ffree, &ss->f_ffree)        ||
-                   __put_user (s.f_ffree, &ss->f_favail)       ||
-                   __put_user (sysv_encode_dev(inode->i_sb->s_dev), &ss->f_fsid) ||
-                   __copy_to_user (ss->f_basetype,p,j)         ||
-                   __put_user (0, (char __user *)&ss->f_basetype[j])   ||
-                   __put_user (s.f_namelen, &ss->f_namemax)    ||
-                   __put_user (i, &ss->f_flag)                 ||                  
-                   __clear_user (&ss->f_fstr, 32))
-                       return -EFAULT;
-       }
-       return error;
-}
-
-asmlinkage int solaris_statvfs(u32 path, u32 buf)
-{
-       struct nameidata nd;
-       int error;
-
-       error = user_path_walk(A(path),&nd);
-       if (!error) {
-               struct inode *inode = nd.path.dentry->d_inode;
-               error = report_statvfs(nd.path.mnt, inode, buf);
-               path_put(&nd.path);
-       }
-       return error;
-}
-
-asmlinkage int solaris_fstatvfs(unsigned int fd, u32 buf)
-{
-       struct file * file;
-       int error;
-
-       error = -EBADF;
-       file = fget(fd);
-       if (file) {
-               error = report_statvfs(file->f_path.mnt, file->f_path.dentry->d_inode, buf);
-               fput(file);
-       }
-
-       return error;
-}
-
-asmlinkage int solaris_statvfs64(u32 path, u32 buf)
-{
-       struct nameidata nd;
-       int error;
-
-       lock_kernel();
-       error = user_path_walk(A(path), &nd);
-       if (!error) {
-               struct inode *inode = nd.path.dentry->d_inode;
-               error = report_statvfs64(nd.path.mnt, inode, buf);
-               path_put(&nd.path);
-       }
-       unlock_kernel();
-       return error;
-}
-
-asmlinkage int solaris_fstatvfs64(unsigned int fd, u32 buf)
-{
-       struct file * file;
-       int error;
-
-       error = -EBADF;
-       file = fget(fd);
-       if (file) {
-               lock_kernel();
-               error = report_statvfs64(file->f_path.mnt, file->f_path.dentry->d_inode, buf);
-               unlock_kernel();
-               fput(file);
-       }
-       return error;
-}
-
-extern asmlinkage long sparc32_open(const char * filename, int flags, int mode);
-
-asmlinkage int solaris_open(u32 fname, int flags, u32 mode)
-{
-       const char *filename = (const char *)(long)fname;
-       int fl = flags & 0xf;
-
-       /* Translate flags first. */
-       if (flags & 0x2000) fl |= O_LARGEFILE;
-       if (flags & 0x8050) fl |= O_SYNC;
-       if (flags & 0x80) fl |= O_NONBLOCK;
-       if (flags & 0x100) fl |= O_CREAT;
-       if (flags & 0x200) fl |= O_TRUNC;
-       if (flags & 0x400) fl |= O_EXCL;
-       if (flags & 0x800) fl |= O_NOCTTY;
-       flags = fl;
-
-       return sparc32_open(filename, flags, mode);
-}
-
-#define SOL_F_SETLK    6
-#define SOL_F_SETLKW   7
-#define SOL_F_FREESP    11
-#define SOL_F_ISSTREAM  13
-#define SOL_F_GETLK     14
-#define SOL_F_PRIV      15
-#define SOL_F_NPRIV     16
-#define SOL_F_QUOTACTL  17
-#define SOL_F_BLOCKS    18
-#define SOL_F_BLKSIZE   19
-#define SOL_F_GETOWN    23
-#define SOL_F_SETOWN    24
-
-struct sol_flock {
-       short   l_type;
-       short   l_whence;
-       u32     l_start;
-       u32     l_len;
-       s32     l_sysid;
-       s32     l_pid;
-       s32     l_pad[4];
-};
-
-asmlinkage int solaris_fcntl(unsigned fd, unsigned cmd, u32 arg)
-{
-       int (*sys_fcntl)(unsigned,unsigned,unsigned long) = 
-               (int (*)(unsigned,unsigned,unsigned long))SYS(fcntl);
-       int ret, flags;
-
-       switch (cmd) {
-       case F_DUPFD:
-       case F_GETFD:
-       case F_SETFD: return sys_fcntl(fd, cmd, (unsigned long)arg);
-       case F_GETFL:
-               flags = sys_fcntl(fd, cmd, 0);
-               ret = flags & 0xf;
-               if (flags & O_SYNC) ret |= 0x8050;
-               if (flags & O_NONBLOCK) ret |= 0x80;
-               return ret;
-       case F_SETFL:
-               flags = arg & 0xf;
-               if (arg & 0x8050) flags |= O_SYNC;
-               if (arg & 0x80) flags |= O_NONBLOCK;
-               return sys_fcntl(fd, cmd, (long)flags);
-       case SOL_F_GETLK:
-       case SOL_F_SETLK:
-       case SOL_F_SETLKW:
-               {
-                       struct flock f;
-                       struct sol_flock __user *p = A(arg);
-                       mm_segment_t old_fs = get_fs();
-
-                       switch (cmd) {
-                       case SOL_F_GETLK: cmd = F_GETLK; break;
-                       case SOL_F_SETLK: cmd = F_SETLK; break;
-                       case SOL_F_SETLKW: cmd = F_SETLKW; break;
-                       }
-
-                       if (get_user (f.l_type, &p->l_type) ||
-                           __get_user (f.l_whence, &p->l_whence) ||
-                           __get_user (f.l_start, &p->l_start) ||
-                           __get_user (f.l_len, &p->l_len) ||
-                           __get_user (f.l_pid, &p->l_sysid))
-                               return -EFAULT;
-
-                       set_fs(KERNEL_DS);
-                       ret = sys_fcntl(fd, cmd, (unsigned long)&f);
-                       set_fs(old_fs);
-
-                       if (__put_user (f.l_type, &p->l_type) ||
-                           __put_user (f.l_whence, &p->l_whence) ||
-                           __put_user (f.l_start, &p->l_start) ||
-                           __put_user (f.l_len, &p->l_len) ||
-                           __put_user (f.l_pid, &p->l_pid) ||
-                           __put_user (0, &p->l_sysid))
-                               return -EFAULT;
-
-                       return ret;
-               }
-       case SOL_F_FREESP:
-               { 
-                   int length;
-                   int (*sys_newftruncate)(unsigned int, unsigned long)=
-                           (int (*)(unsigned int, unsigned long))SYS(ftruncate);
-
-                   if (get_user(length, &((struct sol_flock __user *)A(arg))->l_start))
-                           return -EFAULT;
-
-                   return sys_newftruncate(fd, length);
-               }
-       };
-       return -EINVAL;
-}
-
-asmlinkage int solaris_ulimit(int cmd, int val)
-{
-       switch (cmd) {
-       case 1: /* UL_GETFSIZE - in 512B chunks */
-               return current->signal->rlim[RLIMIT_FSIZE].rlim_cur >> 9;
-       case 2: /* UL_SETFSIZE */
-               if ((unsigned long)val > (LONG_MAX>>9)) return -ERANGE;
-               val <<= 9;
-               task_lock(current->group_leader);
-               if (val > current->signal->rlim[RLIMIT_FSIZE].rlim_max) {
-                       if (!capable(CAP_SYS_RESOURCE)) {
-                               task_unlock(current->group_leader);
-                               return -EPERM;
-                       }
-                       current->signal->rlim[RLIMIT_FSIZE].rlim_max = val;
-               }
-               current->signal->rlim[RLIMIT_FSIZE].rlim_cur = val;
-               task_unlock(current->group_leader);
-               return 0;
-       case 3: /* UL_GMEMLIM */
-               return current->signal->rlim[RLIMIT_DATA].rlim_cur;
-       case 4: /* UL_GDESLIM */
-               return sysctl_nr_open;
-       }
-       return -EINVAL;
-}
-
-/* At least at the time I'm writing this, Linux doesn't have ACLs, so we
-   just fake this */
-asmlinkage int solaris_acl(u32 filename, int cmd, int nentries, u32 aclbufp)
-{
-       return -ENOSYS;
-}
-
-asmlinkage int solaris_facl(unsigned int fd, int cmd, int nentries, u32 aclbufp)
-{
-       return -ENOSYS;
-}
-
-asmlinkage int solaris_pread(unsigned int fd, char __user *buf, u32 count, u32 pos)
-{
-       ssize_t (*sys_pread64)(unsigned int, char __user *, size_t, loff_t) =
-               (ssize_t (*)(unsigned int, char __user *, size_t, loff_t))SYS(pread64);
-
-       return sys_pread64(fd, buf, count, (loff_t)pos);
-}
-
-asmlinkage int solaris_pwrite(unsigned int fd, char __user *buf, u32 count, u32 pos)
-{
-       ssize_t (*sys_pwrite64)(unsigned int, char __user *, size_t, loff_t) =
-               (ssize_t (*)(unsigned int, char __user *, size_t, loff_t))SYS(pwrite64);
-
-       return sys_pwrite64(fd, buf, count, (loff_t)pos);
-}
-
-/* POSIX.1 names */
-#define _PC_LINK_MAX    1
-#define _PC_MAX_CANON   2
-#define _PC_MAX_INPUT   3
-#define _PC_NAME_MAX    4
-#define _PC_PATH_MAX    5
-#define _PC_PIPE_BUF    6
-#define _PC_NO_TRUNC    7
-#define _PC_VDISABLE    8
-#define _PC_CHOWN_RESTRICTED    9
-/* POSIX.4 names */
-#define _PC_ASYNC_IO    10
-#define _PC_PRIO_IO     11
-#define _PC_SYNC_IO     12
-#define _PC_LAST        12
-
-/* This is not a real and complete implementation yet, just to keep
- * the easy Solaris binaries happy.
- */
-asmlinkage int solaris_fpathconf(int fd, int name)
-{
-       int ret;
-
-       switch(name) {
-       case _PC_LINK_MAX:
-               ret = LINK_MAX;
-               break;
-       case _PC_MAX_CANON:
-               ret = MAX_CANON;
-               break;
-       case _PC_MAX_INPUT:
-               ret = MAX_INPUT;
-               break;
-       case _PC_NAME_MAX:
-               ret = NAME_MAX;
-               break;
-       case _PC_PATH_MAX:
-               ret = PATH_MAX;
-               break;
-       case _PC_PIPE_BUF:
-               ret = PIPE_BUF;
-               break;
-       case _PC_CHOWN_RESTRICTED:
-               ret = 1;
-               break;
-       case _PC_NO_TRUNC:
-       case _PC_VDISABLE:
-               ret = 0;
-               break;
-       default:
-               ret = -EINVAL;
-               break;
-       }
-       return ret;
-}
-
-asmlinkage int solaris_pathconf(u32 path, int name)
-{
-       return solaris_fpathconf(0, name);
-}
-
-/* solaris_llseek returns long long - quite difficult */
-asmlinkage long solaris_llseek(struct pt_regs *regs, u32 off_hi, u32 off_lo, int whence)
-{
-       int (*sys_llseek)(unsigned int, unsigned long, unsigned long, loff_t __user *, unsigned int) =
-               (int (*)(unsigned int, unsigned long, unsigned long, loff_t __user *, unsigned int))SYS(_llseek);
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       loff_t retval;
-       
-       set_fs(KERNEL_DS);
-       ret = sys_llseek((unsigned int)regs->u_regs[UREG_I0], off_hi, off_lo, &retval, whence);
-       set_fs(old_fs);
-       if (ret < 0) return ret;
-       regs->u_regs[UREG_I1] = (u32)retval;
-       return (retval >> 32);
-}
-
-/* Have to mask out all but lower 3 bits */
-asmlinkage int solaris_access(u32 filename, long mode)
-{
-       int (*sys_access)(const char __user *, int) = 
-               (int (*)(const char __user *, int))SYS(access);
-               
-       return sys_access(A(filename), mode & 7);
-}
diff --git a/arch/sparc64/solaris/ioctl.c b/arch/sparc64/solaris/ioctl.c
deleted file mode 100644 (file)
index 8ad10a6..0000000
+++ /dev/null
@@ -1,825 +0,0 @@
-/* $Id: ioctl.c,v 1.17 2002/02/08 03:57:14 davem Exp $
- * ioctl.c: Solaris ioctl emulation.
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- * Copyright (C) 1997,1998 Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)
- *
- * Streams & timod emulation based on code
- * Copyright (C) 1995, 1996 Mike Jagdis (jaggy@purplet.demon.co.uk)
- *
- * 1999-08-19 Implemented solaris 'm' (mag tape) and
- *            'O' (openprom) ioctls, by Jason Rappleye
- *             (rappleye@ccr.buffalo.edu)
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/syscalls.h>
-#include <linux/ioctl.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/netdevice.h>
-#include <linux/mtio.h>
-#include <linux/time.h>
-#include <linux/rcupdate.h>
-#include <linux/compat.h>
-
-#include <net/sock.h>
-#include <net/net_namespace.h>
-
-#include <asm/uaccess.h>
-#include <asm/termios.h>
-#include <asm/openpromio.h>
-
-#include "conv.h"
-#include "socksys.h"
-
-extern asmlinkage int compat_sys_ioctl(unsigned int fd, unsigned int cmd,
-       u32 arg);
-asmlinkage int solaris_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
-
-extern int timod_putmsg(unsigned int fd, char __user *ctl_buf, int ctl_len,
-                       char __user *data_buf, int data_len, int flags);
-extern int timod_getmsg(unsigned int fd, char __user *ctl_buf, int ctl_maxlen, int __user *ctl_len,
-                       char __user *data_buf, int data_maxlen, int __user *data_len, int *flags);
-
-/* termio* stuff {{{ */
-
-struct solaris_termios {
-       u32     c_iflag;
-       u32     c_oflag;
-       u32     c_cflag;
-       u32     c_lflag;
-       u8      c_cc[19];
-};
-
-struct solaris_termio {
-       u16     c_iflag;
-       u16     c_oflag;
-       u16     c_cflag;
-       u16     c_lflag;
-       s8      c_line;
-       u8      c_cc[8];
-};
-
-struct solaris_termiox {
-       u16     x_hflag;
-       u16     x_cflag;
-       u16     x_rflag[5];
-       u16     x_sflag;
-};
-
-static u32 solaris_to_linux_cflag(u32 cflag)
-{
-       cflag &= 0x7fdff000;
-       if (cflag & 0x200000) {
-               int baud = cflag & 0xf;
-               cflag &= ~0x20000f;
-               switch (baud) {
-               case 0: baud = B57600; break;
-               case 1: baud = B76800; break;
-               case 2: baud = B115200; break;
-               case 3: baud = B153600; break;
-               case 4: baud = B230400; break;
-               case 5: baud = B307200; break;
-               case 6: baud = B460800; break;
-               }
-               cflag |= CBAUDEX | baud;
-       }
-       return cflag;
-}
-
-static u32 linux_to_solaris_cflag(u32 cflag)
-{
-       cflag &= ~(CMSPAR | CIBAUD);
-       if (cflag & CBAUDEX) {
-               int baud = cflag & CBAUD;
-               cflag &= ~CBAUD;
-               switch (baud) {
-               case B57600: baud = 0; break;
-               case B76800: baud = 1; break;
-               case B115200: baud = 2; break;
-               case B153600: baud = 3; break;
-               case B230400: baud = 4; break;
-               case B307200: baud = 5; break;
-               case B460800: baud = 6; break;
-               case B614400: baud = 7; break;
-               case B921600: baud = 8; break;
-#if 0          
-               case B1843200: baud = 9; break;
-#endif
-               }
-               cflag |= 0x200000 | baud;
-       }
-       return cflag;
-}
-
-static inline int linux_to_solaris_termio(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       struct solaris_termio __user *p = A(arg);
-       int ret;
-       
-       ret = sys_ioctl(fd, cmd, (unsigned long)p);
-       if (!ret) {
-               u32 cflag;
-               
-               if (__get_user (cflag, &p->c_cflag))
-                       return -EFAULT;
-               cflag = linux_to_solaris_cflag(cflag);
-               if (__put_user (cflag, &p->c_cflag))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-static int solaris_to_linux_termio(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       int ret;
-       struct solaris_termio s;
-       mm_segment_t old_fs = get_fs();
-       
-       if (copy_from_user (&s, (struct solaris_termio __user *)A(arg), sizeof(struct solaris_termio)))
-               return -EFAULT;
-       s.c_cflag = solaris_to_linux_cflag(s.c_cflag);
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, cmd, (unsigned long)&s);
-       set_fs(old_fs);
-       return ret;
-}
-
-static inline int linux_to_solaris_termios(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       int ret;
-       struct solaris_termios s;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);      
-       ret = sys_ioctl(fd, cmd, (unsigned long)&s);
-       set_fs(old_fs);
-       if (!ret) {
-               struct solaris_termios __user *p = A(arg);
-               if (put_user (s.c_iflag, &p->c_iflag) ||
-                   __put_user (s.c_oflag, &p->c_oflag) ||
-                   __put_user (linux_to_solaris_cflag(s.c_cflag), &p->c_cflag) ||
-                   __put_user (s.c_lflag, &p->c_lflag) ||
-                   __copy_to_user (p->c_cc, s.c_cc, 16) ||
-                   __clear_user (p->c_cc + 16, 2))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-static int solaris_to_linux_termios(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       int ret;
-       struct solaris_termios s;
-       struct solaris_termios __user *p = A(arg);
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, TCGETS, (unsigned long)&s);
-       set_fs(old_fs);
-       if (ret) return ret;
-       if (put_user (s.c_iflag, &p->c_iflag) ||
-           __put_user (s.c_oflag, &p->c_oflag) ||
-           __put_user (s.c_cflag, &p->c_cflag) ||
-           __put_user (s.c_lflag, &p->c_lflag) ||
-           __copy_from_user (s.c_cc, p->c_cc, 16))
-               return -EFAULT;
-       s.c_cflag = solaris_to_linux_cflag(s.c_cflag);
-       set_fs(KERNEL_DS);
-       ret = sys_ioctl(fd, cmd, (unsigned long)&s);
-       set_fs(old_fs);
-       return ret;
-}
-
-static inline int solaris_T(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       switch (cmd & 0xff) {
-       case 1: /* TCGETA */
-               return linux_to_solaris_termio(fd, TCGETA, arg);
-       case 2: /* TCSETA */
-               return solaris_to_linux_termio(fd, TCSETA, arg);
-       case 3: /* TCSETAW */
-               return solaris_to_linux_termio(fd, TCSETAW, arg);
-       case 4: /* TCSETAF */
-               return solaris_to_linux_termio(fd, TCSETAF, arg);
-       case 5: /* TCSBRK */
-               return sys_ioctl(fd, TCSBRK, arg);
-       case 6: /* TCXONC */
-               return sys_ioctl(fd, TCXONC, arg);
-       case 7: /* TCFLSH */
-               return sys_ioctl(fd, TCFLSH, arg);
-       case 13: /* TCGETS */
-               return linux_to_solaris_termios(fd, TCGETS, arg);
-       case 14: /* TCSETS */
-               return solaris_to_linux_termios(fd, TCSETS, arg);
-       case 15: /* TCSETSW */
-               return solaris_to_linux_termios(fd, TCSETSW, arg);
-       case 16: /* TCSETSF */
-               return solaris_to_linux_termios(fd, TCSETSF, arg);
-       case 103: /* TIOCSWINSZ */
-               return sys_ioctl(fd, TIOCSWINSZ, arg);
-       case 104: /* TIOCGWINSZ */
-               return sys_ioctl(fd, TIOCGWINSZ, arg);
-       }
-       return -ENOSYS;
-}
-
-static inline int solaris_t(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       switch (cmd & 0xff) {
-       case 20: /* TIOCGPGRP */
-               return sys_ioctl(fd, TIOCGPGRP, arg);
-       case 21: /* TIOCSPGRP */
-               return sys_ioctl(fd, TIOCSPGRP, arg);
-       }
-       return -ENOSYS;
-}
-
-/* }}} */
-
-/* A pseudo STREAMS support {{{ */
-
-struct strioctl {
-       int cmd, timeout, len;
-       u32 data;
-};
-
-struct solaris_si_sockparams {
-       int sp_family;
-       int sp_type;
-       int sp_protocol;
-};
-
-struct solaris_o_si_udata {
-       int tidusize;
-       int addrsize;
-       int optsize;
-       int etsdusize;
-       int servtype;
-       int so_state;
-       int so_options;
-       int tsdusize;
-};
-
-struct solaris_si_udata {
-       int tidusize;
-       int addrsize;
-       int optsize;
-       int etsdusize;
-       int servtype;
-       int so_state;
-       int so_options;
-       int tsdusize;
-       struct solaris_si_sockparams sockparams;
-};
-
-#define SOLARIS_MODULE_TIMOD    0
-#define SOLARIS_MODULE_SOCKMOD  1
-#define SOLARIS_MODULE_MAX      2
-
-static struct module_info {
-        const char *name;
-        /* can be expanded further if needed */
-} module_table[ SOLARIS_MODULE_MAX + 1 ] = {
-        /* the ordering here must match the module numbers above! */
-        { "timod" },
-        { "sockmod" },
-        { NULL }
-};
-
-static inline int solaris_sockmod(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       struct inode *ino;
-       struct fdtable *fdt;
-       /* I wonder which of these tests are superfluous... --patrik */
-       rcu_read_lock();
-       fdt = files_fdtable(current->files);
-       if (! fdt->fd[fd] ||
-           ! fdt->fd[fd]->f_path.dentry ||
-           ! (ino = fdt->fd[fd]->f_path.dentry->d_inode) ||
-           ! S_ISSOCK(ino->i_mode)) {
-               rcu_read_unlock();
-               return TBADF;
-       }
-       rcu_read_unlock();
-       
-       switch (cmd & 0xff) {
-       case 109: /* SI_SOCKPARAMS */
-       {
-               struct solaris_si_sockparams si;
-               if (copy_from_user (&si, A(arg), sizeof(si)))
-                       return (EFAULT << 8) | TSYSERR;
-
-               /* Should we modify socket ino->socket_i.ops and type? */
-               return 0;
-       }
-       case 110: /* SI_GETUDATA */
-       {
-               int etsdusize, servtype;
-               struct solaris_si_udata __user *p = A(arg);
-               switch (SOCKET_I(ino)->type) {
-               case SOCK_STREAM:
-                       etsdusize = 1;
-                       servtype = 2;
-                       break;
-               default:
-                       etsdusize = -2;
-                       servtype = 3;
-                       break;
-               }
-               if (put_user(16384, &p->tidusize) ||
-                   __put_user(sizeof(struct sockaddr), &p->addrsize) ||
-                   __put_user(-1, &p->optsize) ||
-                   __put_user(etsdusize, &p->etsdusize) ||
-                   __put_user(servtype, &p->servtype) ||
-                   __put_user(0, &p->so_state) ||
-                   __put_user(0, &p->so_options) ||
-                   __put_user(16384, &p->tsdusize) ||
-                   __put_user(SOCKET_I(ino)->ops->family, &p->sockparams.sp_family) ||
-                   __put_user(SOCKET_I(ino)->type, &p->sockparams.sp_type) ||
-                   __put_user(SOCKET_I(ino)->ops->family, &p->sockparams.sp_protocol))
-                       return (EFAULT << 8) | TSYSERR;
-               return 0;
-       }
-       case 101: /* O_SI_GETUDATA */
-       {
-               int etsdusize, servtype;
-               struct solaris_o_si_udata __user *p = A(arg);
-               switch (SOCKET_I(ino)->type) {
-               case SOCK_STREAM:
-                       etsdusize = 1;
-                       servtype = 2;
-                       break;
-               default:
-                       etsdusize = -2;
-                       servtype = 3;
-                       break;
-               }
-               if (put_user(16384, &p->tidusize) ||
-                   __put_user(sizeof(struct sockaddr), &p->addrsize) ||
-                   __put_user(-1, &p->optsize) ||
-                   __put_user(etsdusize, &p->etsdusize) ||
-                   __put_user(servtype, &p->servtype) ||
-                   __put_user(0, &p->so_state) ||
-                   __put_user(0, &p->so_options) ||
-                   __put_user(16384, &p->tsdusize))
-                       return (EFAULT << 8) | TSYSERR;
-               return 0;
-       }
-       case 102: /* SI_SHUTDOWN */
-       case 103: /* SI_LISTEN */
-       case 104: /* SI_SETMYNAME */
-       case 105: /* SI_SETPEERNAME */
-       case 106: /* SI_GETINTRANSIT */
-       case 107: /* SI_TCL_LINK */
-       case 108: /* SI_TCL_UNLINK */
-               ;
-       }
-       return TNOTSUPPORT;
-}
-
-static inline int solaris_timod(unsigned int fd, unsigned int cmd, u32 arg,
-                                    int len, int __user *len_p)
-{
-       int ret;
-               
-       switch (cmd & 0xff) {
-       case 141: /* TI_OPTMGMT */
-       {
-               int i;
-               u32 prim;
-               SOLD("TI_OPMGMT entry");
-               ret = timod_putmsg(fd, A(arg), len, NULL, -1, 0);
-               SOLD("timod_putmsg() returned");
-               if (ret)
-                       return (-ret << 8) | TSYSERR;
-               i = MSG_HIPRI;
-               SOLD("calling timod_getmsg()");
-               ret = timod_getmsg(fd, A(arg), len, len_p, NULL, -1, NULL, &i);
-               SOLD("timod_getmsg() returned");
-               if (ret)
-                       return (-ret << 8) | TSYSERR;
-               SOLD("ret ok");
-               if (get_user(prim, (u32 __user *)A(arg)))
-                       return (EFAULT << 8) | TSYSERR;
-               SOLD("got prim");
-               if (prim == T_ERROR_ACK) {
-                       u32 tmp, tmp2;
-                       SOLD("prim is T_ERROR_ACK");
-                       if (get_user(tmp, (u32 __user *)A(arg)+3) ||
-                           get_user(tmp2, (u32 __user *)A(arg)+2))
-                               return (EFAULT << 8) | TSYSERR;
-                       return (tmp2 << 8) | tmp;
-               }
-               SOLD("TI_OPMGMT return 0");
-               return 0;
-       }
-       case 142: /* TI_BIND */
-       {
-               int i;
-               u32 prim;
-               SOLD("TI_BIND entry");
-               ret = timod_putmsg(fd, A(arg), len, NULL, -1, 0);
-               SOLD("timod_putmsg() returned");
-               if (ret)
-                       return (-ret << 8) | TSYSERR;
-               len = 1024; /* Solaris allows arbitrary return size */
-               i = MSG_HIPRI;
-               SOLD("calling timod_getmsg()");
-               ret = timod_getmsg(fd, A(arg), len, len_p, NULL, -1, NULL, &i);
-               SOLD("timod_getmsg() returned");
-               if (ret)
-                       return (-ret << 8) | TSYSERR;
-               SOLD("ret ok");
-               if (get_user(prim, (u32 __user *)A(arg)))
-                       return (EFAULT << 8) | TSYSERR;
-               SOLD("got prim");
-               if (prim == T_ERROR_ACK) {
-                       u32 tmp, tmp2;
-                       SOLD("prim is T_ERROR_ACK");
-                       if (get_user(tmp, (u32 __user *)A(arg)+3) ||
-                           get_user(tmp2, (u32 __user *)A(arg)+2))
-                               return (EFAULT << 8) | TSYSERR;
-                       return (tmp2 << 8) | tmp;
-               }
-               SOLD("no ERROR_ACK requested");
-               if (prim != T_OK_ACK)
-                       return TBADSEQ;
-               SOLD("OK_ACK requested");
-               i = MSG_HIPRI;
-               SOLD("calling timod_getmsg()");
-               ret = timod_getmsg(fd, A(arg), len, len_p, NULL, -1, NULL, &i);
-               SOLD("timod_getmsg() returned");
-               if (ret)
-                       return (-ret << 8) | TSYSERR;
-               SOLD("TI_BIND return ok");
-               return 0;
-       }
-       case 140: /* TI_GETINFO */
-       case 143: /* TI_UNBIND */
-       case 144: /* TI_GETMYNAME */
-       case 145: /* TI_GETPEERNAME */
-       case 146: /* TI_SETMYNAME */
-       case 147: /* TI_SETPEERNAME */
-               ;
-       }
-       return TNOTSUPPORT;
-}
-
-static inline int solaris_S(struct file *filp, unsigned int fd, unsigned int cmd, u32 arg)
-{
-       char *p;
-       int ret;
-       mm_segment_t old_fs;
-       struct strioctl si;
-       struct inode *ino;
-        struct sol_socket_struct *sock;
-        struct module_info *mi;
-
-        ino = filp->f_path.dentry->d_inode;
-        if (!S_ISSOCK(ino->i_mode))
-               return -EBADF;
-        sock = filp->private_data;
-        if (! sock) {
-                printk("solaris_S: NULL private_data\n");
-                return -EBADF;
-        }
-        if (sock->magic != SOLARIS_SOCKET_MAGIC) {
-                printk("solaris_S: invalid magic\n");
-                return -EBADF;
-        }
-        
-
-       switch (cmd & 0xff) {
-       case 1: /* I_NREAD */
-               return -ENOSYS;
-       case 2: /* I_PUSH */
-        {
-               p = getname (A(arg));
-               if (IS_ERR (p))
-                       return PTR_ERR(p);
-                ret = -EINVAL;
-                for (mi = module_table; mi->name; mi++) {
-                        if (strcmp(mi->name, p) == 0) {
-                                sol_module m;
-                                if (sock->modcount >= MAX_NR_STREAM_MODULES) {
-                                        ret = -ENXIO;
-                                        break;
-                                }
-                                m = (sol_module) (mi - module_table);
-                                sock->module[sock->modcount++] = m;
-                                ret = 0;
-                                break;
-                        }
-                }
-               putname (p);
-               return ret;
-        }
-       case 3: /* I_POP */
-                if (sock->modcount <= 0) return -EINVAL;
-                sock->modcount--;
-               return 0;
-        case 4: /* I_LOOK */
-        {
-               const char *p;
-                if (sock->modcount <= 0) return -EINVAL;
-                p = module_table[(unsigned)sock->module[sock->modcount]].name;
-                if (copy_to_user (A(arg), p, strlen(p)))
-                       return -EFAULT;
-                return 0;
-        }
-       case 5: /* I_FLUSH */
-               return 0;
-       case 8: /* I_STR */
-               if (copy_from_user(&si, A(arg), sizeof(struct strioctl)))
-                       return -EFAULT;
-                /* We ignore what module is actually at the top of stack. */
-               switch ((si.cmd >> 8) & 0xff) {
-               case 'I':
-                        return solaris_sockmod(fd, si.cmd, si.data);
-               case 'T':
-                        return solaris_timod(fd, si.cmd, si.data, si.len,
-                               &((struct strioctl __user *)A(arg))->len);
-               default:
-                       return solaris_ioctl(fd, si.cmd, si.data);
-               }
-       case 9: /* I_SETSIG */
-               return sys_ioctl(fd, FIOSETOWN, current->pid);
-       case 10: /* I_GETSIG */
-               old_fs = get_fs();
-               set_fs(KERNEL_DS);
-               sys_ioctl(fd, FIOGETOWN, (unsigned long)&ret);
-               set_fs(old_fs);
-               if (ret == current->pid) return 0x3ff;
-               else return -EINVAL;
-       case 11: /* I_FIND */
-        {
-                int i;
-               p = getname (A(arg));
-               if (IS_ERR (p))
-                       return PTR_ERR(p);
-                ret = 0;
-                for (i = 0; i < sock->modcount; i++) {
-                        unsigned m = sock->module[i];
-                        if (strcmp(module_table[m].name, p) == 0) {
-                                ret = 1;
-                                break;
-                        } 
-                }
-               putname (p);
-               return ret;
-        }
-       case 19: /* I_SWROPT */
-       case 32: /* I_SETCLTIME */
-               return 0;       /* Lie */
-       }
-       return -ENOSYS;
-}
-
-static inline int solaris_s(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       switch (cmd & 0xff) {
-       case 0: /* SIOCSHIWAT */
-       case 2: /* SIOCSLOWAT */
-               return 0; /* We don't support them */
-       case 1: /* SIOCGHIWAT */
-       case 3: /* SIOCGLOWAT */
-               if (put_user (0, (u32 __user *)A(arg)))
-                       return -EFAULT;
-               return 0; /* Lie */
-       case 7: /* SIOCATMARK */
-               return sys_ioctl(fd, SIOCATMARK, arg);
-       case 8: /* SIOCSPGRP */
-               return sys_ioctl(fd, SIOCSPGRP, arg);
-       case 9: /* SIOCGPGRP */
-               return sys_ioctl(fd, SIOCGPGRP, arg);
-       }
-       return -ENOSYS;
-}
-
-static inline int solaris_r(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       switch (cmd & 0xff) {
-       case 10: /* SIOCADDRT */
-               return compat_sys_ioctl(fd, SIOCADDRT, arg);
-       case 11: /* SIOCDELRT */
-               return compat_sys_ioctl(fd, SIOCDELRT, arg);
-       }
-       return -ENOSYS;
-}
-
-static inline int solaris_i(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       switch (cmd & 0xff) {
-       case 12: /* SIOCSIFADDR */
-               return compat_sys_ioctl(fd, SIOCSIFADDR, arg);
-       case 13: /* SIOCGIFADDR */
-               return compat_sys_ioctl(fd, SIOCGIFADDR, arg);
-       case 14: /* SIOCSIFDSTADDR */
-               return compat_sys_ioctl(fd, SIOCSIFDSTADDR, arg);
-       case 15: /* SIOCGIFDSTADDR */
-               return compat_sys_ioctl(fd, SIOCGIFDSTADDR, arg);
-       case 16: /* SIOCSIFFLAGS */
-               return compat_sys_ioctl(fd, SIOCSIFFLAGS, arg);
-       case 17: /* SIOCGIFFLAGS */
-               return compat_sys_ioctl(fd, SIOCGIFFLAGS, arg);
-       case 18: /* SIOCSIFMEM */
-               return compat_sys_ioctl(fd, SIOCSIFMEM, arg);
-       case 19: /* SIOCGIFMEM */
-               return compat_sys_ioctl(fd, SIOCGIFMEM, arg);
-       case 20: /* SIOCGIFCONF */
-               return compat_sys_ioctl(fd, SIOCGIFCONF, arg);
-       case 21: /* SIOCSIFMTU */
-               return compat_sys_ioctl(fd, SIOCSIFMTU, arg);
-       case 22: /* SIOCGIFMTU */
-               return compat_sys_ioctl(fd, SIOCGIFMTU, arg);
-       case 23: /* SIOCGIFBRDADDR */
-               return compat_sys_ioctl(fd, SIOCGIFBRDADDR, arg);
-       case 24: /* SIOCSIFBRDADDR */
-               return compat_sys_ioctl(fd, SIOCSIFBRDADDR, arg);
-       case 25: /* SIOCGIFNETMASK */
-               return compat_sys_ioctl(fd, SIOCGIFNETMASK, arg);
-       case 26: /* SIOCSIFNETMASK */
-               return compat_sys_ioctl(fd, SIOCSIFNETMASK, arg);
-       case 27: /* SIOCGIFMETRIC */
-               return compat_sys_ioctl(fd, SIOCGIFMETRIC, arg);
-       case 28: /* SIOCSIFMETRIC */
-               return compat_sys_ioctl(fd, SIOCSIFMETRIC, arg);
-       case 30: /* SIOCSARP */
-               return compat_sys_ioctl(fd, SIOCSARP, arg);
-       case 31: /* SIOCGARP */
-               return compat_sys_ioctl(fd, SIOCGARP, arg);
-       case 32: /* SIOCDARP */
-               return compat_sys_ioctl(fd, SIOCDARP, arg);
-       case 52: /* SIOCGETNAME */
-       case 53: /* SIOCGETPEER */
-               {
-                       struct sockaddr uaddr;
-                       int uaddr_len = sizeof(struct sockaddr), ret;
-                       long args[3];
-                       mm_segment_t old_fs = get_fs();
-                       int (*sys_socketcall)(int, unsigned long *) =
-                               (int (*)(int, unsigned long *))SYS(socketcall);
-                       
-                       args[0] = fd; args[1] = (long)&uaddr; args[2] = (long)&uaddr_len;
-                       set_fs(KERNEL_DS);
-                       ret = sys_socketcall(((cmd & 0xff) == 52) ? SYS_GETSOCKNAME : SYS_GETPEERNAME,
-                                       args);
-                       set_fs(old_fs);
-                       if (ret >= 0) {
-                               if (copy_to_user(A(arg), &uaddr, uaddr_len))
-                                       return -EFAULT;
-                       }
-                       return ret;
-               }
-#if 0          
-       case 86: /* SIOCSOCKSYS */
-               return socksys_syscall(fd, arg);
-#endif         
-       case 87: /* SIOCGIFNUM */
-               {
-                       struct net_device *d;
-                       int i = 0;
-                       
-                       read_lock_bh(&dev_base_lock);
-                       for_each_netdev(&init_net, d)
-                               i++;
-                       read_unlock_bh(&dev_base_lock);
-
-                       if (put_user (i, (int __user *)A(arg)))
-                               return -EFAULT;
-                       return 0;
-               }
-       }
-       return -ENOSYS;
-}
-
-static int solaris_m(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       int ret;
-
-       switch (cmd & 0xff) {
-       case 1: /* MTIOCTOP */
-               ret = sys_ioctl(fd, MTIOCTOP, (unsigned long)&arg);
-               break;
-       case 2: /* MTIOCGET */
-               ret = sys_ioctl(fd, MTIOCGET, (unsigned long)&arg);
-               break;
-       case 3: /* MTIOCGETDRIVETYPE */
-       case 4: /* MTIOCPERSISTENT */
-       case 5: /* MTIOCPERSISTENTSTATUS */
-       case 6: /* MTIOCLRERR */
-       case 7: /* MTIOCGUARANTEEDORDER */
-       case 8: /* MTIOCRESERVE */
-       case 9: /* MTIOCRELEASE */
-       case 10: /* MTIOCFORCERESERVE */
-       case 13: /* MTIOCSTATE */
-       case 14: /* MTIOCREADIGNOREILI */
-       case 15: /* MTIOCREADIGNOREEOFS */
-       case 16: /* MTIOCSHORTFMK */
-       default:
-               ret = -ENOSYS; /* linux doesn't support these */
-               break;
-       };
-
-       return ret;
-}
-
-static int solaris_O(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       int ret = -EINVAL;
-
-       switch (cmd & 0xff) {
-       case 1: /* OPROMGETOPT */
-               ret = sys_ioctl(fd, OPROMGETOPT, arg);
-               break;
-       case 2: /* OPROMSETOPT */
-               ret = sys_ioctl(fd, OPROMSETOPT, arg);
-               break;
-       case 3: /* OPROMNXTOPT */
-               ret = sys_ioctl(fd, OPROMNXTOPT, arg);
-               break;
-       case 4: /* OPROMSETOPT2 */
-               ret = sys_ioctl(fd, OPROMSETOPT2, arg);
-               break;
-       case 5: /* OPROMNEXT */
-               ret = sys_ioctl(fd, OPROMNEXT, arg);
-               break;
-       case 6: /* OPROMCHILD */
-               ret = sys_ioctl(fd, OPROMCHILD, arg);
-               break;
-       case 7: /* OPROMGETPROP */
-               ret = sys_ioctl(fd, OPROMGETPROP, arg);
-               break;
-       case 8: /* OPROMNXTPROP */
-               ret = sys_ioctl(fd, OPROMNXTPROP, arg);
-               break;
-       case 9: /* OPROMU2P */
-               ret = sys_ioctl(fd, OPROMU2P, arg);
-               break;
-       case 10: /* OPROMGETCONS */
-               ret = sys_ioctl(fd, OPROMGETCONS, arg);
-               break;
-       case 11: /* OPROMGETFBNAME */
-               ret = sys_ioctl(fd, OPROMGETFBNAME, arg);
-               break;
-       case 12: /* OPROMGETBOOTARGS */
-               ret = sys_ioctl(fd, OPROMGETBOOTARGS, arg);
-               break;
-       case 13: /* OPROMGETVERSION */
-       case 14: /* OPROMPATH2DRV */
-       case 15: /* OPROMDEV2PROMNAME */
-       case 16: /* OPROMPROM2DEVNAME */
-       case 17: /* OPROMGETPROPLEN */
-       default:
-               ret = -EINVAL;
-               break;
-       };
-       return ret;
-}
-
-/* }}} */
-
-asmlinkage int solaris_ioctl(unsigned int fd, unsigned int cmd, u32 arg)
-{
-       struct file *filp;
-       int error = -EBADF;
-
-       filp = fget(fd);
-       if (!filp)
-               goto out;
-
-       lock_kernel();
-       error = -EFAULT;
-       switch ((cmd >> 8) & 0xff) {
-       case 'S': error = solaris_S(filp, fd, cmd, arg); break;
-       case 'T': error = solaris_T(fd, cmd, arg); break;
-       case 'i': error = solaris_i(fd, cmd, arg); break;
-       case 'r': error = solaris_r(fd, cmd, arg); break;
-       case 's': error = solaris_s(fd, cmd, arg); break;
-       case 't': error = solaris_t(fd, cmd, arg); break;
-       case 'f': error = sys_ioctl(fd, cmd, arg); break;
-       case 'm': error = solaris_m(fd, cmd, arg); break;
-       case 'O': error = solaris_O(fd, cmd, arg); break;
-       default:
-               error = -ENOSYS;
-               break;
-       }
-       unlock_kernel();
-       fput(filp);
-out:
-       if (error == -ENOSYS) {
-               unsigned char c = cmd>>8;
-               
-               if (c < ' ' || c > 126) c = '.';
-               printk("solaris_ioctl: Unknown cmd fd(%d) cmd(%08x '%c') arg(%08x)\n",
-                      (int)fd, (unsigned int)cmd, c, (unsigned int)arg);
-               error = -EINVAL;
-       }
-       return error;
-}
diff --git a/arch/sparc64/solaris/ipc.c b/arch/sparc64/solaris/ipc.c
deleted file mode 100644 (file)
index 499135f..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/* $Id: ipc.c,v 1.5 1999/12/09 00:41:00 davem Exp $
- * ipc.c: Solaris IPC emulation
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/wait.h>
-#include <linux/mm.h>
-#include <linux/shm.h>
-#include <linux/sem.h>
-#include <linux/msg.h>
-#include <linux/ipc.h>
-
-#include <asm/uaccess.h>
-#include <asm/string.h>
-
-#include "conv.h"
-
-struct solaris_ipc_perm {
-       s32     uid;
-       s32     gid;
-       s32     cuid;
-       s32     cgid;
-       u32     mode;
-       u32     seq;
-       int     key;
-       s32     pad[4];
-};
-
-struct solaris_shmid_ds {
-       struct solaris_ipc_perm shm_perm;
-       int                     shm_segsz;
-       u32                     shm_amp;
-       unsigned short          shm_lkcnt;
-       char                    __padxx[2];
-       s32                     shm_lpid;
-       s32                     shm_cpid;
-       u32                     shm_nattch;
-       u32                     shm_cnattch;
-       s32                     shm_atime;
-       s32                     shm_pad1;
-       s32                     shm_dtime;
-       s32                     shm_pad2;
-       s32                     shm_ctime;
-       s32                     shm_pad3;
-       unsigned short          shm_cv;
-       char                    shm_pad4[2];
-       u32                     shm_sptas;
-       s32                     shm_pad5[2];
-};
-
-asmlinkage long solaris_shmsys(int cmd, u32 arg1, u32 arg2, u32 arg3)
-{
-       int (*sys_ipc)(unsigned,int,int,unsigned long,void __user *,long) = 
-               (int (*)(unsigned,int,int,unsigned long,void __user *,long))SYS(ipc);
-       mm_segment_t old_fs;
-       unsigned long raddr;
-       int ret;
-               
-       switch (cmd) {
-       case 0: /* shmat */
-               old_fs = get_fs();
-               set_fs(KERNEL_DS);
-               ret = sys_ipc(SHMAT, arg1, arg3 & ~0x4000, (unsigned long)&raddr, A(arg2), 0);
-               set_fs(old_fs);
-               if (ret >= 0) return (u32)raddr;
-               else return ret;
-       case 1: /* shmctl */
-               switch (arg2) {
-               case 3: /* SHM_LOCK */
-               case 4: /* SHM_UNLOCK */
-                       return sys_ipc(SHMCTL, arg1, (arg2 == 3) ? SHM_LOCK : SHM_UNLOCK, 0, NULL, 0);
-               case 10: /* IPC_RMID */
-                       return sys_ipc(SHMCTL, arg1, IPC_RMID, 0, NULL, 0);
-               case 11: /* IPC_SET */
-                       {
-                               struct shmid_ds s;
-                               struct solaris_shmid_ds __user *p = A(arg3);
-                               
-                               if (get_user (s.shm_perm.uid, &p->shm_perm.uid) ||
-                                   __get_user (s.shm_perm.gid, &p->shm_perm.gid) || 
-                                   __get_user (s.shm_perm.mode, &p->shm_perm.mode))
-                                       return -EFAULT;
-                               old_fs = get_fs();
-                               set_fs(KERNEL_DS);
-                               ret = sys_ipc(SHMCTL, arg1, IPC_SET, 0, &s, 0);
-                               set_fs(old_fs);
-                               return ret;
-                       }
-               case 12: /* IPC_STAT */
-                       {
-                               struct shmid_ds s;
-                               struct solaris_shmid_ds __user *p = A(arg3);
-                               
-                               old_fs = get_fs();
-                               set_fs(KERNEL_DS);
-                               ret = sys_ipc(SHMCTL, arg1, IPC_SET, 0, &s, 0);
-                               set_fs(old_fs);
-                               if (put_user (s.shm_perm.uid, &(p->shm_perm.uid)) ||
-                                   __put_user (s.shm_perm.gid, &(p->shm_perm.gid)) || 
-                                   __put_user (s.shm_perm.cuid, &(p->shm_perm.cuid)) ||
-                                   __put_user (s.shm_perm.cgid, &(p->shm_perm.cgid)) || 
-                                   __put_user (s.shm_perm.mode, &(p->shm_perm.mode)) ||
-                                   __put_user (s.shm_perm.seq, &(p->shm_perm.seq)) ||
-                                   __put_user (s.shm_perm.key, &(p->shm_perm.key)) ||
-                                   __put_user (s.shm_segsz, &(p->shm_segsz)) ||
-                                   __put_user (s.shm_lpid, &(p->shm_lpid)) ||
-                                   __put_user (s.shm_cpid, &(p->shm_cpid)) ||
-                                   __put_user (s.shm_nattch, &(p->shm_nattch)) ||
-                                   __put_user (s.shm_atime, &(p->shm_atime)) ||
-                                   __put_user (s.shm_dtime, &(p->shm_dtime)) ||
-                                   __put_user (s.shm_ctime, &(p->shm_ctime)))
-                                       return -EFAULT;
-                               return ret;
-                       }
-               default: return -EINVAL;
-               }
-       case 2: /* shmdt */
-               return sys_ipc(SHMDT, 0, 0, 0, A(arg1), 0);
-       case 3: /* shmget */
-               return sys_ipc(SHMGET, arg1, arg2, arg3, NULL, 0);
-       }
-       return -EINVAL;
-}
diff --git a/arch/sparc64/solaris/misc.c b/arch/sparc64/solaris/misc.c
deleted file mode 100644 (file)
index d3e48e9..0000000
+++ /dev/null
@@ -1,786 +0,0 @@
-/* $Id: misc.c,v 1.36 2002/02/09 19:49:31 davem Exp $
- * misc.c: Miscellaneous syscall emulation for Solaris
- *
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-
-#include <linux/module.h> 
-#include <linux/types.h>
-#include <linux/utsname.h>
-#include <linux/limits.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/tty.h>
-#include <linux/mman.h>
-#include <linux/file.h>
-#include <linux/timex.h>
-#include <linux/major.h>
-#include <linux/compat.h>
-
-#include <asm/uaccess.h>
-#include <asm/string.h>
-#include <asm/oplib.h>
-#include <asm/idprom.h>
-#include <asm/smp.h>
-#include <asm/prom.h>
-
-#include "conv.h"
-
-/* Conversion from Linux to Solaris errnos. 0-34 are identity mapped.
-   Some Linux errnos (EPROCLIM, EDOTDOT, ERREMOTE, EUCLEAN, ENOTNAM, 
-   ENAVAIL, EISNAM, EREMOTEIO, ENOMEDIUM, EMEDIUMTYPE) have no Solaris
-   equivalents. I return EINVAL in that case, which is very wrong. If
-   someone suggest a better value for them, you're welcomed.
-   On the other side, Solaris ECANCELED and ENOTSUP have no Linux equivalents,
-   but that doesn't matter here. --jj */
-int solaris_err_table[] = {
-/* 0 */  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
-/* 10 */  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
-/* 20 */  20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
-/* 30 */  30, 31, 32, 33, 34, 22, 150, 149, 95, 96,
-/* 40 */  97, 98, 99, 120, 121, 122, 123, 124, 125, 126, 
-/* 50 */ 127, 128, 129, 130, 131, 132, 133, 134, 143, 144,
-/* 60 */ 145, 146, 90, 78, 147, 148, 93, 22, 94, 49,
-/* 70 */ 151, 66, 60, 62, 63, 35, 77, 36, 45, 46, 
-/* 80 */ 64, 22, 67, 68, 69, 70, 71, 74, 22, 82, 
-/* 90 */ 89, 92, 79, 81, 37, 38, 39, 40, 41, 42,
-/* 100 */ 43, 44, 50, 51, 52, 53, 54, 55, 56, 57,
-/* 110 */ 87, 61, 84, 65, 83, 80, 91, 22, 22, 22,
-/* 120 */ 22, 22, 88, 86, 85, 22, 22,
-};
-
-#define SOLARIS_NR_OPEN        256
-
-static u32 do_solaris_mmap(u32 addr, u32 len, u32 prot, u32 flags, u32 fd, u64 off)
-{
-       struct file *file = NULL;
-       unsigned long retval, ret_type;
-
-       /* Do we need it here? */
-       set_personality(PER_SVR4);
-       if (flags & MAP_NORESERVE) {
-               static int cnt;
-               
-               if (cnt < 5) {
-                       printk("%s:  unimplemented Solaris MAP_NORESERVE mmap() flag\n",
-                              current->comm);
-                       cnt++;
-               }
-               flags &= ~MAP_NORESERVE;
-       }
-       retval = -EBADF;
-       if(!(flags & MAP_ANONYMOUS)) {
-               if(fd >= SOLARIS_NR_OPEN)
-                       goto out;
-               file = fget(fd);
-               if (!file)
-                       goto out;
-               else {
-                       struct inode * inode = file->f_path.dentry->d_inode;
-                       if(imajor(inode) == MEM_MAJOR &&
-                          iminor(inode) == 5) {
-                               flags |= MAP_ANONYMOUS;
-                               fput(file);
-                               file = NULL;
-                       }
-               }
-       }
-
-       retval = -EINVAL;
-       len = PAGE_ALIGN(len);
-       if(!(flags & MAP_FIXED))
-               addr = 0;
-       else if (len > STACK_TOP32 || addr > STACK_TOP32 - len)
-               goto out_putf;
-       ret_type = flags & _MAP_NEW;
-       flags &= ~_MAP_NEW;
-
-       down_write(&current->mm->mmap_sem);
-       flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-       retval = do_mmap(file,
-                        (unsigned long) addr, (unsigned long) len,
-                        (unsigned long) prot, (unsigned long) flags, off);
-       up_write(&current->mm->mmap_sem);
-       if(!ret_type)
-               retval = ((retval < STACK_TOP32) ? 0 : retval);
-                               
-out_putf:
-       if (file)
-               fput(file);
-out:
-       return (u32) retval;
-}
-
-asmlinkage u32 solaris_mmap(u32 addr, u32 len, u32 prot, u32 flags, u32 fd, u32 off)
-{
-       return do_solaris_mmap(addr, len, prot, flags, fd, (u64) off);
-}
-
-asmlinkage u32 solaris_mmap64(struct pt_regs *regs, u32 len, u32 prot, u32 flags, u32 fd, u32 offhi)
-{
-       u32 offlo;
-       
-       if (regs->u_regs[UREG_G1]) {
-               if (get_user (offlo, (u32 __user *)(long)((u32)regs->u_regs[UREG_I6] + 0x5c)))
-                       return -EFAULT;
-       } else {
-               if (get_user (offlo, (u32 __user *)(long)((u32)regs->u_regs[UREG_I6] + 0x60)))
-                       return -EFAULT;
-       }
-       return do_solaris_mmap((u32)regs->u_regs[UREG_I0], len, prot, flags, fd, (((u64)offhi)<<32)|offlo);
-}
-
-asmlinkage int solaris_brk(u32 brk)
-{
-       int (*sunos_brk)(u32) = (int (*)(u32))SUNOS(17);
-       
-       return sunos_brk(brk);
-}
-
-static int __set_utsfield(char __user *to, int to_size,
-                         const char *from, int from_size,
-                         int dotchop, int countfrom)
-{
-       int len = countfrom ? (to_size > from_size ?
-                              from_size : to_size) : to_size;
-       int off;
-
-       if (copy_to_user(to, from, len))
-               return -EFAULT;
-
-       off = len < to_size? len: len - 1;
-       if (dotchop) {
-               const char *p = strnchr(from, len, '.');
-               if (p) off = p - from;
-       }
-
-       if (__put_user('\0', to + off))
-               return -EFAULT;
-
-       return 0;
-}
-
-#define set_utsfield(to, from, dotchop, countfrom) \
-       __set_utsfield((to), sizeof(to), \
-                      (from), sizeof(from), \
-                      (dotchop), (countfrom))
-
-struct sol_uname {
-       char sysname[9];
-       char nodename[9];
-       char release[9];
-       char version[9];
-       char machine[9];
-};
-
-struct sol_utsname {
-       char sysname[257];
-       char nodename[257];
-       char release[257];
-       char version[257];
-       char machine[257];
-};
-
-static char *machine(void)
-{
-       switch (sparc_cpu_model) {
-       case sun4: return "sun4";
-       case sun4c: return "sun4c";
-       case sun4e: return "sun4e";
-       case sun4m: return "sun4m";
-       case sun4d: return "sun4d";
-       case sun4u: return "sun4u";
-       default: return "sparc";
-       }
-}
-
-static char *platform(char *buffer, int sz)
-{
-       struct device_node *dp = of_find_node_by_path("/");
-       int len;
-
-       *buffer = 0;
-       len = strlen(dp->name);
-       if (len > sz)
-               len = sz;
-       memcpy(buffer, dp->name, len);
-       buffer[len] = 0;
-       if (*buffer) {
-               char *p;
-
-               for (p = buffer; *p; p++)
-                       if (*p == '/' || *p == ' ') *p = '_';
-               return buffer;
-       }
-
-       return "sun4u";
-}
-
-static char *serial(char *buffer, int sz)
-{
-       struct device_node *dp = of_find_node_by_path("/options");
-       int len;
-
-       *buffer = 0;
-       if (dp) {
-               const char *val =
-                       of_get_property(dp, "system-board-serial#", &len);
-
-               if (val && len > 0) {
-                       if (len > sz)
-                               len = sz;
-                       memcpy(buffer, val, len);
-                       buffer[len] = 0;
-               }
-       }
-       if (!*buffer)
-               return "4512348717234";
-       else
-               return buffer;
-}
-
-asmlinkage int solaris_utssys(u32 buf, u32 flags, int which, u32 buf2)
-{
-       struct sol_uname __user *v = A(buf);
-       int err;
-
-       switch (which) {
-       case 0: /* old uname */
-               /* Let's cheat */
-               err  = set_utsfield(v->sysname, "SunOS", 1, 0);
-               down_read(&uts_sem);
-               err |= set_utsfield(v->nodename, utsname()->nodename,
-                                   1, 1);
-               up_read(&uts_sem);
-               err |= set_utsfield(v->release, "2.6", 0, 0);
-               err |= set_utsfield(v->version, "Generic", 0, 0);
-               err |= set_utsfield(v->machine, machine(), 0, 0);
-               return (err ? -EFAULT : 0);
-       case 2: /* ustat */
-               return -ENOSYS;
-       case 3: /* fusers */
-               return -ENOSYS;
-       default:
-               return -ENOSYS;
-       }
-}
-
-asmlinkage int solaris_utsname(u32 buf)
-{
-       struct sol_utsname __user *v = A(buf);
-       int err;
-
-       /* Why should we not lie a bit? */
-       down_read(&uts_sem);
-       err  = set_utsfield(v->sysname, "SunOS", 0, 0);
-       err |= set_utsfield(v->nodename, utsname()->nodename, 1, 1);
-       err |= set_utsfield(v->release, "5.6", 0, 0);
-       err |= set_utsfield(v->version, "Generic", 0, 0);
-       err |= set_utsfield(v->machine, machine(), 0, 0);
-       up_read(&uts_sem);
-
-       return (err ? -EFAULT : 0);
-}
-
-#define SI_SYSNAME             1       /* return name of operating system */
-#define SI_HOSTNAME            2       /* return name of node */
-#define SI_RELEASE             3       /* return release of operating system */
-#define SI_VERSION             4       /* return version field of utsname */
-#define SI_MACHINE             5       /* return kind of machine */
-#define SI_ARCHITECTURE                6       /* return instruction set arch */
-#define SI_HW_SERIAL           7       /* return hardware serial number */
-#define SI_HW_PROVIDER         8       /* return hardware manufacturer */
-#define SI_SRPC_DOMAIN         9       /* return secure RPC domain */
-#define SI_PLATFORM            513     /* return platform identifier */
-
-asmlinkage int solaris_sysinfo(int cmd, u32 buf, s32 count)
-{
-       char *p, *q, *r;
-       char buffer[256];
-       int len;
-       
-       /* Again, we cheat :)) */
-       switch (cmd) {
-       case SI_SYSNAME: r = "SunOS"; break;
-       case SI_HOSTNAME:
-               r = buffer + 256;
-               down_read(&uts_sem);
-               for (p = utsname()->nodename, q = buffer;
-                    q < r && *p && *p != '.'; *q++ = *p++);
-               up_read(&uts_sem);
-               *q = 0;
-               r = buffer;
-               break;
-       case SI_RELEASE: r = "5.6"; break;
-       case SI_MACHINE: r = machine(); break;
-       case SI_ARCHITECTURE: r = "sparc"; break;
-       case SI_HW_PROVIDER: r = "Sun_Microsystems"; break;
-       case SI_HW_SERIAL: r = serial(buffer, sizeof(buffer)); break;
-       case SI_PLATFORM: r = platform(buffer, sizeof(buffer)); break;
-       case SI_SRPC_DOMAIN: r = ""; break;
-       case SI_VERSION: r = "Generic"; break;
-       default: return -EINVAL;
-       }
-       len = strlen(r) + 1;
-       if (count < len) {
-               if (copy_to_user(A(buf), r, count - 1) ||
-                   __put_user(0, (char __user *)A(buf) + count - 1))
-                       return -EFAULT;
-       } else {
-               if (copy_to_user(A(buf), r, len))
-                       return -EFAULT;
-       }
-       return len;
-}
-
-#define        SOLARIS_CONFIG_NGROUPS                  2
-#define        SOLARIS_CONFIG_CHILD_MAX                3
-#define        SOLARIS_CONFIG_OPEN_FILES               4
-#define        SOLARIS_CONFIG_POSIX_VER                5
-#define        SOLARIS_CONFIG_PAGESIZE                 6
-#define        SOLARIS_CONFIG_CLK_TCK                  7
-#define        SOLARIS_CONFIG_XOPEN_VER                8
-#define        SOLARIS_CONFIG_PROF_TCK                 10
-#define        SOLARIS_CONFIG_NPROC_CONF               11
-#define        SOLARIS_CONFIG_NPROC_ONLN               12
-#define        SOLARIS_CONFIG_AIO_LISTIO_MAX           13
-#define        SOLARIS_CONFIG_AIO_MAX                  14
-#define        SOLARIS_CONFIG_AIO_PRIO_DELTA_MAX       15
-#define        SOLARIS_CONFIG_DELAYTIMER_MAX           16
-#define        SOLARIS_CONFIG_MQ_OPEN_MAX              17
-#define        SOLARIS_CONFIG_MQ_PRIO_MAX              18
-#define        SOLARIS_CONFIG_RTSIG_MAX                19
-#define        SOLARIS_CONFIG_SEM_NSEMS_MAX            20
-#define        SOLARIS_CONFIG_SEM_VALUE_MAX            21
-#define        SOLARIS_CONFIG_SIGQUEUE_MAX             22
-#define        SOLARIS_CONFIG_SIGRT_MIN                23
-#define        SOLARIS_CONFIG_SIGRT_MAX                24
-#define        SOLARIS_CONFIG_TIMER_MAX                25
-#define        SOLARIS_CONFIG_PHYS_PAGES               26
-#define        SOLARIS_CONFIG_AVPHYS_PAGES             27
-
-asmlinkage int solaris_sysconf(int id)
-{
-       switch (id) {
-       case SOLARIS_CONFIG_NGROUPS:    return NGROUPS_MAX;
-       case SOLARIS_CONFIG_CHILD_MAX:
-               return current->signal->rlim[RLIMIT_NPROC].rlim_cur;
-       case SOLARIS_CONFIG_OPEN_FILES:
-               return current->signal->rlim[RLIMIT_NOFILE].rlim_cur;
-       case SOLARIS_CONFIG_POSIX_VER:  return 199309;
-       case SOLARIS_CONFIG_PAGESIZE:   return PAGE_SIZE;
-       case SOLARIS_CONFIG_XOPEN_VER:  return 3;
-       case SOLARIS_CONFIG_CLK_TCK:
-       case SOLARIS_CONFIG_PROF_TCK:
-               return sparc64_get_clock_tick(smp_processor_id());
-#ifdef CONFIG_SMP      
-       case SOLARIS_CONFIG_NPROC_CONF: return NR_CPUS;
-       case SOLARIS_CONFIG_NPROC_ONLN: return num_online_cpus();
-#else
-       case SOLARIS_CONFIG_NPROC_CONF: return 1;
-       case SOLARIS_CONFIG_NPROC_ONLN: return 1;
-#endif
-       case SOLARIS_CONFIG_SIGRT_MIN:          return 37;
-       case SOLARIS_CONFIG_SIGRT_MAX:          return 44;
-       case SOLARIS_CONFIG_PHYS_PAGES:
-       case SOLARIS_CONFIG_AVPHYS_PAGES:
-               {
-                       struct sysinfo s;
-                       
-                       si_meminfo(&s);
-                       if (id == SOLARIS_CONFIG_PHYS_PAGES)
-                               return s.totalram >>= PAGE_SHIFT;
-                       else
-                               return s.freeram >>= PAGE_SHIFT;
-               }
-       /* XXX support these as well -jj */
-       case SOLARIS_CONFIG_AIO_LISTIO_MAX:     return -EINVAL;
-       case SOLARIS_CONFIG_AIO_MAX:            return -EINVAL;
-       case SOLARIS_CONFIG_AIO_PRIO_DELTA_MAX: return -EINVAL;
-       case SOLARIS_CONFIG_DELAYTIMER_MAX:     return -EINVAL;
-       case SOLARIS_CONFIG_MQ_OPEN_MAX:        return -EINVAL;
-       case SOLARIS_CONFIG_MQ_PRIO_MAX:        return -EINVAL;
-       case SOLARIS_CONFIG_RTSIG_MAX:          return -EINVAL;
-       case SOLARIS_CONFIG_SEM_NSEMS_MAX:      return -EINVAL;
-       case SOLARIS_CONFIG_SEM_VALUE_MAX:      return -EINVAL;
-       case SOLARIS_CONFIG_SIGQUEUE_MAX:       return -EINVAL;
-       case SOLARIS_CONFIG_TIMER_MAX:          return -EINVAL;
-       default: return -EINVAL;
-       }
-}
-
-asmlinkage int solaris_procids(int cmd, s32 pid, s32 pgid)
-{
-       int ret;
-       
-       switch (cmd) {
-       case 0: /* getpgrp */
-               return task_pgrp_vnr(current);
-       case 1: /* setpgrp */
-               {
-                       int (*sys_setpgid)(pid_t,pid_t) =
-                               (int (*)(pid_t,pid_t))SYS(setpgid);
-                               
-                       /* can anyone explain me the difference between
-                          Solaris setpgrp and setsid? */
-                       ret = sys_setpgid(0, 0);
-                       if (ret) return ret;
-                       proc_clear_tty(current);
-                       return task_pgrp_vnr(current);
-               }
-       case 2: /* getsid */
-               {
-                       int (*sys_getsid)(pid_t) = (int (*)(pid_t))SYS(getsid);
-                       return sys_getsid(pid);
-               }
-       case 3: /* setsid */
-               {
-                       int (*sys_setsid)(void) = (int (*)(void))SYS(setsid);
-                       return sys_setsid();
-               }
-       case 4: /* getpgid */
-               {
-                       int (*sys_getpgid)(pid_t) = (int (*)(pid_t))SYS(getpgid);
-                       return sys_getpgid(pid);
-               }
-       case 5: /* setpgid */
-               {
-                       int (*sys_setpgid)(pid_t,pid_t) = 
-                               (int (*)(pid_t,pid_t))SYS(setpgid);
-                       return sys_setpgid(pid,pgid);
-               }
-       }
-       return -EINVAL;
-}
-
-asmlinkage int solaris_gettimeofday(u32 tim)
-{
-       int (*sys_gettimeofday)(struct timeval *, struct timezone *) =
-               (int (*)(struct timeval *, struct timezone *))SYS(gettimeofday);
-               
-       return sys_gettimeofday((struct timeval *)(u64)tim, NULL);
-}
-
-#define RLIM_SOL_INFINITY32    0x7fffffff
-#define RLIM_SOL_SAVED_MAX32   0x7ffffffe
-#define RLIM_SOL_SAVED_CUR32   0x7ffffffd
-#define RLIM_SOL_INFINITY      ((u64)-3)
-#define RLIM_SOL_SAVED_MAX     ((u64)-2)
-#define RLIM_SOL_SAVED_CUR     ((u64)-1)
-#define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
-#define RLIMIT_SOL_NOFILE      5
-#define RLIMIT_SOL_VMEM                6
-
-struct rlimit32 {
-       u32     rlim_cur;
-       u32     rlim_max;
-};
-
-asmlinkage int solaris_getrlimit(unsigned int resource, struct rlimit32 __user *rlim)
-{
-       struct rlimit r;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       int (*sys_getrlimit)(unsigned int, struct rlimit *) =
-               (int (*)(unsigned int, struct rlimit *))SYS(getrlimit);
-
-       if (resource > RLIMIT_SOL_VMEM)
-               return -EINVAL; 
-       switch (resource) {
-       case RLIMIT_SOL_NOFILE: resource = RLIMIT_NOFILE; break;
-       case RLIMIT_SOL_VMEM: resource = RLIMIT_AS; break;
-       default: break;
-       }
-       set_fs (KERNEL_DS);
-       ret = sys_getrlimit(resource, &r);
-       set_fs (old_fs);
-       if (!ret) {
-               if (r.rlim_cur == RLIM_INFINITY)
-                       r.rlim_cur = RLIM_SOL_INFINITY32;
-               else if ((u64)r.rlim_cur > RLIM_SOL_INFINITY32)
-                       r.rlim_cur = RLIM_SOL_SAVED_CUR32;
-               if (r.rlim_max == RLIM_INFINITY)
-                       r.rlim_max = RLIM_SOL_INFINITY32;
-               else if ((u64)r.rlim_max > RLIM_SOL_INFINITY32)
-                       r.rlim_max = RLIM_SOL_SAVED_MAX32;
-               ret = put_user (r.rlim_cur, &rlim->rlim_cur);
-               ret |= __put_user (r.rlim_max, &rlim->rlim_max);
-       }
-       return ret;
-}
-
-asmlinkage int solaris_setrlimit(unsigned int resource, struct rlimit32 __user *rlim)
-{
-       struct rlimit r, rold;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       int (*sys_getrlimit)(unsigned int, struct rlimit __user *) =
-               (int (*)(unsigned int, struct rlimit __user *))SYS(getrlimit);
-       int (*sys_setrlimit)(unsigned int, struct rlimit __user *) =
-               (int (*)(unsigned int, struct rlimit __user *))SYS(setrlimit);
-
-       if (resource > RLIMIT_SOL_VMEM)
-               return -EINVAL; 
-       switch (resource) {
-       case RLIMIT_SOL_NOFILE: resource = RLIMIT_NOFILE; break;
-       case RLIMIT_SOL_VMEM: resource = RLIMIT_AS; break;
-       default: break;
-       }
-       if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
-           __get_user (r.rlim_max, &rlim->rlim_max))
-               return -EFAULT;
-       set_fs (KERNEL_DS);
-       ret = sys_getrlimit(resource, &rold);
-       if (!ret) {
-               if (r.rlim_cur == RLIM_SOL_INFINITY32)
-                       r.rlim_cur = RLIM_INFINITY;
-               else if (r.rlim_cur == RLIM_SOL_SAVED_CUR32)
-                       r.rlim_cur = rold.rlim_cur;
-               else if (r.rlim_cur == RLIM_SOL_SAVED_MAX32)
-                       r.rlim_cur = rold.rlim_max;
-               if (r.rlim_max == RLIM_SOL_INFINITY32)
-                       r.rlim_max = RLIM_INFINITY;
-               else if (r.rlim_max == RLIM_SOL_SAVED_CUR32)
-                       r.rlim_max = rold.rlim_cur;
-               else if (r.rlim_max == RLIM_SOL_SAVED_MAX32)
-                       r.rlim_max = rold.rlim_max;
-               ret = sys_setrlimit(resource, &r);
-       }
-       set_fs (old_fs);
-       return ret;
-}
-
-asmlinkage int solaris_getrlimit64(unsigned int resource, struct rlimit __user *rlim)
-{
-       struct rlimit r;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       int (*sys_getrlimit)(unsigned int, struct rlimit __user *) =
-               (int (*)(unsigned int, struct rlimit __user *))SYS(getrlimit);
-
-       if (resource > RLIMIT_SOL_VMEM)
-               return -EINVAL; 
-       switch (resource) {
-       case RLIMIT_SOL_NOFILE: resource = RLIMIT_NOFILE; break;
-       case RLIMIT_SOL_VMEM: resource = RLIMIT_AS; break;
-       default: break;
-       }
-       set_fs (KERNEL_DS);
-       ret = sys_getrlimit(resource, &r);
-       set_fs (old_fs);
-       if (!ret) {
-               if (r.rlim_cur == RLIM_INFINITY)
-                       r.rlim_cur = RLIM_SOL_INFINITY;
-               if (r.rlim_max == RLIM_INFINITY)
-                       r.rlim_max = RLIM_SOL_INFINITY;
-               ret = put_user (r.rlim_cur, &rlim->rlim_cur);
-               ret |= __put_user (r.rlim_max, &rlim->rlim_max);
-       }
-       return ret;
-}
-
-asmlinkage int solaris_setrlimit64(unsigned int resource, struct rlimit __user *rlim)
-{
-       struct rlimit r, rold;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       int (*sys_getrlimit)(unsigned int, struct rlimit __user *) =
-               (int (*)(unsigned int, struct rlimit __user *))SYS(getrlimit);
-       int (*sys_setrlimit)(unsigned int, struct rlimit __user *) =
-               (int (*)(unsigned int, struct rlimit __user *))SYS(setrlimit);
-
-       if (resource > RLIMIT_SOL_VMEM)
-               return -EINVAL; 
-       switch (resource) {
-       case RLIMIT_SOL_NOFILE: resource = RLIMIT_NOFILE; break;
-       case RLIMIT_SOL_VMEM: resource = RLIMIT_AS; break;
-       default: break;
-       }
-       if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
-           __get_user (r.rlim_max, &rlim->rlim_max))
-               return -EFAULT;
-       set_fs (KERNEL_DS);
-       ret = sys_getrlimit(resource, &rold);
-       if (!ret) {
-               if (r.rlim_cur == RLIM_SOL_INFINITY)
-                       r.rlim_cur = RLIM_INFINITY;
-               else if (r.rlim_cur == RLIM_SOL_SAVED_CUR)
-                       r.rlim_cur = rold.rlim_cur;
-               else if (r.rlim_cur == RLIM_SOL_SAVED_MAX)
-                       r.rlim_cur = rold.rlim_max;
-               if (r.rlim_max == RLIM_SOL_INFINITY)
-                       r.rlim_max = RLIM_INFINITY;
-               else if (r.rlim_max == RLIM_SOL_SAVED_CUR)
-                       r.rlim_max = rold.rlim_cur;
-               else if (r.rlim_max == RLIM_SOL_SAVED_MAX)
-                       r.rlim_max = rold.rlim_max;
-               ret = sys_setrlimit(resource, &r);
-       }
-       set_fs (old_fs);
-       return ret;
-}
-
-struct sol_ntptimeval {
-       struct compat_timeval time;
-       s32 maxerror;
-       s32 esterror;
-};
-
-struct sol_timex {
-       u32 modes;
-       s32 offset;
-       s32 freq;
-       s32 maxerror;
-       s32 esterror;
-       s32 status;
-       s32 constant;
-       s32 precision;
-       s32 tolerance;
-       s32 ppsfreq;
-       s32 jitter;
-       s32 shift;
-       s32 stabil;
-       s32 jitcnt;
-       s32 calcnt;
-       s32 errcnt;
-       s32 stbcnt;
-};
-
-asmlinkage int solaris_ntp_gettime(struct sol_ntptimeval __user *ntp)
-{
-       int (*sys_adjtimex)(struct timex __user *) =
-               (int (*)(struct timex __user *))SYS(adjtimex);
-       struct timex t;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       
-       set_fs(KERNEL_DS);
-       t.modes = 0;
-       ret = sys_adjtimex(&t);
-       set_fs(old_fs);
-       if (ret < 0)
-               return ret;
-       ret = put_user (t.time.tv_sec, &ntp->time.tv_sec);
-       ret |= __put_user (t.time.tv_usec, &ntp->time.tv_usec);
-       ret |= __put_user (t.maxerror, &ntp->maxerror);
-       ret |= __put_user (t.esterror, &ntp->esterror);
-       return ret;                             
-}
-
-asmlinkage int solaris_ntp_adjtime(struct sol_timex __user *txp)
-{
-       int (*sys_adjtimex)(struct timex __user *) =
-               (int (*)(struct timex __user *))SYS(adjtimex);
-       struct timex t;
-       int ret, err;
-       mm_segment_t old_fs = get_fs();
-
-       ret = get_user (t.modes, &txp->modes);
-       ret |= __get_user (t.offset, &txp->offset);
-       ret |= __get_user (t.freq, &txp->freq);
-       ret |= __get_user (t.maxerror, &txp->maxerror);
-       ret |= __get_user (t.esterror, &txp->esterror);
-       ret |= __get_user (t.status, &txp->status);
-       ret |= __get_user (t.constant, &txp->constant);
-       set_fs(KERNEL_DS);
-       ret = sys_adjtimex(&t);
-       set_fs(old_fs);
-       if (ret < 0)
-               return ret;
-       err = put_user (t.offset, &txp->offset);
-       err |= __put_user (t.freq, &txp->freq);
-       err |= __put_user (t.maxerror, &txp->maxerror);
-       err |= __put_user (t.esterror, &txp->esterror);
-       err |= __put_user (t.status, &txp->status);
-       err |= __put_user (t.constant, &txp->constant);
-       err |= __put_user (t.precision, &txp->precision);
-       err |= __put_user (t.tolerance, &txp->tolerance);
-       err |= __put_user (t.ppsfreq, &txp->ppsfreq);
-       err |= __put_user (t.jitter, &txp->jitter);
-       err |= __put_user (t.shift, &txp->shift);
-       err |= __put_user (t.stabil, &txp->stabil);
-       err |= __put_user (t.jitcnt, &txp->jitcnt);
-       err |= __put_user (t.calcnt, &txp->calcnt);
-       err |= __put_user (t.errcnt, &txp->errcnt);
-       err |= __put_user (t.stbcnt, &txp->stbcnt);
-       if (err)
-               return -EFAULT;
-       return ret;
-}
-
-asmlinkage int do_sol_unimplemented(struct pt_regs *regs)
-{
-       printk ("Unimplemented Solaris syscall %d %08x %08x %08x %08x\n", 
-                       (int)regs->u_regs[UREG_G1], 
-                       (int)regs->u_regs[UREG_I0],
-                       (int)regs->u_regs[UREG_I1],
-                       (int)regs->u_regs[UREG_I2],
-                       (int)regs->u_regs[UREG_I3]);
-       return -ENOSYS;
-}
-
-asmlinkage void solaris_register(void)
-{
-       set_personality(PER_SVR4);
-}
-
-extern long solaris_to_linux_signals[], linux_to_solaris_signals[];
-
-struct exec_domain solaris_exec_domain = {
-       .name =         "Solaris",
-       .handler =      NULL,
-       .pers_low =     1,              /* PER_SVR4 personality */
-       .pers_high =    1,
-       .signal_map =   solaris_to_linux_signals,
-       .signal_invmap =linux_to_solaris_signals,
-       .module =       THIS_MODULE,
-       .next =         NULL
-};
-
-extern int init_socksys(void);
-
-MODULE_AUTHOR("Jakub Jelinek (jj@ultra.linux.cz), Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)");
-MODULE_DESCRIPTION("Solaris binary emulation module");
-MODULE_LICENSE("GPL");
-
-extern u32 tl0_solaris[8];
-#define update_ttable(x)                                                                               \
-       tl0_solaris[3] = (((long)(x) - (long)tl0_solaris - 3) >> 2) | 0x40000000;                       \
-       wmb();          \
-       __asm__ __volatile__ ("flush %0" : : "r" (&tl0_solaris[3]))
-
-extern u32 solaris_sparc_syscall[];
-extern u32 solaris_syscall[];
-extern void cleanup_socksys(void);
-
-extern u32 entry64_personality_patch;
-
-static int __init solaris_init(void)
-{
-       int ret;
-
-       SOLDD(("Solaris module at %p\n", solaris_sparc_syscall));
-       register_exec_domain(&solaris_exec_domain);
-       if ((ret = init_socksys())) {
-               unregister_exec_domain(&solaris_exec_domain);
-               return ret;
-       }
-       update_ttable(solaris_sparc_syscall);
-       entry64_personality_patch |=
-               (offsetof(struct task_struct, personality) +
-                (sizeof(unsigned long) - 1));
-       wmb();
-       __asm__ __volatile__("flush %0"
-                            : : "r" (&entry64_personality_patch));
-       return 0;
-}
-
-static void __exit solaris_exit(void)
-{
-       update_ttable(solaris_syscall);
-       cleanup_socksys();
-       unregister_exec_domain(&solaris_exec_domain);
-}
-
-module_init(solaris_init);
-module_exit(solaris_exit);
diff --git a/arch/sparc64/solaris/signal.c b/arch/sparc64/solaris/signal.c
deleted file mode 100644 (file)
index de10c97..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-/* $Id: signal.c,v 1.7 2000/09/05 21:44:54 davem Exp $
- * signal.c: Signal emulation for Solaris
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-
-#include <linux/types.h>
-#include <linux/errno.h>
-
-#include <asm/uaccess.h>
-#include <asm/svr4.h>
-#include <asm/string.h>
-
-#include "conv.h"
-#include "signal.h"
-
-#define _S(nr) (1L<<((nr)-1))
-
-#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP)))
-
-long linux_to_solaris_signals[] = {
-        0,
-       SOLARIS_SIGHUP,         SOLARIS_SIGINT, 
-       SOLARIS_SIGQUIT,        SOLARIS_SIGILL,
-       SOLARIS_SIGTRAP,        SOLARIS_SIGIOT,
-       SOLARIS_SIGEMT,         SOLARIS_SIGFPE,
-       SOLARIS_SIGKILL,        SOLARIS_SIGBUS,
-       SOLARIS_SIGSEGV,        SOLARIS_SIGSYS,
-       SOLARIS_SIGPIPE,        SOLARIS_SIGALRM,
-       SOLARIS_SIGTERM,        SOLARIS_SIGURG,
-       SOLARIS_SIGSTOP,        SOLARIS_SIGTSTP,
-       SOLARIS_SIGCONT,        SOLARIS_SIGCLD,
-       SOLARIS_SIGTTIN,        SOLARIS_SIGTTOU,
-       SOLARIS_SIGPOLL,        SOLARIS_SIGXCPU,
-       SOLARIS_SIGXFSZ,        SOLARIS_SIGVTALRM,
-       SOLARIS_SIGPROF,        SOLARIS_SIGWINCH,
-       SOLARIS_SIGUSR1,        SOLARIS_SIGUSR1,
-       SOLARIS_SIGUSR2,        -1,
-};
-
-long solaris_to_linux_signals[] = {
-        0,
-        SIGHUP,                SIGINT,         SIGQUIT,        SIGILL,
-        SIGTRAP,       SIGIOT,         SIGEMT,         SIGFPE,
-        SIGKILL,       SIGBUS,         SIGSEGV,        SIGSYS,
-        SIGPIPE,       SIGALRM,        SIGTERM,        SIGUSR1,
-        SIGUSR2,       SIGCHLD,        -1,             SIGWINCH,
-        SIGURG,                SIGPOLL,        SIGSTOP,        SIGTSTP,
-        SIGCONT,       SIGTTIN,        SIGTTOU,        SIGVTALRM,
-        SIGPROF,       SIGXCPU,        SIGXFSZ,        -1,
-       -1,             -1,             -1,             -1,
-       -1,             -1,             -1,             -1,
-       -1,             -1,             -1,             -1,
-};
-
-static inline long mapsig(long sig)
-{
-       if ((unsigned long)sig > SOLARIS_NSIGNALS)
-               return -EINVAL;
-       return solaris_to_linux_signals[sig];
-}
-
-asmlinkage int solaris_kill(int pid, int sig)
-{
-       int (*sys_kill)(int,int) = 
-               (int (*)(int,int))SYS(kill);
-       int s = mapsig(sig);
-       
-       if (s < 0) return s;
-       return sys_kill(pid, s);
-}
-
-static long sig_handler(int sig, u32 arg, int one_shot)
-{
-       struct sigaction sa, old;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       int (*sys_sigaction)(int,struct sigaction __user *,struct sigaction __user *) = 
-               (int (*)(int,struct sigaction __user *,struct sigaction __user *))SYS(sigaction);
-       
-       sigemptyset(&sa.sa_mask);
-       sa.sa_restorer = NULL;
-       sa.sa_handler = (__sighandler_t)A(arg);
-       sa.sa_flags = 0;
-       if (one_shot) sa.sa_flags = SA_ONESHOT | SA_NOMASK;
-       set_fs (KERNEL_DS);
-       ret = sys_sigaction(sig, (void __user *)&sa, (void __user *)&old);
-       set_fs (old_fs);
-       if (ret < 0) return ret;
-       return (u32)(unsigned long)old.sa_handler;
-}
-
-static inline long solaris_signal(int sig, u32 arg)
-{
-       return sig_handler (sig, arg, 1);
-}
-
-static long solaris_sigset(int sig, u32 arg)
-{
-       if (arg != 2) /* HOLD */ {
-               spin_lock_irq(&current->sighand->siglock);
-               sigdelsetmask(&current->blocked, _S(sig));
-               recalc_sigpending();
-               spin_unlock_irq(&current->sighand->siglock);
-               return sig_handler (sig, arg, 0);
-       } else {
-               spin_lock_irq(&current->sighand->siglock);
-               sigaddsetmask(&current->blocked, (_S(sig) & ~_BLOCKABLE));
-               recalc_sigpending();
-               spin_unlock_irq(&current->sighand->siglock);
-               return 0;
-       }
-}
-
-static inline long solaris_sighold(int sig)
-{
-       return solaris_sigset(sig, 2);
-}
-
-static inline long solaris_sigrelse(int sig)
-{
-       spin_lock_irq(&current->sighand->siglock);
-       sigdelsetmask(&current->blocked, _S(sig));
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
-       return 0;
-}
-
-static inline long solaris_sigignore(int sig)
-{
-       return sig_handler(sig, (u32)(unsigned long)SIG_IGN, 0);
-}
-
-static inline long solaris_sigpause(int sig)
-{
-       printk ("Need to support solaris sigpause\n");
-       return -ENOSYS;
-}
-
-asmlinkage long solaris_sigfunc(int sig, u32 arg)
-{
-       int func = sig & ~0xff;
-       
-       sig = mapsig(sig & 0xff); 
-       if (sig < 0) return sig; 
-       switch (func) {
-       case 0: return solaris_signal(sig, arg); 
-       case 0x100: return solaris_sigset(sig, arg); 
-       case 0x200: return solaris_sighold(sig);
-       case 0x400: return solaris_sigrelse(sig); 
-       case 0x800: return solaris_sigignore(sig); 
-       case 0x1000: return solaris_sigpause(sig);
-       }
-       return -EINVAL;
-}
-
-typedef struct {
-       u32 __sigbits[4];
-} sol_sigset_t;
-
-static inline int mapin(u32 *p, sigset_t *q)
-{
-       int i;
-       u32 x;
-       int sig;
-       
-       sigemptyset(q);
-       x = p[0];
-       for (i = 1; i <= SOLARIS_NSIGNALS; i++) {
-               if (x & 1) {
-                       sig = solaris_to_linux_signals[i];
-                       if (sig == -1)
-                               return -EINVAL;
-                       sigaddsetmask(q, (1L << (sig - 1)));
-               }
-               x >>= 1;
-               if (i == 32)
-                       x = p[1];
-       }
-       return 0;
-}
-
-static inline int mapout(sigset_t *q, u32 *p)
-{
-       int i;
-       int sig;
-       
-       p[0] = 0;
-       p[1] = 0;
-       for (i = 1; i <= 32; i++) {
-               if (sigismember(q, sigmask(i))) {
-                       sig = linux_to_solaris_signals[i];
-                       if (sig == -1)
-                               return -EINVAL;
-                       if (sig > 32)
-                               p[1] |= 1L << (sig - 33);
-                       else
-                               p[0] |= 1L << (sig - 1);
-               }
-       }
-       return 0;
-}
-
-asmlinkage int solaris_sigprocmask(int how, u32 in, u32 out)
-{
-       sigset_t in_s, *ins, out_s, *outs;
-       mm_segment_t old_fs = get_fs();
-       int ret;
-       int (*sys_sigprocmask)(int,sigset_t __user *,sigset_t __user *) = 
-               (int (*)(int,sigset_t __user *,sigset_t __user *))SYS(sigprocmask);
-       
-       ins = NULL; outs = NULL;
-       if (in) {
-               u32 tmp[2];
-               
-               if (copy_from_user (tmp, (void __user *)A(in), 2*sizeof(u32)))
-                       return -EFAULT;
-               ins = &in_s;
-               if (mapin (tmp, ins)) return -EINVAL;
-       }
-       if (out) outs = &out_s;
-       set_fs (KERNEL_DS);
-       ret = sys_sigprocmask((how == 3) ? SIG_SETMASK : how,
-                               (void __user *)ins, (void __user *)outs);
-       set_fs (old_fs);
-       if (ret) return ret;
-       if (out) {
-               u32 tmp[4];
-               
-               tmp[2] = 0; tmp[3] = 0;
-               if (mapout (outs, tmp)) return -EINVAL;
-               if (copy_to_user((void __user *)A(out), tmp, 4*sizeof(u32)))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-asmlinkage long do_sol_sigsuspend(u32 mask)
-{
-       sigset_t s;
-       u32 tmp[2];
-               
-       if (copy_from_user (tmp, (sol_sigset_t __user *)A(mask), 2*sizeof(u32)))
-               return -EFAULT;
-       if (mapin (tmp, &s)) return -EINVAL;
-       return (long)s.sig[0];
-}
-
-struct sol_sigaction {
-       int     sa_flags;
-       u32     sa_handler;
-       u32     sa_mask[4];
-       int     sa_resv[2];
-};
-
-asmlinkage int solaris_sigaction(int sig, u32 act, u32 old)
-{
-       u32 tmp, tmp2[4];
-       struct sigaction s, s2;
-       int ret;
-       mm_segment_t old_fs = get_fs();
-       struct sol_sigaction __user *p = (void __user *)A(old);
-       int (*sys_sigaction)(int,struct sigaction __user *,struct sigaction __user *) = 
-               (int (*)(int,struct sigaction __user *,struct sigaction __user *))SYS(sigaction);
-       
-       sig = mapsig(sig); 
-       if (sig < 0) {
-               /* We cheat a little bit for Solaris only signals */
-               if (old && clear_user(p, sizeof(struct sol_sigaction)))
-                       return -EFAULT;
-               return 0;
-       }
-       if (act) {
-               if (get_user (tmp, &p->sa_flags))
-                       return -EFAULT;
-               s.sa_flags = 0;
-               if (tmp & SOLARIS_SA_ONSTACK) s.sa_flags |= SA_STACK;
-               if (tmp & SOLARIS_SA_RESTART) s.sa_flags |= SA_RESTART;
-               if (tmp & SOLARIS_SA_NODEFER) s.sa_flags |= SA_NOMASK;
-               if (tmp & SOLARIS_SA_RESETHAND) s.sa_flags |= SA_ONESHOT;
-               if (tmp & SOLARIS_SA_NOCLDSTOP) s.sa_flags |= SA_NOCLDSTOP;
-               if (get_user (tmp, &p->sa_handler) ||
-                   copy_from_user (tmp2, &p->sa_mask, 2*sizeof(u32)))
-                       return -EFAULT;
-               s.sa_handler = (__sighandler_t)A(tmp);
-               if (mapin (tmp2, &s.sa_mask)) return -EINVAL;
-               s.sa_restorer = NULL;
-       }
-       set_fs(KERNEL_DS);
-       ret = sys_sigaction(sig, act ? (void __user *)&s : NULL,
-                                old ? (void __user *)&s2 : NULL);
-       set_fs(old_fs);
-       if (ret) return ret;
-       if (old) {
-               if (mapout (&s2.sa_mask, tmp2)) return -EINVAL;
-               tmp = 0; tmp2[2] = 0; tmp2[3] = 0;
-               if (s2.sa_flags & SA_STACK) tmp |= SOLARIS_SA_ONSTACK;
-               if (s2.sa_flags & SA_RESTART) tmp |= SOLARIS_SA_RESTART;
-               if (s2.sa_flags & SA_NOMASK) tmp |= SOLARIS_SA_NODEFER;
-               if (s2.sa_flags & SA_ONESHOT) tmp |= SOLARIS_SA_RESETHAND;
-               if (s2.sa_flags & SA_NOCLDSTOP) tmp |= SOLARIS_SA_NOCLDSTOP;
-               if (put_user (tmp, &p->sa_flags) ||
-                   __put_user ((u32)(unsigned long)s2.sa_handler, &p->sa_handler) ||
-                   copy_to_user (&p->sa_mask, tmp2, 4*sizeof(u32)))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-asmlinkage int solaris_sigpending(int which, u32 set)
-{
-       sigset_t s;
-       u32 tmp[4];
-       switch (which) {
-       case 1: /* sigpending */
-               spin_lock_irq(&current->sighand->siglock);
-               sigandsets(&s, &current->blocked, &current->pending.signal);
-               recalc_sigpending();
-               spin_unlock_irq(&current->sighand->siglock);
-               break;
-       case 2: /* sigfillset - I just set signals which have linux equivalents */
-               sigfillset(&s);
-               break;
-       default: return -EINVAL;
-       }
-       if (mapout (&s, tmp)) return -EINVAL;
-       tmp[2] = 0; tmp[3] = 0;
-       if (copy_to_user ((u32 __user *)A(set), tmp, sizeof(tmp)))
-               return -EFAULT;
-       return 0;
-}
-
-asmlinkage int solaris_wait(u32 stat_loc)
-{
-       unsigned __user *p = (unsigned __user *)A(stat_loc);
-       int (*sys_wait4)(pid_t,unsigned __user *, int, struct rusage __user *) =
-               (int (*)(pid_t,unsigned __user *, int, struct rusage __user *))SYS(wait4);
-       int ret, status;
-       
-       ret = sys_wait4(-1, p, WUNTRACED, NULL);
-       if (ret >= 0 && stat_loc) {
-               if (get_user (status, p))
-                       return -EFAULT;
-               if (((status - 1) & 0xffff) < 0xff)
-                       status = linux_to_solaris_signals[status & 0x7f] & 0x7f;
-               else if ((status & 0xff) == 0x7f)
-                       status = (linux_to_solaris_signals[(status >> 8) & 0xff] << 8) | 0x7f;
-               if (__put_user (status, p))
-                       return -EFAULT;
-       }
-       return ret;
-}
-
-asmlinkage int solaris_waitid(int idtype, s32 pid, u32 info, int options)
-{
-       int (*sys_wait4)(pid_t,unsigned __user *, int, struct rusage __user *) =
-               (int (*)(pid_t,unsigned __user *, int, struct rusage __user *))SYS(wait4);
-       int opts, status, ret;
-       
-       switch (idtype) {
-       case 0: /* P_PID */ break;
-       case 1: /* P_PGID */ pid = -pid; break;
-       case 7: /* P_ALL */ pid = -1; break;
-       default: return -EINVAL;
-       }
-       opts = 0;
-       if (options & SOLARIS_WUNTRACED) opts |= WUNTRACED;
-       if (options & SOLARIS_WNOHANG) opts |= WNOHANG;
-       current->state = TASK_RUNNING;
-       ret = sys_wait4(pid, (unsigned int __user *)A(info), opts, NULL);
-       if (ret < 0) return ret;
-       if (info) {
-               struct sol_siginfo __user *s = (void __user *)A(info);
-       
-               if (get_user (status, (unsigned int __user *)A(info)))
-                       return -EFAULT;
-
-               if (__put_user (SOLARIS_SIGCLD, &s->si_signo) ||
-                   __put_user (ret, &s->_data._proc._pid))
-                       return -EFAULT;
-
-               switch (status & 0xff) {
-               case 0: ret = SOLARIS_CLD_EXITED;
-                       status = (status >> 8) & 0xff;
-                       break;
-               case 0x7f:
-                       status = (status >> 8) & 0xff;
-                       switch (status) {
-                       case SIGSTOP:
-                       case SIGTSTP: ret = SOLARIS_CLD_STOPPED;
-                       default: ret = SOLARIS_CLD_EXITED;
-                       }
-                       status = linux_to_solaris_signals[status];
-                       break;
-               default:
-                       if (status & 0x80) ret = SOLARIS_CLD_DUMPED;
-                       else ret = SOLARIS_CLD_KILLED;
-                       status = linux_to_solaris_signals[status & 0x7f];
-                       break;
-               }
-
-               if (__put_user (ret, &s->si_code) ||
-                   __put_user (status, &s->_data._proc._pdata._cld._status))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-extern int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs);
-extern int svr4_getcontext(svr4_ucontext_t *c, struct pt_regs *regs);
-
-asmlinkage int solaris_context(struct pt_regs *regs)
-{
-       switch ((unsigned)regs->u_regs[UREG_I0]) {
-       case 0: /* getcontext */
-               return svr4_getcontext((svr4_ucontext_t *)(long)(u32)regs->u_regs[UREG_I1], regs);
-       case 1: /* setcontext */
-               return svr4_setcontext((svr4_ucontext_t *)(long)(u32)regs->u_regs[UREG_I1], regs);
-       default:
-               return -EINVAL;
-
-       }
-}
-
-asmlinkage int solaris_sigaltstack(u32 ss, u32 oss)
-{
-/* XXX Implement this soon */
-       return 0;
-}
diff --git a/arch/sparc64/solaris/signal.h b/arch/sparc64/solaris/signal.h
deleted file mode 100644 (file)
index e915708..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/* $Id: signal.h,v 1.3 1998/04/12 06:20:33 davem Exp $
- * signal.h: Signal emulation for Solaris
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- */
-    
-#define SOLARIS_SIGHUP         1
-#define SOLARIS_SIGINT         2
-#define SOLARIS_SIGQUIT                3
-#define SOLARIS_SIGILL         4
-#define SOLARIS_SIGTRAP                5
-#define SOLARIS_SIGIOT         6
-#define SOLARIS_SIGEMT         7
-#define SOLARIS_SIGFPE         8
-#define SOLARIS_SIGKILL                9
-#define SOLARIS_SIGBUS         10
-#define SOLARIS_SIGSEGV                11
-#define SOLARIS_SIGSYS         12
-#define SOLARIS_SIGPIPE                13
-#define SOLARIS_SIGALRM                14
-#define SOLARIS_SIGTERM                15
-#define SOLARIS_SIGUSR1                16
-#define SOLARIS_SIGUSR2                17
-#define SOLARIS_SIGCLD         18
-#define SOLARIS_SIGPWR         19
-#define SOLARIS_SIGWINCH       20
-#define SOLARIS_SIGURG         21
-#define SOLARIS_SIGPOLL                22
-#define SOLARIS_SIGSTOP                23
-#define SOLARIS_SIGTSTP                24
-#define SOLARIS_SIGCONT                25
-#define SOLARIS_SIGTTIN                26
-#define SOLARIS_SIGTTOU                27
-#define SOLARIS_SIGVTALRM      28
-#define SOLARIS_SIGPROF                29
-#define SOLARIS_SIGXCPU                30
-#define SOLARIS_SIGXFSZ                31
-#define SOLARIS_SIGWAITING     32
-#define SOLARIS_SIGLWP         33
-#define SOLARIS_SIGFREEZE      34
-#define SOLARIS_SIGTHAW                35
-#define SOLARIS_SIGCANCEL      36
-#define SOLARIS_SIGRTMIN       37
-#define SOLARIS_SIGRTMAX       44
-#define SOLARIS_NSIGNALS       44
-
-
-#define SOLARIS_SA_ONSTACK     1
-#define SOLARIS_SA_RESETHAND   2
-#define SOLARIS_SA_RESTART     4
-#define SOLARIS_SA_SIGINFO     8
-#define SOLARIS_SA_NODEFER     16
-#define SOLARIS_SA_NOCLDWAIT   0x10000
-#define SOLARIS_SA_NOCLDSTOP   0x20000
-
-struct sol_siginfo {
-       int     si_signo;
-       int     si_code;
-       int     si_errno;
-       union   {
-               char    pad[128-3*sizeof(int)];
-               struct { 
-                       s32     _pid;
-                       union {
-                               struct {
-                                       s32     _uid;
-                                       s32     _value;
-                               } _kill;
-                               struct {
-                                       s32     _utime;
-                                       int     _status;
-                                       s32     _stime;
-                               } _cld;
-                       } _pdata;
-               } _proc;
-               struct { /* SIGSEGV, SIGBUS, SIGILL and SIGFPE */
-                       u32     _addr;
-                       int     _trapno;
-               } _fault;
-               struct { /* SIGPOLL, SIGXFSZ */
-                       int     _fd;
-                       s32     _band;
-               } _file;
-       } _data;
-};
-
-#define SOLARIS_WUNTRACED      0x04
-#define SOLARIS_WNOHANG                0x40
-#define SOLARIS_WEXITED         0x01
-#define SOLARIS_WTRAPPED        0x02
-#define SOLARIS_WSTOPPED        WUNTRACED
-#define SOLARIS_WCONTINUED      0x08
-#define SOLARIS_WNOWAIT         0x80
-
-#define SOLARIS_TRAP_BRKPT      1
-#define SOLARIS_TRAP_TRACE      2
-#define SOLARIS_CLD_EXITED      1
-#define SOLARIS_CLD_KILLED      2
-#define SOLARIS_CLD_DUMPED      3
-#define SOLARIS_CLD_TRAPPED     4
-#define SOLARIS_CLD_STOPPED     5
-#define SOLARIS_CLD_CONTINUED   6
-#define SOLARIS_POLL_IN         1
-#define SOLARIS_POLL_OUT        2
-#define SOLARIS_POLL_MSG        3
-#define SOLARIS_POLL_ERR        4
-#define SOLARIS_POLL_PRI        5
-#define SOLARIS_POLL_HUP        6
diff --git a/arch/sparc64/solaris/socket.c b/arch/sparc64/solaris/socket.c
deleted file mode 100644 (file)
index cc69847..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-/* $Id: socket.c,v 1.6 2002/02/08 03:57:14 davem Exp $
- * socket.c: Socket syscall emulation for Solaris 2.6+
- *
- * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
- *
- * 1999-08-19 Fixed socketpair code 
- *            Jason Rappleye (rappleye@ccr.buffalo.edu)
- */
-
-#include <linux/types.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/socket.h>
-#include <linux/file.h>
-#include <linux/net.h>
-#include <linux/compat.h>
-#include <net/compat.h>
-#include <net/sock.h>
-
-#include <asm/uaccess.h>
-#include <asm/string.h>
-#include <asm/oplib.h>
-#include <asm/idprom.h>
-
-#include "conv.h"
-
-#define SOCK_SOL_STREAM                2
-#define SOCK_SOL_DGRAM         1
-#define SOCK_SOL_RAW           4
-#define SOCK_SOL_RDM           5
-#define SOCK_SOL_SEQPACKET     6
-
-#define SOL_SO_SNDLOWAT                0x1003
-#define SOL_SO_RCVLOWAT                0x1004
-#define SOL_SO_SNDTIMEO                0x1005
-#define SOL_SO_RCVTIMEO                0x1006
-#define SOL_SO_STATE           0x2000
-
-#define SOL_SS_NDELAY          0x040
-#define SOL_SS_NONBLOCK                0x080
-#define SOL_SS_ASYNC           0x100
-
-#define SO_STATE               0x000e
-
-static int socket_check(int family, int type)
-{
-       if (family != PF_UNIX && family != PF_INET)
-               return -ESOCKTNOSUPPORT;
-       switch (type) {
-       case SOCK_SOL_STREAM: type = SOCK_STREAM; break;
-       case SOCK_SOL_DGRAM: type = SOCK_DGRAM; break;
-       case SOCK_SOL_RAW: type = SOCK_RAW; break;
-       case SOCK_SOL_RDM: type = SOCK_RDM; break;
-       case SOCK_SOL_SEQPACKET: type = SOCK_SEQPACKET; break;
-       default: return -EINVAL;
-       }
-       return type;
-}
-
-static int solaris_to_linux_sockopt(int optname) 
-{
-       switch (optname) {
-       case SOL_SO_SNDLOWAT: optname = SO_SNDLOWAT; break;
-       case SOL_SO_RCVLOWAT: optname = SO_RCVLOWAT; break;
-       case SOL_SO_SNDTIMEO: optname = SO_SNDTIMEO; break;
-       case SOL_SO_RCVTIMEO: optname = SO_RCVTIMEO; break;
-       case SOL_SO_STATE: optname = SO_STATE; break;
-       };
-       
-       return optname;
-}
-       
-asmlinkage int solaris_socket(int family, int type, int protocol)
-{
-       int (*sys_socket)(int, int, int) =
-               (int (*)(int, int, int))SYS(socket);
-
-       type = socket_check (family, type);
-       if (type < 0) return type;
-       return sys_socket(family, type, protocol);
-}
-
-asmlinkage int solaris_socketpair(int *usockvec)
-{
-       int (*sys_socketpair)(int, int, int, int *) =
-               (int (*)(int, int, int, int *))SYS(socketpair);
-
-       /* solaris socketpair really only takes one arg at the syscall
-        * level, int * usockvec. The libs apparently take care of 
-        * making sure that family==AF_UNIX and type==SOCK_STREAM. The 
-        * pointer we really want ends up residing in the first (and
-        * supposedly only) argument.
-        */
-
-       return sys_socketpair(AF_UNIX, SOCK_STREAM, 0, (int *)usockvec);
-}
-
-asmlinkage int solaris_bind(int fd, struct sockaddr *addr, int addrlen)
-{
-       int (*sys_bind)(int, struct sockaddr *, int) =
-               (int (*)(int, struct sockaddr *, int))SUNOS(104);
-
-       return sys_bind(fd, addr, addrlen);
-}
-
-asmlinkage int solaris_setsockopt(int fd, int level, int optname, u32 optval, int optlen)
-{
-       int (*sunos_setsockopt)(int, int, int, u32, int) =
-               (int (*)(int, int, int, u32, int))SUNOS(105);
-
-       optname = solaris_to_linux_sockopt(optname);
-       if (optname < 0)
-               return optname;
-       if (optname == SO_STATE)
-               return 0;
-
-       return sunos_setsockopt(fd, level, optname, optval, optlen);
-}
-
-asmlinkage int solaris_getsockopt(int fd, int level, int optname, u32 optval, u32 optlen)
-{
-       int (*sunos_getsockopt)(int, int, int, u32, u32) =
-               (int (*)(int, int, int, u32, u32))SUNOS(118);
-
-       optname = solaris_to_linux_sockopt(optname);
-       if (optname < 0)
-               return optname;
-
-       if (optname == SO_STATE)
-               optname = SOL_SO_STATE;
-
-       return sunos_getsockopt(fd, level, optname, optval, optlen);
-}
-
-asmlinkage int solaris_connect(int fd, struct sockaddr __user *addr, int addrlen)
-{
-       int (*sys_connect)(int, struct sockaddr __user *, int) =
-               (int (*)(int, struct sockaddr __user *, int))SYS(connect);
-
-       return sys_connect(fd, addr, addrlen);
-}
-
-asmlinkage int solaris_accept(int fd, struct sockaddr __user *addr, int __user *addrlen)
-{
-       int (*sys_accept)(int, struct sockaddr __user *, int __user *) =
-               (int (*)(int, struct sockaddr __user *, int __user *))SYS(accept);
-
-       return sys_accept(fd, addr, addrlen);
-}
-
-asmlinkage int solaris_listen(int fd, int backlog)
-{
-       int (*sys_listen)(int, int) =
-               (int (*)(int, int))SUNOS(106);
-
-       return sys_listen(fd, backlog);
-}
-
-asmlinkage int solaris_shutdown(int fd, int how)
-{
-       int (*sys_shutdown)(int, int) =
-               (int (*)(int, int))SYS(shutdown);
-
-       return sys_shutdown(fd, how);
-}
-
-#define MSG_SOL_OOB            0x1
-#define MSG_SOL_PEEK           0x2
-#define MSG_SOL_DONTROUTE      0x4
-#define MSG_SOL_EOR            0x8
-#define MSG_SOL_CTRUNC         0x10
-#define MSG_SOL_TRUNC          0x20
-#define MSG_SOL_WAITALL                0x40
-#define MSG_SOL_DONTWAIT       0x80
-
-static int solaris_to_linux_msgflags(int flags)
-{
-       int fl = flags & (MSG_OOB|MSG_PEEK|MSG_DONTROUTE);
-       
-       if (flags & MSG_SOL_EOR) fl |= MSG_EOR;
-       if (flags & MSG_SOL_CTRUNC) fl |= MSG_CTRUNC;
-       if (flags & MSG_SOL_TRUNC) fl |= MSG_TRUNC;
-       if (flags & MSG_SOL_WAITALL) fl |= MSG_WAITALL;
-       if (flags & MSG_SOL_DONTWAIT) fl |= MSG_DONTWAIT;
-       return fl;
-}
-
-static int linux_to_solaris_msgflags(int flags)
-{
-       int fl = flags & (MSG_OOB|MSG_PEEK|MSG_DONTROUTE);
-       
-       if (flags & MSG_EOR) fl |= MSG_SOL_EOR;
-       if (flags & MSG_CTRUNC) fl |= MSG_SOL_CTRUNC;
-       if (flags & MSG_TRUNC) fl |= MSG_SOL_TRUNC;
-       if (flags & MSG_WAITALL) fl |= MSG_SOL_WAITALL;
-       if (flags & MSG_DONTWAIT) fl |= MSG_SOL_DONTWAIT;
-       return fl;
-}
-
-asmlinkage int solaris_recvfrom(int s, char __user *buf, int len, int flags, u32 from, u32 fromlen)
-{
-       int (*sys_recvfrom)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *) =
-               (int (*)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *))SYS(recvfrom);
-       
-       return sys_recvfrom(s, buf, len, solaris_to_linux_msgflags(flags), A(from), A(fromlen));
-}
-
-asmlinkage int solaris_recv(int s, char __user *buf, int len, int flags)
-{
-       int (*sys_recvfrom)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *) =
-               (int (*)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *))SYS(recvfrom);
-       
-       return sys_recvfrom(s, buf, len, solaris_to_linux_msgflags(flags), NULL, NULL);
-}
-
-asmlinkage int solaris_sendto(int s, char __user *buf, int len, int flags, u32 to, u32 tolen)
-{
-       int (*sys_sendto)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *) =
-               (int (*)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *))SYS(sendto);
-       
-       return sys_sendto(s, buf, len, solaris_to_linux_msgflags(flags), A(to), A(tolen));
-}
-
-asmlinkage int solaris_send(int s, char *buf, int len, int flags)
-{
-       int (*sys_sendto)(int, void *, size_t, unsigned, struct sockaddr *, int *) =
-               (int (*)(int, void *, size_t, unsigned, struct sockaddr *, int *))SYS(sendto);
-       
-       return sys_sendto(s, buf, len, solaris_to_linux_msgflags(flags), NULL, NULL);
-}
-
-asmlinkage int solaris_getpeername(int fd, struct sockaddr *addr, int *addrlen)
-{
-       int (*sys_getpeername)(int, struct sockaddr *, int *) =
-               (int (*)(int, struct sockaddr *, int *))SYS(getpeername);
-
-       return sys_getpeername(fd, addr, addrlen);
-}
-
-asmlinkage int solaris_getsockname(int fd, struct sockaddr *addr, int *addrlen)
-{
-       int (*sys_getsockname)(int, struct sockaddr *, int *) =
-               (int (*)(int, struct sockaddr *, int *))SYS(getsockname);
-
-       return sys_getsockname(fd, addr, addrlen);
-}
-
-/* XXX This really belongs in some header file... -DaveM */
-#define MAX_SOCK_ADDR  128             /* 108 for Unix domain - 
-                                          16 for IP, 16 for IPX,
-                                          24 for IPv6,
-                                          about 80 for AX.25 */
-
-struct sol_nmsghdr {
-       u32             msg_name;
-       int             msg_namelen;
-       u32             msg_iov;
-       u32             msg_iovlen;
-       u32             msg_control;
-       u32             msg_controllen;
-       u32             msg_flags;
-};
-
-struct sol_cmsghdr {
-       u32             cmsg_len;
-       int             cmsg_level;
-       int             cmsg_type;
-       unsigned char   cmsg_data[0];
-};
-
-static inline int msghdr_from_user32_to_kern(struct msghdr *kmsg,
-                                            struct sol_nmsghdr __user *umsg)
-{
-       u32 tmp1, tmp2, tmp3;
-       int err;
-
-       err = get_user(tmp1, &umsg->msg_name);
-       err |= __get_user(tmp2, &umsg->msg_iov);
-       err |= __get_user(tmp3, &umsg->msg_control);
-       if (err)
-               return -EFAULT;
-
-       kmsg->msg_name = A(tmp1);
-       kmsg->msg_iov = A(tmp2);
-       kmsg->msg_control = A(tmp3);
-
-       err = get_user(kmsg->msg_namelen, &umsg->msg_namelen);
-       err |= get_user(kmsg->msg_controllen, &umsg->msg_controllen);
-       err |= get_user(kmsg->msg_flags, &umsg->msg_flags);
-       
-       kmsg->msg_flags = solaris_to_linux_msgflags(kmsg->msg_flags);
-       
-       return err;
-}
-
-asmlinkage int solaris_sendmsg(int fd, struct sol_nmsghdr __user *user_msg, unsigned user_flags)
-{
-       struct socket *sock;
-       char address[MAX_SOCK_ADDR];
-       struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
-       unsigned char ctl[sizeof(struct cmsghdr) + 20];
-       unsigned char *ctl_buf = ctl;
-       struct msghdr msg_sys;
-       int err, ctl_len, iov_size, total_len;
-
-       err = -EFAULT;
-       if (msghdr_from_user32_to_kern(&msg_sys, user_msg))
-               goto out;
-
-       sock = sockfd_lookup(fd, &err);
-       if (!sock)
-               goto out;
-
-       /* do not move before msg_sys is valid */
-       err = -EMSGSIZE;
-       if (msg_sys.msg_iovlen > UIO_MAXIOV)
-               goto out_put;
-
-       /* Check whether to allocate the iovec area*/
-       err = -ENOMEM;
-       iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
-       if (msg_sys.msg_iovlen > UIO_FASTIOV) {
-               iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
-               if (!iov)
-                       goto out_put;
-       }
-
-       err = verify_compat_iovec(&msg_sys, iov, address, VERIFY_READ);
-       if (err < 0)
-               goto out_freeiov;
-       total_len = err;
-
-       err = -ENOBUFS;
-       if (msg_sys.msg_controllen > INT_MAX)
-               goto out_freeiov;
-
-       ctl_len = msg_sys.msg_controllen;
-       if (ctl_len) {
-               struct sol_cmsghdr __user *ucmsg = msg_sys.msg_control;
-               unsigned long *kcmsg;
-               compat_size_t cmlen;
-
-               err = -EINVAL;
-               if (ctl_len <= sizeof(compat_size_t))
-                       goto out_freeiov;
-
-               if (ctl_len > sizeof(ctl)) {
-                       err = -ENOBUFS;
-                       ctl_buf = kmalloc(ctl_len, GFP_KERNEL);
-                       if (!ctl_buf)
-                               goto out_freeiov;
-               }
-               __get_user(cmlen, &ucmsg->cmsg_len);
-               kcmsg = (unsigned long *) ctl_buf;
-               *kcmsg++ = (unsigned long)cmlen;
-               err = -EFAULT;
-               if (copy_from_user(kcmsg, &ucmsg->cmsg_level,
-                                  ctl_len - sizeof(compat_size_t)))
-                       goto out_freectl;
-               msg_sys.msg_control = ctl_buf;
-       }
-       msg_sys.msg_flags = solaris_to_linux_msgflags(user_flags);
-
-       if (sock->file->f_flags & O_NONBLOCK)
-               msg_sys.msg_flags |= MSG_DONTWAIT;
-       err = sock_sendmsg(sock, &msg_sys, total_len);
-
-out_freectl:
-       if (ctl_buf != ctl)    
-               sock_kfree_s(sock->sk, ctl_buf, ctl_len);
-out_freeiov:
-       if (iov != iovstack)
-               sock_kfree_s(sock->sk, iov, iov_size);
-out_put:
-       sockfd_put(sock);
-out:       
-       return err;
-}
-
-asmlinkage int solaris_recvmsg(int fd, struct sol_nmsghdr __user *user_msg, unsigned int user_flags)
-{
-       struct socket *sock;
-       struct iovec iovstack[UIO_FASTIOV];
-       struct iovec *iov = iovstack;
-       struct msghdr msg_sys;
-       unsigned long cmsg_ptr;
-       int err, iov_size, total_len, len;
-
-       /* kernel mode address */
-       char addr[MAX_SOCK_ADDR];
-
-       /* user mode address pointers */
-       struct sockaddr __user *uaddr;
-       int __user *uaddr_len;
-
-       if (msghdr_from_user32_to_kern(&msg_sys, user_msg))
-               return -EFAULT;
-
-       sock = sockfd_lookup(fd, &err);
-       if (!sock)
-               goto out;
-
-       err = -EMSGSIZE;
-       if (msg_sys.msg_iovlen > UIO_MAXIOV)
-               goto out_put;
-
-       /* Check whether to allocate the iovec area*/
-       err = -ENOMEM;
-       iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
-       if (msg_sys.msg_iovlen > UIO_FASTIOV) {
-               iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
-               if (!iov)
-                       goto out_put;
-       }
-
-       /*
-        *      Save the user-mode address (verify_iovec will change the
-        *      kernel msghdr to use the kernel address space)
-        */
-        
-       uaddr = (void __user *) msg_sys.msg_name;
-       uaddr_len = &user_msg->msg_namelen;
-       err = verify_compat_iovec(&msg_sys, iov, addr, VERIFY_WRITE);
-       if (err < 0)
-               goto out_freeiov;
-       total_len = err;
-
-       cmsg_ptr = (unsigned long) msg_sys.msg_control;
-       msg_sys.msg_flags = MSG_CMSG_COMPAT;
-
-       if (sock->file->f_flags & O_NONBLOCK)
-               user_flags |= MSG_DONTWAIT;
-
-       err = sock_recvmsg(sock, &msg_sys, total_len, user_flags);
-       if(err < 0)
-               goto out_freeiov;
-
-       len = err;
-
-       if (uaddr != NULL) {
-               err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, uaddr_len);
-               if (err < 0)
-                       goto out_freeiov;
-       }
-       err = __put_user(linux_to_solaris_msgflags(msg_sys.msg_flags), &user_msg->msg_flags);
-       if (err)
-               goto out_freeiov;
-       err = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr,
-                        &user_msg->msg_controllen);
-       if (err)
-               goto out_freeiov;
-       err = len;
-
-out_freeiov:
-       if (iov != iovstack)
-               sock_kfree_s(sock->sk, iov, iov_size);
-out_put:
-       sockfd_put(sock);
-out:
-       return err;
-}
diff --git a/arch/sparc64/solaris/socksys.c b/arch/sparc64/solaris/socksys.c
deleted file mode 100644 (file)
index 7736411..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/* $Id: socksys.c,v 1.21 2002/02/08 03:57:14 davem Exp $
- * socksys.c: /dev/inet/ stuff for Solaris emulation.
- *
- * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- * Copyright (C) 1997, 1998 Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)
- * Copyright (C) 1995, 1996 Mike Jagdis (jaggy@purplet.demon.co.uk)
- */
-
-/*
- *  Dave, _please_ give me specifications on this fscking mess so that I
- * could at least get it into the state when it wouldn't screw the rest of
- * the kernel over.  socksys.c and timod.c _stink_ and we are not talking
- * H2S here, it's isopropilmercaptan in concentrations way over LD50. -- AV
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/ioctl.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/init.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/syscalls.h>
-#include <linux/in.h>
-
-#include <net/sock.h>
-
-#include <asm/uaccess.h>
-#include <asm/termios.h>
-
-#include "conv.h"
-#include "socksys.h"
-
-static int af_inet_protocols[] = {
-IPPROTO_ICMP, IPPROTO_ICMP, IPPROTO_IGMP, IPPROTO_IPIP, IPPROTO_TCP,
-IPPROTO_EGP, IPPROTO_PUP, IPPROTO_UDP, IPPROTO_IDP, IPPROTO_RAW,
-0, 0, 0, 0, 0, 0,
-};
-
-#ifndef DEBUG_SOLARIS_KMALLOC
-
-#define mykmalloc kmalloc
-#define mykfree kfree
-
-#else
-
-extern void * mykmalloc(size_t s, gfp_t gfp);
-extern void mykfree(void *);
-
-#endif
-
-static unsigned int (*sock_poll)(struct file *, poll_table *);
-
-static struct file_operations socksys_file_ops = {
-       /* Currently empty */
-};
-
-static int socksys_open(struct inode * inode, struct file * filp)
-{
-       int family, type, protocol, fd;
-       struct dentry *dentry;
-       int (*sys_socket)(int,int,int) =
-               (int (*)(int,int,int))SUNOS(97);
-        struct sol_socket_struct * sock;
-       
-       family = ((iminor(inode) >> 4) & 0xf);
-       switch (family) {
-       case AF_UNIX:
-               type = SOCK_STREAM;
-               protocol = 0;
-               break;
-       case AF_INET:
-               protocol = af_inet_protocols[iminor(inode) & 0xf];
-               switch (protocol) {
-               case IPPROTO_TCP: type = SOCK_STREAM; break;
-               case IPPROTO_UDP: type = SOCK_DGRAM; break;
-               default: type = SOCK_RAW; break;
-               }
-               break;
-       default:
-               type = SOCK_RAW;
-               protocol = 0;
-               break;
-       }
-
-       fd = sys_socket(family, type, protocol);
-       if (fd < 0)
-               return fd;
-       /*
-        * N.B. The following operations are not legal!
-        *
-        * No shit.  WTF is it supposed to do, anyway?
-        *
-        * Try instead:
-        * d_delete(filp->f_path.dentry), then d_instantiate with sock inode
-        */
-       dentry = filp->f_path.dentry;
-       filp->f_path.dentry = dget(fcheck(fd)->f_path.dentry);
-       filp->f_path.dentry->d_inode->i_rdev = inode->i_rdev;
-       filp->f_path.dentry->d_inode->i_flock = inode->i_flock;
-       SOCKET_I(filp->f_path.dentry->d_inode)->file = filp;
-       filp->f_op = &socksys_file_ops;
-        sock = (struct sol_socket_struct*) 
-               mykmalloc(sizeof(struct sol_socket_struct), GFP_KERNEL);
-        if (!sock) return -ENOMEM;
-       SOLDD(("sock=%016lx(%016lx)\n", sock, filp));
-        sock->magic = SOLARIS_SOCKET_MAGIC;
-        sock->modcount = 0;
-        sock->state = TS_UNBND;
-        sock->offset = 0;
-        sock->pfirst = sock->plast = NULL;
-        filp->private_data = sock;
-       SOLDD(("filp->private_data %016lx\n", filp->private_data));
-
-       sys_close(fd);
-       dput(dentry);
-       return 0;
-}
-
-static int socksys_release(struct inode * inode, struct file * filp)
-{
-        struct sol_socket_struct * sock;
-        struct T_primsg *it;
-
-       /* XXX: check this */
-       sock = (struct sol_socket_struct *)filp->private_data;
-       SOLDD(("sock release %016lx(%016lx)\n", sock, filp));
-       it = sock->pfirst;
-       while (it) {
-               struct T_primsg *next = it->next;
-               
-               SOLDD(("socksys_release %016lx->%016lx\n", it, next));
-               mykfree((char*)it);
-               it = next;
-       }
-       filp->private_data = NULL;
-       SOLDD(("socksys_release %016lx\n", sock));
-       mykfree((char*)sock);
-       return 0;
-}
-
-static unsigned int socksys_poll(struct file * filp, poll_table * wait)
-{
-       struct inode *ino;
-       unsigned int mask = 0;
-
-       ino=filp->f_path.dentry->d_inode;
-       if (ino && S_ISSOCK(ino->i_mode)) {
-               struct sol_socket_struct *sock;
-               sock = (struct sol_socket_struct*)filp->private_data;
-               if (sock && sock->pfirst) {
-                       mask |= POLLIN | POLLRDNORM;
-                       if (sock->pfirst->pri == MSG_HIPRI)
-                               mask |= POLLPRI;
-               }
-       }
-       if (sock_poll)
-               mask |= (*sock_poll)(filp, wait);
-       return mask;
-}
-       
-static const struct file_operations socksys_fops = {
-       .open =         socksys_open,
-       .release =      socksys_release,
-};
-
-int __init init_socksys(void)
-{
-       int ret;
-       struct file * file;
-       int (*sys_socket)(int,int,int) =
-               (int (*)(int,int,int))SUNOS(97);
-       int (*sys_close)(unsigned int) = 
-               (int (*)(unsigned int))SYS(close);
-       
-       ret = register_chrdev (30, "socksys", &socksys_fops);
-       if (ret < 0) {
-               printk ("Couldn't register socksys character device\n");
-               return ret;
-       }
-       ret = sys_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-       if (ret < 0) {
-               printk ("Couldn't create socket\n");
-               return ret;
-       }
-
-       file = fcheck(ret);
-       /* N.B. Is this valid? Suppose the f_ops are in a module ... */
-       socksys_file_ops = *file->f_op;
-       sys_close(ret);
-       sock_poll = socksys_file_ops.poll;
-       socksys_file_ops.poll = socksys_poll;
-       socksys_file_ops.release = socksys_release;
-       return 0;
-}
-
-void __exit cleanup_socksys(void)
-{
-       unregister_chrdev(30, "socksys");
-}
diff --git a/arch/sparc64/solaris/socksys.h b/arch/sparc64/solaris/socksys.h
deleted file mode 100644 (file)
index 5d1b78e..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-/* $Id: socksys.h,v 1.2 1998/03/26 08:46:07 jj Exp $
- * socksys.h: Definitions for STREAMS modules emulation code.
- *
- * Copyright (C) 1998 Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)
- */
-
-#define MSG_HIPRI      0x01
-#define MSG_ANY                0x02
-#define MSG_BAND       0x04
-
-#define MORECTL                1
-#define MOREDATA       2
-
-#define        TBADADDR                1
-#define        TBADOPT                 2
-#define        TACCES                  3
-#define TBADF                  4
-#define TNOADDR                        5
-#define TOUTSTATE              6
-#define TBADSEQ                        7
-#define TSYSERR                        8
-#define TLOOK                  9
-#define TBADDATA              10
-#define TBUFOVFLW             11
-#define TFLOW                 12
-#define        TNODATA                13
-#define TNODIS                14
-#define TNOUDERR              15
-#define TBADFLAG              16
-#define TNOREL                17
-#define TNOTSUPPORT           18
-#define TSTATECHNG            19
-
-#define T_CONN_REQ      0
-#define T_CONN_RES      1
-#define T_DISCON_REQ    2
-#define T_DATA_REQ      3
-#define T_EXDATA_REQ    4
-#define T_INFO_REQ      5
-#define T_BIND_REQ      6
-#define T_UNBIND_REQ    7
-#define T_UNITDATA_REQ  8
-#define T_OPTMGMT_REQ   9
-#define T_ORDREL_REQ    10
-
-#define T_CONN_IND      11
-#define T_CONN_CON      12
-#define T_DISCON_IND    13
-#define T_DATA_IND      14
-#define T_EXDATA_IND    15
-#define T_INFO_ACK      16
-#define T_BIND_ACK      17
-#define T_ERROR_ACK     18
-#define T_OK_ACK        19
-#define T_UNITDATA_IND  20
-#define T_UDERROR_IND   21
-#define T_OPTMGMT_ACK   22
-#define T_ORDREL_IND    23
-
-#define T_NEGOTIATE    0x0004
-#define T_FAILURE      0x0040
-
-#define TS_UNBND       0       /* unbound */
-#define        TS_WACK_BREQ    1       /* waiting for T_BIND_REQ ack  */
-#define TS_WACK_UREQ   2       /* waiting for T_UNBIND_REQ ack */
-#define TS_IDLE                3       /* idle */
-#define TS_WACK_OPTREQ 4       /* waiting for T_OPTMGMT_REQ ack */
-#define TS_WACK_CREQ   5       /* waiting for T_CONN_REQ ack */
-#define TS_WCON_CREQ   6       /* waiting for T_CONN_REQ confirmation */
-#define        TS_WRES_CIND    7       /* waiting for T_CONN_IND */
-#define TS_WACK_CRES   8       /* waiting for T_CONN_RES ack */
-#define TS_DATA_XFER   9       /* data transfer */
-#define TS_WIND_ORDREL 10      /* releasing read but not write */
-#define TS_WREQ_ORDREL 11      /* wait to release write but not read */
-#define TS_WACK_DREQ6  12      /* waiting for T_DISCON_REQ ack */
-#define TS_WACK_DREQ7  13      /* waiting for T_DISCON_REQ ack */
-#define TS_WACK_DREQ9  14      /* waiting for T_DISCON_REQ ack */
-#define TS_WACK_DREQ10 15      /* waiting for T_DISCON_REQ ack */
-#define TS_WACK_DREQ11 16      /* waiting for T_DISCON_REQ ack */
-#define TS_NOSTATES    17
-
-struct T_conn_req {
-       s32 PRIM_type; 
-       s32 DEST_length;
-       s32 DEST_offset;
-       s32 OPT_length;
-       s32 OPT_offset;
-};
-
-struct T_bind_req {
-       s32 PRIM_type;
-       s32 ADDR_length;
-       s32 ADDR_offset;
-       u32 CONIND_number;
-};
-
-struct T_unitdata_req {
-       s32 PRIM_type; 
-       s32 DEST_length;
-       s32 DEST_offset;
-       s32 OPT_length;
-       s32 OPT_offset;
-};
-
-struct T_optmgmt_req {
-       s32 PRIM_type; 
-       s32 OPT_length;
-       s32 OPT_offset;
-       s32 MGMT_flags;
-};
-
-struct T_bind_ack {
-       s32 PRIM_type;
-       s32 ADDR_length;
-       s32 ADDR_offset;
-       u32 CONIND_number;
-};
-
-struct T_error_ack {
-       s32 PRIM_type;
-       s32 ERROR_prim;
-       s32 TLI_error;
-       s32 UNIX_error;
-};
-
-struct T_ok_ack {
-       s32 PRIM_type;
-       s32 CORRECT_prim;
-};
-
-struct T_conn_ind {
-       s32 PRIM_type;
-       s32 SRC_length;
-       s32 SRC_offset;
-       s32 OPT_length;
-       s32 OPT_offset;
-       s32 SEQ_number;
-};
-
-struct T_conn_con {
-       s32 PRIM_type;
-       s32 RES_length;
-       s32 RES_offset;
-       s32 OPT_length;
-       s32 OPT_offset;
-};
-
-struct T_discon_ind {
-       s32 PRIM_type;
-       s32 DISCON_reason;
-       s32 SEQ_number;
-};
-
-struct T_unitdata_ind {
-       s32 PRIM_type;
-       s32 SRC_length;
-       s32 SRC_offset;
-       s32 OPT_length;
-       s32 OPT_offset;
-};
-
-struct T_optmgmt_ack {
-       s32 PRIM_type; 
-       s32 OPT_length;
-       s32 OPT_offset;
-       s32 MGMT_flags;
-};
-
-struct opthdr {
-       s32 level;
-       s32 name;
-       s32 len;
-       char value[0];  
-};
-
-struct T_primsg {
-       struct T_primsg *next;
-       unsigned char pri;
-       unsigned char band;
-       int length;
-       s32 type;
-};
-
-struct strbuf {
-       s32 maxlen;
-       s32 len;
-       u32 buf;
-} ;
-
-/* Constants used by STREAMS modules emulation code */
-
-typedef char sol_module;
-
-#define MAX_NR_STREAM_MODULES   16
-
-/* Private data structure assigned to sockets. */
-
-struct sol_socket_struct {
-        int magic;
-        int modcount;
-        sol_module module[MAX_NR_STREAM_MODULES];
-        long state;
-        int offset;
-        struct T_primsg *pfirst, *plast;
-};
-
-#define SOLARIS_SOCKET_MAGIC    0xADDED
-
diff --git a/arch/sparc64/solaris/systbl.S b/arch/sparc64/solaris/systbl.S
deleted file mode 100644 (file)
index 7043ca1..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/* $Id: systbl.S,v 1.11 2000/03/13 21:57:35 davem Exp $
- * systbl.S: System call entry point table for Solaris compatibility.
- *
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
- */
-
-#include <asm/unistd.h>
-
-/* Fall back to sys_call_table32 entry */
-#define CHAIN(name)    __NR_##name
-
-/* Pass pt_regs pointer as first argument */
-#define REGS(name)     name+1
-
-/* Hack till all be implemented */
-#define solaris_getpmsg                solaris_unimplemented
-#define solaris_hrtsys         solaris_unimplemented
-#define solaris_msgsys         solaris_unimplemented
-#define solaris_putpmsg                solaris_unimplemented
-#define solaris_semsys         solaris_unimplemented
-
-        .data
-       .globl          solaris_sys_table
-solaris_sys_table:
-       .word solaris_unimplemented     /* nosys                0       */
-       .word CHAIN(exit)               /* exit         d       1       */
-       .word CHAIN(fork)               /* fork                 2       */
-       .word CHAIN(read)               /* read         dpd     3       */
-       .word CHAIN(write)              /* write        dpd     4       */
-       .word solaris_open              /* open         soo     5       */
-       .word CHAIN(close)              /* close        d       6       */
-       .word solaris_wait              /* wait         xxx     7       */
-       .word CHAIN(creat)              /* creat        so      8       */
-       .word CHAIN(link)               /* link         ss      9       */
-       .word CHAIN(unlink)             /* unlink       s       10      */
-       .word solaris_unimplemented     /* exec         sxx     11      */
-       .word CHAIN(chdir)              /* chdir        s       12      */
-       .word CHAIN(time)               /* time                 13      */
-       .word solaris_mknod             /* mknod        sox     14      */
-       .word CHAIN(chmod)              /* chmod        so      15      */ 
-       .word CHAIN(chown)              /* chown        sdd     16      */
-       .word solaris_brk               /* brk/break    x       17      */
-       .word solaris_stat              /* stat         sp      18      */
-       .word CHAIN(lseek)              /* seek/lseek   ddd     19      */
-       .word solaris_getpid            /* getpid               20      */
-       .word solaris_unimplemented     /* mount                21      */
-       .word CHAIN(umount)             /* umount       s       22      */
-       .word CHAIN(setuid)             /* setuid       d       23      */
-       .word solaris_getuid            /* getuid               24      */
-       .word CHAIN(stime)              /* stime        d       25      */
-#if 0
-       .word solaris_ptrace            /* ptrace       xdxx    26      */
-#else
-       .word CHAIN(ptrace)             /* ptrace       xdxx    26      */
-#endif
-       .word CHAIN(alarm)              /* alarm        d       27      */
-       .word solaris_fstat             /* fstat        dp      28      */
-       .word CHAIN(pause)              /* pause                29      */
-       .word CHAIN(utime)              /* utime        xx      30      */
-       .word solaris_unimplemented     /* stty                 31      */
-       .word solaris_unimplemented     /* gtty                 32      */
-       .word solaris_access            /* access       so      33      */
-       .word CHAIN(nice)               /* nice         d       34      */
-       .word solaris_statfs            /* statfs       spdd    35      */
-       .word CHAIN(sync)               /* sync                 36      */
-       .word solaris_kill              /* kill         dd      37      */
-       .word solaris_fstatfs           /* fstatfs      dpdd    38      */
-       .word solaris_procids           /* pgrpsys      ddd     39      */
-       .word solaris_unimplemented     /* xenix                40      */
-       .word CHAIN(dup)                /* dup          d       41      */
-       .word CHAIN(pipe)               /* pipe                 42      */
-       .word CHAIN(times)              /* times        p       43      */
-       .word 44 /*CHAIN(profil)*/      /* prof         xxxx    44      */
-       .word solaris_unimplemented     /* lock/plock           45      */
-       .word CHAIN(setgid)             /* setgid       d       46      */
-       .word solaris_getgid            /* getgid               47      */
-       .word solaris_sigfunc           /* sigfunc      xx      48      */
-       .word REGS(solaris_msgsys)      /* msgsys       dxddd   49      */
-       .word solaris_unimplemented     /* syssun/3b            50      */
-       .word CHAIN(acct)               /* acct/sysacct x       51      */
-       .word solaris_shmsys            /* shmsys       ddxo    52      */
-       .word REGS(solaris_semsys)      /* semsys       dddx    53      */
-       .word solaris_ioctl             /* ioctl        dxx     54      */
-       .word solaris_unimplemented     /* uadmin       xxx     55      */
-       .word solaris_unimplemented     /* reserved:exch        56      */
-       .word solaris_utssys            /* utssys       x       57      */
-       .word CHAIN(fsync)              /* fsync        d       58      */
-       .word CHAIN(execve)             /* execv        spp     59      */
-       .word CHAIN(umask)              /* umask        o       60      */
-       .word CHAIN(chroot)             /* chroot       s       61      */
-       .word solaris_fcntl             /* fcntl        dxx     62      */
-       .word solaris_ulimit            /* ulimit       xx      63      */
-       .word solaris_unimplemented     /* ?                    64      */
-       .word solaris_unimplemented     /* ?                    65      */
-       .word solaris_unimplemented     /* ?                    66      */
-       .word solaris_unimplemented     /* ?                    67      */
-       .word solaris_unimplemented     /* ?                    68      */
-       .word solaris_unimplemented     /* ?                    69      */
-       .word solaris_unimplemented     /* advfs                70      */
-       .word solaris_unimplemented     /* unadvfs              71      */
-       .word solaris_unimplemented     /* rmount               72      */
-       .word solaris_unimplemented     /* rumount              73      */
-       .word solaris_unimplemented     /* rfstart              74      */
-       .word solaris_unimplemented     /* ?                    75      */
-       .word solaris_unimplemented     /* rdebug               76      */
-       .word solaris_unimplemented     /* rfstop               77      */
-       .word solaris_unimplemented     /* rfsys                78      */
-       .word CHAIN(rmdir)              /* rmdir        s       79      */
-       .word CHAIN(mkdir)              /* mkdir        so      80      */
-       .word CHAIN(getdents)           /* getdents     dxd     81      */
-       .word solaris_unimplemented     /* libattach            82      */
-       .word solaris_unimplemented     /* libdetach            83      */
-       .word CHAIN(sysfs)              /* sysfs        dxx     84      */
-       .word solaris_getmsg            /* getmsg       dxxx    85      */
-       .word solaris_putmsg            /* putmsg       dxxd    86      */
-       .word CHAIN(poll)               /* poll         xdd     87      */
-       .word solaris_lstat             /* lstat        sp      88      */
-       .word CHAIN(symlink)            /* symlink      ss      89      */
-       .word CHAIN(readlink)           /* readlink     spd     90      */
-       .word CHAIN(setgroups)          /* setgroups    dp      91      */
-       .word CHAIN(getgroups)          /* getgroups    dp      92      */
-       .word CHAIN(fchmod)             /* fchmod       do      93      */
-       .word CHAIN(fchown)             /* fchown       ddd     94      */
-       .word solaris_sigprocmask       /* sigprocmask  dxx     95      */
-       .word solaris_sigsuspend        /* sigsuspend   x       96      */
-       .word solaris_sigaltstack       /* sigaltstack  xx      97      */
-       .word solaris_sigaction         /* sigaction    dxx     98      */
-       .word solaris_sigpending        /* sigpending   dd      99      */
-       .word REGS(solaris_context)     /* context              100     */
-       .word solaris_unimplemented     /* evsys                101     */
-       .word solaris_unimplemented     /* evtrapret            102     */
-       .word solaris_statvfs           /* statvfs      sp      103     */
-       .word solaris_fstatvfs          /* fstatvfs     dp      104     */
-       .word solaris_unimplemented     /* unknown              105     */
-       .word solaris_unimplemented     /* nfssys               106     */
-       .word solaris_waitid            /* waitid       ddxd    107     */
-       .word solaris_unimplemented     /* sigsendsys   ddd     108     */
-       .word REGS(solaris_hrtsys)      /* hrtsys       xxx     109     */
-       .word solaris_unimplemented     /* acancel      dxd     110     */
-       .word solaris_unimplemented     /* async                111     */
-       .word solaris_unimplemented     /* priocntlsys          112     */
-       .word solaris_pathconf          /* pathconf     sd      113     */
-       .word CHAIN(mincore)            /* mincore      d       114     */
-       .word solaris_mmap              /* mmap         xxxxdx  115     */
-       .word CHAIN(mprotect)           /* mprotect     xdx     116     */
-       .word CHAIN(munmap)             /* munmap       xd      117     */
-       .word solaris_fpathconf         /* fpathconf    dd      118     */
-       .word CHAIN(fork)               /* fork                 119     */
-       .word solaris_unimplemented     /* fchdir       d       120     */
-       .word CHAIN(readv)              /* readv        dxd     121     */
-       .word CHAIN(writev)             /* writev       dxd     122     */
-       .word solaris_xstat             /* xstat        dsx     123     */
-       .word solaris_lxstat            /* lxstat       dsx     124     */
-       .word solaris_fxstat            /* fxstat       ddx     125     */
-       .word solaris_xmknod            /* xmknod       dsox    126     */
-       .word solaris_unimplemented     /* syslocal     d       127     */
-       .word solaris_setrlimit         /* setrlimit    dp      128     */
-       .word solaris_getrlimit         /* getrlimit    dp      129     */
-       .word CHAIN(chown)              /* lchown       sdd     130     */
-       .word solaris_unimplemented     /* memcntl              131     */
-       .word solaris_getpmsg           /* getpmsg      dxxxx   132     */
-       .word solaris_putpmsg           /* putpmsg      dxxdd   133     */
-       .word CHAIN(rename)             /* rename       ss      134     */
-       .word solaris_utsname           /* uname        x       135     */
-       .word solaris_unimplemented     /* setegid              136     */
-       .word solaris_sysconf           /* sysconfig    d       137     */
-       .word solaris_unimplemented     /* adjtime              138     */
-       .word solaris_sysinfo           /* systeminfo   dsd     139     */
-       .word solaris_unimplemented     /* ?                    140     */
-       .word solaris_unimplemented     /* seteuid              141     */
-       .word solaris_unimplemented     /* ?                    142     */
-       .word solaris_unimplemented     /* ?                    143     */
-       .word solaris_unimplemented     /* secsys       dx      144     */
-       .word solaris_unimplemented     /* filepriv     sdxd    145     */
-       .word solaris_unimplemented     /* procpriv     dxd     146     */
-       .word solaris_unimplemented     /* devstat      sdx     147     */
-       .word solaris_unimplemented     /* aclipc       ddddx   148     */
-       .word solaris_unimplemented     /* fdevstat     ddx     149     */
-       .word solaris_unimplemented     /* flvlfile     ddx     150     */
-       .word solaris_unimplemented     /* lvlfile      sdx     151     */
-       .word solaris_unimplemented     /* ?                    152     */
-       .word solaris_unimplemented     /* fchroot      d       153     */
-       .word solaris_unimplemented     /* lvlproc      dx      154     */
-       .word solaris_unimplemented     /* ?                    155     */
-       .word solaris_gettimeofday      /* gettimeofday x       156     */
-       .word CHAIN(getitimer)          /* getitimer    dx      157     */
-       .word CHAIN(setitimer)          /* setitimer    dxx     158     */
-       .word solaris_unimplemented     /* lwp-xxx              159     */
-       .word solaris_unimplemented     /* lwp-xxx              160     */
-       .word solaris_unimplemented     /* lwp-xxx              161     */
-       .word solaris_unimplemented     /* lwp-xxx              162     */
-       .word solaris_unimplemented     /* lwp-xxx              163     */
-       .word solaris_unimplemented     /* lwp-xxx              164     */
-       .word solaris_unimplemented     /* lwp-xxx              165     */
-       .word solaris_unimplemented     /* lwp-xxx              166     */
-       .word solaris_unimplemented     /* lwp-xxx              167     */
-       .word solaris_unimplemented     /* lwp-xxx              168     */
-       .word solaris_unimplemented     /* lwp-xxx              169     */
-       .word solaris_unimplemented     /* lwp-xxx              170     */
-       .word solaris_unimplemented     /* lwp-xxx              171     */
-       .word solaris_unimplemented     /* lwp-xxx              172     */
-       .word solaris_pread             /* pread        dpdd    173     */
-       .word solaris_pwrite            /* pwrite       dpdd    174     */
-       .word REGS(solaris_llseek)      /* llseek       dLd     175     */
-       .word solaris_unimplemented     /* lwpself              176     */
-       .word solaris_unimplemented     /* lwpinfo              177     */
-       .word solaris_unimplemented     /* lwpprivate           178     */
-       .word solaris_unimplemented     /* processorbind        179     */
-       .word solaris_unimplemented     /* processorexbind      180     */
-       .word solaris_unimplemented     /*                      181     */
-       .word solaris_unimplemented     /* sync_mailbox         182     */
-       .word solaris_unimplemented     /* prepblock            183     */
-       .word solaris_unimplemented     /* block                184     */
-       .word solaris_acl               /* acl          sddp    185     */
-       .word solaris_unimplemented     /* unblock              186     */
-       .word solaris_unimplemented     /* cancelblock          187     */
-       .word solaris_unimplemented     /* ?                    188     */
-       .word solaris_unimplemented     /* xxxxx                189     */
-       .word solaris_unimplemented     /* xxxxxe               190     */
-       .word solaris_unimplemented     /*                      191     */
-       .word solaris_unimplemented     /*                      192     */
-       .word solaris_unimplemented     /*                      193     */
-       .word solaris_unimplemented     /*                      194     */
-       .word solaris_unimplemented     /*                      195     */
-       .word solaris_unimplemented     /*                      196     */
-       .word solaris_unimplemented     /*                      197     */
-       .word solaris_unimplemented     /*                      198     */
-       .word CHAIN(nanosleep)          /* nanosleep    dd      199     */
-       .word solaris_facl              /* facl         dddp    200     */
-       .word solaris_unimplemented     /*                      201     */
-       .word CHAIN(setreuid)           /* setreuid     dd      202     */
-       .word CHAIN(setregid)           /* setregid     dd      203     */
-       .word solaris_unimplemented     /*                      204     */
-       .word solaris_unimplemented     /*                      205     */
-       .word solaris_unimplemented     /*                      206     */
-       .word solaris_unimplemented     /*                      207     */
-       .word solaris_unimplemented     /*                      208     */
-       .word solaris_unimplemented     /*                      209     */
-       .word solaris_unimplemented     /*                      210     */
-       .word solaris_unimplemented     /*                      211     */
-       .word solaris_unimplemented     /*                      212     */
-       .word solaris_getdents64        /* getdents64   dpd     213     */
-       .word REGS(solaris_mmap64)      /* mmap64       xxxxdX  214     */
-       .word solaris_stat64            /* stat64       sP      215     */
-       .word solaris_lstat64           /* lstat64      sP      216     */
-       .word solaris_fstat64           /* fstat64      dP      217     */
-       .word solaris_statvfs64         /* statvfs64    sP      218     */
-       .word solaris_fstatvfs64        /* fstatvfs64   dP      219     */
-       .word solaris_setrlimit64       /* setrlimit64  dP      220     */
-       .word solaris_getrlimit64       /* getrlimit64  dP      221     */
-       .word CHAIN(pread64)            /* pread64      dpdD    222     */
-       .word CHAIN(pwrite64)           /* pwrite64     dpdD    223     */
-       .word CHAIN(creat)              /* creat64      so      224     */
-       .word solaris_open              /* open64       soo     225     */
-       .word solaris_unimplemented     /*                      226     */
-       .word solaris_unimplemented     /*                      227     */
-       .word solaris_unimplemented     /*                      228     */
-       .word solaris_unimplemented     /*                      229     */
-       .word solaris_socket            /* socket       ddd     230     */
-       .word solaris_socketpair        /* socketpair   dddp    231     */
-       .word solaris_bind              /* bind         dpd     232     */
-       .word solaris_listen            /* listen       dd      233     */
-       .word solaris_accept            /* accept       dpp     234     */
-       .word solaris_connect           /* connect      dpd     235     */
-       .word solaris_shutdown          /* shutdown     dd      236     */
-       .word solaris_recv              /* recv         dpdd    237     */
-       .word solaris_recvfrom          /* recvfrom     dpddpp  238     */
-       .word solaris_recvmsg           /* recvmsg      dpd     239     */
-       .word solaris_send              /* send         dpdd    240     */
-       .word solaris_sendmsg           /* sendmsg      dpd     241     */
-       .word solaris_sendto            /* sendto       dpddpd  242     */
-       .word solaris_getpeername       /* getpeername  dpp     243     */
-       .word solaris_getsockname       /* getsockname  dpp     244     */
-       .word solaris_getsockopt        /* getsockopt   dddpp   245     */
-       .word solaris_setsockopt        /* setsockopt   dddpp   246     */
-       .word solaris_unimplemented     /*                      247     */
-       .word solaris_ntp_gettime       /* ntp_gettime  p       248     */
-       .word solaris_ntp_adjtime       /* ntp_adjtime  p       249     */
-       .word solaris_unimplemented     /*                      250     */
-       .word solaris_unimplemented     /*                      251     */
-       .word solaris_unimplemented     /*                      252     */
-       .word solaris_unimplemented     /*                      253     */
-       .word solaris_unimplemented     /*                      254     */
-       .word solaris_unimplemented     /*                      255     */
diff --git a/arch/sparc64/solaris/timod.c b/arch/sparc64/solaris/timod.c
deleted file mode 100644 (file)
index 15234fc..0000000
+++ /dev/null
@@ -1,976 +0,0 @@
-/* $Id: timod.c,v 1.19 2002/02/08 03:57:14 davem Exp $
- * timod.c: timod emulation.
- *
- * Copyright (C) 1998 Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)
- *
- * Streams & timod emulation based on code
- * Copyright (C) 1995, 1996 Mike Jagdis (jaggy@purplet.demon.co.uk)
- *
- */
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/ioctl.h>
-#include <linux/fs.h>
-#include <linux/file.h>
-#include <linux/netdevice.h>
-#include <linux/poll.h>
-
-#include <net/sock.h>
-
-#include <asm/uaccess.h>
-#include <asm/termios.h>
-
-#include "conv.h"
-#include "socksys.h"
-
-asmlinkage int solaris_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
-
-static DEFINE_SPINLOCK(timod_pagelock);
-static char * page = NULL ;
-
-#ifndef DEBUG_SOLARIS_KMALLOC
-
-#define mykmalloc kmalloc
-#define mykfree kfree
-
-#else
-
-void * mykmalloc(size_t s, gfp_t gfp)
-{
-       static char * page;
-       static size_t free;
-       void * r;
-       s = ((s + 63) & ~63);
-       if( s > PAGE_SIZE ) {
-               SOLD("too big size, calling real kmalloc");
-               return kmalloc(s, gfp);
-       }
-       if( s > free ) {
-               /* we are wasting memory, but we don't care */
-               page = (char *)__get_free_page(gfp);
-               free = PAGE_SIZE;
-       }
-       r = page;
-       page += s;
-       free -= s;
-       return r;
-}
-
-void mykfree(void *p)
-{
-}
-
-#endif
-
-#ifndef DEBUG_SOLARIS
-
-#define BUF_SIZE       PAGE_SIZE
-#define PUT_MAGIC(a,m)
-#define SCHECK_MAGIC(a,m)
-#define BUF_OFFSET     0
-#define MKCTL_TRAILER  0
-
-#else
-
-#define BUF_SIZE       (PAGE_SIZE-2*sizeof(u64))
-#define BUFPAGE_MAGIC  0xBADC0DEDDEADBABEL
-#define MKCTL_MAGIC    0xDEADBABEBADC0DEDL
-#define PUT_MAGIC(a,m) do{(*(u64*)(a))=(m);}while(0)
-#define SCHECK_MAGIC(a,m)      do{if((*(u64*)(a))!=(m))printk("%s,%u,%s(): magic %08x at %p corrupted!\n",\
-                               __FILE__,__LINE__,__func__,(m),(a));}while(0)
-#define BUF_OFFSET     sizeof(u64)
-#define MKCTL_TRAILER  sizeof(u64)
-
-#endif
-
-static char *getpage( void )
-{
-       char *r;
-       SOLD("getting page");
-       spin_lock(&timod_pagelock);
-       if (page) {
-               r = page;
-               page = NULL;
-               spin_unlock(&timod_pagelock);
-               SOLD("got cached");
-               return r + BUF_OFFSET;
-       }
-       spin_unlock(&timod_pagelock);
-       SOLD("getting new");
-       r = (char *)__get_free_page(GFP_KERNEL);
-       PUT_MAGIC(r,BUFPAGE_MAGIC);
-       PUT_MAGIC(r+PAGE_SIZE-sizeof(u64),BUFPAGE_MAGIC);
-       return r + BUF_OFFSET;
-}
-
-static void putpage(char *p)
-{
-       SOLD("putting page");
-       p = p - BUF_OFFSET;
-       SCHECK_MAGIC(p,BUFPAGE_MAGIC);
-       SCHECK_MAGIC(p+PAGE_SIZE-sizeof(u64),BUFPAGE_MAGIC);
-       spin_lock(&timod_pagelock);
-       if (page) {
-               spin_unlock(&timod_pagelock);
-               free_page((unsigned long)p);
-               SOLD("freed it");
-       } else {
-               page = p;
-               spin_unlock(&timod_pagelock);
-               SOLD("cached it");
-       }
-}
-
-static struct T_primsg *timod_mkctl(int size)
-{
-       struct T_primsg *it;
-
-       SOLD("creating primsg");
-       it = (struct T_primsg *)mykmalloc(size+sizeof(*it)-sizeof(s32)+2*MKCTL_TRAILER, GFP_KERNEL);
-       if (it) {
-               SOLD("got it");
-               it->pri = MSG_HIPRI;
-               it->length = size;
-               PUT_MAGIC((char*)((u64)(((char *)&it->type)+size+7)&~7),MKCTL_MAGIC);
-       }
-       return it;
-}
-
-static void timod_wake_socket(unsigned int fd)
-{
-       struct socket *sock;
-       struct fdtable *fdt;
-
-       SOLD("wakeing socket");
-       fdt = files_fdtable(current->files);
-       sock = SOCKET_I(fdt->fd[fd]->f_path.dentry->d_inode);
-       wake_up_interruptible(&sock->wait);
-       read_lock(&sock->sk->sk_callback_lock);
-       if (sock->fasync_list && !test_bit(SOCK_ASYNC_WAITDATA, &sock->flags))
-               __kill_fasync(sock->fasync_list, SIGIO, POLL_IN);
-       read_unlock(&sock->sk->sk_callback_lock);
-       SOLD("done");
-}
-
-static void timod_queue(unsigned int fd, struct T_primsg *it)
-{
-       struct sol_socket_struct *sock;
-       struct fdtable *fdt;
-
-       SOLD("queuing primsg");
-       fdt = files_fdtable(current->files);
-       sock = (struct sol_socket_struct *)fdt->fd[fd]->private_data;
-       it->next = sock->pfirst;
-       sock->pfirst = it;
-       if (!sock->plast)
-               sock->plast = it;
-       timod_wake_socket(fd);
-       SOLD("done");
-}
-
-static void timod_queue_end(unsigned int fd, struct T_primsg *it)
-{
-       struct sol_socket_struct *sock;
-       struct fdtable *fdt;
-
-       SOLD("queuing primsg at end");
-       fdt = files_fdtable(current->files);
-       sock = (struct sol_socket_struct *)fdt->fd[fd]->private_data;
-       it->next = NULL;
-       if (sock->plast)
-               sock->plast->next = it;
-       else
-               sock->pfirst = it;
-       sock->plast = it;
-       SOLD("done");
-}
-
-static void timod_error(unsigned int fd, int prim, int terr, int uerr)
-{
-       struct T_primsg *it;
-       
-       SOLD("making error");
-       it = timod_mkctl(sizeof(struct T_error_ack));
-       if (it) {
-               struct T_error_ack *err = (struct T_error_ack *)&it->type;
-               
-               SOLD("got it");
-               err->PRIM_type = T_ERROR_ACK;
-               err->ERROR_prim = prim;
-               err->TLI_error = terr;
-               err->UNIX_error = uerr; /* FIXME: convert this */
-               timod_queue(fd, it);
-       }
-       SOLD("done");
-}
-
-static void timod_ok(unsigned int fd, int prim)
-{
-       struct T_primsg *it;
-       struct T_ok_ack *ok;
-       
-       SOLD("creating ok ack");
-       it = timod_mkctl(sizeof(*ok));
-       if (it) {
-               SOLD("got it");
-               ok = (struct T_ok_ack *)&it->type;
-               ok->PRIM_type = T_OK_ACK;
-               ok->CORRECT_prim = prim;
-               timod_queue(fd, it);
-       }
-       SOLD("done");
-}
-
-static int timod_optmgmt(unsigned int fd, int flag, char __user *opt_buf, int opt_len, int do_ret)
-{
-       int error, failed;
-       int ret_space, ret_len;
-       long args[5];
-       char *ret_pos,*ret_buf;
-       int (*sys_socketcall)(int, unsigned long *) =
-               (int (*)(int, unsigned long *))SYS(socketcall);
-       mm_segment_t old_fs = get_fs();
-
-       SOLD("entry");
-       SOLDD(("fd %u flg %u buf %p len %u doret %u",fd,flag,opt_buf,opt_len,do_ret));
-       if (!do_ret && (!opt_buf || opt_len <= 0))
-               return 0;
-       SOLD("getting page");
-       ret_pos = ret_buf = getpage();
-       ret_space = BUF_SIZE;
-       ret_len = 0;
-       
-       error = failed = 0;
-       SOLD("looping");
-       while(opt_len >= sizeof(struct opthdr)) {
-               struct opthdr *opt;
-               int orig_opt_len; 
-               SOLD("loop start");
-               opt = (struct opthdr *)ret_pos; 
-               if (ret_space < sizeof(struct opthdr)) {
-                       failed = TSYSERR;
-                       break;
-               }
-               SOLD("getting opthdr");
-               if (copy_from_user(opt, opt_buf, sizeof(struct opthdr)) ||
-                       opt->len > opt_len) {
-                       failed = TBADOPT;
-                       break;
-               }
-               SOLD("got opthdr");
-               if (flag == T_NEGOTIATE) {
-                       char *buf;
-                       
-                       SOLD("handling T_NEGOTIATE");
-                       buf = ret_pos + sizeof(struct opthdr);
-                       if (ret_space < opt->len + sizeof(struct opthdr) ||
-                               copy_from_user(buf, opt_buf+sizeof(struct opthdr), opt->len)) {
-                               failed = TSYSERR;
-                               break;
-                       }
-                       SOLD("got optdata");
-                       args[0] = fd;
-                       args[1] = opt->level;
-                       args[2] = opt->name;
-                       args[3] = (long)buf;
-                       args[4] = opt->len;
-                       SOLD("calling SETSOCKOPT");
-                       set_fs(KERNEL_DS);
-                       error = sys_socketcall(SYS_SETSOCKOPT, args);
-                       set_fs(old_fs);
-                       if (error) {
-                               failed = TBADOPT;
-                               break;
-                       }
-                       SOLD("SETSOCKOPT ok");
-               }
-               orig_opt_len = opt->len;
-               opt->len = ret_space - sizeof(struct opthdr);
-               if (opt->len < 0) {
-                       failed = TSYSERR;
-                       break;
-               }
-               args[0] = fd;
-               args[1] = opt->level;
-               args[2] = opt->name;
-               args[3] = (long)(ret_pos+sizeof(struct opthdr));
-               args[4] = (long)&opt->len;
-               SOLD("calling GETSOCKOPT");
-               set_fs(KERNEL_DS);
-               error = sys_socketcall(SYS_GETSOCKOPT, args);
-               set_fs(old_fs);
-               if (error) {
-                       failed = TBADOPT;
-                       break;
-               }
-               SOLD("GETSOCKOPT ok");
-               ret_space -= sizeof(struct opthdr) + opt->len;
-               ret_len += sizeof(struct opthdr) + opt->len;
-               ret_pos += sizeof(struct opthdr) + opt->len;
-               opt_len -= sizeof(struct opthdr) + orig_opt_len;
-               opt_buf += sizeof(struct opthdr) + orig_opt_len;
-               SOLD("loop end");
-       }
-       SOLD("loop done");
-       if (do_ret) {
-               SOLD("generating ret msg");
-               if (failed)
-                       timod_error(fd, T_OPTMGMT_REQ, failed, -error);
-               else {
-                       struct T_primsg *it;
-                       it = timod_mkctl(sizeof(struct T_optmgmt_ack) + ret_len);
-                       if (it) {
-                               struct T_optmgmt_ack *ack =
-                                       (struct T_optmgmt_ack *)&it->type;
-                               SOLD("got primsg");
-                               ack->PRIM_type = T_OPTMGMT_ACK;
-                               ack->OPT_length = ret_len;
-                               ack->OPT_offset = sizeof(struct T_optmgmt_ack);
-                               ack->MGMT_flags = (failed ? T_FAILURE : flag);
-                               memcpy(((char*)ack)+sizeof(struct T_optmgmt_ack),
-                                       ret_buf, ret_len);
-                               timod_queue(fd, it);
-                       }
-               }
-       }
-       SOLDD(("put_page %p\n", ret_buf));
-       putpage(ret_buf);
-       SOLD("done");   
-       return 0;
-}
-
-int timod_putmsg(unsigned int fd, char __user *ctl_buf, int ctl_len,
-                       char __user *data_buf, int data_len, int flags)
-{
-       int ret, error, terror;
-       char *buf;
-       struct file *filp;
-       struct inode *ino;
-       struct fdtable *fdt;
-       struct sol_socket_struct *sock;
-       mm_segment_t old_fs = get_fs();
-       long args[6];
-       int (*sys_socketcall)(int, unsigned long __user *) =
-               (int (*)(int, unsigned long __user *))SYS(socketcall);
-       int (*sys_sendto)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int) =
-               (int (*)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int))SYS(sendto);
-
-       fdt = files_fdtable(current->files);
-       filp = fdt->fd[fd];
-       ino = filp->f_path.dentry->d_inode;
-       sock = (struct sol_socket_struct *)filp->private_data;
-       SOLD("entry");
-       if (get_user(ret, (int __user *)A(ctl_buf)))
-               return -EFAULT;
-       switch (ret) {
-       case T_BIND_REQ:
-       {
-               struct T_bind_req req;
-               
-               SOLDD(("bind %016lx(%016lx)\n", sock, filp));
-               SOLD("T_BIND_REQ");
-               if (sock->state != TS_UNBND) {
-                       timod_error(fd, T_BIND_REQ, TOUTSTATE, 0);
-                       return 0;
-               }
-               SOLD("state ok");
-               if (copy_from_user(&req, ctl_buf, sizeof(req))) {
-                       timod_error(fd, T_BIND_REQ, TSYSERR, EFAULT);
-                       return 0;
-               }
-               SOLD("got ctl req");
-               if (req.ADDR_offset && req.ADDR_length) {
-                       if (req.ADDR_length > BUF_SIZE) {
-                               timod_error(fd, T_BIND_REQ, TSYSERR, EFAULT);
-                               return 0;
-                       }
-                       SOLD("req size ok");
-                       buf = getpage();
-                       if (copy_from_user(buf, ctl_buf + req.ADDR_offset, req.ADDR_length)) {
-                               timod_error(fd, T_BIND_REQ, TSYSERR, EFAULT);
-                               putpage(buf);
-                               return 0;
-                       }
-                       SOLD("got ctl data");
-                       args[0] = fd;
-                       args[1] = (long)buf;
-                       args[2] = req.ADDR_length;
-                       SOLD("calling BIND");
-                       set_fs(KERNEL_DS);
-                       error = sys_socketcall(SYS_BIND, args);
-                       set_fs(old_fs);
-                       putpage(buf);
-                       SOLD("BIND returned");
-               } else 
-                       error = 0;
-               if (!error) {
-                       struct T_primsg *it;
-                       if (req.CONIND_number) {
-                               args[0] = fd;
-                               args[1] = req.CONIND_number;
-                               SOLD("calling LISTEN");
-                               set_fs(KERNEL_DS);
-                               error = sys_socketcall(SYS_LISTEN, args);
-                               set_fs(old_fs);
-                               SOLD("LISTEN done");
-                       }
-                       it = timod_mkctl(sizeof(struct T_bind_ack)+sizeof(struct sockaddr));
-                       if (it) {
-                               struct T_bind_ack *ack;
-
-                               ack = (struct T_bind_ack *)&it->type;
-                               ack->PRIM_type = T_BIND_ACK;
-                               ack->ADDR_offset = sizeof(*ack);
-                               ack->ADDR_length = sizeof(struct sockaddr);
-                               ack->CONIND_number = req.CONIND_number;
-                               args[0] = fd;
-                               args[1] = (long)(ack+sizeof(*ack));
-                               args[2] = (long)&ack->ADDR_length;
-                               set_fs(KERNEL_DS);
-                               sys_socketcall(SYS_GETSOCKNAME,args);
-                               set_fs(old_fs);
-                               sock->state = TS_IDLE;
-                               timod_ok(fd, T_BIND_REQ);
-                               timod_queue_end(fd, it);
-                               SOLD("BIND done");
-                               return 0;
-                       }
-               }
-               SOLD("some error");
-               switch (error) {
-                       case -EINVAL:
-                               terror = TOUTSTATE;
-                               error = 0;
-                               break;
-                       case -EACCES:
-                               terror = TACCES;
-                               error = 0;
-                               break;
-                       case -EADDRNOTAVAIL:
-                       case -EADDRINUSE:
-                               terror = TNOADDR;
-                               error = 0;
-                               break;
-                       default:
-                               terror = TSYSERR;
-                               break;
-               }
-               timod_error(fd, T_BIND_REQ, terror, -error);
-               SOLD("BIND done");
-               return 0;
-       }
-       case T_CONN_REQ:
-       {
-               struct T_conn_req req;
-               unsigned short oldflags;
-               struct T_primsg *it;
-               SOLD("T_CONN_REQ");
-               if (sock->state != TS_UNBND && sock->state != TS_IDLE) {
-                       timod_error(fd, T_CONN_REQ, TOUTSTATE, 0);
-                       return 0;
-               }
-               SOLD("state ok");
-               if (copy_from_user(&req, ctl_buf, sizeof(req))) {
-                       timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
-                       return 0;
-               }
-               SOLD("got ctl req");
-               if (ctl_len > BUF_SIZE) {
-                       timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
-                       return 0;
-               }
-               SOLD("req size ok");
-               buf = getpage();
-               if (copy_from_user(buf, ctl_buf, ctl_len)) {
-                       timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
-                       putpage(buf);
-                       return 0;
-               }
-#ifdef DEBUG_SOLARIS           
-               {
-                       char * ptr = buf;
-                       int len = ctl_len;
-                       printk("returned data (%d bytes): ",len);
-                       while( len-- ) {
-                               if (!(len & 7))
-                                       printk(" ");
-                               printk("%02x",(unsigned char)*ptr++);
-                       }
-                       printk("\n");
-               }
-#endif
-               SOLD("got ctl data");
-               args[0] = fd;
-               args[1] = (long)buf+req.DEST_offset;
-               args[2] = req.DEST_length;
-               oldflags = filp->f_flags;
-               filp->f_flags &= ~O_NONBLOCK;
-               SOLD("calling CONNECT");
-               set_fs(KERNEL_DS);
-               error = sys_socketcall(SYS_CONNECT, args);
-               set_fs(old_fs);
-               filp->f_flags = oldflags;
-               SOLD("CONNECT done");
-               if (!error) {
-                       struct T_conn_con *con;
-                       SOLD("no error");
-                       it = timod_mkctl(ctl_len);
-                       if (!it) {
-                               putpage(buf);
-                               return -ENOMEM;
-                       }
-                       con = (struct T_conn_con *)&it->type;
-#ifdef DEBUG_SOLARIS                   
-                       {
-                               char * ptr = buf;
-                               int len = ctl_len;
-                               printk("returned data (%d bytes): ",len);
-                               while( len-- ) {
-                                       if (!(len & 7))
-                                               printk(" ");
-                                       printk("%02x",(unsigned char)*ptr++);
-                               }
-                               printk("\n");
-                       }
-#endif
-                       memcpy(con, buf, ctl_len);
-                       SOLD("copied ctl_buf");
-                       con->PRIM_type = T_CONN_CON;
-                       sock->state = TS_DATA_XFER;
-               } else {
-                       struct T_discon_ind *dis;
-                       SOLD("some error");
-                       it = timod_mkctl(sizeof(*dis));
-                       if (!it) {
-                               putpage(buf);
-                               return -ENOMEM;
-                       }
-                       SOLD("got primsg");
-                       dis = (struct T_discon_ind *)&it->type;
-                       dis->PRIM_type = T_DISCON_IND;
-                       dis->DISCON_reason = -error;    /* FIXME: convert this as in iABI_errors() */
-                       dis->SEQ_number = 0;
-               }
-               putpage(buf);
-               timod_ok(fd, T_CONN_REQ);
-               it->pri = 0;
-               timod_queue_end(fd, it);
-               SOLD("CONNECT done");
-               return 0;
-       }
-       case T_OPTMGMT_REQ:
-       {
-               struct T_optmgmt_req req;
-               SOLD("OPTMGMT_REQ");
-               if (copy_from_user(&req, ctl_buf, sizeof(req)))
-                       return -EFAULT;
-               SOLD("got req");
-               return timod_optmgmt(fd, req.MGMT_flags,
-                               req.OPT_offset > 0 ? ctl_buf + req.OPT_offset : NULL,
-                               req.OPT_length, 1);
-       }
-       case T_UNITDATA_REQ:
-       {
-               struct T_unitdata_req req;
-               
-               int err;
-               SOLD("T_UNITDATA_REQ");
-               if (sock->state != TS_IDLE && sock->state != TS_DATA_XFER) {
-                       timod_error(fd, T_CONN_REQ, TOUTSTATE, 0);
-                       return 0;
-               }
-               SOLD("state ok");
-               if (copy_from_user(&req, ctl_buf, sizeof(req))) {
-                       timod_error(fd, T_CONN_REQ, TSYSERR, EFAULT);
-                       return 0;
-               }
-               SOLD("got ctl req");
-#ifdef DEBUG_SOLARIS           
-               {
-                       char * ptr = ctl_buf+req.DEST_offset;
-                       int len = req.DEST_length;
-                       printk("socket address (%d bytes): ",len);
-                       while( len-- ) {
-                               char c;
-                               if (get_user(c,ptr))
-                                       printk("??");
-                               else
-                                       printk("%02x",(unsigned char)c);
-                               ptr++;
-                       }
-                       printk("\n");
-               }
-#endif         
-               err = sys_sendto(fd, data_buf, data_len, 0, req.DEST_length > 0 ? (struct sockaddr __user *)(ctl_buf+req.DEST_offset) : NULL, req.DEST_length);
-               if (err == data_len)
-                       return 0;
-               if(err >= 0) {
-                       printk("timod: sendto failed to send all the data\n");
-                       return 0;
-               }
-               timod_error(fd, T_CONN_REQ, TSYSERR, -err);
-               return 0;
-       }
-       default:
-               printk(KERN_INFO "timod_putmsg: unsupported command %u.\n", ret);
-               break;
-       }
-       return -EINVAL;
-}
-
-int timod_getmsg(unsigned int fd, char __user *ctl_buf, int ctl_maxlen, s32 __user *ctl_len,
-                       char __user *data_buf, int data_maxlen, s32 __user *data_len, int *flags_p)
-{
-       int error;
-       int oldflags;
-       struct file *filp;
-       struct inode *ino;
-       struct fdtable *fdt;
-       struct sol_socket_struct *sock;
-       struct T_unitdata_ind udi;
-       mm_segment_t old_fs = get_fs();
-       long args[6];
-       char __user *tmpbuf;
-       int tmplen;
-       int (*sys_socketcall)(int, unsigned long __user *) =
-               (int (*)(int, unsigned long __user *))SYS(socketcall);
-       int (*sys_recvfrom)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *);
-       
-       SOLD("entry");
-       SOLDD(("%u %p %d %p %p %d %p %d\n", fd, ctl_buf, ctl_maxlen, ctl_len, data_buf, data_maxlen, data_len, *flags_p));
-       fdt = files_fdtable(current->files);
-       filp = fdt->fd[fd];
-       ino = filp->f_path.dentry->d_inode;
-       sock = (struct sol_socket_struct *)filp->private_data;
-       SOLDD(("%p %p\n", sock->pfirst, sock->pfirst ? sock->pfirst->next : NULL));
-       if ( ctl_maxlen > 0 && !sock->pfirst && SOCKET_I(ino)->type == SOCK_STREAM
-               && sock->state == TS_IDLE) {
-               SOLD("calling LISTEN");
-               args[0] = fd;
-               args[1] = -1;
-               set_fs(KERNEL_DS);
-               sys_socketcall(SYS_LISTEN, args);
-               set_fs(old_fs);
-               SOLD("LISTEN done");
-       }
-       if (!(filp->f_flags & O_NONBLOCK)) {
-               struct poll_wqueues wait_table;
-               poll_table *wait;
-
-               poll_initwait(&wait_table);
-               wait = &wait_table.pt;
-               for(;;) {
-                       SOLD("loop");
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       /* ! ( l<0 || ( l>=0 && ( ! pfirst || (flags == HIPRI && pri != HIPRI) ) ) ) */ 
-                       /* ( ! l<0 && ! ( l>=0 && ( ! pfirst || (flags == HIPRI && pri != HIPRI) ) ) ) */ 
-                       /* ( l>=0 && ( ! l>=0 || ! ( ! pfirst || (flags == HIPRI && pri != HIPRI) ) ) ) */ 
-                       /* ( l>=0 && ( l<0 || ( pfirst && ! (flags == HIPRI && pri != HIPRI) ) ) ) */ 
-                       /* ( l>=0 && ( l<0 || ( pfirst && (flags != HIPRI || pri == HIPRI) ) ) ) */ 
-                       /* ( l>=0 && ( pfirst && (flags != HIPRI || pri == HIPRI) ) ) */ 
-                       if (ctl_maxlen >= 0 && sock->pfirst && (*flags_p != MSG_HIPRI || sock->pfirst->pri == MSG_HIPRI))
-                               break;
-                       SOLD("cond 1 passed");
-                       if (
-                       #if 1
-                               *flags_p != MSG_HIPRI &&
-                       #endif
-                               ((filp->f_op->poll(filp, wait) & POLLIN) ||
-                               (filp->f_op->poll(filp, NULL) & POLLIN) ||
-                               signal_pending(current))
-                       ) {
-                               break;
-                       }
-                       if( *flags_p == MSG_HIPRI ) {
-                               SOLD("avoiding lockup");
-                               break ;
-                       }
-                       if(wait_table.error) {
-                               SOLD("wait-table error");
-                               poll_freewait(&wait_table);
-                               return wait_table.error;
-                       }
-                       SOLD("scheduling");
-                       schedule();
-               }
-               SOLD("loop done");
-               current->state = TASK_RUNNING;
-               poll_freewait(&wait_table);
-               if (signal_pending(current)) {
-                       SOLD("signal pending");
-                       return -EINTR;
-               }
-       }
-       if (ctl_maxlen >= 0 && sock->pfirst) {
-               struct T_primsg *it = sock->pfirst;
-               int l = min_t(int, ctl_maxlen, it->length);
-               SCHECK_MAGIC((char*)((u64)(((char *)&it->type)+sock->offset+it->length+7)&~7),MKCTL_MAGIC);
-               SOLD("purting ctl data");
-               if(copy_to_user(ctl_buf,
-                       (char*)&it->type + sock->offset, l))
-                       return -EFAULT;
-               SOLD("pur it");
-               if(put_user(l, ctl_len))
-                       return -EFAULT;
-               SOLD("set ctl_len");
-               *flags_p = it->pri;
-               it->length -= l;
-               if (it->length) {
-                       SOLD("more ctl");
-                       sock->offset += l;
-                       return MORECTL;
-               } else {
-                       SOLD("removing message");
-                       sock->pfirst = it->next;
-                       if (!sock->pfirst)
-                               sock->plast = NULL;
-                       SOLDD(("getmsg kfree %016lx->%016lx\n", it, sock->pfirst));
-                       mykfree(it);
-                       sock->offset = 0;
-                       SOLD("ctl done");
-                       return 0;
-               }
-       }
-       *flags_p = 0;
-       if (ctl_maxlen >= 0) {
-               SOLD("ACCEPT perhaps?");
-               if (SOCKET_I(ino)->type == SOCK_STREAM && sock->state == TS_IDLE) {
-                       struct T_conn_ind ind;
-                       char *buf = getpage();
-                       int len = BUF_SIZE;
-
-                       SOLD("trying ACCEPT");
-                       if (put_user(ctl_maxlen - sizeof(ind), ctl_len))
-                               return -EFAULT;
-                       args[0] = fd;
-                       args[1] = (long)buf;
-                       args[2] = (long)&len;
-                       oldflags = filp->f_flags;
-                       filp->f_flags |= O_NONBLOCK;
-                       SOLD("calling ACCEPT");
-                       set_fs(KERNEL_DS);
-                       error = sys_socketcall(SYS_ACCEPT, args);
-                       set_fs(old_fs);
-                       filp->f_flags = oldflags;
-                       if (error < 0) {
-                               SOLD("some error");
-                               putpage(buf);
-                               return error;
-                       }
-                       if (error) {
-                               SOLD("connect");
-                               putpage(buf);
-                               if (sizeof(ind) > ctl_maxlen) {
-                                       SOLD("generating CONN_IND");
-                                       ind.PRIM_type = T_CONN_IND;
-                                       ind.SRC_length = len;
-                                       ind.SRC_offset = sizeof(ind);
-                                       ind.OPT_length = ind.OPT_offset = 0;
-                                       ind.SEQ_number = error;
-                                       if(copy_to_user(ctl_buf, &ind, sizeof(ind))||
-                                          put_user(sizeof(ind)+ind.SRC_length,ctl_len))
-                                               return -EFAULT;
-                                       SOLD("CONN_IND created");
-                               }
-                               if (data_maxlen >= 0)
-                                       put_user(0, data_len);
-                               SOLD("CONN_IND done");
-                               return 0;
-                       }
-                       if (len>ctl_maxlen) {
-                               SOLD("data don't fit");
-                               putpage(buf);
-                               return -EFAULT;         /* XXX - is this ok ? */
-                       }
-                       if(copy_to_user(ctl_buf,buf,len) || put_user(len,ctl_len)){
-                               SOLD("can't copy data");
-                               putpage(buf);
-                               return -EFAULT;
-                       }
-                       SOLD("ACCEPT done");
-                       putpage(buf);
-               }
-       }
-       SOLD("checking data req");
-       if (data_maxlen <= 0) {
-               if (data_maxlen == 0)
-                       put_user(0, data_len);
-               if (ctl_maxlen >= 0)
-                       put_user(0, ctl_len);
-               return -EAGAIN;
-       }
-       SOLD("wants data");
-       if (ctl_maxlen > sizeof(udi) && sock->state == TS_IDLE) {
-               SOLD("udi fits");
-               tmpbuf = ctl_buf + sizeof(udi);
-               tmplen = ctl_maxlen - sizeof(udi);
-       } else {
-               SOLD("udi does not fit");
-               tmpbuf = NULL;
-               tmplen = 0;
-       }
-       if (put_user(tmplen, ctl_len))
-               return -EFAULT;
-       SOLD("set ctl_len");
-       oldflags = filp->f_flags;
-       filp->f_flags |= O_NONBLOCK;
-       SOLD("calling recvfrom");
-       sys_recvfrom = (int (*)(int, void __user *, size_t, unsigned, struct sockaddr __user *, int __user *))SYS(recvfrom);
-       error = sys_recvfrom(fd, data_buf, data_maxlen, 0, (struct sockaddr __user *)tmpbuf, ctl_len);
-       filp->f_flags = oldflags;
-       if (error < 0)
-               return error;
-       SOLD("error >= 0" ) ;
-       if (error && ctl_maxlen > sizeof(udi) && sock->state == TS_IDLE) {
-               SOLD("generating udi");
-               udi.PRIM_type = T_UNITDATA_IND;
-               if (get_user(udi.SRC_length, ctl_len))
-                       return -EFAULT;
-               udi.SRC_offset = sizeof(udi);
-               udi.OPT_length = udi.OPT_offset = 0;
-               if (copy_to_user(ctl_buf, &udi, sizeof(udi)) ||
-                   put_user(sizeof(udi)+udi.SRC_length, ctl_len))
-                       return -EFAULT;
-               SOLD("udi done");
-       } else {
-               if (put_user(0, ctl_len))
-                       return -EFAULT;
-       }
-       put_user(error, data_len);
-       SOLD("done");
-       return 0;
-}
-
-asmlinkage int solaris_getmsg(unsigned int fd, u32 arg1, u32 arg2, u32 arg3)
-{
-       struct file *filp;
-       struct inode *ino;
-       struct strbuf __user *ctlptr;
-       struct strbuf __user *datptr;
-       struct strbuf ctl, dat;
-       int __user *flgptr;
-       int flags;
-       int error = -EBADF;
-       struct fdtable *fdt;
-
-       SOLD("entry");
-       lock_kernel();
-       if (fd >= sysctl_nr_open)
-               goto out;
-
-       fdt = files_fdtable(current->files);
-       filp = fdt->fd[fd];
-       if(!filp) goto out;
-
-       ino = filp->f_path.dentry->d_inode;
-       if (!ino || !S_ISSOCK(ino->i_mode))
-               goto out;
-
-       ctlptr = (struct strbuf __user *)A(arg1);
-       datptr = (struct strbuf __user *)A(arg2);
-       flgptr = (int __user *)A(arg3);
-
-       error = -EFAULT;
-
-       if (ctlptr) {
-               if (copy_from_user(&ctl,ctlptr,sizeof(struct strbuf)) || 
-                   put_user(-1,&ctlptr->len))
-                       goto out;
-       } else
-               ctl.maxlen = -1;
-
-       if (datptr) {
-               if (copy_from_user(&dat,datptr,sizeof(struct strbuf)) || 
-                   put_user(-1,&datptr->len))
-                       goto out;
-       } else
-               dat.maxlen = -1;
-
-       if (get_user(flags,flgptr))
-               goto out;
-
-       switch (flags) {
-       case 0:
-       case MSG_HIPRI:
-       case MSG_ANY:
-       case MSG_BAND:
-               break;
-       default:
-               error = -EINVAL;
-               goto out;
-       }
-
-       error = timod_getmsg(fd,A(ctl.buf),ctl.maxlen,&ctlptr->len,
-                               A(dat.buf),dat.maxlen,&datptr->len,&flags);
-
-       if (!error && put_user(flags,flgptr))
-               error = -EFAULT;
-out:
-       unlock_kernel();
-       SOLD("done");
-       return error;
-}
-
-asmlinkage int solaris_putmsg(unsigned int fd, u32 arg1, u32 arg2, u32 arg3)
-{
-       struct file *filp;
-       struct inode *ino;
-       struct strbuf __user *ctlptr;
-       struct strbuf __user *datptr;
-       struct strbuf ctl, dat;
-       int flags = (int) arg3;
-       int error = -EBADF;
-       struct fdtable *fdt;
-
-       SOLD("entry");
-       lock_kernel();
-       if (fd >= sysctl_nr_open)
-               goto out;
-
-       fdt = files_fdtable(current->files);
-       filp = fdt->fd[fd];
-       if(!filp) goto out;
-
-       ino = filp->f_path.dentry->d_inode;
-       if (!ino) goto out;
-
-       if (!S_ISSOCK(ino->i_mode) &&
-               (imajor(ino) != 30 || iminor(ino) != 1))
-               goto out;
-
-       ctlptr = A(arg1);
-       datptr = A(arg2);
-
-       error = -EFAULT;
-
-       if (ctlptr) {
-               if (copy_from_user(&ctl,ctlptr,sizeof(ctl)))
-                       goto out;
-               if (ctl.len < 0 && flags) {
-                       error = -EINVAL;
-                       goto out;
-               }
-       } else {
-               ctl.len = 0;
-               ctl.buf = 0;
-       }
-
-       if (datptr) {
-               if (copy_from_user(&dat,datptr,sizeof(dat)))
-                       goto out;
-       } else {
-               dat.len = 0;
-               dat.buf = 0;
-       }
-
-       error = timod_putmsg(fd,A(ctl.buf),ctl.len,
-                               A(dat.buf),dat.len,flags);
-out:
-       unlock_kernel();
-       SOLD("done");
-       return error;
-}
index 85364804364fc3a058114b30379927dcd974621f..7bd76639544c18d78d8b4ed87fb6befb7dcf685d 100644 (file)
@@ -108,7 +108,7 @@ static struct page *brd_insert_page(struct brd_device *brd, sector_t sector)
 #ifndef CONFIG_BLK_DEV_XIP
        gfp_flags |= __GFP_HIGHMEM;
 #endif
-       page = alloc_page(GFP_NOIO | __GFP_HIGHMEM | __GFP_ZERO);
+       page = alloc_page(gfp_flags);
        if (!page)
                return NULL;
 
index f0b00ec1e47e7c1c0daf85cd6cc864f2c0c2c555..e03c67dd3e6325ae186fbe7ecc9523223f3015ad 100644 (file)
@@ -44,8 +44,8 @@
 
 #ifdef CONFIG_HID_DEBUG
 int hid_debug = 0;
-module_param_named(debug, hid_debug, bool, 0600);
-MODULE_PARM_DESC(debug, "Turn HID debugging mode on and off");
+module_param_named(debug, hid_debug, int, 0600);
+MODULE_PARM_DESC(debug, "HID debugging (0=off, 1=probing info, 2=continuous data dumping)");
 EXPORT_SYMBOL_GPL(hid_debug);
 #endif
 
@@ -97,7 +97,7 @@ static struct hid_field *hid_register_field(struct hid_report *report, unsigned
        field->index = report->maxfield++;
        report->field[field->index] = field;
        field->usage = (struct hid_usage *)(field + 1);
-       field->value = (unsigned *)(field->usage + usages);
+       field->value = (s32 *)(field->usage + usages);
        field->report = report;
 
        return field;
@@ -830,7 +830,8 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, s
  * reporting to the layer).
  */
 
-void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt)
+static void hid_input_field(struct hid_device *hid, struct hid_field *field,
+                           __u8 *data, int interrupt)
 {
        unsigned n;
        unsigned count = field->report_count;
@@ -876,7 +877,6 @@ void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data
 exit:
        kfree(value);
 }
-EXPORT_SYMBOL_GPL(hid_input_field);
 
 /*
  * Output the field into the report.
@@ -988,8 +988,13 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
 
        if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
                hid->hiddev_report_event(hid, report);
-       if (hid->claimed & HID_CLAIMED_HIDRAW)
-               hidraw_report_event(hid, data, size);
+       if (hid->claimed & HID_CLAIMED_HIDRAW) {
+               /* numbered reports need to be passed with the report num */
+               if (report_enum->numbered)
+                       hidraw_report_event(hid, data - 1, size + 1);
+               else
+                       hidraw_report_event(hid, data, size);
+       }
 
        for (n = 0; n < report->maxfield; n++)
                hid_input_field(hid, report->field[n], data, interrupt);
index 5c24fe46d8eb9c423637888f163e70dedb2281c2..f88714b0600007c3e54d3f85a2a4ea60eeb12574 100644 (file)
@@ -498,7 +498,7 @@ void hid_dump_device(struct hid_device *device) {
 EXPORT_SYMBOL_GPL(hid_dump_device);
 
 void hid_dump_input(struct hid_usage *usage, __s32 value) {
-       if (!hid_debug)
+       if (hid_debug < 2)
                return;
 
        printk(KERN_DEBUG "hid-debug: input ");
index dceadd0c141964b732e3bf2846b77c1ead5d9fd2..4c2052c658f1465f6a8d89494b03a8783a7ba6e3 100644 (file)
@@ -276,6 +276,21 @@ static int quirk_btc_8193(struct hid_usage *usage, struct input_dev *input,
        return 1;
 }
 
+static int quirk_sunplus_wdesktop(struct hid_usage *usage, struct input_dev *input,
+                             unsigned long **bit, int *max)
+{
+       if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
+               return 0;
+
+       switch (usage->hid & HID_USAGE) {
+               case 0x2003: map_key_clear(KEY_ZOOMIN);         break;
+               case 0x2103: map_key_clear(KEY_ZOOMOUT);        break;
+               default:
+                       return 0;
+       }
+       return 1;
+}
+
 #define VENDOR_ID_BELKIN                       0x1020
 #define DEVICE_ID_BELKIN_WIRELESS_KEYBOARD     0x0006
 
@@ -306,6 +321,9 @@ static int quirk_btc_8193(struct hid_usage *usage, struct input_dev *input,
 #define VENDOR_ID_PETALYNX                     0x18b1
 #define DEVICE_ID_PETALYNX_MAXTER_REMOTE       0x0037
 
+#define VENDOR_ID_SUNPLUS                      0x04fc
+#define DEVICE_ID_SUNPLUS_WDESKTOP             0x05d8
+
 static const struct hid_input_blacklist {
        __u16 idVendor;
        __u16 idProduct;
@@ -332,8 +350,10 @@ static const struct hid_input_blacklist {
        { VENDOR_ID_MONTEREY, DEVICE_ID_GENIUS_KB29E, quirk_cherry_genius_29e },
 
        { VENDOR_ID_PETALYNX, DEVICE_ID_PETALYNX_MAXTER_REMOTE, quirk_petalynx_remote },
-       
-       { 0, 0, 0 }
+
+       { VENDOR_ID_SUNPLUS, DEVICE_ID_SUNPLUS_WDESKTOP, quirk_sunplus_wdesktop },
+
+       { 0, 0, NULL }
 };
 
 int hidinput_mapping_quirks(struct hid_usage *usage, 
index 7160fa65d79bd2f2dea4730e138bc59f96d81ce9..18f09104765c71406020bc2031c76ef901fcaa2c 100644 (file)
@@ -71,6 +71,14 @@ config LOGITECH_FF
          Note: if you say N here, this device will still be supported, but without
          force feedback.
 
+config LOGIRUMBLEPAD2_FF
+       bool "Logitech Rumblepad 2 support"
+       depends on HID_FF
+       select INPUT_FF_MEMLESS if USB_HID
+       help
+         Say Y here if you want to enable force feedback support for Logitech
+         Rumblepad 2 devices.
+
 config PANTHERLORD_FF
        bool "PantherLord/GreenAsia based device support"
        depends on HID_FF
@@ -80,8 +88,8 @@ config PANTHERLORD_FF
          or adapter and want to enable force feedback support for it.
 
 config THRUSTMASTER_FF
-       bool "ThrustMaster devices support (EXPERIMENTAL)"
-       depends on HID_FF && EXPERIMENTAL
+       bool "ThrustMaster devices support"
+       depends on HID_FF
        select INPUT_FF_MEMLESS if USB_HID
        help
          Say Y here if you have a THRUSTMASTER FireStore Dual Power 2 or
index 8e6ab5b164a241fdb0aabbb8b853d809d0bd43b2..00a7b70901925276e63237b023580c94ec21cec8 100644 (file)
@@ -16,6 +16,9 @@ endif
 ifeq ($(CONFIG_LOGITECH_FF),y)
        usbhid-objs     += hid-lgff.o
 endif
+ifeq ($(CONFIG_LOGIRUMBLEPAD2_FF),y)
+       usbhid-objs     += hid-lg2ff.o
+endif
 ifeq ($(CONFIG_PANTHERLORD_FF),y)
        usbhid-objs     += hid-plff.o
 endif
index d95979f0e028adb0f3090a724bbc481882eeeecb..e0d805f1b2bff4d80cb43eb12d320b07b412ddd5 100644 (file)
@@ -82,6 +82,7 @@ static int hid_start_in(struct hid_device *hid)
 
        spin_lock_irqsave(&usbhid->inlock, flags);
        if (hid->open > 0 && !test_bit(HID_SUSPENDED, &usbhid->iofl) &&
+                       !test_bit(HID_DISCONNECTED, &usbhid->iofl) &&
                        !test_and_set_bit(HID_IN_RUNNING, &usbhid->iofl)) {
                rc = usb_submit_urb(usbhid->urbin, GFP_ATOMIC);
                if (rc != 0)
@@ -155,7 +156,7 @@ static void hid_io_error(struct hid_device *hid)
        spin_lock_irqsave(&usbhid->inlock, flags);
 
        /* Stop when disconnected */
-       if (usb_get_intfdata(usbhid->intf) == NULL)
+       if (test_bit(HID_DISCONNECTED, &usbhid->iofl))
                goto done;
 
        /* If it has been a while since the last error, we'll assume
@@ -341,7 +342,7 @@ static void hid_irq_out(struct urb *urb)
        if (usbhid->outhead != usbhid->outtail) {
                if (hid_submit_out(hid)) {
                        clear_bit(HID_OUT_RUNNING, &usbhid->iofl);
-                       wake_up(&hid->wait);
+                       wake_up(&usbhid->wait);
                }
                spin_unlock_irqrestore(&usbhid->outlock, flags);
                return;
@@ -349,7 +350,7 @@ static void hid_irq_out(struct urb *urb)
 
        clear_bit(HID_OUT_RUNNING, &usbhid->iofl);
        spin_unlock_irqrestore(&usbhid->outlock, flags);
-       wake_up(&hid->wait);
+       wake_up(&usbhid->wait);
 }
 
 /*
@@ -391,7 +392,7 @@ static void hid_ctrl(struct urb *urb)
        if (usbhid->ctrlhead != usbhid->ctrltail) {
                if (hid_submit_ctrl(hid)) {
                        clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
-                       wake_up(&hid->wait);
+                       wake_up(&usbhid->wait);
                }
                spin_unlock_irqrestore(&usbhid->ctrllock, flags);
                return;
@@ -399,7 +400,7 @@ static void hid_ctrl(struct urb *urb)
 
        clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
        spin_unlock_irqrestore(&usbhid->ctrllock, flags);
-       wake_up(&hid->wait);
+       wake_up(&usbhid->wait);
 }
 
 void usbhid_submit_report(struct hid_device *hid, struct hid_report *report, unsigned char dir)
@@ -478,8 +479,9 @@ int usbhid_wait_io(struct hid_device *hid)
 {
        struct usbhid_device *usbhid = hid->driver_data;
 
-       if (!wait_event_timeout(hid->wait, (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl) &&
-                                       !test_bit(HID_OUT_RUNNING, &usbhid->iofl)),
+       if (!wait_event_timeout(usbhid->wait,
+                               (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl) &&
+                               !test_bit(HID_OUT_RUNNING, &usbhid->iofl)),
                                        10*HZ)) {
                dbg_hid("timeout waiting for ctrl or out queue to clear\n");
                return -1;
@@ -610,10 +612,11 @@ static void usbhid_set_leds(struct hid_device *hid)
 /*
  * Traverse the supplied list of reports and find the longest
  */
-static void hid_find_max_report(struct hid_device *hid, unsigned int type, int *max)
+static void hid_find_max_report(struct hid_device *hid, unsigned int type,
+               unsigned int *max)
 {
        struct hid_report *report;
-       int size;
+       unsigned int size;
 
        list_for_each_entry(report, &hid->report_enum[type].report_list, list) {
                size = ((report->size - 1) >> 3) + 1;
@@ -705,9 +708,9 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
        struct hid_descriptor *hdesc;
        struct hid_device *hid;
        u32 quirks = 0;
-       unsigned rsize = 0;
+       unsigned int insize = 0, rsize = 0;
        char *rdesc;
-       int n, len, insize = 0;
+       int n, len;
        struct usbhid_device *usbhid;
 
        quirks = usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
@@ -800,6 +803,22 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
                goto fail;
        }
 
+       hid->name[0] = 0;
+
+       if (dev->manufacturer)
+               strlcpy(hid->name, dev->manufacturer, sizeof(hid->name));
+
+       if (dev->product) {
+               if (dev->manufacturer)
+                       strlcat(hid->name, " ", sizeof(hid->name));
+               strlcat(hid->name, dev->product, sizeof(hid->name));
+       }
+
+       if (!strlen(hid->name))
+               snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x",
+                        le16_to_cpu(dev->descriptor.idVendor),
+                        le16_to_cpu(dev->descriptor.idProduct));
+
        for (n = 0; n < interface->desc.bNumEndpoints; n++) {
 
                struct usb_endpoint_descriptor *endpoint;
@@ -812,6 +831,14 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
 
                interval = endpoint->bInterval;
 
+               /* Some vendors give fullspeed interval on highspeed devides */
+               if (quirks & HID_QUIRK_FULLSPEED_INTERVAL  &&
+                   dev->speed == USB_SPEED_HIGH) {
+                       interval = fls(endpoint->bInterval*8);
+                       printk(KERN_INFO "%s: Fixing fullspeed to highspeed interval: %d -> %d\n",
+                              hid->name, endpoint->bInterval, interval);
+               }
+
                /* Change the polling interval of mice. */
                if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0)
                        interval = hid_mousepoll_interval;
@@ -844,8 +871,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
                goto fail;
        }
 
-       init_waitqueue_head(&hid->wait);
-
+       init_waitqueue_head(&usbhid->wait);
        INIT_WORK(&usbhid->reset_work, hid_reset);
        setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
 
@@ -859,22 +885,6 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
        usbhid->intf = intf;
        usbhid->ifnum = interface->desc.bInterfaceNumber;
 
-       hid->name[0] = 0;
-
-       if (dev->manufacturer)
-               strlcpy(hid->name, dev->manufacturer, sizeof(hid->name));
-
-       if (dev->product) {
-               if (dev->manufacturer)
-                       strlcat(hid->name, " ", sizeof(hid->name));
-               strlcat(hid->name, dev->product, sizeof(hid->name));
-       }
-
-       if (!strlen(hid->name))
-               snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x",
-                        le16_to_cpu(dev->descriptor.idVendor),
-                        le16_to_cpu(dev->descriptor.idProduct));
-
        hid->bus = BUS_USB;
        hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
        hid->product = le16_to_cpu(dev->descriptor.idProduct);
@@ -932,6 +942,7 @@ static void hid_disconnect(struct usb_interface *intf)
 
        spin_lock_irq(&usbhid->inlock); /* Sync with error handler */
        usb_set_intfdata(intf, NULL);
+       set_bit(HID_DISCONNECTED, &usbhid->iofl);
        spin_unlock_irq(&usbhid->inlock);
        usb_kill_urb(usbhid->urbin);
        usb_kill_urb(usbhid->urbout);
index 4c210e16b1b4d5b0ef8f4a17e7a2e79be5061136..1d0dac52f1664607afe7130f348e7ba5d3cfa23e 100644 (file)
@@ -59,6 +59,9 @@ static struct hid_ff_initializer inits[] = {
        { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */
        { 0x46d, 0xca03, hid_lgff_init }, /* Logitech MOMO force wheel */
 #endif
+#ifdef CONFIG_LOGIRUMBLEPAD2_FF
+       { 0x46d, 0xc218, hid_lg2ff_init }, /* Logitech Rumblepad 2 */
+#endif
 #ifdef CONFIG_PANTHERLORD_FF
        { 0x810, 0x0001, hid_plff_init }, /* "Twin USB Joystick" */
        { 0xe8f, 0x0003, hid_plff_init }, /* "GreenAsia Inc.    USB Joystick     " */
diff --git a/drivers/hid/usbhid/hid-lg2ff.c b/drivers/hid/usbhid/hid-lg2ff.c
new file mode 100644 (file)
index 0000000..d469bd0
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ *  Force feedback support for Logitech Rumblepad 2
+ *
+ *  Copyright (c) 2008 Anssi Hannula <anssi.hannula@gmail.com>
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <linux/input.h>
+#include <linux/usb.h>
+#include <linux/hid.h>
+#include "usbhid.h"
+
+struct lg2ff_device {
+       struct hid_report *report;
+};
+
+static int play_effect(struct input_dev *dev, void *data,
+                        struct ff_effect *effect)
+{
+       struct hid_device *hid = input_get_drvdata(dev);
+       struct lg2ff_device *lg2ff = data;
+       int weak, strong;
+
+       strong = effect->u.rumble.strong_magnitude;
+       weak = effect->u.rumble.weak_magnitude;
+
+       if (weak || strong) {
+               weak = weak * 0xff / 0xffff;
+               strong = strong * 0xff / 0xffff;
+
+               lg2ff->report->field[0]->value[0] = 0x51;
+               lg2ff->report->field[0]->value[2] = weak;
+               lg2ff->report->field[0]->value[4] = strong;
+       } else {
+               lg2ff->report->field[0]->value[0] = 0xf3;
+               lg2ff->report->field[0]->value[2] = 0x00;
+               lg2ff->report->field[0]->value[4] = 0x00;
+       }
+
+       usbhid_submit_report(hid, lg2ff->report, USB_DIR_OUT);
+       return 0;
+}
+
+int hid_lg2ff_init(struct hid_device *hid)
+{
+       struct lg2ff_device *lg2ff;
+       struct hid_report *report;
+       struct hid_input *hidinput = list_entry(hid->inputs.next,
+                                               struct hid_input, list);
+       struct list_head *report_list =
+                       &hid->report_enum[HID_OUTPUT_REPORT].report_list;
+       struct input_dev *dev = hidinput->input;
+       int error;
+
+       if (list_empty(report_list)) {
+               printk(KERN_ERR "hid-lg2ff: no output report found\n");
+               return -ENODEV;
+       }
+
+       report = list_entry(report_list->next, struct hid_report, list);
+
+       if (report->maxfield < 1) {
+               printk(KERN_ERR "hid-lg2ff: output report is empty\n");
+               return -ENODEV;
+       }
+       if (report->field[0]->report_count < 7) {
+               printk(KERN_ERR "hid-lg2ff: not enough values in the field\n");
+               return -ENODEV;
+       }
+
+       lg2ff = kmalloc(sizeof(struct lg2ff_device), GFP_KERNEL);
+       if (!lg2ff)
+               return -ENOMEM;
+
+       set_bit(FF_RUMBLE, dev->ffbit);
+
+       error = input_ff_create_memless(dev, lg2ff, play_effect);
+       if (error) {
+               kfree(lg2ff);
+               return error;
+       }
+
+       lg2ff->report = report;
+       report->field[0]->value[0] = 0xf3;
+       report->field[0]->value[1] = 0x00;
+       report->field[0]->value[2] = 0x00;
+       report->field[0]->value[3] = 0x00;
+       report->field[0]->value[4] = 0x00;
+       report->field[0]->value[5] = 0x00;
+       report->field[0]->value[6] = 0x00;
+
+       usbhid_submit_report(hid, report, USB_DIR_OUT);
+
+       printk(KERN_INFO "Force feedback for Logitech Rumblepad 2 by "
+              "Anssi Hannula <anssi.hannula@gmail.com>\n");
+
+       return 0;
+}
index e29a057cbea2df1a708dc20d465b6428764efaad..28ddc3fdd3d1ffc717bd8735b813fc55a4c64a55 100644 (file)
@@ -32,6 +32,9 @@
 #define USB_VENDOR_ID_ADS_TECH                 0x06e1
 #define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X    0xa155
 
+#define USB_VENDOR_ID_AFATECH          0x15a4
+#define USB_DEVICE_ID_AFATECH_AF9016   0x9016
+
 #define USB_VENDOR_ID_AIPTEK           0x08ca
 #define USB_DEVICE_ID_AIPTEK_01                0x0001
 #define USB_DEVICE_ID_AIPTEK_10                0x0010
 #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
 #define USB_DEVICE_ID_DELORME_EM_LT20  0x0200
 
+#define USB_VENDOR_ID_DMI              0x0c0b
+#define USB_DEVICE_ID_DMI_ENC          0x5fab
+
 #define USB_VENDOR_ID_ELO              0x04E7
 #define USB_DEVICE_ID_ELO_TS2700       0x0020
 
 #define USB_DEVICE_ID_GTCO_502         0x0502
 #define USB_DEVICE_ID_GTCO_503         0x0503
 #define USB_DEVICE_ID_GTCO_504         0x0504
-#define USB_DEVICE_ID_GTCO_600         0x0600
-#define USB_DEVICE_ID_GTCO_601         0x0601
-#define USB_DEVICE_ID_GTCO_602         0x0602
-#define USB_DEVICE_ID_GTCO_603         0x0603
-#define USB_DEVICE_ID_GTCO_604         0x0604
-#define USB_DEVICE_ID_GTCO_605         0x0605
-#define USB_DEVICE_ID_GTCO_606         0x0606
-#define USB_DEVICE_ID_GTCO_607         0x0607
-#define USB_DEVICE_ID_GTCO_608         0x0608
-#define USB_DEVICE_ID_GTCO_609         0x0609
-#define USB_DEVICE_ID_GTCO_609         0x0609
 #define USB_DEVICE_ID_GTCO_1000                0x1000
 #define USB_DEVICE_ID_GTCO_1001                0x1001
 #define USB_DEVICE_ID_GTCO_1002                0x1002
 #define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500  0xc512
 #define USB_DEVICE_ID_MX3000_RECEIVER  0xc513
 #define USB_DEVICE_ID_DINOVO_EDGE      0xc714
+#define USB_DEVICE_ID_DINOVO_MINI      0xc71f
 
 #define USB_VENDOR_ID_MCC              0x09db
 #define USB_DEVICE_ID_MCC_PMD1024LS    0x0076
 #define USB_VENDOR_ID_MICROSOFT                0x045e
 #define USB_DEVICE_ID_SIDEWINDER_GV    0x003b
 #define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d
+#define USB_DEVICE_ID_DESKTOP_RECV_1028 0x00f9
 #define USB_DEVICE_ID_MS_NE4K          0x00db
 #define USB_DEVICE_ID_MS_LK6K          0x00f9
 
 #define USB_VENDOR_ID_SUN              0x0430
 #define USB_DEVICE_ID_RARITAN_KVM_DONGLE       0xcdab
 
+#define USB_VENDOR_ID_SUNPLUS          0x04fc
+#define USB_DEVICE_ID_SUNPLUS_WDESKTOP 0x05d8
+
 #define USB_VENDOR_ID_TOPMAX           0x0663
 #define USB_DEVICE_ID_TOPMAX_COBRAPAD  0x0103
 
@@ -435,9 +435,13 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD },
        
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES },
+       { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI, HID_QUIRK_DUPLICATE_USAGES },
+
+       { USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL },
 
        { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
        { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+       { USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
        { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT },
 
        { USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193, HID_QUIRK_HWHEEL_WHEEL_INVERT },
@@ -518,16 +522,6 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_600, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_601, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_602, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_603, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_604, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_605, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_606, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_607, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_608, HID_QUIRK_IGNORE },
-       { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_609, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE },
        { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE },
@@ -601,6 +595,7 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
+       { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL, HID_QUIRK_NOGET },
@@ -608,7 +603,7 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET },
-       { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
+       { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
        { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 
        { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
@@ -719,6 +714,7 @@ static const struct hid_rdesc_blacklist {
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_RDESC_LOGITECH },
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_RDESC_LOGITECH },
        { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_RDESC_LOGITECH },
+       { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_DESKTOP_RECV_1028, HID_QUIRK_RDESC_MICROSOFT_RECV_1028 },
 
        { USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E, HID_QUIRK_RDESC_BUTTON_CONSUMER },
 
@@ -728,6 +724,8 @@ static const struct hid_rdesc_blacklist {
 
        { USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_RDESC_SAMSUNG_REMOTE },
 
+       { USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP, HID_QUIRK_RDESC_SUNPLUS_WDESKTOP },
+
        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, HID_QUIRK_RDESC_SWAPPED_MIN_MAX },
        { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, HID_QUIRK_RDESC_SWAPPED_MIN_MAX },
 
@@ -793,8 +791,8 @@ static struct hid_blacklist *usbhid_exists_dquirk(const u16 idVendor,
  *
  * Returns: 0 OK, -error on failure.
  */
-int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct,
-               const u32 quirks)
+static int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct,
+                               const u32 quirks)
 {
        struct quirks_list_struct *q_new, *q;
        int list_edited = 0;
@@ -1002,6 +1000,17 @@ static void usbhid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize)
        }
 }
 
+static void usbhid_fixup_sunplus_wdesktop(unsigned char *rdesc, int rsize)
+{
+       if (rsize >= 107 && rdesc[104] == 0x26
+                        && rdesc[105] == 0x80
+                        && rdesc[106] == 0x03) {
+               printk(KERN_INFO "Fixing up Sunplus Wireless Desktop report descriptor\n");
+               rdesc[105] = rdesc[110] = 0x03;
+               rdesc[106] = rdesc[111] = 0x21;
+       }
+}
+
 /*
  * Samsung IrDA remote controller (reports as Cypress USB Mouse).
  *
@@ -1089,6 +1098,28 @@ static void usbhid_fixup_button_consumer_descriptor(unsigned char *rdesc, int rs
        }
 }
 
+/*
+ * Microsoft Wireless Desktop Receiver (Model 1028) has several
+ * 'Usage Min/Max' where it ought to have 'Physical Min/Max'
+ */
+static void usbhid_fixup_microsoft_descriptor(unsigned char *rdesc, int rsize)
+{
+       if (rsize == 571 && rdesc[284] == 0x19
+                        && rdesc[286] == 0x2a
+                        && rdesc[304] == 0x19
+                        && rdesc[306] == 0x29
+                        && rdesc[352] == 0x1a
+                        && rdesc[355] == 0x2a
+                        && rdesc[557] == 0x19
+                        && rdesc[559] == 0x29) {
+               printk(KERN_INFO "Fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
+               rdesc[284] = rdesc[304] = rdesc[558] = 0x35;
+               rdesc[352] = 0x36;
+               rdesc[286] = rdesc[355] = 0x46;
+               rdesc[306] = rdesc[559] = 0x45;
+       }
+}
+
 static void __usbhid_fixup_report_descriptor(__u32 quirks, char *rdesc, unsigned rsize)
 {
        if ((quirks & HID_QUIRK_RDESC_CYMOTION))
@@ -1112,6 +1143,11 @@ static void __usbhid_fixup_report_descriptor(__u32 quirks, char *rdesc, unsigned
        if (quirks & HID_QUIRK_RDESC_SAMSUNG_REMOTE)
                usbhid_fixup_samsung_irda_descriptor(rdesc, rsize);
 
+       if (quirks & HID_QUIRK_RDESC_MICROSOFT_RECV_1028)
+               usbhid_fixup_microsoft_descriptor(rdesc, rsize);
+
+       if (quirks & HID_QUIRK_RDESC_SUNPLUS_WDESKTOP)
+               usbhid_fixup_sunplus_wdesktop(rdesc, rsize);
 }
 
 /**
@@ -1150,5 +1186,4 @@ void usbhid_fixup_report_descriptor(const u16 idVendor, const u16 idProduct,
                else if (paramVendor == idVendor && paramProduct == idProduct)
                        __usbhid_fixup_report_descriptor(quirks, rdesc, rsize);
        }
-
 }
index 5fc4019956ba2ffe17b2d5dda04206aa7b5d9a4d..95cc192bc7af7573087d2ce67e634371d40caf6e 100644 (file)
@@ -393,6 +393,153 @@ static unsigned int hiddev_poll(struct file *file, poll_table *wait)
 /*
  * "ioctl" file op
  */
+static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd, void __user *user_arg)
+{
+       struct hid_device *hid = hiddev->hid;
+       struct hiddev_report_info rinfo;
+       struct hiddev_usage_ref_multi *uref_multi = NULL;
+       struct hiddev_usage_ref *uref;
+       struct hid_report *report;
+       struct hid_field *field;
+       int i;
+
+       uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
+       if (!uref_multi)
+               return -ENOMEM;
+       uref = &uref_multi->uref;
+       if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
+               if (copy_from_user(uref_multi, user_arg,
+                                  sizeof(*uref_multi)))
+                       goto fault;
+       } else {
+               if (copy_from_user(uref, user_arg, sizeof(*uref)))
+                       goto fault;
+       }
+
+       switch (cmd) {
+       case HIDIOCGUCODE:
+               rinfo.report_type = uref->report_type;
+               rinfo.report_id = uref->report_id;
+               if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
+                       goto inval;
+
+               if (uref->field_index >= report->maxfield)
+                       goto inval;
+
+               field = report->field[uref->field_index];
+               if (uref->usage_index >= field->maxusage)
+                       goto inval;
+
+               uref->usage_code = field->usage[uref->usage_index].hid;
+
+               if (copy_to_user(user_arg, uref, sizeof(*uref)))
+                       goto fault;
+
+               kfree(uref_multi);
+               return 0;
+
+       default:
+               if (cmd != HIDIOCGUSAGE &&
+                   cmd != HIDIOCGUSAGES &&
+                   uref->report_type == HID_REPORT_TYPE_INPUT)
+                       goto inval;
+
+               if (uref->report_id == HID_REPORT_ID_UNKNOWN) {
+                       field = hiddev_lookup_usage(hid, uref);
+                       if (field == NULL)
+                               goto inval;
+               } else {
+                       rinfo.report_type = uref->report_type;
+                       rinfo.report_id = uref->report_id;
+                       if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
+                               goto inval;
+
+                       if (uref->field_index >= report->maxfield)
+                               goto inval;
+
+                       field = report->field[uref->field_index];
+
+                       if (cmd == HIDIOCGCOLLECTIONINDEX) {
+                               if (uref->usage_index >= field->maxusage)
+                                       goto inval;
+                       } else if (uref->usage_index >= field->report_count)
+                               goto inval;
+
+                       else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
+                                (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
+                                 uref->usage_index + uref_multi->num_values > field->report_count))
+                               goto inval;
+                       }
+
+               switch (cmd) {
+               case HIDIOCGUSAGE:
+                       uref->value = field->value[uref->usage_index];
+                       if (copy_to_user(user_arg, uref, sizeof(*uref)))
+                               goto fault;
+                       goto goodreturn;
+
+               case HIDIOCSUSAGE:
+                       field->value[uref->usage_index] = uref->value;
+                       goto goodreturn;
+
+               case HIDIOCGCOLLECTIONINDEX:
+                       kfree(uref_multi);
+                       return field->usage[uref->usage_index].collection_index;
+               case HIDIOCGUSAGES:
+                       for (i = 0; i < uref_multi->num_values; i++)
+                               uref_multi->values[i] =
+                                   field->value[uref->usage_index + i];
+                       if (copy_to_user(user_arg, uref_multi,
+                                        sizeof(*uref_multi)))
+                               goto fault;
+                       goto goodreturn;
+               case HIDIOCSUSAGES:
+                       for (i = 0; i < uref_multi->num_values; i++)
+                               field->value[uref->usage_index + i] =
+                                   uref_multi->values[i];
+                       goto goodreturn;
+               }
+
+goodreturn:
+               kfree(uref_multi);
+               return 0;
+fault:
+               kfree(uref_multi);
+               return -EFAULT;
+inval:
+               kfree(uref_multi);
+               return -EINVAL;
+       }
+}
+
+static noinline int hiddev_ioctl_string(struct hiddev *hiddev, unsigned int cmd, void __user *user_arg)
+{
+       struct hid_device *hid = hiddev->hid;
+       struct usb_device *dev = hid_to_usb_dev(hid);
+       int idx, len;
+       char *buf;
+
+       if (get_user(idx, (int __user *)user_arg))
+               return -EFAULT;
+
+       if ((buf = kmalloc(HID_STRING_SIZE, GFP_KERNEL)) == NULL)
+               return -ENOMEM;
+
+       if ((len = usb_string(dev, idx, buf, HID_STRING_SIZE-1)) < 0) {
+               kfree(buf);
+               return -EINVAL;
+       }
+
+       if (copy_to_user(user_arg+sizeof(int), buf, len+1)) {
+               kfree(buf);
+               return -EFAULT;
+       }
+
+       kfree(buf);
+
+       return len;
+}
+
 static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
 {
        struct hiddev_list *list = file->private_data;
@@ -402,8 +549,6 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
        struct hiddev_collection_info cinfo;
        struct hiddev_report_info rinfo;
        struct hiddev_field_info finfo;
-       struct hiddev_usage_ref_multi *uref_multi = NULL;
-       struct hiddev_usage_ref *uref;
        struct hiddev_devinfo dinfo;
        struct hid_report *report;
        struct hid_field *field;
@@ -470,30 +615,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                }
 
        case HIDIOCGSTRING:
-               {
-                       int idx, len;
-                       char *buf;
-
-                       if (get_user(idx, (int __user *)arg))
-                               return -EFAULT;
-
-                       if ((buf = kmalloc(HID_STRING_SIZE, GFP_KERNEL)) == NULL)
-                               return -ENOMEM;
-
-                       if ((len = usb_string(dev, idx, buf, HID_STRING_SIZE-1)) < 0) {
-                               kfree(buf);
-                               return -EINVAL;
-                       }
-
-                       if (copy_to_user(user_arg+sizeof(int), buf, len+1)) {
-                               kfree(buf);
-                               return -EFAULT;
-                       }
-
-                       kfree(buf);
-
-                       return len;
-               }
+               return hiddev_ioctl_string(hiddev, cmd, user_arg);
 
        case HIDIOCINITREPORT:
                usbhid_init_reports(hid);
@@ -578,121 +700,13 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                return 0;
 
        case HIDIOCGUCODE:
-               uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
-               if (!uref_multi)
-                       return -ENOMEM;
-               uref = &uref_multi->uref;
-               if (copy_from_user(uref, user_arg, sizeof(*uref)))
-                       goto fault;
-
-               rinfo.report_type = uref->report_type;
-               rinfo.report_id = uref->report_id;
-               if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
-                       goto inval;
-
-               if (uref->field_index >= report->maxfield)
-                       goto inval;
-
-               field = report->field[uref->field_index];
-               if (uref->usage_index >= field->maxusage)
-                       goto inval;
-
-               uref->usage_code = field->usage[uref->usage_index].hid;
-
-               if (copy_to_user(user_arg, uref, sizeof(*uref)))
-                       goto fault;
-
-               kfree(uref_multi);
-               return 0;
-
+               /* fall through */
        case HIDIOCGUSAGE:
        case HIDIOCSUSAGE:
        case HIDIOCGUSAGES:
        case HIDIOCSUSAGES:
        case HIDIOCGCOLLECTIONINDEX:
-               uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
-               if (!uref_multi)
-                       return -ENOMEM;
-               uref = &uref_multi->uref;
-               if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
-                       if (copy_from_user(uref_multi, user_arg,
-                                          sizeof(*uref_multi)))
-                               goto fault;
-               } else {
-                       if (copy_from_user(uref, user_arg, sizeof(*uref)))
-                               goto fault;
-               }
-
-               if (cmd != HIDIOCGUSAGE &&
-                   cmd != HIDIOCGUSAGES &&
-                   uref->report_type == HID_REPORT_TYPE_INPUT)
-                       goto inval;
-
-               if (uref->report_id == HID_REPORT_ID_UNKNOWN) {
-                       field = hiddev_lookup_usage(hid, uref);
-                       if (field == NULL)
-                               goto inval;
-               } else {
-                       rinfo.report_type = uref->report_type;
-                       rinfo.report_id = uref->report_id;
-                       if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
-                               goto inval;
-
-                       if (uref->field_index >= report->maxfield)
-                               goto inval;
-
-                       field = report->field[uref->field_index];
-
-                       if (cmd == HIDIOCGCOLLECTIONINDEX) {
-                               if (uref->usage_index >= field->maxusage)
-                                       goto inval;
-                       } else if (uref->usage_index >= field->report_count)
-                               goto inval;
-
-                       else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) &&
-                                (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
-                                 uref->usage_index + uref_multi->num_values > field->report_count))
-                               goto inval;
-                       }
-
-               switch (cmd) {
-                       case HIDIOCGUSAGE:
-                               uref->value = field->value[uref->usage_index];
-                               if (copy_to_user(user_arg, uref, sizeof(*uref)))
-                                       goto fault;
-                               goto goodreturn;
-
-                       case HIDIOCSUSAGE:
-                               field->value[uref->usage_index] = uref->value;
-                               goto goodreturn;
-
-                       case HIDIOCGCOLLECTIONINDEX:
-                               kfree(uref_multi);
-                               return field->usage[uref->usage_index].collection_index;
-                       case HIDIOCGUSAGES:
-                               for (i = 0; i < uref_multi->num_values; i++)
-                                       uref_multi->values[i] =
-                                           field->value[uref->usage_index + i];
-                               if (copy_to_user(user_arg, uref_multi,
-                                                sizeof(*uref_multi)))
-                                       goto fault;
-                               goto goodreturn;
-                       case HIDIOCSUSAGES:
-                               for (i = 0; i < uref_multi->num_values; i++)
-                                       field->value[uref->usage_index + i] =
-                                           uref_multi->values[i];
-                               goto goodreturn;
-               }
-
-goodreturn:
-               kfree(uref_multi);
-               return 0;
-fault:
-               kfree(uref_multi);
-               return -EFAULT;
-inval:
-               kfree(uref_multi);
-               return -EINVAL;
+               return hiddev_ioctl_usage(hiddev, cmd, user_arg);
 
        case HIDIOCGCOLLECTIONINFO:
                if (copy_from_user(&cinfo, user_arg, sizeof(cinfo)))
index 0023f96d4294f1d3e6acc05627e4133d899b8b85..62d2d7c925bd3d494c6dd4be8a3f6b66c4aa556c 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/timer.h>
+#include <linux/wait.h>
 #include <linux/workqueue.h>
 #include <linux/input.h>
 
@@ -77,7 +78,7 @@ struct usbhid_device {
        unsigned long stop_retry;                                       /* Time to give up, in jiffies */
        unsigned int retry_delay;                                       /* Delay length in ms */
        struct work_struct reset_work;                                  /* Task context for resets */
-
+       wait_queue_head_t wait;                                         /* For sleeping */
 };
 
 #define        hid_to_usb_dev(hid_dev) \
index 014dfa575be73e0c156ac77fa08224513cb59d11..7137a17402fe150e3e3189b7355a77495a2c5e8e 100644 (file)
@@ -1,45 +1,16 @@
 #
-# Character device configuration
+# I2C algorithm drivers configuration
 #
 
-menu "I2C Algorithms"
-
 config I2C_ALGOBIT
-       tristate "I2C bit-banging interfaces"
-       help
-         This allows you to use a range of I2C adapters called bit-banging
-         adapters.  Say Y if you own an I2C adapter belonging to this class
-         and then say Y to the specific driver for you adapter below.
-
-         This support is also available as a module.  If so, the module 
-         will be called i2c-algo-bit.
+       tristate
 
 config I2C_ALGOPCF
-       tristate "I2C PCF 8584 interfaces"
-       help
-         This allows you to use a range of I2C adapters called PCF adapters.
-         Say Y if you own an I2C adapter belonging to this class and then say
-         Y to the specific driver for you adapter below.
-
-         This support is also available as a module.  If so, the module 
-         will be called i2c-algo-pcf.
+       tristate
 
 config I2C_ALGOPCA
-       tristate "I2C PCA 9564 interfaces"
-       help
-         This allows you to use a range of I2C adapters called PCA adapters.
-         Say Y if you own an I2C adapter belonging to this class and then say
-         Y to the specific driver for you adapter below.
-
-         This support is also available as a module.  If so, the module 
-         will be called i2c-algo-pca.
+       tristate
 
 config I2C_ALGO_SGI
-       tristate "I2C SGI interfaces"
+       tristate
        depends on SGI_IP22 || SGI_IP32 || X86_VISWS
-       help
-         Supports the SGI interfaces like the ones found on SGI Indy VINO
-         or SGI O2 MACE.
-
-endmenu
-
index 2a16211f12e55dfe2aca3ca77848a694b05d652c..e954a20b97a647e1b5766d345117cab121a42811 100644 (file)
@@ -1,6 +1,7 @@
 /*
- *  i2c-algo-pca.c i2c driver algorithms for PCA9564 adapters                
+ *  i2c-algo-pca.c i2c driver algorithms for PCA9564 adapters
  *    Copyright (C) 2004 Arcom Control Systems
+ *    Copyright (C) 2008 Pengutronix
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/delay.h>
-#include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-pca.h>
-#include "i2c-algo-pca.h"
-
-#define DRIVER "i2c-algo-pca"
 
 #define DEB1(fmt, args...) do { if (i2c_debug>=1) printk(fmt, ## args); } while(0)
 #define DEB2(fmt, args...) do { if (i2c_debug>=2) printk(fmt, ## args); } while(0)
 
 static int i2c_debug;
 
-#define pca_outw(adap, reg, val) adap->write_byte(adap, reg, val)
-#define pca_inw(adap, reg) adap->read_byte(adap, reg)
+#define pca_outw(adap, reg, val) adap->write_byte(adap->data, reg, val)
+#define pca_inw(adap, reg) adap->read_byte(adap->data, reg)
 
 #define pca_status(adap) pca_inw(adap, I2C_PCA_STA)
-#define pca_clock(adap) adap->get_clock(adap)
-#define pca_own(adap) adap->get_own(adap)
+#define pca_clock(adap) adap->i2c_clock
 #define pca_set_con(adap, val) pca_outw(adap, I2C_PCA_CON, val)
 #define pca_get_con(adap) pca_inw(adap, I2C_PCA_CON)
-#define pca_wait(adap) adap->wait_for_interrupt(adap)
+#define pca_wait(adap) adap->wait_for_completion(adap->data)
+#define pca_reset(adap) adap->reset_chip(adap->data)
 
 /*
  * Generate a start condition on the i2c bus.
@@ -99,7 +96,7 @@ static void pca_stop(struct i2c_algo_pca_data *adap)
  *
  * returns after the address has been sent
  */
-static void pca_address(struct i2c_algo_pca_data *adap, 
+static void pca_address(struct i2c_algo_pca_data *adap,
                        struct i2c_msg *msg)
 {
        int sta = pca_get_con(adap);
@@ -108,9 +105,9 @@ static void pca_address(struct i2c_algo_pca_data *adap,
        addr = ( (0x7f & msg->addr) << 1 );
        if (msg->flags & I2C_M_RD )
                addr |= 1;
-       DEB2("=== SLAVE ADDRESS %#04x+%c=%#04x\n", 
+       DEB2("=== SLAVE ADDRESS %#04x+%c=%#04x\n",
             msg->addr, msg->flags & I2C_M_RD ? 'R' : 'W', addr);
-       
+
        pca_outw(adap, I2C_PCA_DAT, addr);
 
        sta &= ~(I2C_PCA_CON_STO|I2C_PCA_CON_STA|I2C_PCA_CON_SI);
@@ -124,7 +121,7 @@ static void pca_address(struct i2c_algo_pca_data *adap,
  *
  * Returns after the byte has been transmitted
  */
-static void pca_tx_byte(struct i2c_algo_pca_data *adap, 
+static void pca_tx_byte(struct i2c_algo_pca_data *adap,
                        __u8 b)
 {
        int sta = pca_get_con(adap);
@@ -142,19 +139,19 @@ static void pca_tx_byte(struct i2c_algo_pca_data *adap,
  *
  * returns immediately.
  */
-static void pca_rx_byte(struct i2c_algo_pca_data *adap, 
+static void pca_rx_byte(struct i2c_algo_pca_data *adap,
                        __u8 *b, int ack)
 {
        *b = pca_inw(adap, I2C_PCA_DAT);
        DEB2("=== READ %#04x %s\n", *b, ack ? "ACK" : "NACK");
 }
 
-/* 
+/*
  * Setup ACK or NACK for next received byte and wait for it to arrive.
  *
  * Returns after next byte has arrived.
  */
-static void pca_rx_ack(struct i2c_algo_pca_data *adap, 
+static void pca_rx_ack(struct i2c_algo_pca_data *adap,
                       int ack)
 {
        int sta = pca_get_con(adap);
@@ -168,15 +165,6 @@ static void pca_rx_ack(struct i2c_algo_pca_data *adap,
        pca_wait(adap);
 }
 
-/* 
- * Reset the i2c bus / SIO 
- */
-static void pca_reset(struct i2c_algo_pca_data *adap)
-{
-       /* apparently only an external reset will do it. not a lot can be done */
-       printk(KERN_ERR DRIVER ": Haven't figured out how to do a reset yet\n");
-}
-
 static int pca_xfer(struct i2c_adapter *i2c_adap,
                     struct i2c_msg *msgs,
                     int num)
@@ -187,7 +175,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
        int numbytes = 0;
        int state;
        int ret;
-       int timeout = 100;
+       int timeout = i2c_adap->timeout;
 
        while ((state = pca_status(adap)) != 0xf8 && timeout--) {
                msleep(10);
@@ -203,14 +191,14 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
                for (curmsg = 0; curmsg < num; curmsg++) {
                        int addr, i;
                        msg = &msgs[curmsg];
-                       
+
                        addr = (0x7f & msg->addr) ;
-               
+
                        if (msg->flags & I2C_M_RD )
-                               printk(KERN_INFO "    [%02d] RD %d bytes from %#02x [%#02x, ...]\n", 
+                               printk(KERN_INFO "    [%02d] RD %d bytes from %#02x [%#02x, ...]\n",
                                       curmsg, msg->len, addr, (addr<<1) | 1);
                        else {
-                               printk(KERN_INFO "    [%02d] WR %d bytes to %#02x [%#02x%s", 
+                               printk(KERN_INFO "    [%02d] WR %d bytes to %#02x [%#02x%s",
                                       curmsg, msg->len, addr, addr<<1,
                                       msg->len == 0 ? "" : ", ");
                                for(i=0; i < msg->len; i++)
@@ -237,7 +225,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
                case 0x10: /* A repeated start condition has been transmitted */
                        pca_address(adap, msg);
                        break;
-                       
+
                case 0x18: /* SLA+W has been transmitted; ACK has been received */
                case 0x28: /* Data byte in I2CDAT has been transmitted; ACK has been received */
                        if (numbytes < msg->len) {
@@ -287,7 +275,7 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
                case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */
                        DEB2("Arbitration lost\n");
                        goto out;
-                       
+
                case 0x58: /* Data byte has been received; NOT ACK has been returned */
                        if ( numbytes == msg->len - 1 ) {
                                pca_rx_byte(adap, &msg->buf[numbytes], 0);
@@ -317,16 +305,16 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
                        pca_reset(adap);
                        goto out;
                default:
-                       printk(KERN_ERR DRIVER ": unhandled SIO state 0x%02x\n", state);
+                       dev_err(&i2c_adap->dev, "unhandled SIO state 0x%02x\n", state);
                        break;
                }
-               
+
        }
 
        ret = curmsg;
  out:
        DEB1(KERN_CRIT "}}} transfered %d/%d messages. "
-            "status is %#04x. control is %#04x\n", 
+            "status is %#04x. control is %#04x\n",
             curmsg, num, pca_status(adap),
             pca_get_con(adap));
        return ret;
@@ -337,53 +325,65 @@ static u32 pca_func(struct i2c_adapter *adap)
         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
 }
 
-static int pca_init(struct i2c_algo_pca_data *adap)
+static const struct i2c_algorithm pca_algo = {
+       .master_xfer    = pca_xfer,
+       .functionality  = pca_func,
+};
+
+static int pca_init(struct i2c_adapter *adap)
 {
        static int freqs[] = {330,288,217,146,88,59,44,36};
-       int own, clock;
+       int clock;
+       struct i2c_algo_pca_data *pca_data = adap->algo_data;
+
+       if (pca_data->i2c_clock > 7) {
+               printk(KERN_WARNING "%s: Invalid I2C clock speed selected. Trying default.\n",
+                       adap->name);
+               pca_data->i2c_clock = I2C_PCA_CON_59kHz;
+       }
+
+       adap->algo = &pca_algo;
 
-       own = pca_own(adap);
-       clock = pca_clock(adap);
-       DEB1(KERN_INFO DRIVER ": own address is %#04x\n", own);
-       DEB1(KERN_INFO DRIVER ": clock freqeuncy is %dkHz\n", freqs[clock]);
+       pca_reset(pca_data);
 
-       pca_outw(adap, I2C_PCA_ADR, own << 1);
+       clock = pca_clock(pca_data);
+       DEB1(KERN_INFO "%s: Clock frequency is %dkHz\n", adap->name, freqs[clock]);
 
-       pca_set_con(adap, I2C_PCA_CON_ENSIO | clock);
-       udelay(500); /* 500 Âµs for oscilator to stabilise */
+       pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);
+       udelay(500); /* 500 us for oscilator to stabilise */
 
        return 0;
 }
 
-static const struct i2c_algorithm pca_algo = {
-       .master_xfer    = pca_xfer,
-       .functionality  = pca_func,
-};
-
-/* 
- * registering functions to load algorithms at runtime 
+/*
+ * registering functions to load algorithms at runtime
  */
 int i2c_pca_add_bus(struct i2c_adapter *adap)
 {
-       struct i2c_algo_pca_data *pca_adap = adap->algo_data;
        int rval;
 
-       /* register new adapter to i2c module... */
-       adap->algo = &pca_algo;
+       rval = pca_init(adap);
+       if (rval)
+               return rval;
 
-       adap->timeout = 100;            /* default values, should       */
-       adap->retries = 3;              /* be replaced by defines       */
+       return i2c_add_adapter(adap);
+}
+EXPORT_SYMBOL(i2c_pca_add_bus);
 
-       if ((rval = pca_init(pca_adap)))
-               return rval;
+int i2c_pca_add_numbered_bus(struct i2c_adapter *adap)
+{
+       int rval;
 
-       rval = i2c_add_adapter(adap);
+       rval = pca_init(adap);
+       if (rval)
+               return rval;
 
-       return rval;
+       return i2c_add_numbered_adapter(adap);
 }
-EXPORT_SYMBOL(i2c_pca_add_bus);
+EXPORT_SYMBOL(i2c_pca_add_numbered_bus);
 
-MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>");
+MODULE_AUTHOR("Ian Campbell <icampbell@arcom.com>, "
+       "Wolfram Sang <w.sang@pengutronix.de>");
 MODULE_DESCRIPTION("I2C-Bus PCA9564 algorithm");
 MODULE_LICENSE("GPL");
 
diff --git a/drivers/i2c/algos/i2c-algo-pca.h b/drivers/i2c/algos/i2c-algo-pca.h
deleted file mode 100644 (file)
index 2fee07e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef I2C_PCA9564_H
-#define I2C_PCA9564_H 1
-
-#define I2C_PCA_STA            0x00 /* STATUS  Read Only  */
-#define I2C_PCA_TO             0x00 /* TIMEOUT Write Only */
-#define I2C_PCA_DAT            0x01 /* DATA    Read/Write */
-#define I2C_PCA_ADR            0x02 /* OWN ADR Read/Write */
-#define I2C_PCA_CON            0x03 /* CONTROL Read/Write */
-
-#define I2C_PCA_CON_AA         0x80 /* Assert Acknowledge */
-#define I2C_PCA_CON_ENSIO      0x40 /* Enable */
-#define I2C_PCA_CON_STA                0x20 /* Start */
-#define I2C_PCA_CON_STO                0x10 /* Stop */
-#define I2C_PCA_CON_SI         0x08 /* Serial Interrupt */
-#define I2C_PCA_CON_CR         0x07 /* Clock Rate (MASK) */
-
-#define I2C_PCA_CON_330kHz     0x00
-#define I2C_PCA_CON_288kHz     0x01
-#define I2C_PCA_CON_217kHz     0x02
-#define I2C_PCA_CON_146kHz     0x03
-#define I2C_PCA_CON_88kHz      0x04
-#define I2C_PCA_CON_59kHz      0x05
-#define I2C_PCA_CON_44kHz      0x06
-#define I2C_PCA_CON_36kHz      0x07
-
-#endif /* I2C_PCA9564_H */
index b04c99580d0dc167fee9f1b99dc812eacc5c3965..48438cc5d0caa282bcf8ae7050bdbebccea3e879 100644 (file)
@@ -100,9 +100,12 @@ config I2C_AU1550
 
 config I2C_BLACKFIN_TWI
        tristate "Blackfin TWI I2C support"
-       depends on BF534 || BF536 || BF537
+       depends on BLACKFIN
        help
-         This is the TWI I2C device driver for Blackfin 534/536/537/54x.
+         This is the TWI I2C device driver for Blackfin BF522, BF525,
+         BF527, BF534, BF536, BF537 and BF54x. For other Blackfin processors,
+         please don't use this driver.
+
          This driver can also be built as a module.  If so, the module
          will be called i2c-bfin-twi.
 
@@ -135,7 +138,7 @@ config I2C_ELEKTOR
          This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
          such an adapter.
 
-         This support is also available as a module.  If so, the module 
+         This support is also available as a module.  If so, the module
          will be called i2c-elektor.
 
 config I2C_GPIO
@@ -190,7 +193,7 @@ config I2C_I810
        select I2C_ALGOBIT
        help
          If you say yes to this option, support will be included for the Intel
-         810/815 family of mainboard I2C interfaces.  Specifically, the 
+         810/815 family of mainboard I2C interfaces.  Specifically, the
          following versions of the chipset are supported:
            i810AA
            i810AB
@@ -246,10 +249,10 @@ config I2C_PIIX4
 
 config I2C_IBM_IIC
        tristate "IBM PPC 4xx on-chip I2C interface"
-       depends on IBM_OCP
+       depends on 4xx
        help
-         Say Y here if you want to use IIC peripheral found on 
-         embedded IBM PPC 4xx based systems. 
+         Say Y here if you want to use IIC peripheral found on
+         embedded IBM PPC 4xx based systems.
 
          This driver can also be built as a module.  If so, the module
          will be called i2c-ibm_iic.
@@ -269,7 +272,7 @@ config I2C_IXP2000
        depends on ARCH_IXP2000
        select I2C_ALGOBIT
        help
-         Say Y here if you have an Intel IXP2000 (2400, 2800, 2850) based 
+         Say Y here if you have an Intel IXP2000 (2400, 2800, 2850) based
          system and are using GPIO lines for an I2C bus.
 
          This support is also available as a module. If so, the module
@@ -354,7 +357,7 @@ config I2C_PARPORT
          on the parport driver.  This is meant for embedded systems. Don't say
          Y here if you intend to say Y or M there.
 
-         This support is also available as a module.  If so, the module 
+         This support is also available as a module.  If so, the module
          will be called i2c-parport.
 
 config I2C_PARPORT_LIGHT
@@ -372,12 +375,12 @@ config I2C_PARPORT_LIGHT
          the clean but heavy parport handling is not an option.  The
          drawback is a reduced portability and the impossibility to
          daisy-chain other parallel port devices.
-         
+
          Don't say Y here if you said Y or M to i2c-parport.  Saying M to
          both is possible but both modules should not be loaded at the same
          time.
 
-         This support is also available as a module.  If so, the module 
+         This support is also available as a module.  If so, the module
          will be called i2c-parport-light.
 
 config I2C_PASEMI
@@ -401,7 +404,7 @@ config I2C_PROSAVAGE
 
          This driver is deprecated in favor of the savagefb driver.
 
-         This support is also available as a module.  If so, the module 
+         This support is also available as a module.  If so, the module
          will be called i2c-prosavage.
 
 config I2C_S3C2410
@@ -417,7 +420,7 @@ config I2C_SAVAGE4
        depends on PCI
        select I2C_ALGOBIT
        help
-         If you say yes to this option, support will be included for the 
+         If you say yes to this option, support will be included for the
          S3 Savage 4 I2C interface.
 
          This driver is deprecated in favor of the savagefb driver.
@@ -452,7 +455,7 @@ config SCx200_I2C
 
          If you don't know what to do here, say N.
 
-         This support is also available as a module.  If so, the module 
+         This support is also available as a module.  If so, the module
          will be called scx200_i2c.
 
          This driver is deprecated and will be dropped soon. Use i2c-gpio
@@ -483,14 +486,14 @@ config SCx200_ACB
 
          If you don't know what to do here, say N.
 
-         This support is also available as a module.  If so, the module 
+         This support is also available as a module.  If so, the module
          will be called scx200_acb.
 
 config I2C_SIS5595
        tristate "SiS 5595"
        depends on PCI
        help
-         If you say yes to this option, support will be included for the 
+         If you say yes to this option, support will be included for the
          SiS5595 SMBus (a subset of I2C) interface.
 
          This driver can also be built as a module.  If so, the module
@@ -500,7 +503,7 @@ config I2C_SIS630
        tristate "SiS 630/730"
        depends on PCI
        help
-         If you say yes to this option, support will be included for the 
+         If you say yes to this option, support will be included for the
          SiS630 and SiS730 SMBus (a subset of I2C) interface.
 
          This driver can also be built as a module.  If so, the module
@@ -632,9 +635,9 @@ config I2C_PCA_ISA
        select I2C_ALGOPCA
        default n
        help
-         This driver supports ISA boards using the Philips PCA 9564
-         Parallel bus to I2C bus controller
-         
+         This driver supports ISA boards using the Philips PCA9564
+         parallel bus to I2C bus controller.
+
          This driver can also be built as a module.  If so, the module
          will be called i2c-pca-isa.
 
@@ -643,6 +646,17 @@ config I2C_PCA_ISA
          delays when I2C/SMBus chip drivers are loaded (e.g. at boot
          time).  If unsure, say N.
 
+config I2C_PCA_PLATFORM
+       tristate "PCA9564 as platform device"
+       select I2C_ALGOPCA
+       default n
+       help
+         This driver supports a memory mapped Philips PCA9564
+         parallel bus to I2C bus controller.
+
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-pca-platform.
+
 config I2C_MV64XXX
        tristate "Marvell mv64xxx I2C Controller"
        depends on (MV64X60 || PLAT_ORION) && EXPERIMENTAL
@@ -672,4 +686,23 @@ config I2C_PMCMSP
          This driver can also be built as module. If so, the module
          will be called i2c-pmcmsp.
 
+config I2C_SH7760
+       tristate "Renesas SH7760 I2C Controller"
+       depends on CPU_SUBTYPE_SH7760
+       help
+         This driver supports the 2 I2C interfaces on the Renesas SH7760.
+
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-sh7760.
+
+config I2C_SH_MOBILE
+       tristate "SuperH Mobile I2C Controller"
+       depends on SUPERH
+       help
+         If you say yes to this option, support will be included for the
+         built-in I2C interface on the Renesas SH-Mobile processor.
+
+         This driver can also be built as a module.  If so, the module
+         will be called i2c-sh_mobile.
+
 endmenu
index ea7068f1eb6b49543fc422b6799d68045d26787f..e8c882a5ea666e5319b0725f3740b400e7223d4f 100644 (file)
@@ -30,6 +30,7 @@ obj-$(CONFIG_I2C_PARPORT)     += i2c-parport.o
 obj-$(CONFIG_I2C_PARPORT_LIGHT)        += i2c-parport-light.o
 obj-$(CONFIG_I2C_PASEMI)       += i2c-pasemi.o
 obj-$(CONFIG_I2C_PCA_ISA)      += i2c-pca-isa.o
+obj-$(CONFIG_I2C_PCA_PLATFORM) += i2c-pca-platform.o
 obj-$(CONFIG_I2C_PIIX4)                += i2c-piix4.o
 obj-$(CONFIG_I2C_PMCMSP)       += i2c-pmcmsp.o
 obj-$(CONFIG_I2C_PNX)          += i2c-pnx.o
@@ -37,6 +38,8 @@ obj-$(CONFIG_I2C_PROSAVAGE)   += i2c-prosavage.o
 obj-$(CONFIG_I2C_PXA)          += i2c-pxa.o
 obj-$(CONFIG_I2C_S3C2410)      += i2c-s3c2410.o
 obj-$(CONFIG_I2C_SAVAGE4)      += i2c-savage4.o
+obj-$(CONFIG_I2C_SH7760)       += i2c-sh7760.o
+obj-$(CONFIG_I2C_SH_MOBILE)    += i2c-sh_mobile.o
 obj-$(CONFIG_I2C_SIBYTE)       += i2c-sibyte.o
 obj-$(CONFIG_I2C_SIMTEC)       += i2c-simtec.o
 obj-$(CONFIG_I2C_SIS5595)      += i2c-sis5595.o
index c09b036913bd9588f9789f982b884b319cff5890..73d61946a53438bbc369cf7bdb51f445100037ac 100644 (file)
@@ -298,7 +298,7 @@ static int at91_i2c_resume(struct platform_device *pdev)
 #endif
 
 /* work with "modprobe at91_i2c" from hotplugging or coldplugging */
-MODULE_ALIAS("at91_i2c");
+MODULE_ALIAS("platform:at91_i2c");
 
 static struct platform_driver at91_i2c_driver = {
        .probe          = at91_i2c_probe,
index 1953b26da56a3201e71bd8f309dddb14b4969347..491718fe46b78a00ac959885fe00745cb682c18a 100644 (file)
@@ -472,6 +472,7 @@ i2c_au1550_exit(void)
 MODULE_AUTHOR("Dan Malek, Embedded Edge, LLC.");
 MODULE_DESCRIPTION("SMBus adapter Alchemy pb1550");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:au1xpsc_smbus");
 
 module_init (i2c_au1550_init);
 module_exit (i2c_au1550_exit);
index 7dbdaeb707a99c0caf78290f4263f7ceb515a475..48d084bdf7c8e1d590b18130882c39bc44e3d038 100644 (file)
@@ -1,25 +1,11 @@
 /*
- * drivers/i2c/busses/i2c-bfin-twi.c
+ * Blackfin On-Chip Two Wire Interface Driver
  *
- * Description: Driver for Blackfin Two Wire Interface
+ * Copyright 2005-2007 Analog Devices Inc.
  *
- * Author:      sonicz  <sonic.zhang@analog.com>
+ * Enter bugs at http://blackfin.uclinux.org/
  *
- * Copyright (c) 2005-2007 Analog Devices, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Licensed under the GPL-2 or later.
  */
 
 #include <linux/module.h>
 #include <linux/platform_device.h>
 
 #include <asm/blackfin.h>
+#include <asm/portmux.h>
 #include <asm/irq.h>
 
 #define POLL_TIMEOUT       (2 * HZ)
 
 /* SMBus mode*/
-#define TWI_I2C_MODE_STANDARD          0x01
-#define TWI_I2C_MODE_STANDARDSUB       0x02
-#define TWI_I2C_MODE_COMBINED          0x04
+#define TWI_I2C_MODE_STANDARD          1
+#define TWI_I2C_MODE_STANDARDSUB       2
+#define TWI_I2C_MODE_COMBINED          3
+#define TWI_I2C_MODE_REPEAT            4
 
 struct bfin_twi_iface {
        int                     irq;
@@ -58,39 +46,74 @@ struct bfin_twi_iface {
        struct timer_list       timeout_timer;
        struct i2c_adapter      adap;
        struct completion       complete;
+       struct i2c_msg          *pmsg;
+       int                     msg_num;
+       int                     cur_msg;
+       void __iomem            *regs_base;
 };
 
-static struct bfin_twi_iface twi_iface;
+
+#define DEFINE_TWI_REG(reg, off) \
+static inline u16 read_##reg(struct bfin_twi_iface *iface) \
+       { return bfin_read16(iface->regs_base + (off)); } \
+static inline void write_##reg(struct bfin_twi_iface *iface, u16 v) \
+       { bfin_write16(iface->regs_base + (off), v); }
+
+DEFINE_TWI_REG(CLKDIV, 0x00)
+DEFINE_TWI_REG(CONTROL, 0x04)
+DEFINE_TWI_REG(SLAVE_CTL, 0x08)
+DEFINE_TWI_REG(SLAVE_STAT, 0x0C)
+DEFINE_TWI_REG(SLAVE_ADDR, 0x10)
+DEFINE_TWI_REG(MASTER_CTL, 0x14)
+DEFINE_TWI_REG(MASTER_STAT, 0x18)
+DEFINE_TWI_REG(MASTER_ADDR, 0x1C)
+DEFINE_TWI_REG(INT_STAT, 0x20)
+DEFINE_TWI_REG(INT_MASK, 0x24)
+DEFINE_TWI_REG(FIFO_CTL, 0x28)
+DEFINE_TWI_REG(FIFO_STAT, 0x2C)
+DEFINE_TWI_REG(XMT_DATA8, 0x80)
+DEFINE_TWI_REG(XMT_DATA16, 0x84)
+DEFINE_TWI_REG(RCV_DATA8, 0x88)
+DEFINE_TWI_REG(RCV_DATA16, 0x8C)
+
+static const u16 pin_req[2][3] = {
+       {P_TWI0_SCL, P_TWI0_SDA, 0},
+       {P_TWI1_SCL, P_TWI1_SDA, 0},
+};
 
 static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface)
 {
-       unsigned short twi_int_status = bfin_read_TWI_INT_STAT();
-       unsigned short mast_stat = bfin_read_TWI_MASTER_STAT();
+       unsigned short twi_int_status = read_INT_STAT(iface);
+       unsigned short mast_stat = read_MASTER_STAT(iface);
 
        if (twi_int_status & XMTSERV) {
                /* Transmit next data */
                if (iface->writeNum > 0) {
-                       bfin_write_TWI_XMT_DATA8(*(iface->transPtr++));
+                       write_XMT_DATA8(iface, *(iface->transPtr++));
                        iface->writeNum--;
                }
                /* start receive immediately after complete sending in
                 * combine mode.
                 */
-               else if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
-                       bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL()
-                               | MDIR | RSTART);
-               } else if (iface->manual_stop)
-                       bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL()
-                               | STOP);
+               else if (iface->cur_mode == TWI_I2C_MODE_COMBINED)
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) | MDIR | RSTART);
+               else if (iface->manual_stop)
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) | STOP);
+               else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
+                               iface->cur_msg+1 < iface->msg_num)
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) | RSTART);
                SSYNC();
                /* Clear status */
-               bfin_write_TWI_INT_STAT(XMTSERV);
+               write_INT_STAT(iface, XMTSERV);
                SSYNC();
        }
        if (twi_int_status & RCVSERV) {
                if (iface->readNum > 0) {
                        /* Receive next data */
-                       *(iface->transPtr) = bfin_read_TWI_RCV_DATA8();
+                       *(iface->transPtr) = read_RCV_DATA8(iface);
                        if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
                                /* Change combine mode into sub mode after
                                 * read first data.
@@ -105,28 +128,33 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface)
                        iface->transPtr++;
                        iface->readNum--;
                } else if (iface->manual_stop) {
-                       bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL()
-                               | STOP);
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) | STOP);
+                       SSYNC();
+               } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
+                               iface->cur_msg+1 < iface->msg_num) {
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) | RSTART);
                        SSYNC();
                }
                /* Clear interrupt source */
-               bfin_write_TWI_INT_STAT(RCVSERV);
+               write_INT_STAT(iface, RCVSERV);
                SSYNC();
        }
        if (twi_int_status & MERR) {
-               bfin_write_TWI_INT_STAT(MERR);
-               bfin_write_TWI_INT_MASK(0);
-               bfin_write_TWI_MASTER_STAT(0x3e);
-               bfin_write_TWI_MASTER_CTL(0);
+               write_INT_STAT(iface, MERR);
+               write_INT_MASK(iface, 0);
+               write_MASTER_STAT(iface, 0x3e);
+               write_MASTER_CTL(iface, 0);
                SSYNC();
-               iface->result = -1;
+               iface->result = -EIO;
                /* if both err and complete int stats are set, return proper
                 * results.
                 */
                if (twi_int_status & MCOMP) {
-                       bfin_write_TWI_INT_STAT(MCOMP);
-                       bfin_write_TWI_INT_MASK(0);
-                       bfin_write_TWI_MASTER_CTL(0);
+                       write_INT_STAT(iface, MCOMP);
+                       write_INT_MASK(iface, 0);
+                       write_MASTER_CTL(iface, 0);
                        SSYNC();
                        /* If it is a quick transfer, only address bug no data,
                         * not an err, return 1.
@@ -143,7 +171,7 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface)
                return;
        }
        if (twi_int_status & MCOMP) {
-               bfin_write_TWI_INT_STAT(MCOMP);
+               write_INT_STAT(iface, MCOMP);
                SSYNC();
                if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
                        if (iface->readNum == 0) {
@@ -152,28 +180,63 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface)
                                 */
                                iface->readNum = 1;
                                iface->manual_stop = 1;
-                               bfin_write_TWI_MASTER_CTL(
-                                       bfin_read_TWI_MASTER_CTL()
-                                       | (0xff << 6));
+                               write_MASTER_CTL(iface,
+                                       read_MASTER_CTL(iface) | (0xff << 6));
                        } else {
                                /* set the readd number in other
                                 * combine mode.
                                 */
-                               bfin_write_TWI_MASTER_CTL(
-                                       (bfin_read_TWI_MASTER_CTL() &
+                               write_MASTER_CTL(iface,
+                                       (read_MASTER_CTL(iface) &
                                        (~(0xff << 6))) |
-                                       ( iface->readNum << 6));
+                                       (iface->readNum << 6));
+                       }
+                       /* remove restart bit and enable master receive */
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) & ~RSTART);
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) | MEN | MDIR);
+                       SSYNC();
+               } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
+                               iface->cur_msg+1 < iface->msg_num) {
+                       iface->cur_msg++;
+                       iface->transPtr = iface->pmsg[iface->cur_msg].buf;
+                       iface->writeNum = iface->readNum =
+                               iface->pmsg[iface->cur_msg].len;
+                       /* Set Transmit device address */
+                       write_MASTER_ADDR(iface,
+                               iface->pmsg[iface->cur_msg].addr);
+                       if (iface->pmsg[iface->cur_msg].flags & I2C_M_RD)
+                               iface->read_write = I2C_SMBUS_READ;
+                       else {
+                               iface->read_write = I2C_SMBUS_WRITE;
+                               /* Transmit first data */
+                               if (iface->writeNum > 0) {
+                                       write_XMT_DATA8(iface,
+                                               *(iface->transPtr++));
+                                       iface->writeNum--;
+                                       SSYNC();
+                               }
+                       }
+
+                       if (iface->pmsg[iface->cur_msg].len <= 255)
+                               write_MASTER_CTL(iface,
+                               iface->pmsg[iface->cur_msg].len << 6);
+                       else {
+                               write_MASTER_CTL(iface, 0xff << 6);
+                               iface->manual_stop = 1;
                        }
                        /* remove restart bit and enable master receive */
-                       bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() &
-                               ~RSTART);
-                       bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() |
-                               MEN | MDIR);
+                       write_MASTER_CTL(iface,
+                               read_MASTER_CTL(iface) & ~RSTART);
+                       write_MASTER_CTL(iface, read_MASTER_CTL(iface) |
+                               MEN | ((iface->read_write == I2C_SMBUS_READ) ?
+                               MDIR : 0));
                        SSYNC();
                } else {
                        iface->result = 1;
-                       bfin_write_TWI_INT_MASK(0);
-                       bfin_write_TWI_MASTER_CTL(0);
+                       write_INT_MASK(iface, 0);
+                       write_MASTER_CTL(iface, 0);
                        SSYNC();
                        complete(&iface->complete);
                }
@@ -221,91 +284,85 @@ static int bfin_twi_master_xfer(struct i2c_adapter *adap,
 {
        struct bfin_twi_iface *iface = adap->algo_data;
        struct i2c_msg *pmsg;
-       int i, ret;
        int rc = 0;
 
-       if (!(bfin_read_TWI_CONTROL() & TWI_ENA))
+       if (!(read_CONTROL(iface) & TWI_ENA))
                return -ENXIO;
 
-       while (bfin_read_TWI_MASTER_STAT() & BUSBUSY) {
+       while (read_MASTER_STAT(iface) & BUSBUSY)
                yield();
+
+       iface->pmsg = msgs;
+       iface->msg_num = num;
+       iface->cur_msg = 0;
+
+       pmsg = &msgs[0];
+       if (pmsg->flags & I2C_M_TEN) {
+               dev_err(&adap->dev, "10 bits addr not supported!\n");
+               return -EINVAL;
        }
 
-       ret = 0;
-       for (i = 0; rc >= 0 && i < num; i++) {
-               pmsg = &msgs[i];
-               if (pmsg->flags & I2C_M_TEN) {
-                       dev_err(&(adap->dev), "i2c-bfin-twi: 10 bits addr "
-                               "not supported !\n");
-                       rc = -EINVAL;
-                       break;
-               }
+       iface->cur_mode = TWI_I2C_MODE_REPEAT;
+       iface->manual_stop = 0;
+       iface->transPtr = pmsg->buf;
+       iface->writeNum = iface->readNum = pmsg->len;
+       iface->result = 0;
+       iface->timeout_count = 10;
+       init_completion(&(iface->complete));
+       /* Set Transmit device address */
+       write_MASTER_ADDR(iface, pmsg->addr);
 
-               iface->cur_mode = TWI_I2C_MODE_STANDARD;
-               iface->manual_stop = 0;
-               iface->transPtr = pmsg->buf;
-               iface->writeNum = iface->readNum = pmsg->len;
-               iface->result = 0;
-               iface->timeout_count = 10;
-               /* Set Transmit device address */
-               bfin_write_TWI_MASTER_ADDR(pmsg->addr);
-
-               /* FIFO Initiation. Data in FIFO should be
-                *  discarded before start a new operation.
-                */
-               bfin_write_TWI_FIFO_CTL(0x3);
-               SSYNC();
-               bfin_write_TWI_FIFO_CTL(0);
-               SSYNC();
+       /* FIFO Initiation. Data in FIFO should be
+        *  discarded before start a new operation.
+        */
+       write_FIFO_CTL(iface, 0x3);
+       SSYNC();
+       write_FIFO_CTL(iface, 0);
+       SSYNC();
 
-               if (pmsg->flags & I2C_M_RD)
-                       iface->read_write = I2C_SMBUS_READ;
-               else {
-                       iface->read_write = I2C_SMBUS_WRITE;
-                       /* Transmit first data */
-                       if (iface->writeNum > 0) {
-                               bfin_write_TWI_XMT_DATA8(*(iface->transPtr++));
-                               iface->writeNum--;
-                               SSYNC();
-                       }
+       if (pmsg->flags & I2C_M_RD)
+               iface->read_write = I2C_SMBUS_READ;
+       else {
+               iface->read_write = I2C_SMBUS_WRITE;
+               /* Transmit first data */
+               if (iface->writeNum > 0) {
+                       write_XMT_DATA8(iface, *(iface->transPtr++));
+                       iface->writeNum--;
+                       SSYNC();
                }
+       }
 
-               /* clear int stat */
-               bfin_write_TWI_INT_STAT(MERR|MCOMP|XMTSERV|RCVSERV);
+       /* clear int stat */
+       write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
 
-               /* Interrupt mask . Enable XMT, RCV interrupt */
-               bfin_write_TWI_INT_MASK(MCOMP | MERR |
-                       ((iface->read_write == I2C_SMBUS_READ)?
-                       RCVSERV : XMTSERV));
-               SSYNC();
+       /* Interrupt mask . Enable XMT, RCV interrupt */
+       write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
+       SSYNC();
 
-               if (pmsg->len > 0 && pmsg->len <= 255)
-                       bfin_write_TWI_MASTER_CTL(pmsg->len << 6);
-               else if (pmsg->len > 255) {
-                       bfin_write_TWI_MASTER_CTL(0xff << 6);
-                       iface->manual_stop = 1;
-               } else
-                       break;
+       if (pmsg->len <= 255)
+               write_MASTER_CTL(iface, pmsg->len << 6);
+       else {
+               write_MASTER_CTL(iface, 0xff << 6);
+               iface->manual_stop = 1;
+       }
 
-               iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
-               add_timer(&iface->timeout_timer);
+       iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+       add_timer(&iface->timeout_timer);
 
-               /* Master enable */
-               bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() | MEN |
-                       ((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
-                       ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
-               SSYNC();
+       /* Master enable */
+       write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
+               ((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
+               ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
+       SSYNC();
 
-               wait_for_completion(&iface->complete);
+       wait_for_completion(&iface->complete);
 
-               rc = iface->result;
-               if (rc == 1)
-                       ret++;
-               else if (rc == -1)
-                       break;
-       }
+       rc = iface->result;
 
-       return ret;
+       if (rc == 1)
+               return num;
+       else
+               return rc;
 }
 
 /*
@@ -319,12 +376,11 @@ int bfin_twi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
        struct bfin_twi_iface *iface = adap->algo_data;
        int rc = 0;
 
-       if (!(bfin_read_TWI_CONTROL() & TWI_ENA))
+       if (!(read_CONTROL(iface) & TWI_ENA))
                return -ENXIO;
 
-       while (bfin_read_TWI_MASTER_STAT() & BUSBUSY) {
+       while (read_MASTER_STAT(iface) & BUSBUSY)
                yield();
-       }
 
        iface->writeNum = 0;
        iface->readNum = 0;
@@ -392,19 +448,20 @@ int bfin_twi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
        iface->read_write = read_write;
        iface->command = command;
        iface->timeout_count = 10;
+       init_completion(&(iface->complete));
 
        /* FIFO Initiation. Data in FIFO should be discarded before
         * start a new operation.
         */
-       bfin_write_TWI_FIFO_CTL(0x3);
+       write_FIFO_CTL(iface, 0x3);
        SSYNC();
-       bfin_write_TWI_FIFO_CTL(0);
+       write_FIFO_CTL(iface, 0);
 
        /* clear int stat */
-       bfin_write_TWI_INT_STAT(MERR|MCOMP|XMTSERV|RCVSERV);
+       write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
 
        /* Set Transmit device address */
-       bfin_write_TWI_MASTER_ADDR(addr);
+       write_MASTER_ADDR(iface, addr);
        SSYNC();
 
        iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
@@ -412,60 +469,64 @@ int bfin_twi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
 
        switch (iface->cur_mode) {
        case TWI_I2C_MODE_STANDARDSUB:
-               bfin_write_TWI_XMT_DATA8(iface->command);
-               bfin_write_TWI_INT_MASK(MCOMP | MERR |
+               write_XMT_DATA8(iface, iface->command);
+               write_INT_MASK(iface, MCOMP | MERR |
                        ((iface->read_write == I2C_SMBUS_READ) ?
                        RCVSERV : XMTSERV));
                SSYNC();
 
                if (iface->writeNum + 1 <= 255)
-                       bfin_write_TWI_MASTER_CTL((iface->writeNum + 1) << 6);
+                       write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
                else {
-                       bfin_write_TWI_MASTER_CTL(0xff << 6);
+                       write_MASTER_CTL(iface, 0xff << 6);
                        iface->manual_stop = 1;
                }
                /* Master enable */
-               bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() | MEN |
+               write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
                        ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
                break;
        case TWI_I2C_MODE_COMBINED:
-               bfin_write_TWI_XMT_DATA8(iface->command);
-               bfin_write_TWI_INT_MASK(MCOMP | MERR | RCVSERV | XMTSERV);
+               write_XMT_DATA8(iface, iface->command);
+               write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
                SSYNC();
 
                if (iface->writeNum > 0)
-                       bfin_write_TWI_MASTER_CTL((iface->writeNum + 1) << 6);
+                       write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
                else
-                       bfin_write_TWI_MASTER_CTL(0x1 << 6);
+                       write_MASTER_CTL(iface, 0x1 << 6);
                /* Master enable */
-               bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() | MEN |
+               write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
                        ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
                break;
        default:
-               bfin_write_TWI_MASTER_CTL(0);
+               write_MASTER_CTL(iface, 0);
                if (size != I2C_SMBUS_QUICK) {
                        /* Don't access xmit data register when this is a
                         * read operation.
                         */
                        if (iface->read_write != I2C_SMBUS_READ) {
                                if (iface->writeNum > 0) {
-                                       bfin_write_TWI_XMT_DATA8(*(iface->transPtr++));
+                                       write_XMT_DATA8(iface,
+                                               *(iface->transPtr++));
                                        if (iface->writeNum <= 255)
-                                               bfin_write_TWI_MASTER_CTL(iface->writeNum << 6);
+                                               write_MASTER_CTL(iface,
+                                                       iface->writeNum << 6);
                                        else {
-                                               bfin_write_TWI_MASTER_CTL(0xff << 6);
+                                               write_MASTER_CTL(iface,
+                                                       0xff << 6);
                                                iface->manual_stop = 1;
                                        }
                                        iface->writeNum--;
                                } else {
-                                       bfin_write_TWI_XMT_DATA8(iface->command);
-                                       bfin_write_TWI_MASTER_CTL(1 << 6);
+                                       write_XMT_DATA8(iface, iface->command);
+                                       write_MASTER_CTL(iface, 1 << 6);
                                }
                        } else {
                                if (iface->readNum > 0 && iface->readNum <= 255)
-                                       bfin_write_TWI_MASTER_CTL(iface->readNum << 6);
+                                       write_MASTER_CTL(iface,
+                                               iface->readNum << 6);
                                else if (iface->readNum > 255) {
-                                       bfin_write_TWI_MASTER_CTL(0xff << 6);
+                                       write_MASTER_CTL(iface, 0xff << 6);
                                        iface->manual_stop = 1;
                                } else {
                                        del_timer(&iface->timeout_timer);
@@ -473,13 +534,13 @@ int bfin_twi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
                                }
                        }
                }
-               bfin_write_TWI_INT_MASK(MCOMP | MERR |
+               write_INT_MASK(iface, MCOMP | MERR |
                        ((iface->read_write == I2C_SMBUS_READ) ?
                        RCVSERV : XMTSERV));
                SSYNC();
 
                /* Master enable */
-               bfin_write_TWI_MASTER_CTL(bfin_read_TWI_MASTER_CTL() | MEN |
+               write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
                        ((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
                        ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
                break;
@@ -514,10 +575,10 @@ static struct i2c_algorithm bfin_twi_algorithm = {
 
 static int i2c_bfin_twi_suspend(struct platform_device *dev, pm_message_t state)
 {
-/*     struct bfin_twi_iface *iface = platform_get_drvdata(dev);*/
+       struct bfin_twi_iface *iface = platform_get_drvdata(dev);
 
        /* Disable TWI */
-       bfin_write_TWI_CONTROL(bfin_read_TWI_CONTROL() & ~TWI_ENA);
+       write_CONTROL(iface, read_CONTROL(iface) & ~TWI_ENA);
        SSYNC();
 
        return 0;
@@ -525,24 +586,52 @@ static int i2c_bfin_twi_suspend(struct platform_device *dev, pm_message_t state)
 
 static int i2c_bfin_twi_resume(struct platform_device *dev)
 {
-/*     struct bfin_twi_iface *iface = platform_get_drvdata(dev);*/
+       struct bfin_twi_iface *iface = platform_get_drvdata(dev);
 
        /* Enable TWI */
-       bfin_write_TWI_CONTROL(bfin_read_TWI_CONTROL() | TWI_ENA);
+       write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA);
        SSYNC();
 
        return 0;
 }
 
-static int i2c_bfin_twi_probe(struct platform_device *dev)
+static int i2c_bfin_twi_probe(struct platform_device *pdev)
 {
-       struct bfin_twi_iface *iface = &twi_iface;
+       struct bfin_twi_iface *iface;
        struct i2c_adapter *p_adap;
+       struct resource *res;
        int rc;
 
+       iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL);
+       if (!iface) {
+               dev_err(&pdev->dev, "Cannot allocate memory\n");
+               rc = -ENOMEM;
+               goto out_error_nomem;
+       }
+
        spin_lock_init(&(iface->lock));
-       init_completion(&(iface->complete));
-       iface->irq = IRQ_TWI;
+
+       /* Find and map our resources */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res == NULL) {
+               dev_err(&pdev->dev, "Cannot get IORESOURCE_MEM\n");
+               rc = -ENOENT;
+               goto out_error_get_res;
+       }
+
+       iface->regs_base = ioremap(res->start, res->end - res->start + 1);
+       if (iface->regs_base == NULL) {
+               dev_err(&pdev->dev, "Cannot map IO\n");
+               rc = -ENXIO;
+               goto out_error_ioremap;
+       }
+
+       iface->irq = platform_get_irq(pdev, 0);
+       if (iface->irq < 0) {
+               dev_err(&pdev->dev, "No IRQ specified\n");
+               rc = -ENOENT;
+               goto out_error_no_irq;
+       }
 
        init_timer(&(iface->timeout_timer));
        iface->timeout_timer.function = bfin_twi_timeout;
@@ -550,39 +639,63 @@ static int i2c_bfin_twi_probe(struct platform_device *dev)
 
        p_adap = &iface->adap;
        p_adap->id = I2C_HW_BLACKFIN;
-       p_adap->nr = dev->id;
-       strlcpy(p_adap->name, dev->name, sizeof(p_adap->name));
+       p_adap->nr = pdev->id;
+       strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name));
        p_adap->algo = &bfin_twi_algorithm;
        p_adap->algo_data = iface;
        p_adap->class = I2C_CLASS_ALL;
-       p_adap->dev.parent = &dev->dev;
+       p_adap->dev.parent = &pdev->dev;
+
+       rc = peripheral_request_list(pin_req[pdev->id], "i2c-bfin-twi");
+       if (rc) {
+               dev_err(&pdev->dev, "Can't setup pin mux!\n");
+               goto out_error_pin_mux;
+       }
 
        rc = request_irq(iface->irq, bfin_twi_interrupt_entry,
-               IRQF_DISABLED, dev->name, iface);
+               IRQF_DISABLED, pdev->name, iface);
        if (rc) {
-               dev_err(&(p_adap->dev), "i2c-bfin-twi: can't get IRQ %d !\n",
-                       iface->irq);
-               return -ENODEV;
+               dev_err(&pdev->dev, "Can't get IRQ %d !\n", iface->irq);
+               rc = -ENODEV;
+               goto out_error_req_irq;
        }
 
        /* Set TWI internal clock as 10MHz */
-       bfin_write_TWI_CONTROL(((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F);
+       write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F);
 
        /* Set Twi interface clock as specified */
-       bfin_write_TWI_CLKDIV((( 5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ )
-                       << 8) | (( 5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ )
+       write_CLKDIV(iface, ((5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ)
+                       << 8) | ((5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ)
                        & 0xFF));
 
        /* Enable TWI */
-       bfin_write_TWI_CONTROL(bfin_read_TWI_CONTROL() | TWI_ENA);
+       write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA);
        SSYNC();
 
        rc = i2c_add_numbered_adapter(p_adap);
-       if (rc < 0)
-               free_irq(iface->irq, iface);
-       else
-               platform_set_drvdata(dev, iface);
+       if (rc < 0) {
+               dev_err(&pdev->dev, "Can't add i2c adapter!\n");
+               goto out_error_add_adapter;
+       }
+
+       platform_set_drvdata(pdev, iface);
 
+       dev_info(&pdev->dev, "Blackfin BF5xx on-chip I2C TWI Contoller, "
+               "regs_base@%p\n", iface->regs_base);
+
+       return 0;
+
+out_error_add_adapter:
+       free_irq(iface->irq, iface);
+out_error_req_irq:
+out_error_no_irq:
+       peripheral_free_list(pin_req[pdev->id]);
+out_error_pin_mux:
+       iounmap(iface->regs_base);
+out_error_ioremap:
+out_error_get_res:
+       kfree(iface);
+out_error_nomem:
        return rc;
 }
 
@@ -594,6 +707,9 @@ static int i2c_bfin_twi_remove(struct platform_device *pdev)
 
        i2c_del_adapter(&(iface->adap));
        free_irq(iface->irq, iface);
+       peripheral_free_list(pin_req[pdev->id]);
+       iounmap(iface->regs_base);
+       kfree(iface);
 
        return 0;
 }
@@ -611,8 +727,6 @@ static struct platform_driver i2c_bfin_twi_driver = {
 
 static int __init i2c_bfin_twi_init(void)
 {
-       pr_info("I2C: Blackfin I2C TWI driver\n");
-
        return platform_driver_register(&i2c_bfin_twi_driver);
 }
 
@@ -621,9 +735,10 @@ static void __exit i2c_bfin_twi_exit(void)
        platform_driver_unregister(&i2c_bfin_twi_driver);
 }
 
-MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
-MODULE_DESCRIPTION("I2C-Bus adapter routines for Blackfin TWI");
-MODULE_LICENSE("GPL");
-
 module_init(i2c_bfin_twi_init);
 module_exit(i2c_bfin_twi_exit);
+
+MODULE_AUTHOR("Bryan Wu, Sonic Zhang");
+MODULE_DESCRIPTION("Blackfin BF5xx on-chip I2C TWI Contoller Driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:i2c-bfin-twi");
index fde26345a379b38993917c797cc584afd38e7034..7ecbfc429b19722e4c681958f1fee5eab5b73c24 100644 (file)
@@ -328,7 +328,7 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
        int i;
        int ret;
 
-       dev_dbg(dev->dev, "%s: msgs: %d\n", __FUNCTION__, num);
+       dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num);
 
        ret = i2c_davinci_wait_bus_not_busy(dev, 1);
        if (ret < 0) {
@@ -342,7 +342,7 @@ i2c_davinci_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
                        return ret;
        }
 
-       dev_dbg(dev->dev, "%s:%d ret: %d\n", __FUNCTION__, __LINE__, ret);
+       dev_dbg(dev->dev, "%s:%d ret: %d\n", __func__, __LINE__, ret);
 
        return num;
 }
@@ -364,7 +364,7 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
        u16 w;
 
        while ((stat = davinci_i2c_read_reg(dev, DAVINCI_I2C_IVR_REG))) {
-               dev_dbg(dev->dev, "%s: stat=0x%x\n", __FUNCTION__, stat);
+               dev_dbg(dev->dev, "%s: stat=0x%x\n", __func__, stat);
                if (count++ == 100) {
                        dev_warn(dev->dev, "Too much work in one IRQ\n");
                        break;
@@ -553,6 +553,9 @@ static int davinci_i2c_remove(struct platform_device *pdev)
        return 0;
 }
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:i2c_davinci");
+
 static struct platform_driver davinci_i2c_driver = {
        .probe          = davinci_i2c_probe,
        .remove         = davinci_i2c_remove,
index 3ca19fc234fb45122be765f517288aa419b3d516..7c1b762aa681fc727312c0e0c1db08dbff0c2c04 100644 (file)
@@ -220,3 +220,4 @@ module_exit(i2c_gpio_exit);
 MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
 MODULE_DESCRIPTION("Platform-independent bitbanging I2C driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:i2c-gpio");
index 22bb247d0e606b5a1926fe9f49735c9f3ac84a13..85dbf34382e1f54a3d964a2f71abf4f214457656 100644 (file)
@@ -6,6 +6,9 @@
  * Copyright (c) 2003, 2004 Zultys Technologies.
  * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
  *
+ * Copyright (c) 2008 PIKA Technologies
+ * Sean MacLennan <smaclennan@pikatech.com>
+ *
  * Based on original work by
  *     Ian DaSilva  <idasilva@mvista.com>
  *      Armin Kuster <akuster@mvista.com>
 #include <asm/io.h>
 #include <linux/i2c.h>
 #include <linux/i2c-id.h>
+
+#ifdef CONFIG_IBM_OCP
 #include <asm/ocp.h>
 #include <asm/ibm4xx.h>
+#else
+#include <linux/of_platform.h>
+#endif
 
 #include "i2c-ibm_iic.h"
 
-#define DRIVER_VERSION "2.1"
+#define DRIVER_VERSION "2.2"
 
 MODULE_DESCRIPTION("IBM IIC driver v" DRIVER_VERSION);
 MODULE_LICENSE("GPL");
@@ -650,13 +658,14 @@ static inline u8 iic_clckdiv(unsigned int opb)
        opb /= 1000000;
 
        if (opb < 20 || opb > 150){
-               printk(KERN_CRIT "ibm-iic: invalid OPB clock frequency %u MHz\n",
+               printk(KERN_WARNING "ibm-iic: invalid OPB clock frequency %u MHz\n",
                        opb);
                opb = opb < 20 ? 20 : 150;
        }
        return (u8)((opb + 9) / 10 - 1);
 }
 
+#ifdef CONFIG_IBM_OCP
 /*
  * Register single IIC interface
  */
@@ -672,7 +681,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
                        ocp->def->index);
 
        if (!(dev = kzalloc(sizeof(*dev), GFP_KERNEL))) {
-               printk(KERN_CRIT "ibm-iic%d: failed to allocate device data\n",
+               printk(KERN_ERR "ibm-iic%d: failed to allocate device data\n",
                        ocp->def->index);
                return -ENOMEM;
        }
@@ -687,7 +696,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
        }
 
        if (!(dev->vaddr = ioremap(ocp->def->paddr, sizeof(struct iic_regs)))){
-               printk(KERN_CRIT "ibm-iic%d: failed to ioremap device registers\n",
+               printk(KERN_ERR "ibm-iic%d: failed to ioremap device registers\n",
                        dev->idx);
                ret = -ENXIO;
                goto fail2;
@@ -745,7 +754,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
        adap->nr = dev->idx >= 0 ? dev->idx : 0;
 
        if ((ret = i2c_add_numbered_adapter(adap)) < 0) {
-               printk(KERN_CRIT "ibm-iic%d: failed to register i2c adapter\n",
+               printk(KERN_ERR "ibm-iic%d: failed to register i2c adapter\n",
                        dev->idx);
                goto fail;
        }
@@ -778,7 +787,7 @@ static void __devexit iic_remove(struct ocp_device *ocp)
        struct ibm_iic_private* dev = (struct ibm_iic_private*)ocp_get_drvdata(ocp);
        BUG_ON(dev == NULL);
        if (i2c_del_adapter(&dev->adap)){
-               printk(KERN_CRIT "ibm-iic%d: failed to delete i2c adapter :(\n",
+               printk(KERN_ERR "ibm-iic%d: failed to delete i2c adapter :(\n",
                        dev->idx);
                /* That's *very* bad, just shutdown IRQ ... */
                if (dev->irq >= 0){
@@ -828,5 +837,181 @@ static void __exit iic_exit(void)
        ocp_unregister_driver(&ibm_iic_driver);
 }
 
+#else  /* !CONFIG_IBM_OCP */
+
+static int __devinit iic_request_irq(struct of_device *ofdev,
+                                    struct ibm_iic_private *dev)
+{
+       struct device_node *np = ofdev->node;
+       int irq;
+
+       if (iic_force_poll)
+               return NO_IRQ;
+
+       irq = irq_of_parse_and_map(np, 0);
+       if (irq == NO_IRQ) {
+               dev_err(&ofdev->dev, "irq_of_parse_and_map failed\n");
+               return NO_IRQ;
+       }
+
+       /* Disable interrupts until we finish initialization, assumes
+        *  level-sensitive IRQ setup...
+        */
+       iic_interrupt_mode(dev, 0);
+       if (request_irq(irq, iic_handler, 0, "IBM IIC", dev)) {
+               dev_err(&ofdev->dev, "request_irq %d failed\n", irq);
+               /* Fallback to the polling mode */
+               return NO_IRQ;
+       }
+
+       return irq;
+}
+
+/*
+ * Register single IIC interface
+ */
+static int __devinit iic_probe(struct of_device *ofdev,
+                              const struct of_device_id *match)
+{
+       struct device_node *np = ofdev->node;
+       struct ibm_iic_private *dev;
+       struct i2c_adapter *adap;
+       const u32 *indexp, *freq;
+       int ret;
+
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev) {
+               dev_err(&ofdev->dev, "failed to allocate device data\n");
+               return -ENOMEM;
+       }
+
+       dev_set_drvdata(&ofdev->dev, dev);
+
+       indexp = of_get_property(np, "index", NULL);
+       if (!indexp) {
+               dev_err(&ofdev->dev, "no index specified\n");
+               ret = -EINVAL;
+               goto error_cleanup;
+       }
+       dev->idx = *indexp;
+
+       dev->vaddr = of_iomap(np, 0);
+       if (dev->vaddr == NULL) {
+               dev_err(&ofdev->dev, "failed to iomap device\n");
+               ret = -ENXIO;
+               goto error_cleanup;
+       }
+
+       init_waitqueue_head(&dev->wq);
+
+       dev->irq = iic_request_irq(ofdev, dev);
+       if (dev->irq == NO_IRQ)
+               dev_warn(&ofdev->dev, "using polling mode\n");
+
+       /* Board specific settings */
+       if (iic_force_fast || of_get_property(np, "fast-mode", NULL))
+               dev->fast_mode = 1;
+
+       freq = of_get_property(np, "clock-frequency", NULL);
+       if (freq == NULL) {
+               freq = of_get_property(np->parent, "clock-frequency", NULL);
+               if (freq == NULL) {
+                       dev_err(&ofdev->dev, "Unable to get bus frequency\n");
+                       ret = -EINVAL;
+                       goto error_cleanup;
+               }
+       }
+
+       dev->clckdiv = iic_clckdiv(*freq);
+       dev_dbg(&ofdev->dev, "clckdiv = %d\n", dev->clckdiv);
+
+       /* Initialize IIC interface */
+       iic_dev_init(dev);
+
+       /* Register it with i2c layer */
+       adap = &dev->adap;
+       adap->dev.parent = &ofdev->dev;
+       strlcpy(adap->name, "IBM IIC", sizeof(adap->name));
+       i2c_set_adapdata(adap, dev);
+       adap->id = I2C_HW_OCP;
+       adap->class = I2C_CLASS_HWMON;
+       adap->algo = &iic_algo;
+       adap->timeout = 1;
+       adap->nr = dev->idx;
+
+       ret = i2c_add_numbered_adapter(adap);
+       if (ret  < 0) {
+               dev_err(&ofdev->dev, "failed to register i2c adapter\n");
+               goto error_cleanup;
+       }
+
+       dev_info(&ofdev->dev, "using %s mode\n",
+                dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
+
+       return 0;
+
+error_cleanup:
+       if (dev->irq != NO_IRQ) {
+               iic_interrupt_mode(dev, 0);
+               free_irq(dev->irq, dev);
+       }
+
+       if (dev->vaddr)
+               iounmap(dev->vaddr);
+
+       dev_set_drvdata(&ofdev->dev, NULL);
+       kfree(dev);
+       return ret;
+}
+
+/*
+ * Cleanup initialized IIC interface
+ */
+static int __devexit iic_remove(struct of_device *ofdev)
+{
+       struct ibm_iic_private *dev = dev_get_drvdata(&ofdev->dev);
+
+       dev_set_drvdata(&ofdev->dev, NULL);
+
+       i2c_del_adapter(&dev->adap);
+
+       if (dev->irq != NO_IRQ) {
+               iic_interrupt_mode(dev, 0);
+               free_irq(dev->irq, dev);
+       }
+
+       iounmap(dev->vaddr);
+       kfree(dev);
+
+       return 0;
+}
+
+static const struct of_device_id ibm_iic_match[] = {
+       { .compatible = "ibm,iic-405ex", },
+       { .compatible = "ibm,iic-405gp", },
+       { .compatible = "ibm,iic-440gp", },
+       { .compatible = "ibm,iic-440gpx", },
+       { .compatible = "ibm,iic-440grx", },
+       {}
+};
+
+static struct of_platform_driver ibm_iic_driver = {
+       .name   = "ibm-iic",
+       .match_table = ibm_iic_match,
+       .probe  = iic_probe,
+       .remove = __devexit_p(iic_remove),
+};
+
+static int __init iic_init(void)
+{
+       return of_register_platform_driver(&ibm_iic_driver);
+}
+
+static void __exit iic_exit(void)
+{
+       of_unregister_platform_driver(&ibm_iic_driver);
+}
+#endif /* CONFIG_IBM_OCP */
+
 module_init(iic_init);
 module_exit(iic_exit);
index ab41400c883e32b36a4446c5f90148beb43b1e66..39884e7975945e8954ed4bb8f1e8194fab5fd895 100644 (file)
@@ -550,3 +550,4 @@ module_exit (i2c_iop3xx_exit);
 MODULE_AUTHOR("D-TACQ Solutions Ltd <www.d-tacq.com>");
 MODULE_DESCRIPTION("IOP3xx iic algorithm and driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:IOP3xx-I2C");
index 6352121a28275552bd1a360288485afdd5e4ca52..5af9e6521e6ca514b912266866c7ace21763df63 100644 (file)
@@ -164,4 +164,5 @@ module_exit(ixp2000_i2c_exit);
 MODULE_AUTHOR ("Deepak Saxena <dsaxena@plexity.net>");
 MODULE_DESCRIPTION("IXP2000 GPIO-based I2C bus driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:IXP2000-I2C");
 
index bbe787b243b7e6766576a49a525dab883f49b620..18beb0ad7bf3ad1b9fc703c3c75952fd6017e848 100644 (file)
@@ -392,6 +392,9 @@ static int fsl_i2c_remove(struct platform_device *pdev)
        return 0;
 };
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:fsl-i2c");
+
 /* Structure for a device driver */
 static struct platform_driver fsl_i2c_driver = {
        .probe = fsl_i2c_probe,
index e417c2c3ca22af0fa2520878ff07798a417ffad0..f145692cbb76ad649901ccc3553443804bde3941 100644 (file)
@@ -312,6 +312,9 @@ static int __devexit ocores_i2c_remove(struct platform_device* pdev)
        return 0;
 }
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:ocores-i2c");
+
 static struct platform_driver ocores_i2c_driver = {
        .probe  = ocores_i2c_probe,
        .remove = __devexit_p(ocores_i2c_remove),
index 7ba31770d773245102b4ece0dc9393af76791a3b..e7eb7bf9ddecc762e088d17f155c5b38818c6a57 100644 (file)
@@ -693,3 +693,4 @@ module_exit(omap_i2c_exit_driver);
 MODULE_AUTHOR("MontaVista Software, Inc. (and others)");
 MODULE_DESCRIPTION("TI OMAP I2C bus adapter");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:i2c_omap");
index 496ee875eb4f2ffa67933abc23da2d2814205633..a119784bae1069bee133d2b5f5f76ba1dd805f63 100644 (file)
@@ -1,6 +1,7 @@
 /*
  *  i2c-pca-isa.c driver for PCA9564 on ISA boards
  *    Copyright (C) 2004 Arcom Control Systems
+ *    Copyright (C) 2008 Pengutronix
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/delay.h>
-#include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/wait.h>
-
 #include <linux/isa.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-pca.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include "../algos/i2c-algo-pca.h"
-
+#define DRIVER "i2c-pca-isa"
 #define IO_SIZE 4
 
-#undef DEBUG_IO
-//#define DEBUG_IO
-
 static unsigned long base   = 0x330;
 static int irq           = 10;
 
@@ -48,22 +43,9 @@ static int irq         = 10;
  * in the actual clock rate */
 static int clock  = I2C_PCA_CON_59kHz;
 
-static int own    = 0x55;
-
 static wait_queue_head_t pca_wait;
 
-static int pca_isa_getown(struct i2c_algo_pca_data *adap)
-{
-       return (own);
-}
-
-static int pca_isa_getclock(struct i2c_algo_pca_data *adap)
-{
-       return (clock);
-}
-
-static void
-pca_isa_writebyte(struct i2c_algo_pca_data *adap, int reg, int val)
+static void pca_isa_writebyte(void *pd, int reg, int val)
 {
 #ifdef DEBUG_IO
        static char *names[] = { "T/O", "DAT", "ADR", "CON" };
@@ -72,44 +54,49 @@ pca_isa_writebyte(struct i2c_algo_pca_data *adap, int reg, int val)
        outb(val, base+reg);
 }
 
-static int
-pca_isa_readbyte(struct i2c_algo_pca_data *adap, int reg)
+static int pca_isa_readbyte(void *pd, int reg)
 {
        int res = inb(base+reg);
 #ifdef DEBUG_IO
        {
-               static char *names[] = { "STA", "DAT", "ADR", "CON" };  
+               static char *names[] = { "STA", "DAT", "ADR", "CON" };
                printk("*** read  %s => %#04x\n", names[reg], res);
        }
 #endif
        return res;
 }
 
-static int pca_isa_waitforinterrupt(struct i2c_algo_pca_data *adap)
+static int pca_isa_waitforcompletion(void *pd)
 {
        int ret = 0;
 
        if (irq > -1) {
                ret = wait_event_interruptible(pca_wait,
-                                              pca_isa_readbyte(adap, I2C_PCA_CON) & I2C_PCA_CON_SI);
+                                              pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI);
        } else {
-               while ((pca_isa_readbyte(adap, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0) 
+               while ((pca_isa_readbyte(pd, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
                        udelay(100);
        }
        return ret;
 }
 
+static void pca_isa_resetchip(void *pd)
+{
+       /* apparently only an external reset will do it. not a lot can be done */
+       printk(KERN_WARNING DRIVER ": Haven't figured out how to do a reset yet\n");
+}
+
 static irqreturn_t pca_handler(int this_irq, void *dev_id) {
        wake_up_interruptible(&pca_wait);
        return IRQ_HANDLED;
 }
 
 static struct i2c_algo_pca_data pca_isa_data = {
-       .get_own                = pca_isa_getown,
-       .get_clock              = pca_isa_getclock,
+       /* .data intentionally left NULL, not needed with ISA */
        .write_byte             = pca_isa_writebyte,
        .read_byte              = pca_isa_readbyte,
-       .wait_for_interrupt     = pca_isa_waitforinterrupt,
+       .wait_for_completion    = pca_isa_waitforcompletion,
+       .reset_chip             = pca_isa_resetchip,
 };
 
 static struct i2c_adapter pca_isa_ops = {
@@ -117,6 +104,7 @@ static struct i2c_adapter pca_isa_ops = {
        .id             = I2C_HW_A_ISA,
        .algo_data      = &pca_isa_data,
        .name           = "PCA9564 ISA Adapter",
+       .timeout        = 100,
 };
 
 static int __devinit pca_isa_probe(struct device *dev, unsigned int id)
@@ -144,6 +132,7 @@ static int __devinit pca_isa_probe(struct device *dev, unsigned int id)
                }
        }
 
+       pca_isa_data.i2c_clock = clock;
        if (i2c_pca_add_bus(&pca_isa_ops) < 0) {
                dev_err(dev, "Failed to add i2c bus\n");
                goto out_irq;
@@ -178,7 +167,7 @@ static struct isa_driver pca_isa_driver = {
        .remove         = __devexit_p(pca_isa_remove),
        .driver = {
                .owner  = THIS_MODULE,
-               .name   = "i2c-pca-isa",
+               .name   = DRIVER,
        }
 };
 
@@ -204,7 +193,5 @@ MODULE_PARM_DESC(irq, "IRQ");
 module_param(clock, int, 0);
 MODULE_PARM_DESC(clock, "Clock rate as described in table 1 of PCA9564 datasheet");
 
-module_param(own, int, 0); /* the driver can't do slave mode, so there's no real point in this */
-
 module_init(pca_isa_init);
 module_exit(pca_isa_exit);
diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c
new file mode 100644 (file)
index 0000000..9d75f51
--- /dev/null
@@ -0,0 +1,298 @@
+/*
+ *  i2c_pca_platform.c
+ *
+ *  Platform driver for the PCA9564 I2C controller.
+ *
+ *  Copyright (C) 2008 Pengutronix
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/i2c-algo-pca.h>
+#include <linux/i2c-pca-platform.h>
+#include <linux/gpio.h>
+
+#include <asm/irq.h>
+#include <asm/io.h>
+
+#define res_len(r)             ((r)->end - (r)->start + 1)
+
+struct i2c_pca_pf_data {
+       void __iomem                    *reg_base;
+       int                             irq;    /* if 0, use polling */
+       int                             gpio;
+       wait_queue_head_t               wait;
+       struct i2c_adapter              adap;
+       struct i2c_algo_pca_data        algo_data;
+       unsigned long                   io_base;
+       unsigned long                   io_size;
+};
+
+/* Read/Write functions for different register alignments */
+
+static int i2c_pca_pf_readbyte8(void *pd, int reg)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       return ioread8(i2c->reg_base + reg);
+}
+
+static int i2c_pca_pf_readbyte16(void *pd, int reg)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       return ioread8(i2c->reg_base + reg * 2);
+}
+
+static int i2c_pca_pf_readbyte32(void *pd, int reg)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       return ioread8(i2c->reg_base + reg * 4);
+}
+
+static void i2c_pca_pf_writebyte8(void *pd, int reg, int val)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       iowrite8(val, i2c->reg_base + reg);
+}
+
+static void i2c_pca_pf_writebyte16(void *pd, int reg, int val)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       iowrite8(val, i2c->reg_base + reg * 2);
+}
+
+static void i2c_pca_pf_writebyte32(void *pd, int reg, int val)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       iowrite8(val, i2c->reg_base + reg * 4);
+}
+
+
+static int i2c_pca_pf_waitforcompletion(void *pd)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       int ret = 0;
+
+       if (i2c->irq) {
+               ret = wait_event_interruptible(i2c->wait,
+                       i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
+                       & I2C_PCA_CON_SI);
+       } else {
+               /*
+                * Do polling...
+                * XXX: Could get stuck in extreme cases!
+                *      Maybe add timeout, but using irqs is preferred anyhow.
+                */
+               while ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON)
+                               & I2C_PCA_CON_SI) == 0)
+                       udelay(100);
+       }
+
+       return ret;
+}
+
+static void i2c_pca_pf_dummyreset(void *pd)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+       printk(KERN_WARNING "%s: No reset-pin found. Chip may get stuck!\n",
+               i2c->adap.name);
+}
+
+static void i2c_pca_pf_resetchip(void *pd)
+{
+       struct i2c_pca_pf_data *i2c = pd;
+
+       gpio_set_value(i2c->gpio, 0);
+       ndelay(100);
+       gpio_set_value(i2c->gpio, 1);
+}
+
+static irqreturn_t i2c_pca_pf_handler(int this_irq, void *dev_id)
+{
+       struct i2c_pca_pf_data *i2c = dev_id;
+
+       if ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0)
+               return IRQ_NONE;
+
+       wake_up_interruptible(&i2c->wait);
+
+       return IRQ_HANDLED;
+}
+
+
+static int __devinit i2c_pca_pf_probe(struct platform_device *pdev)
+{
+       struct i2c_pca_pf_data *i2c;
+       struct resource *res;
+       struct i2c_pca9564_pf_platform_data *platform_data =
+                               pdev->dev.platform_data;
+       int ret = 0;
+       int irq;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       irq = platform_get_irq(pdev, 0);
+       /* If irq is 0, we do polling. */
+
+       if (res == NULL) {
+               ret = -ENODEV;
+               goto e_print;
+       }
+
+       if (!request_mem_region(res->start, res_len(res), res->name)) {
+               ret = -ENOMEM;
+               goto e_print;
+       }
+
+       i2c = kzalloc(sizeof(struct i2c_pca_pf_data), GFP_KERNEL);
+       if (!i2c) {
+               ret = -ENOMEM;
+               goto e_alloc;
+       }
+
+       init_waitqueue_head(&i2c->wait);
+
+       i2c->reg_base = ioremap(res->start, res_len(res));
+       if (!i2c->reg_base) {
+               ret = -EIO;
+               goto e_remap;
+       }
+       i2c->io_base = res->start;
+       i2c->io_size = res_len(res);
+       i2c->irq = irq;
+
+       i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0;
+       i2c->adap.owner = THIS_MODULE;
+       snprintf(i2c->adap.name, sizeof(i2c->adap.name), "PCA9564 at 0x%08lx",
+               (unsigned long) res->start);
+       i2c->adap.algo_data = &i2c->algo_data;
+       i2c->adap.dev.parent = &pdev->dev;
+       i2c->adap.timeout = platform_data->timeout;
+
+       i2c->algo_data.i2c_clock = platform_data->i2c_clock_speed;
+       i2c->algo_data.data = i2c;
+
+       switch (res->flags & IORESOURCE_MEM_TYPE_MASK) {
+       case IORESOURCE_MEM_32BIT:
+               i2c->algo_data.write_byte = i2c_pca_pf_writebyte32;
+               i2c->algo_data.read_byte = i2c_pca_pf_readbyte32;
+               break;
+       case IORESOURCE_MEM_16BIT:
+               i2c->algo_data.write_byte = i2c_pca_pf_writebyte16;
+               i2c->algo_data.read_byte = i2c_pca_pf_readbyte16;
+               break;
+       case IORESOURCE_MEM_8BIT:
+       default:
+               i2c->algo_data.write_byte = i2c_pca_pf_writebyte8;
+               i2c->algo_data.read_byte = i2c_pca_pf_readbyte8;
+               break;
+       }
+
+       i2c->algo_data.wait_for_completion = i2c_pca_pf_waitforcompletion;
+
+       i2c->gpio = platform_data->gpio;
+       i2c->algo_data.reset_chip = i2c_pca_pf_dummyreset;
+
+       /* Use gpio_is_valid() when in mainline */
+       if (i2c->gpio > -1) {
+               ret = gpio_request(i2c->gpio, i2c->adap.name);
+               if (ret == 0) {
+                       gpio_direction_output(i2c->gpio, 1);
+                       i2c->algo_data.reset_chip = i2c_pca_pf_resetchip;
+               } else {
+                       printk(KERN_WARNING "%s: Registering gpio failed!\n",
+                               i2c->adap.name);
+                       i2c->gpio = ret;
+               }
+       }
+
+       if (irq) {
+               ret = request_irq(irq, i2c_pca_pf_handler,
+                       IRQF_TRIGGER_FALLING, i2c->adap.name, i2c);
+               if (ret)
+                       goto e_reqirq;
+       }
+
+       if (i2c_pca_add_numbered_bus(&i2c->adap) < 0) {
+               ret = -ENODEV;
+               goto e_adapt;
+       }
+
+       platform_set_drvdata(pdev, i2c);
+
+       printk(KERN_INFO "%s registered.\n", i2c->adap.name);
+
+       return 0;
+
+e_adapt:
+       if (irq)
+               free_irq(irq, i2c);
+e_reqirq:
+       if (i2c->gpio > -1)
+               gpio_free(i2c->gpio);
+
+       iounmap(i2c->reg_base);
+e_remap:
+       kfree(i2c);
+e_alloc:
+       release_mem_region(res->start, res_len(res));
+e_print:
+       printk(KERN_ERR "Registering PCA9564 FAILED! (%d)\n", ret);
+       return ret;
+}
+
+static int __devexit i2c_pca_pf_remove(struct platform_device *pdev)
+{
+       struct i2c_pca_pf_data *i2c = platform_get_drvdata(pdev);
+       platform_set_drvdata(pdev, NULL);
+
+       i2c_del_adapter(&i2c->adap);
+
+       if (i2c->irq)
+               free_irq(i2c->irq, i2c);
+
+       if (i2c->gpio > -1)
+               gpio_free(i2c->gpio);
+
+       iounmap(i2c->reg_base);
+       release_mem_region(i2c->io_base, i2c->io_size);
+       kfree(i2c);
+
+       return 0;
+}
+
+static struct platform_driver i2c_pca_pf_driver = {
+       .probe = i2c_pca_pf_probe,
+       .remove = __devexit_p(i2c_pca_pf_remove),
+       .driver = {
+               .name = "i2c-pca-platform",
+               .owner = THIS_MODULE,
+       },
+};
+
+static int __init i2c_pca_pf_init(void)
+{
+       return platform_driver_register(&i2c_pca_pf_driver);
+}
+
+static void __exit i2c_pca_pf_exit(void)
+{
+       platform_driver_unregister(&i2c_pca_pf_driver);
+}
+
+MODULE_AUTHOR("Wolfram Sang <w.sang@pengutronix.de>");
+MODULE_DESCRIPTION("I2C-PCA9564 platform driver");
+MODULE_LICENSE("GPL");
+
+module_init(i2c_pca_pf_init);
+module_exit(i2c_pca_pf_exit);
+
index b03af5653c6521ec28e3fb8c626d0bc02a226afe..63b3e2c11cff1a17ac67b2b21b39d49851c5143a 100644 (file)
@@ -467,7 +467,7 @@ static enum pmcmsptwi_xfer_result pmcmsptwi_xfer_cmd(
            (cmd->read_len == 0 || cmd->write_len == 0))) {
                dev_err(&pmcmsptwi_adapter.dev,
                        "%s: Cannot transfer less than 1 byte\n",
-                       __FUNCTION__);
+                       __func__);
                return -EINVAL;
        }
 
@@ -475,7 +475,7 @@ static enum pmcmsptwi_xfer_result pmcmsptwi_xfer_cmd(
            cmd->write_len > MSP_MAX_BYTES_PER_RW) {
                dev_err(&pmcmsptwi_adapter.dev,
                        "%s: Cannot transfer more than %d bytes\n",
-                       __FUNCTION__, MSP_MAX_BYTES_PER_RW);
+                       __func__, MSP_MAX_BYTES_PER_RW);
                return -EINVAL;
        }
 
@@ -627,6 +627,9 @@ static struct i2c_adapter pmcmsptwi_adapter = {
        .name           = DRV_NAME,
 };
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:" DRV_NAME);
+
 static struct platform_driver pmcmsptwi_driver = {
        .probe  = pmcmsptwi_probe,
        .remove = __devexit_p(pmcmsptwi_remove),
index f8d0dff0de7eab4d77e06ae33794b510fb39817d..1ca21084ffcf02117925ccb78222df4b594682de 100644 (file)
@@ -76,7 +76,7 @@ static int i2c_pnx_start(unsigned char slave_addr, struct i2c_adapter *adap)
 {
        struct i2c_pnx_algo_data *alg_data = adap->algo_data;
 
-       dev_dbg(&adap->dev, "%s(): addr 0x%x mode %d\n", __FUNCTION__,
+       dev_dbg(&adap->dev, "%s(): addr 0x%x mode %d\n", __func__,
                slave_addr, alg_data->mif.mode);
 
        /* Check for 7 bit slave addresses only */
@@ -110,14 +110,14 @@ static int i2c_pnx_start(unsigned char slave_addr, struct i2c_adapter *adap)
        iowrite32(ioread32(I2C_REG_STS(alg_data)) | mstatus_tdi | mstatus_afi,
                  I2C_REG_STS(alg_data));
 
-       dev_dbg(&adap->dev, "%s(): sending %#x\n", __FUNCTION__,
+       dev_dbg(&adap->dev, "%s(): sending %#x\n", __func__,
                (slave_addr << 1) | start_bit | alg_data->mif.mode);
 
        /* Write the slave address, START bit and R/W bit */
        iowrite32((slave_addr << 1) | start_bit | alg_data->mif.mode,
                  I2C_REG_TX(alg_data));
 
-       dev_dbg(&adap->dev, "%s(): exit\n", __FUNCTION__);
+       dev_dbg(&adap->dev, "%s(): exit\n", __func__);
 
        return 0;
 }
@@ -135,7 +135,7 @@ static void i2c_pnx_stop(struct i2c_adapter *adap)
        long timeout = 1000;
 
        dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 
        /* Write a STOP bit to TX FIFO */
        iowrite32(0xff | stop_bit, I2C_REG_TX(alg_data));
@@ -149,7 +149,7 @@ static void i2c_pnx_stop(struct i2c_adapter *adap)
        }
 
        dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 }
 
 /**
@@ -164,7 +164,7 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
        u32 val;
 
        dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 
        if (alg_data->mif.len > 0) {
                /* We still have something to talk about... */
@@ -179,7 +179,7 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
                alg_data->mif.len--;
                iowrite32(val, I2C_REG_TX(alg_data));
 
-               dev_dbg(&adap->dev, "%s(): xmit %#x [%d]\n", __FUNCTION__,
+               dev_dbg(&adap->dev, "%s(): xmit %#x [%d]\n", __func__,
                        val, alg_data->mif.len + 1);
 
                if (alg_data->mif.len == 0) {
@@ -197,7 +197,7 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
                        del_timer_sync(&alg_data->mif.timer);
 
                        dev_dbg(&adap->dev, "%s(): Waking up xfer routine.\n",
-                               __FUNCTION__);
+                               __func__);
 
                        complete(&alg_data->mif.complete);
                }
@@ -213,13 +213,13 @@ static int i2c_pnx_master_xmit(struct i2c_adapter *adap)
                /* Stop timer. */
                del_timer_sync(&alg_data->mif.timer);
                dev_dbg(&adap->dev, "%s(): Waking up xfer routine after "
-                       "zero-xfer.\n", __FUNCTION__);
+                       "zero-xfer.\n", __func__);
 
                complete(&alg_data->mif.complete);
        }
 
        dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 
        return 0;
 }
@@ -237,14 +237,14 @@ static int i2c_pnx_master_rcv(struct i2c_adapter *adap)
        u32 ctl = 0;
 
        dev_dbg(&adap->dev, "%s(): entering: stat = %04x.\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 
        /* Check, whether there is already data,
         * or we didn't 'ask' for it yet.
         */
        if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) {
                dev_dbg(&adap->dev, "%s(): Write dummy data to fill "
-                       "Rx-fifo...\n", __FUNCTION__);
+                       "Rx-fifo...\n", __func__);
 
                if (alg_data->mif.len == 1) {
                        /* Last byte, do not acknowledge next rcv. */
@@ -276,7 +276,7 @@ static int i2c_pnx_master_rcv(struct i2c_adapter *adap)
        if (alg_data->mif.len > 0) {
                val = ioread32(I2C_REG_RX(alg_data));
                *alg_data->mif.buf++ = (u8) (val & 0xff);
-               dev_dbg(&adap->dev, "%s(): rcv 0x%x [%d]\n", __FUNCTION__, val,
+               dev_dbg(&adap->dev, "%s(): rcv 0x%x [%d]\n", __func__, val,
                        alg_data->mif.len);
 
                alg_data->mif.len--;
@@ -300,7 +300,7 @@ static int i2c_pnx_master_rcv(struct i2c_adapter *adap)
        }
 
        dev_dbg(&adap->dev, "%s(): exiting: stat = %04x.\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 
        return 0;
 }
@@ -312,7 +312,7 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
        struct i2c_pnx_algo_data *alg_data = adap->algo_data;
 
        dev_dbg(&adap->dev, "%s(): mstat = %x mctrl = %x, mode = %d\n",
-               __FUNCTION__,
+               __func__,
                ioread32(I2C_REG_STS(alg_data)),
                ioread32(I2C_REG_CTL(alg_data)),
                alg_data->mif.mode);
@@ -336,7 +336,7 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
                /* Slave did not acknowledge, generate a STOP */
                dev_dbg(&adap->dev, "%s(): "
                        "Slave did not acknowledge, generating a STOP.\n",
-                       __FUNCTION__);
+                       __func__);
                i2c_pnx_stop(adap);
 
                /* Disable master interrupts. */
@@ -375,7 +375,7 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
        iowrite32(stat | mstatus_tdi | mstatus_afi, I2C_REG_STS(alg_data));
 
        dev_dbg(&adap->dev, "%s(): exiting, stat = %x ctrl = %x.\n",
-                __FUNCTION__, ioread32(I2C_REG_STS(alg_data)),
+                __func__, ioread32(I2C_REG_STS(alg_data)),
                 ioread32(I2C_REG_CTL(alg_data)));
 
        return IRQ_HANDLED;
@@ -447,7 +447,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
        u32 stat = ioread32(I2C_REG_STS(alg_data));
 
        dev_dbg(&adap->dev, "%s(): entering: %d messages, stat = %04x.\n",
-               __FUNCTION__, num, ioread32(I2C_REG_STS(alg_data)));
+               __func__, num, ioread32(I2C_REG_STS(alg_data)));
 
        bus_reset_if_active(adap);
 
@@ -473,7 +473,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
                alg_data->mif.ret = 0;
                alg_data->last = (i == num - 1);
 
-               dev_dbg(&adap->dev, "%s(): mode %d, %d bytes\n", __FUNCTION__,
+               dev_dbg(&adap->dev, "%s(): mode %d, %d bytes\n", __func__,
                        alg_data->mif.mode,
                        alg_data->mif.len);
 
@@ -498,7 +498,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
                if (!(rc = alg_data->mif.ret))
                        completed++;
                dev_dbg(&adap->dev, "%s(): Complete, return code = %d.\n",
-                       __FUNCTION__, rc);
+                       __func__, rc);
 
                /* Clear TDI and AFI bits in case they are set. */
                if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_tdi) {
@@ -522,7 +522,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
        alg_data->mif.len = 0;
 
        dev_dbg(&adap->dev, "%s(): exiting, stat = %x\n",
-               __FUNCTION__, ioread32(I2C_REG_STS(alg_data)));
+               __func__, ioread32(I2C_REG_STS(alg_data)));
 
        if (completed != num)
                return ((rc < 0) ? rc : -EREMOTEIO);
@@ -563,7 +563,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
 
        if (!i2c_pnx || !i2c_pnx->adapter) {
                dev_err(&pdev->dev, "%s: no platform data supplied\n",
-                      __FUNCTION__);
+                      __func__);
                ret = -EINVAL;
                goto out;
        }
@@ -697,6 +697,7 @@ static void __exit i2c_adap_pnx_exit(void)
 MODULE_AUTHOR("Vitaly Wool, Dennis Kovalev <source@mvista.com>");
 MODULE_DESCRIPTION("I2C driver for Philips IP3204-based I2C busses");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:pnx-i2c");
 
 /* We need to make sure I2C is initialized before USB */
 subsys_initcall(i2c_adap_pnx_init);
index 7813127649a101e2977fa42544d7b2d6e50503e9..22f6d5c00d80e85829dc5d81133cc5cb2f9c6029 100644 (file)
@@ -263,6 +263,9 @@ static int __devexit i2c_powermac_probe(struct platform_device *dev)
 }
 
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:i2c-powermac");
+
 static struct platform_driver i2c_powermac_driver = {
        .probe = i2c_powermac_probe,
        .remove = __devexit_p(i2c_powermac_remove),
index 6fd2d6a84effbb6118edfb606e27ce9b1a3ffec6..eb69fbadc9cb273a77111a0fe43a55debf13f4da 100644 (file)
@@ -155,7 +155,7 @@ static void i2c_pxa_show_state(struct pxa_i2c *i2c, int lno, const char *fname)
                readl(_ISR(i2c)), readl(_ICR(i2c)), readl(_IBMR(i2c)));
 }
 
-#define show_state(i2c) i2c_pxa_show_state(i2c, __LINE__, __FUNCTION__)
+#define show_state(i2c) i2c_pxa_show_state(i2c, __LINE__, __func__)
 #else
 #define i2c_debug      0
 
@@ -1132,6 +1132,7 @@ static void __exit i2c_adap_pxa_exit(void)
 }
 
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:pxa2xx-i2c");
 
 module_init(i2c_adap_pxa_init);
 module_exit(i2c_adap_pxa_exit);
index c44ada5f4292e301bfb4e2e1165e06b1007b626f..1305ef190fc10dfbee90b1f52705885731935071 100644 (file)
@@ -276,12 +276,12 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
        switch (i2c->state) {
 
        case STATE_IDLE:
-               dev_err(i2c->dev, "%s: called in STATE_IDLE\n", __FUNCTION__);
+               dev_err(i2c->dev, "%s: called in STATE_IDLE\n", __func__);
                goto out;
                break;
 
        case STATE_STOP:
-               dev_err(i2c->dev, "%s: called in STATE_STOP\n", __FUNCTION__);
+               dev_err(i2c->dev, "%s: called in STATE_STOP\n", __func__);
                s3c24xx_i2c_disable_irq(i2c);           
                goto out_ack;
 
@@ -948,3 +948,4 @@ module_exit(i2c_adap_s3c_exit);
 MODULE_DESCRIPTION("S3C24XX I2C Bus driver");
 MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:s3c2410-i2c");
diff --git a/drivers/i2c/busses/i2c-sh7760.c b/drivers/i2c/busses/i2c-sh7760.c
new file mode 100644 (file)
index 0000000..5e0e254
--- /dev/null
@@ -0,0 +1,577 @@
+/*
+ * I2C bus driver for the SH7760 I2C Interfaces.
+ *
+ * (c) 2005-2008 MSC Vertriebsges.m.b.H, Manuel Lauss <mlau@msc-ge.com>
+ *
+ * licensed under the terms outlined in the file COPYING.
+ *
+ */
+
+#include <linux/completion.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#include <asm/clock.h>
+#include <asm/i2c-sh7760.h>
+#include <asm/io.h>
+
+/* register offsets */
+#define I2CSCR         0x0             /* slave ctrl           */
+#define I2CMCR         0x4             /* master ctrl          */
+#define I2CSSR         0x8             /* slave status         */
+#define I2CMSR         0xC             /* master status        */
+#define I2CSIER                0x10            /* slave irq enable     */
+#define I2CMIER                0x14            /* master irq enable    */
+#define I2CCCR         0x18            /* clock dividers       */
+#define I2CSAR         0x1c            /* slave address        */
+#define I2CMAR         0x20            /* master address       */
+#define I2CRXTX                0x24            /* data port            */
+#define I2CFCR         0x28            /* fifo control         */
+#define I2CFSR         0x2C            /* fifo status          */
+#define I2CFIER                0x30            /* fifo irq enable      */
+#define I2CRFDR                0x34            /* rx fifo count        */
+#define I2CTFDR                0x38            /* tx fifo count        */
+
+#define REGSIZE                0x3C
+
+#define MCR_MDBS       0x80            /* non-fifo mode switch */
+#define MCR_FSCL       0x40            /* override SCL pin     */
+#define MCR_FSDA       0x20            /* override SDA pin     */
+#define MCR_OBPC       0x10            /* override pins        */
+#define MCR_MIE                0x08            /* master if enable     */
+#define MCR_TSBE       0x04
+#define MCR_FSB                0x02            /* force stop bit       */
+#define MCR_ESG                0x01            /* en startbit gen.     */
+
+#define MSR_MNR                0x40            /* nack received        */
+#define MSR_MAL                0x20            /* arbitration lost     */
+#define MSR_MST                0x10            /* sent a stop          */
+#define MSR_MDE                0x08
+#define MSR_MDT                0x04
+#define MSR_MDR                0x02
+#define MSR_MAT                0x01            /* slave addr xfer done */
+
+#define MIE_MNRE       0x40            /* nack irq en          */
+#define MIE_MALE       0x20            /* arblos irq en        */
+#define MIE_MSTE       0x10            /* stop irq en          */
+#define MIE_MDEE       0x08
+#define MIE_MDTE       0x04
+#define MIE_MDRE       0x02
+#define MIE_MATE       0x01            /* address sent irq en  */
+
+#define FCR_RFRST      0x02            /* reset rx fifo        */
+#define FCR_TFRST      0x01            /* reset tx fifo        */
+
+#define FSR_TEND       0x04            /* last byte sent       */
+#define FSR_RDF                0x02            /* rx fifo trigger      */
+#define FSR_TDFE       0x01            /* tx fifo empty        */
+
+#define FIER_TEIE      0x04            /* tx fifo empty irq en */
+#define FIER_RXIE      0x02            /* rx fifo trig irq en  */
+#define FIER_TXIE      0x01            /* tx fifo trig irq en  */
+
+#define FIFO_SIZE      16
+
+struct cami2c {
+       void __iomem *iobase;
+       struct i2c_adapter adap;
+
+       /* message processing */
+       struct i2c_msg  *msg;
+#define IDF_SEND       1
+#define IDF_RECV       2
+#define IDF_STOP       4
+       int             flags;
+
+#define IDS_DONE       1
+#define IDS_ARBLOST    2
+#define IDS_NACK       4
+       int             status;
+       struct completion xfer_done;
+
+       int irq;
+       struct resource *ioarea;
+};
+
+static inline void OUT32(struct cami2c *cam, int reg, unsigned long val)
+{
+       ctrl_outl(val, (unsigned long)cam->iobase + reg);
+}
+
+static inline unsigned long IN32(struct cami2c *cam, int reg)
+{
+       return ctrl_inl((unsigned long)cam->iobase + reg);
+}
+
+static irqreturn_t sh7760_i2c_irq(int irq, void *ptr)
+{
+       struct cami2c *id = ptr;
+       struct i2c_msg *msg = id->msg;
+       char *data = msg->buf;
+       unsigned long msr, fsr, fier, len;
+
+       msr = IN32(id, I2CMSR);
+       fsr = IN32(id, I2CFSR);
+
+       /* arbitration lost */
+       if (msr & MSR_MAL) {
+               OUT32(id, I2CMCR, 0);
+               OUT32(id, I2CSCR, 0);
+               OUT32(id, I2CSAR, 0);
+               id->status |= IDS_DONE | IDS_ARBLOST;
+               goto out;
+       }
+
+       if (msr & MSR_MNR) {
+               /* NACK handling is very screwed up.  After receiving a
+                * NAK IRQ one has to wait a bit  before writing to any
+                * registers, or the ctl will lock up. After that delay
+                * do a normal i2c stop. Then wait at least 1 ms before
+                * attempting another transfer or ctl will stop working
+                */
+               udelay(100);    /* wait or risk ctl hang */
+               OUT32(id, I2CFCR, FCR_RFRST | FCR_TFRST);
+               OUT32(id, I2CMCR, MCR_MIE | MCR_FSB);
+               OUT32(id, I2CFIER, 0);
+               OUT32(id, I2CMIER, MIE_MSTE);
+               OUT32(id, I2CSCR, 0);
+               OUT32(id, I2CSAR, 0);
+               id->status |= IDS_NACK;
+               msr &= ~MSR_MAT;
+               fsr = 0;
+               /* In some cases the MST bit is also set. */
+       }
+
+       /* i2c-stop was sent */
+       if (msr & MSR_MST) {
+               id->status |= IDS_DONE;
+               goto out;
+       }
+
+       /* i2c slave addr was sent; set to "normal" operation */
+       if (msr & MSR_MAT)
+               OUT32(id, I2CMCR, MCR_MIE);
+
+       fier = IN32(id, I2CFIER);
+
+       if (fsr & FSR_RDF) {
+               len = IN32(id, I2CRFDR);
+               if (msg->len <= len) {
+                       if (id->flags & IDF_STOP) {
+                               OUT32(id, I2CMCR, MCR_MIE | MCR_FSB);
+                               OUT32(id, I2CFIER, 0);
+                               /* manual says: wait >= 0.5 SCL times */
+                               udelay(5);
+                               /* next int should be MST */
+                       } else {
+                               id->status |= IDS_DONE;
+                               /* keep the RDF bit: ctrl holds SCL low
+                                * until the setup for the next i2c_msg
+                                * clears this bit.
+                                */
+                               fsr &= ~FSR_RDF;
+                       }
+               }
+               while (msg->len && len) {
+                       *data++ = IN32(id, I2CRXTX);
+                       msg->len--;
+                       len--;
+               }
+
+               if (msg->len) {
+                       len = (msg->len >= FIFO_SIZE) ? FIFO_SIZE - 1
+                                                     : msg->len - 1;
+
+                       OUT32(id, I2CFCR, FCR_TFRST | ((len & 0xf) << 4));
+               }
+
+       } else if (id->flags & IDF_SEND) {
+               if ((fsr & FSR_TEND) && (msg->len < 1)) {
+                       if (id->flags & IDF_STOP) {
+                               OUT32(id, I2CMCR, MCR_MIE | MCR_FSB);
+                       } else {
+                               id->status |= IDS_DONE;
+                               /* keep the TEND bit: ctl holds SCL low
+                                * until the setup for the next i2c_msg
+                                * clears this bit.
+                                */
+                               fsr &= ~FSR_TEND;
+                       }
+               }
+               if (fsr & FSR_TDFE) {
+                       while (msg->len && (IN32(id, I2CTFDR) < FIFO_SIZE)) {
+                               OUT32(id, I2CRXTX, *data++);
+                               msg->len--;
+                       }
+
+                       if (msg->len < 1) {
+                               fier &= ~FIER_TXIE;
+                               OUT32(id, I2CFIER, fier);
+                       } else {
+                               len = (msg->len >= FIFO_SIZE) ? 2 : 0;
+                               OUT32(id, I2CFCR,
+                                         FCR_RFRST | ((len & 3) << 2));
+                       }
+               }
+       }
+out:
+       if (id->status & IDS_DONE) {
+               OUT32(id, I2CMIER, 0);
+               OUT32(id, I2CFIER, 0);
+               id->msg = NULL;
+               complete(&id->xfer_done);
+       }
+       /* clear status flags and ctrl resumes work */
+       OUT32(id, I2CMSR, ~msr);
+       OUT32(id, I2CFSR, ~fsr);
+       OUT32(id, I2CSSR, 0);
+
+       return IRQ_HANDLED;
+}
+
+
+/* prepare and start a master receive operation */
+static void sh7760_i2c_mrecv(struct cami2c *id)
+{
+       int len;
+
+       id->flags |= IDF_RECV;
+
+       /* set the slave addr reg; otherwise rcv wont work! */
+       OUT32(id, I2CSAR, 0xfe);
+       OUT32(id, I2CMAR, (id->msg->addr << 1) | 1);
+
+       /* adjust rx fifo trigger */
+       if (id->msg->len >= FIFO_SIZE)
+               len = FIFO_SIZE - 1;    /* trigger at fifo full */
+       else
+               len = id->msg->len - 1; /* trigger before all received */
+
+       OUT32(id, I2CFCR, FCR_RFRST | FCR_TFRST);
+       OUT32(id, I2CFCR, FCR_TFRST | ((len & 0xF) << 4));
+
+       OUT32(id, I2CMSR, 0);
+       OUT32(id, I2CMCR, MCR_MIE | MCR_ESG);
+       OUT32(id, I2CMIER, MIE_MNRE | MIE_MALE | MIE_MSTE | MIE_MATE);
+       OUT32(id, I2CFIER, FIER_RXIE);
+}
+
+/* prepare and start a master send operation */
+static void sh7760_i2c_msend(struct cami2c *id)
+{
+       int len;
+
+       id->flags |= IDF_SEND;
+
+       /* set the slave addr reg; otherwise xmit wont work! */
+       OUT32(id, I2CSAR, 0xfe);
+       OUT32(id, I2CMAR, (id->msg->addr << 1) | 0);
+
+       /* adjust tx fifo trigger */
+       if (id->msg->len >= FIFO_SIZE)
+               len = 2;        /* trig: 2 bytes left in TX fifo */
+       else
+               len = 0;        /* trig: 8 bytes left in TX fifo */
+
+       OUT32(id, I2CFCR, FCR_RFRST | FCR_TFRST);
+       OUT32(id, I2CFCR, FCR_RFRST | ((len & 3) << 2));
+
+       while (id->msg->len && IN32(id, I2CTFDR) < FIFO_SIZE) {
+               OUT32(id, I2CRXTX, *(id->msg->buf));
+               (id->msg->len)--;
+               (id->msg->buf)++;
+       }
+
+       OUT32(id, I2CMSR, 0);
+       OUT32(id, I2CMCR, MCR_MIE | MCR_ESG);
+       OUT32(id, I2CFSR, 0);
+       OUT32(id, I2CMIER, MIE_MNRE | MIE_MALE | MIE_MSTE | MIE_MATE);
+       OUT32(id, I2CFIER, FIER_TEIE | (id->msg->len ? FIER_TXIE : 0));
+}
+
+static inline int sh7760_i2c_busy_check(struct cami2c *id)
+{
+       return (IN32(id, I2CMCR) & MCR_FSDA);
+}
+
+static int sh7760_i2c_master_xfer(struct i2c_adapter *adap,
+                                 struct i2c_msg *msgs,
+                                 int num)
+{
+       struct cami2c *id = adap->algo_data;
+       int i, retr;
+
+       if (sh7760_i2c_busy_check(id)) {
+               dev_err(&adap->dev, "sh7760-i2c%d: bus busy!\n", adap->nr);
+               return -EBUSY;
+       }
+
+       i = 0;
+       while (i < num) {
+               retr = adap->retries;
+retry:
+               id->flags = ((i == (num-1)) ? IDF_STOP : 0);
+               id->status = 0;
+               id->msg = msgs;
+               init_completion(&id->xfer_done);
+
+               if (msgs->flags & I2C_M_RD)
+                       sh7760_i2c_mrecv(id);
+               else
+                       sh7760_i2c_msend(id);
+
+               wait_for_completion(&id->xfer_done);
+
+               if (id->status == 0) {
+                       num = -EIO;
+                       break;
+               }
+
+               if (id->status & IDS_NACK) {
+                       /* wait a bit or i2c module stops working */
+                       mdelay(1);
+                       num = -EREMOTEIO;
+                       break;
+               }
+
+               if (id->status & IDS_ARBLOST) {
+                       if (retr--) {
+                               mdelay(2);
+                               goto retry;
+                       }
+                       num = -EREMOTEIO;
+                       break;
+               }
+
+               msgs++;
+               i++;
+       }
+
+       id->msg = NULL;
+       id->flags = 0;
+       id->status = 0;
+
+       OUT32(id, I2CMCR, 0);
+       OUT32(id, I2CMSR, 0);
+       OUT32(id, I2CMIER, 0);
+       OUT32(id, I2CFIER, 0);
+
+       /* reset slave module registers too: master mode enables slave
+        * module for receive ops (ack, data). Without this reset,
+        * eternal bus activity might be reported after NACK / ARBLOST.
+        */
+       OUT32(id, I2CSCR, 0);
+       OUT32(id, I2CSAR, 0);
+       OUT32(id, I2CSSR, 0);
+
+       return num;
+}
+
+static u32 sh7760_i2c_func(struct i2c_adapter *adap)
+{
+       return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
+}
+
+static const struct i2c_algorithm sh7760_i2c_algo = {
+       .master_xfer    = sh7760_i2c_master_xfer,
+       .functionality  = sh7760_i2c_func,
+};
+
+/* calculate CCR register setting for a desired scl clock.  SCL clock is
+ * derived from I2C module clock  (iclk)  which in turn is derived from
+ * peripheral module clock (mclk, usually around 33MHz):
+ * iclk = mclk/(CDF + 1).  iclk must be < 20MHz.
+ * scl = iclk/(SCGD*8 + 20).
+ */
+static int __devinit calc_CCR(unsigned long scl_hz)
+{
+       struct clk *mclk;
+       unsigned long mck, m1, dff, odff, iclk;
+       signed char cdf, cdfm;
+       int scgd, scgdm, scgds;
+
+       mclk = clk_get(NULL, "module_clk");
+       if (IS_ERR(mclk)) {
+               return PTR_ERR(mclk);
+       } else {
+               mck = mclk->rate;
+               clk_put(mclk);
+       }
+
+       odff = scl_hz;
+       scgdm = cdfm = m1 = 0;
+       for (cdf = 3; cdf >= 0; cdf--) {
+               iclk = mck / (1 + cdf);
+               if (iclk >= 20000000)
+                       continue;
+               scgds = ((iclk / scl_hz) - 20) >> 3;
+               for (scgd = scgds; (scgd < 63) && scgd <= scgds + 1; scgd++) {
+                       m1 = iclk / (20 + (scgd << 3));
+                       dff = abs(scl_hz - m1);
+                       if (dff < odff) {
+                               odff = dff;
+                               cdfm = cdf;
+                               scgdm = scgd;
+                       }
+               }
+       }
+       /* fail if more than 25% off of requested SCL */
+       if (odff > (scl_hz >> 2))
+               return -EINVAL;
+
+       /* create a CCR register value */
+       return ((scgdm << 2) | cdfm);
+}
+
+static int __devinit sh7760_i2c_probe(struct platform_device *pdev)
+{
+       struct sh7760_i2c_platdata *pd;
+       struct resource *res;
+       struct cami2c *id;
+       int ret;
+
+       pd = pdev->dev.platform_data;
+       if (!pd) {
+               dev_err(&pdev->dev, "no platform_data!\n");
+               ret = -ENODEV;
+               goto out0;
+       }
+
+       id = kzalloc(sizeof(struct cami2c), GFP_KERNEL);
+       if (!id) {
+               dev_err(&pdev->dev, "no mem for private data\n");
+               ret = -ENOMEM;
+               goto out0;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "no mmio resources\n");
+               ret = -ENODEV;
+               goto out1;
+       }
+
+       id->ioarea = request_mem_region(res->start, REGSIZE, pdev->name);
+       if (!id->ioarea) {
+               dev_err(&pdev->dev, "mmio already reserved\n");
+               ret = -EBUSY;
+               goto out1;
+       }
+
+       id->iobase = ioremap(res->start, REGSIZE);
+       if (!id->iobase) {
+               dev_err(&pdev->dev, "cannot ioremap\n");
+               ret = -ENODEV;
+               goto out2;
+       }
+
+       id->irq = platform_get_irq(pdev, 0);
+
+       id->adap.nr = pdev->id;
+       id->adap.algo = &sh7760_i2c_algo;
+       id->adap.class = I2C_CLASS_ALL;
+       id->adap.retries = 3;
+       id->adap.algo_data = id;
+       id->adap.dev.parent = &pdev->dev;
+       snprintf(id->adap.name, sizeof(id->adap.name),
+               "SH7760 I2C at %08lx", (unsigned long)res->start);
+
+       OUT32(id, I2CMCR, 0);
+       OUT32(id, I2CMSR, 0);
+       OUT32(id, I2CMIER, 0);
+       OUT32(id, I2CMAR, 0);
+       OUT32(id, I2CSIER, 0);
+       OUT32(id, I2CSAR, 0);
+       OUT32(id, I2CSCR, 0);
+       OUT32(id, I2CSSR, 0);
+       OUT32(id, I2CFIER, 0);
+       OUT32(id, I2CFCR, FCR_RFRST | FCR_TFRST);
+       OUT32(id, I2CFSR, 0);
+
+       ret = calc_CCR(pd->speed_khz * 1000);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "invalid SCL clock: %dkHz\n",
+                       pd->speed_khz);
+               goto out3;
+       }
+       OUT32(id, I2CCCR, ret);
+
+       if (request_irq(id->irq, sh7760_i2c_irq, IRQF_DISABLED,
+                       SH7760_I2C_DEVNAME, id)) {
+               dev_err(&pdev->dev, "cannot get irq %d\n", id->irq);
+               ret = -EBUSY;
+               goto out3;
+       }
+
+       ret = i2c_add_numbered_adapter(&id->adap);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "reg adap failed: %d\n", ret);
+               goto out4;
+       }
+
+       platform_set_drvdata(pdev, id);
+
+       dev_info(&pdev->dev, "%d kHz mmio %08x irq %d\n",
+                pd->speed_khz, res->start, id->irq);
+
+       return 0;
+
+out4:
+       free_irq(id->irq, id);
+out3:
+       iounmap(id->iobase);
+out2:
+       release_resource(id->ioarea);
+       kfree(id->ioarea);
+out1:
+       kfree(id);
+out0:
+       return ret;
+}
+
+static int __devexit sh7760_i2c_remove(struct platform_device *pdev)
+{
+       struct cami2c *id = platform_get_drvdata(pdev);
+
+       i2c_del_adapter(&id->adap);
+       free_irq(id->irq, id);
+       iounmap(id->iobase);
+       release_resource(id->ioarea);
+       kfree(id->ioarea);
+       kfree(id);
+       platform_set_drvdata(pdev, NULL);
+
+       return 0;
+}
+
+static struct platform_driver sh7760_i2c_drv = {
+       .driver = {
+               .name   = SH7760_I2C_DEVNAME,
+               .owner  = THIS_MODULE,
+       },
+       .probe          = sh7760_i2c_probe,
+       .remove         = __devexit_p(sh7760_i2c_remove),
+};
+
+static int __init sh7760_i2c_init(void)
+{
+       return platform_driver_register(&sh7760_i2c_drv);
+}
+
+static void __exit sh7760_i2c_exit(void)
+{
+       platform_driver_unregister(&sh7760_i2c_drv);
+}
+
+module_init(sh7760_i2c_init);
+module_exit(sh7760_i2c_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("SH7760 I2C bus driver");
+MODULE_AUTHOR("Manuel Lauss <mano@roarinelk.homelinux.net>");
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
new file mode 100644 (file)
index 0000000..840e634
--- /dev/null
@@ -0,0 +1,500 @@
+/*
+ * SuperH Mobile I2C Controller
+ *
+ * Copyright (C) 2008 Magnus Damm
+ *
+ * Portions of the code based on out-of-tree driver i2c-sh7343.c
+ * Copyright (c) 2006 Carlos Munoz <carlos@kenati.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/i2c.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+
+enum sh_mobile_i2c_op {
+       OP_START = 0,
+       OP_TX_ONLY,
+       OP_TX_STOP,
+       OP_TX_TO_RX,
+       OP_RX_ONLY,
+       OP_RX_STOP,
+};
+
+struct sh_mobile_i2c_data {
+       struct device *dev;
+       void __iomem *reg;
+       struct i2c_adapter adap;
+
+       struct clk *clk;
+       u_int8_t iccl;
+       u_int8_t icch;
+
+       spinlock_t lock;
+       wait_queue_head_t wait;
+       struct i2c_msg *msg;
+       int pos;
+       int sr;
+};
+
+#define NORMAL_SPEED           100000 /* FAST_SPEED 400000 */
+
+/* Register offsets */
+#define ICDR(pd)               (pd->reg + 0x00)
+#define ICCR(pd)               (pd->reg + 0x04)
+#define ICSR(pd)               (pd->reg + 0x08)
+#define ICIC(pd)               (pd->reg + 0x0c)
+#define ICCL(pd)               (pd->reg + 0x10)
+#define ICCH(pd)               (pd->reg + 0x14)
+
+/* Register bits */
+#define ICCR_ICE               0x80
+#define ICCR_RACK              0x40
+#define ICCR_TRS               0x10
+#define ICCR_BBSY              0x04
+#define ICCR_SCP               0x01
+
+#define ICSR_SCLM              0x80
+#define ICSR_SDAM              0x40
+#define SW_DONE                        0x20
+#define ICSR_BUSY              0x10
+#define ICSR_AL                        0x08
+#define ICSR_TACK              0x04
+#define ICSR_WAIT              0x02
+#define ICSR_DTE               0x01
+
+#define ICIC_ALE               0x08
+#define ICIC_TACKE             0x04
+#define ICIC_WAITE             0x02
+#define ICIC_DTEE              0x01
+
+static void activate_ch(struct sh_mobile_i2c_data *pd)
+{
+       /* Make sure the clock is enabled */
+       clk_enable(pd->clk);
+
+       /* Enable channel and configure rx ack */
+       iowrite8(ioread8(ICCR(pd)) | ICCR_ICE, ICCR(pd));
+
+       /* Mask all interrupts */
+       iowrite8(0, ICIC(pd));
+
+       /* Set the clock */
+       iowrite8(pd->iccl, ICCL(pd));
+       iowrite8(pd->icch, ICCH(pd));
+}
+
+static void deactivate_ch(struct sh_mobile_i2c_data *pd)
+{
+       /* Clear/disable interrupts */
+       iowrite8(0, ICSR(pd));
+       iowrite8(0, ICIC(pd));
+
+       /* Disable channel */
+       iowrite8(ioread8(ICCR(pd)) & ~ICCR_ICE, ICCR(pd));
+
+       /* Disable clock */
+       clk_disable(pd->clk);
+}
+
+static unsigned char i2c_op(struct sh_mobile_i2c_data *pd,
+                           enum sh_mobile_i2c_op op, unsigned char data)
+{
+       unsigned char ret = 0;
+       unsigned long flags;
+
+       dev_dbg(pd->dev, "op %d, data in 0x%02x\n", op, data);
+
+       spin_lock_irqsave(&pd->lock, flags);
+
+       switch (op) {
+       case OP_START:
+               iowrite8(0x94, ICCR(pd));
+               break;
+       case OP_TX_ONLY:
+               iowrite8(data, ICDR(pd));
+               break;
+       case OP_TX_STOP:
+               iowrite8(data, ICDR(pd));
+               iowrite8(0x90, ICCR(pd));
+               iowrite8(ICIC_ALE | ICIC_TACKE, ICIC(pd));
+               break;
+       case OP_TX_TO_RX:
+               iowrite8(data, ICDR(pd));
+               iowrite8(0x81, ICCR(pd));
+               break;
+       case OP_RX_ONLY:
+               ret = ioread8(ICDR(pd));
+               break;
+       case OP_RX_STOP:
+               ret = ioread8(ICDR(pd));
+               iowrite8(0xc0, ICCR(pd));
+               break;
+       }
+
+       spin_unlock_irqrestore(&pd->lock, flags);
+
+       dev_dbg(pd->dev, "op %d, data out 0x%02x\n", op, ret);
+       return ret;
+}
+
+static irqreturn_t sh_mobile_i2c_isr(int irq, void *dev_id)
+{
+       struct platform_device *dev = dev_id;
+       struct sh_mobile_i2c_data *pd = platform_get_drvdata(dev);
+       struct i2c_msg *msg = pd->msg;
+       unsigned char data, sr;
+       int wakeup = 0;
+
+       sr = ioread8(ICSR(pd));
+       pd->sr |= sr;
+
+       dev_dbg(pd->dev, "i2c_isr 0x%02x 0x%02x %s %d %d!\n", sr, pd->sr,
+              (msg->flags & I2C_M_RD) ? "read" : "write",
+              pd->pos, msg->len);
+
+       if (sr & (ICSR_AL | ICSR_TACK)) {
+               iowrite8(0, ICIC(pd)); /* disable interrupts */
+               wakeup = 1;
+               goto do_wakeup;
+       }
+
+       if (pd->pos == msg->len) {
+               i2c_op(pd, OP_RX_ONLY, 0);
+               wakeup = 1;
+               goto do_wakeup;
+       }
+
+       if (pd->pos == -1) {
+               data = (msg->addr & 0x7f) << 1;
+               data |= (msg->flags & I2C_M_RD) ? 1 : 0;
+       } else
+               data = msg->buf[pd->pos];
+
+       if ((pd->pos == -1) || !(msg->flags & I2C_M_RD)) {
+               if (msg->flags & I2C_M_RD)
+                       i2c_op(pd, OP_TX_TO_RX, data);
+               else if (pd->pos == (msg->len - 1)) {
+                       i2c_op(pd, OP_TX_STOP, data);
+                       wakeup = 1;
+               } else
+                       i2c_op(pd, OP_TX_ONLY, data);
+       } else {
+               if (pd->pos == (msg->len - 1))
+                       data = i2c_op(pd, OP_RX_STOP, 0);
+               else
+                       data = i2c_op(pd, OP_RX_ONLY, 0);
+
+               msg->buf[pd->pos] = data;
+       }
+       pd->pos++;
+
+ do_wakeup:
+       if (wakeup) {
+               pd->sr |= SW_DONE;
+               wake_up(&pd->wait);
+       }
+
+       return IRQ_HANDLED;
+}
+
+static int start_ch(struct sh_mobile_i2c_data *pd, struct i2c_msg *usr_msg)
+{
+       /* Initialize channel registers */
+       iowrite8(ioread8(ICCR(pd)) & ~ICCR_ICE, ICCR(pd));
+
+       /* Enable channel and configure rx ack */
+       iowrite8(ioread8(ICCR(pd)) | ICCR_ICE, ICCR(pd));
+
+       /* Set the clock */
+       iowrite8(pd->iccl, ICCL(pd));
+       iowrite8(pd->icch, ICCH(pd));
+
+       pd->msg = usr_msg;
+       pd->pos = -1;
+       pd->sr = 0;
+
+       /* Enable all interrupts except wait */
+       iowrite8(ioread8(ICIC(pd)) | ICIC_ALE | ICIC_TACKE | ICIC_DTEE,
+                ICIC(pd));
+       return 0;
+}
+
+static int sh_mobile_i2c_xfer(struct i2c_adapter *adapter,
+                             struct i2c_msg *msgs,
+                             int num)
+{
+       struct sh_mobile_i2c_data *pd = i2c_get_adapdata(adapter);
+       struct i2c_msg  *msg;
+       int err = 0;
+       u_int8_t val;
+       int i, k, retry_count;
+
+       activate_ch(pd);
+
+       /* Process all messages */
+       for (i = 0; i < num; i++) {
+               msg = &msgs[i];
+
+               err = start_ch(pd, msg);
+               if (err)
+                       break;
+
+               i2c_op(pd, OP_START, 0);
+
+               /* The interrupt handler takes care of the rest... */
+               k = wait_event_timeout(pd->wait,
+                                      pd->sr & (ICSR_TACK | SW_DONE),
+                                      5 * HZ);
+               if (!k)
+                       dev_err(pd->dev, "Transfer request timed out\n");
+
+               retry_count = 10;
+again:
+               val = ioread8(ICSR(pd));
+
+               dev_dbg(pd->dev, "val 0x%02x pd->sr 0x%02x\n", val, pd->sr);
+
+               if ((val | pd->sr) & (ICSR_TACK | ICSR_AL)) {
+                       err = -EIO;
+                       break;
+               }
+
+               /* the interrupt handler may wake us up before the
+                * transfer is finished, so poll the hardware
+                * until we're done.
+                */
+
+               if (!(!(val & ICSR_BUSY) && (val & ICSR_SCLM) &&
+                     (val & ICSR_SDAM))) {
+                       msleep(1);
+                       if (retry_count--)
+                               goto again;
+
+                       err = -EIO;
+                       dev_err(pd->dev, "Polling timed out\n");
+                       break;
+               }
+       }
+
+       deactivate_ch(pd);
+
+       if (!err)
+               err = num;
+       return err;
+}
+
+static u32 sh_mobile_i2c_func(struct i2c_adapter *adapter)
+{
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+static struct i2c_algorithm sh_mobile_i2c_algorithm = {
+       .functionality  = sh_mobile_i2c_func,
+       .master_xfer    = sh_mobile_i2c_xfer,
+};
+
+static void sh_mobile_i2c_setup_channel(struct platform_device *dev)
+{
+       struct sh_mobile_i2c_data *pd = platform_get_drvdata(dev);
+       unsigned long peripheral_clk = clk_get_rate(pd->clk);
+       u_int32_t num;
+       u_int32_t denom;
+       u_int32_t tmp;
+
+       spin_lock_init(&pd->lock);
+       init_waitqueue_head(&pd->wait);
+
+       /* Calculate the value for iccl. From the data sheet:
+        * iccl = (p clock / transfer rate) * (L / (L + H))
+        * where L and H are the SCL low/high ratio (5/4 in this case).
+        * We also round off the result.
+        */
+       num = peripheral_clk * 5;
+       denom = NORMAL_SPEED * 9;
+       tmp = num * 10 / denom;
+       if (tmp % 10 >= 5)
+               pd->iccl = (u_int8_t)((num/denom) + 1);
+       else
+               pd->iccl = (u_int8_t)(num/denom);
+
+       /* Calculate the value for icch. From the data sheet:
+          icch = (p clock / transfer rate) * (H / (L + H)) */
+       num = peripheral_clk * 4;
+       tmp = num * 10 / denom;
+       if (tmp % 10 >= 5)
+               pd->icch = (u_int8_t)((num/denom) + 1);
+       else
+               pd->icch = (u_int8_t)(num/denom);
+}
+
+static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
+{
+       struct resource *res;
+       int ret = -ENXIO;
+       int q, m;
+       int k = 0;
+       int n = 0;
+
+       while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) {
+               for (n = res->start; hook && n <= res->end; n++) {
+                       if (request_irq(n, sh_mobile_i2c_isr, IRQF_DISABLED,
+                                       dev->dev.bus_id, dev))
+                               goto rollback;
+               }
+               k++;
+       }
+
+       if (hook)
+               return k > 0 ? 0 : -ENOENT;
+
+       k--;
+       ret = 0;
+
+ rollback:
+       for (q = k; k >= 0; k--) {
+               for (m = n; m >= res->start; m--)
+                       free_irq(m, dev);
+
+               res = platform_get_resource(dev, IORESOURCE_IRQ, k - 1);
+               m = res->end;
+       }
+
+       return ret;
+}
+
+static int sh_mobile_i2c_probe(struct platform_device *dev)
+{
+       struct sh_mobile_i2c_data *pd;
+       struct i2c_adapter *adap;
+       struct resource *res;
+       int size;
+       int ret;
+
+       pd = kzalloc(sizeof(struct sh_mobile_i2c_data), GFP_KERNEL);
+       if (pd == NULL) {
+               dev_err(&dev->dev, "cannot allocate private data\n");
+               return -ENOMEM;
+       }
+
+       pd->clk = clk_get(&dev->dev, "peripheral_clk");
+       if (IS_ERR(pd->clk)) {
+               dev_err(&dev->dev, "cannot get peripheral clock\n");
+               ret = PTR_ERR(pd->clk);
+               goto err;
+       }
+
+       ret = sh_mobile_i2c_hook_irqs(dev, 1);
+       if (ret) {
+               dev_err(&dev->dev, "cannot request IRQ\n");
+               goto err_clk;
+       }
+
+       pd->dev = &dev->dev;
+       platform_set_drvdata(dev, pd);
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (res == NULL) {
+               dev_err(&dev->dev, "cannot find IO resource\n");
+               ret = -ENOENT;
+               goto err_irq;
+       }
+
+       size = (res->end - res->start) + 1;
+
+       pd->reg = ioremap(res->start, size);
+       if (pd->reg == NULL) {
+               dev_err(&dev->dev, "cannot map IO\n");
+               ret = -ENXIO;
+               goto err_irq;
+       }
+
+       /* setup the private data */
+       adap = &pd->adap;
+       i2c_set_adapdata(adap, pd);
+
+       adap->owner = THIS_MODULE;
+       adap->algo = &sh_mobile_i2c_algorithm;
+       adap->dev.parent = &dev->dev;
+       adap->retries = 5;
+       adap->nr = dev->id;
+
+       strlcpy(adap->name, dev->name, sizeof(adap->name));
+
+       sh_mobile_i2c_setup_channel(dev);
+
+       ret = i2c_add_numbered_adapter(adap);
+       if (ret < 0) {
+               dev_err(&dev->dev, "cannot add numbered adapter\n");
+               goto err_all;
+       }
+
+       return 0;
+
+ err_all:
+       iounmap(pd->reg);
+ err_irq:
+       sh_mobile_i2c_hook_irqs(dev, 0);
+ err_clk:
+       clk_put(pd->clk);
+ err:
+       kfree(pd);
+       return ret;
+}
+
+static int sh_mobile_i2c_remove(struct platform_device *dev)
+{
+       struct sh_mobile_i2c_data *pd = platform_get_drvdata(dev);
+
+       i2c_del_adapter(&pd->adap);
+       iounmap(pd->reg);
+       sh_mobile_i2c_hook_irqs(dev, 0);
+       clk_put(pd->clk);
+       kfree(pd);
+       return 0;
+}
+
+static struct platform_driver sh_mobile_i2c_driver = {
+       .driver         = {
+               .name           = "i2c-sh_mobile",
+               .owner          = THIS_MODULE,
+       },
+       .probe          = sh_mobile_i2c_probe,
+       .remove         = sh_mobile_i2c_remove,
+};
+
+static int __init sh_mobile_i2c_adap_init(void)
+{
+       return platform_driver_register(&sh_mobile_i2c_driver);
+}
+
+static void __exit sh_mobile_i2c_adap_exit(void)
+{
+       platform_driver_unregister(&sh_mobile_i2c_driver);
+}
+
+module_init(sh_mobile_i2c_adap_init);
+module_exit(sh_mobile_i2c_adap_exit);
+
+MODULE_DESCRIPTION("SuperH Mobile I2C Bus Controller driver");
+MODULE_AUTHOR("Magnus Damm");
+MODULE_LICENSE("GPL v2");
index 10af8d31e12aa0a7d4b7aae63419138096a407e4..042fda295f3a557cd56c623a6aab980ae362271e 100644 (file)
@@ -159,6 +159,9 @@ static int simtec_i2c_remove(struct platform_device *dev)
 
 /* device driver */
 
+/* work with hotplug and coldplug */
+MODULE_ALIAS("platform:simtec-i2c");
+
 static struct platform_driver simtec_i2c_driver = {
        .driver         = {
                .name           = "simtec-i2c",
index 081d9578ce103ac90ddb1143fa8279082151ea1a..4678babd3ce617dccc65975b2e178e615a2f3d87 100644 (file)
@@ -151,3 +151,4 @@ module_exit(i2c_versatile_exit);
 
 MODULE_DESCRIPTION("ARM Versatile I2C bus driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:versatile-i2c");
index f5e7a70da831b1c54b51e081bdf0c1a0bc6ef1f8..61abe0f33255291ffa7e274f0aed3a8f68f283d6 100644 (file)
@@ -527,7 +527,7 @@ static int __init scx200_create_isa(const char *text, unsigned long base,
        if (iface == NULL)
                return -ENOMEM;
 
-       if (request_region(base, 8, iface->adapter.name) == 0) {
+       if (!request_region(base, 8, iface->adapter.name)) {
                printk(KERN_ERR NAME ": can't allocate io 0x%lx-0x%lx\n",
                       base, base + 8 - 1);
                rc = -EBUSY;
index 2a3160153f547043a28e13298dd03182b8bf68d0..b1b45dddb17e051286ec1429f209c528cd81cb98 100644 (file)
@@ -658,7 +658,7 @@ pulldown:
                OTG_CTRL_REG |= OTG_PULLUP;
        }
 
-       check_state(isp, __FUNCTION__);
+       check_state(isp, __func__);
        dump_regs(isp, "otg->isp1301");
 }
 
@@ -782,7 +782,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp)
                if (otg_ctrl & OTG_DRIVER_SEL) {
                        switch (isp->otg.state) {
                        case OTG_STATE_A_IDLE:
-                               b_idle(isp, __FUNCTION__);
+                               b_idle(isp, __func__);
                                break;
                        default:
                                break;
@@ -826,7 +826,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp)
                                                isp->otg.host->otg_port);
        }
 
-       check_state(isp, __FUNCTION__);
+       check_state(isp, __func__);
        return ret;
 }
 
@@ -837,7 +837,7 @@ static int otg_init(struct isp1301 *isp)
        if (!otg_dev)
                return -ENODEV;
 
-       dump_regs(isp, __FUNCTION__);
+       dump_regs(isp, __func__);
        /* some of these values are board-specific... */
        OTG_SYSCON_2_REG |= OTG_EN
                /* for B-device: */
@@ -853,9 +853,9 @@ static int otg_init(struct isp1301 *isp)
        update_otg1(isp, isp1301_get_u8(isp, ISP1301_INTERRUPT_SOURCE));
        update_otg2(isp, isp1301_get_u8(isp, ISP1301_OTG_STATUS));
 
-       check_state(isp, __FUNCTION__);
+       check_state(isp, __func__);
        pr_debug("otg: %s, %s %06x\n",
-                       state_name(isp), __FUNCTION__, OTG_CTRL_REG);
+                       state_name(isp), __func__, OTG_CTRL_REG);
 
        OTG_IRQ_EN_REG = DRIVER_SWITCH | OPRT_CHG
                        | B_SRP_TMROUT | B_HNP_FAIL
@@ -1041,11 +1041,11 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat)
                                                OTG1_DP_PULLDOWN);
                        isp1301_clear_bits(isp, ISP1301_OTG_CONTROL_1,
                                                OTG1_DP_PULLUP);
-                       dump_regs(isp, __FUNCTION__);
+                       dump_regs(isp, __func__);
 #endif
                        /* FALLTHROUGH */
                case OTG_STATE_B_SRP_INIT:
-                       b_idle(isp, __FUNCTION__);
+                       b_idle(isp, __func__);
                        OTG_CTRL_REG &= OTG_CTRL_REG & OTG_XCEIV_OUTPUTS;
                        /* FALLTHROUGH */
                case OTG_STATE_B_IDLE:
@@ -1077,7 +1077,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat)
         */
        update_otg1(isp, isp_stat);
        update_otg2(isp, isp_bstat);
-       check_state(isp, __FUNCTION__);
+       check_state(isp, __func__);
 #endif
 
        dump_regs(isp, "isp1301->otg");
@@ -1310,7 +1310,7 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host)
         */
        isp1301_set_bits(isp, ISP1301_OTG_CONTROL_1, OTG1_VBUS_DRV);
 
-       dump_regs(isp, __FUNCTION__);
+       dump_regs(isp, __func__);
 
        return 0;
 
@@ -1365,7 +1365,7 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget)
        isp1301_set_bits(isp, ISP1301_INTERRUPT_FALLING,
                INTR_VBUS_VLD);
        dev_info(&isp->client.dev, "B-Peripheral sessions ok\n");
-       dump_regs(isp, __FUNCTION__);
+       dump_regs(isp, __func__);
 
        /* If this has a Mini-AB connector, this mode is highly
         * nonstandard ... but can be handy for testing, so long
@@ -1416,7 +1416,7 @@ isp1301_start_srp(struct otg_transceiver *dev)
 
        pr_debug("otg: SRP, %s ... %06x\n", state_name(isp), OTG_CTRL_REG);
 #ifdef CONFIG_USB_OTG
-       check_state(isp, __FUNCTION__);
+       check_state(isp, __func__);
 #endif
        return 0;
 }
@@ -1463,7 +1463,7 @@ isp1301_start_hnp(struct otg_transceiver *dev)
        }
        pr_debug("otg: HNP %s, %06x ...\n",
                state_name(isp), OTG_CTRL_REG);
-       check_state(isp, __FUNCTION__);
+       check_state(isp, __func__);
        return 0;
 #else
        /* srp-only */
@@ -1601,7 +1601,7 @@ fail2:
        update_otg2(isp, isp1301_get_u8(isp, ISP1301_OTG_STATUS));
 #endif
 
-       dump_regs(isp, __FUNCTION__);
+       dump_regs(isp, __func__);
 
 #ifdef VERBOSE
        mod_timer(&isp->timer, jiffies + TIMER_JIFFIES);
index e186df657119e9af61296b68db2f8ece414371f1..6c7fa8d53c0eeaeccfec0366302cdc37717efecb 100644 (file)
@@ -1506,7 +1506,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
                read_write = I2C_SMBUS_READ;
                if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
                        dev_err(&adapter->dev, "%s called with invalid "
-                               "block proc call size (%d)\n", __FUNCTION__,
+                               "block proc call size (%d)\n", __func__,
                                data->block[0]);
                        return -1;
                }
index 393e679d9faac4f1a8351b69376ffc656474871d..d34c14c81c291e9beabf7100530307b8a42e8914 100644 (file)
@@ -200,16 +200,176 @@ static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr)
        return device_for_each_child(&adapter->dev, &addr, i2cdev_check);
 }
 
-static int i2cdev_ioctl(struct inode *inode, struct file *file,
-               unsigned int cmd, unsigned long arg)
+static noinline int i2cdev_ioctl_rdrw(struct i2c_client *client,
+               unsigned long arg)
 {
-       struct i2c_client *client = (struct i2c_client *)file->private_data;
        struct i2c_rdwr_ioctl_data rdwr_arg;
-       struct i2c_smbus_ioctl_data data_arg;
-       union i2c_smbus_data temp;
        struct i2c_msg *rdwr_pa;
        u8 __user **data_ptrs;
-       int i,datasize,res;
+       int i, res;
+
+       if (copy_from_user(&rdwr_arg,
+                          (struct i2c_rdwr_ioctl_data __user *)arg,
+                          sizeof(rdwr_arg)))
+               return -EFAULT;
+
+       /* Put an arbitrary limit on the number of messages that can
+        * be sent at once */
+       if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
+               return -EINVAL;
+
+       rdwr_pa = (struct i2c_msg *)
+               kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg),
+               GFP_KERNEL);
+       if (!rdwr_pa)
+               return -ENOMEM;
+
+       if (copy_from_user(rdwr_pa, rdwr_arg.msgs,
+                          rdwr_arg.nmsgs * sizeof(struct i2c_msg))) {
+               kfree(rdwr_pa);
+               return -EFAULT;
+       }
+
+       data_ptrs = kmalloc(rdwr_arg.nmsgs * sizeof(u8 __user *), GFP_KERNEL);
+       if (data_ptrs == NULL) {
+               kfree(rdwr_pa);
+               return -ENOMEM;
+       }
+
+       res = 0;
+       for (i = 0; i < rdwr_arg.nmsgs; i++) {
+               /* Limit the size of the message to a sane amount;
+                * and don't let length change either. */
+               if ((rdwr_pa[i].len > 8192) ||
+                   (rdwr_pa[i].flags & I2C_M_RECV_LEN)) {
+                       res = -EINVAL;
+                       break;
+               }
+               data_ptrs[i] = (u8 __user *)rdwr_pa[i].buf;
+               rdwr_pa[i].buf = kmalloc(rdwr_pa[i].len, GFP_KERNEL);
+               if (rdwr_pa[i].buf == NULL) {
+                       res = -ENOMEM;
+                       break;
+               }
+               if (copy_from_user(rdwr_pa[i].buf, data_ptrs[i],
+                                  rdwr_pa[i].len)) {
+                               ++i; /* Needs to be kfreed too */
+                               res = -EFAULT;
+                       break;
+               }
+       }
+       if (res < 0) {
+               int j;
+               for (j = 0; j < i; ++j)
+                       kfree(rdwr_pa[j].buf);
+               kfree(data_ptrs);
+               kfree(rdwr_pa);
+               return res;
+       }
+
+       res = i2c_transfer(client->adapter, rdwr_pa, rdwr_arg.nmsgs);
+       while (i-- > 0) {
+               if (res >= 0 && (rdwr_pa[i].flags & I2C_M_RD)) {
+                       if (copy_to_user(data_ptrs[i], rdwr_pa[i].buf,
+                                        rdwr_pa[i].len))
+                               res = -EFAULT;
+               }
+               kfree(rdwr_pa[i].buf);
+       }
+       kfree(data_ptrs);
+       kfree(rdwr_pa);
+       return res;
+}
+
+static noinline int i2cdev_ioctl_smbus(struct i2c_client *client,
+               unsigned long arg)
+{
+       struct i2c_smbus_ioctl_data data_arg;
+       union i2c_smbus_data temp;
+       int datasize, res;
+
+       if (copy_from_user(&data_arg,
+                          (struct i2c_smbus_ioctl_data __user *) arg,
+                          sizeof(struct i2c_smbus_ioctl_data)))
+               return -EFAULT;
+       if ((data_arg.size != I2C_SMBUS_BYTE) &&
+           (data_arg.size != I2C_SMBUS_QUICK) &&
+           (data_arg.size != I2C_SMBUS_BYTE_DATA) &&
+           (data_arg.size != I2C_SMBUS_WORD_DATA) &&
+           (data_arg.size != I2C_SMBUS_PROC_CALL) &&
+           (data_arg.size != I2C_SMBUS_BLOCK_DATA) &&
+           (data_arg.size != I2C_SMBUS_I2C_BLOCK_BROKEN) &&
+           (data_arg.size != I2C_SMBUS_I2C_BLOCK_DATA) &&
+           (data_arg.size != I2C_SMBUS_BLOCK_PROC_CALL)) {
+               dev_dbg(&client->adapter->dev,
+                       "size out of range (%x) in ioctl I2C_SMBUS.\n",
+                       data_arg.size);
+               return -EINVAL;
+       }
+       /* Note that I2C_SMBUS_READ and I2C_SMBUS_WRITE are 0 and 1,
+          so the check is valid if size==I2C_SMBUS_QUICK too. */
+       if ((data_arg.read_write != I2C_SMBUS_READ) &&
+           (data_arg.read_write != I2C_SMBUS_WRITE)) {
+               dev_dbg(&client->adapter->dev,
+                       "read_write out of range (%x) in ioctl I2C_SMBUS.\n",
+                       data_arg.read_write);
+               return -EINVAL;
+       }
+
+       /* Note that command values are always valid! */
+
+       if ((data_arg.size == I2C_SMBUS_QUICK) ||
+           ((data_arg.size == I2C_SMBUS_BYTE) &&
+           (data_arg.read_write == I2C_SMBUS_WRITE)))
+               /* These are special: we do not use data */
+               return i2c_smbus_xfer(client->adapter, client->addr,
+                                     client->flags, data_arg.read_write,
+                                     data_arg.command, data_arg.size, NULL);
+
+       if (data_arg.data == NULL) {
+               dev_dbg(&client->adapter->dev,
+                       "data is NULL pointer in ioctl I2C_SMBUS.\n");
+               return -EINVAL;
+       }
+
+       if ((data_arg.size == I2C_SMBUS_BYTE_DATA) ||
+           (data_arg.size == I2C_SMBUS_BYTE))
+               datasize = sizeof(data_arg.data->byte);
+       else if ((data_arg.size == I2C_SMBUS_WORD_DATA) ||
+                (data_arg.size == I2C_SMBUS_PROC_CALL))
+               datasize = sizeof(data_arg.data->word);
+       else /* size == smbus block, i2c block, or block proc. call */
+               datasize = sizeof(data_arg.data->block);
+
+       if ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
+           (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
+           (data_arg.size == I2C_SMBUS_I2C_BLOCK_DATA) ||
+           (data_arg.read_write == I2C_SMBUS_WRITE)) {
+               if (copy_from_user(&temp, data_arg.data, datasize))
+                       return -EFAULT;
+       }
+       if (data_arg.size == I2C_SMBUS_I2C_BLOCK_BROKEN) {
+               /* Convert old I2C block commands to the new
+                  convention. This preserves binary compatibility. */
+               data_arg.size = I2C_SMBUS_I2C_BLOCK_DATA;
+               if (data_arg.read_write == I2C_SMBUS_READ)
+                       temp.block[0] = I2C_SMBUS_BLOCK_MAX;
+       }
+       res = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
+             data_arg.read_write, data_arg.command, data_arg.size, &temp);
+       if (!res && ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
+                    (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
+                    (data_arg.read_write == I2C_SMBUS_READ))) {
+               if (copy_to_user(data_arg.data, &temp, datasize))
+                       return -EFAULT;
+       }
+       return res;
+}
+
+static int i2cdev_ioctl(struct inode *inode, struct file *file,
+               unsigned int cmd, unsigned long arg)
+{
+       struct i2c_client *client = (struct i2c_client *)file->private_data;
        unsigned long funcs;
 
        dev_dbg(&client->adapter->dev, "ioctl, cmd=0x%02x, arg=0x%02lx\n",
@@ -253,164 +413,11 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file,
                return put_user(funcs, (unsigned long __user *)arg);
 
        case I2C_RDWR:
-               if (copy_from_user(&rdwr_arg,
-                                  (struct i2c_rdwr_ioctl_data __user *)arg,
-                                  sizeof(rdwr_arg)))
-                       return -EFAULT;
-
-               /* Put an arbitrary limit on the number of messages that can
-                * be sent at once */
-               if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
-                       return -EINVAL;
-
-               rdwr_pa = (struct i2c_msg *)
-                       kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg),
-                       GFP_KERNEL);
-
-               if (rdwr_pa == NULL) return -ENOMEM;
-
-               if (copy_from_user(rdwr_pa, rdwr_arg.msgs,
-                                  rdwr_arg.nmsgs * sizeof(struct i2c_msg))) {
-                       kfree(rdwr_pa);
-                       return -EFAULT;
-               }
-
-               data_ptrs = kmalloc(rdwr_arg.nmsgs * sizeof(u8 __user *), GFP_KERNEL);
-               if (data_ptrs == NULL) {
-                       kfree(rdwr_pa);
-                       return -ENOMEM;
-               }
-
-               res = 0;
-               for( i=0; i<rdwr_arg.nmsgs; i++ ) {
-                       /* Limit the size of the message to a sane amount;
-                        * and don't let length change either. */
-                       if ((rdwr_pa[i].len > 8192) ||
-                           (rdwr_pa[i].flags & I2C_M_RECV_LEN)) {
-                               res = -EINVAL;
-                               break;
-                       }
-                       data_ptrs[i] = (u8 __user *)rdwr_pa[i].buf;
-                       rdwr_pa[i].buf = kmalloc(rdwr_pa[i].len, GFP_KERNEL);
-                       if(rdwr_pa[i].buf == NULL) {
-                               res = -ENOMEM;
-                               break;
-                       }
-                       if(copy_from_user(rdwr_pa[i].buf,
-                               data_ptrs[i],
-                               rdwr_pa[i].len)) {
-                                       ++i; /* Needs to be kfreed too */
-                                       res = -EFAULT;
-                               break;
-                       }
-               }
-               if (res < 0) {
-                       int j;
-                       for (j = 0; j < i; ++j)
-                               kfree(rdwr_pa[j].buf);
-                       kfree(data_ptrs);
-                       kfree(rdwr_pa);
-                       return res;
-               }
-
-               res = i2c_transfer(client->adapter,
-                       rdwr_pa,
-                       rdwr_arg.nmsgs);
-               while(i-- > 0) {
-                       if( res>=0 && (rdwr_pa[i].flags & I2C_M_RD)) {
-                               if(copy_to_user(
-                                       data_ptrs[i],
-                                       rdwr_pa[i].buf,
-                                       rdwr_pa[i].len)) {
-                                       res = -EFAULT;
-                               }
-                       }
-                       kfree(rdwr_pa[i].buf);
-               }
-               kfree(data_ptrs);
-               kfree(rdwr_pa);
-               return res;
+               return i2cdev_ioctl_rdrw(client, arg);
 
        case I2C_SMBUS:
-               if (copy_from_user(&data_arg,
-                                  (struct i2c_smbus_ioctl_data __user *) arg,
-                                  sizeof(struct i2c_smbus_ioctl_data)))
-                       return -EFAULT;
-               if ((data_arg.size != I2C_SMBUS_BYTE) &&
-                   (data_arg.size != I2C_SMBUS_QUICK) &&
-                   (data_arg.size != I2C_SMBUS_BYTE_DATA) &&
-                   (data_arg.size != I2C_SMBUS_WORD_DATA) &&
-                   (data_arg.size != I2C_SMBUS_PROC_CALL) &&
-                   (data_arg.size != I2C_SMBUS_BLOCK_DATA) &&
-                   (data_arg.size != I2C_SMBUS_I2C_BLOCK_BROKEN) &&
-                   (data_arg.size != I2C_SMBUS_I2C_BLOCK_DATA) &&
-                   (data_arg.size != I2C_SMBUS_BLOCK_PROC_CALL)) {
-                       dev_dbg(&client->adapter->dev,
-                               "size out of range (%x) in ioctl I2C_SMBUS.\n",
-                               data_arg.size);
-                       return -EINVAL;
-               }
-               /* Note that I2C_SMBUS_READ and I2C_SMBUS_WRITE are 0 and 1,
-                  so the check is valid if size==I2C_SMBUS_QUICK too. */
-               if ((data_arg.read_write != I2C_SMBUS_READ) &&
-                   (data_arg.read_write != I2C_SMBUS_WRITE)) {
-                       dev_dbg(&client->adapter->dev,
-                               "read_write out of range (%x) in ioctl I2C_SMBUS.\n",
-                               data_arg.read_write);
-                       return -EINVAL;
-               }
-
-               /* Note that command values are always valid! */
-
-               if ((data_arg.size == I2C_SMBUS_QUICK) ||
-                   ((data_arg.size == I2C_SMBUS_BYTE) &&
-                   (data_arg.read_write == I2C_SMBUS_WRITE)))
-                       /* These are special: we do not use data */
-                       return i2c_smbus_xfer(client->adapter, client->addr,
-                                             client->flags,
-                                             data_arg.read_write,
-                                             data_arg.command,
-                                             data_arg.size, NULL);
-
-               if (data_arg.data == NULL) {
-                       dev_dbg(&client->adapter->dev,
-                               "data is NULL pointer in ioctl I2C_SMBUS.\n");
-                       return -EINVAL;
-               }
+               return i2cdev_ioctl_smbus(client, arg);
 
-               if ((data_arg.size == I2C_SMBUS_BYTE_DATA) ||
-                   (data_arg.size == I2C_SMBUS_BYTE))
-                       datasize = sizeof(data_arg.data->byte);
-               else if ((data_arg.size == I2C_SMBUS_WORD_DATA) ||
-                        (data_arg.size == I2C_SMBUS_PROC_CALL))
-                       datasize = sizeof(data_arg.data->word);
-               else /* size == smbus block, i2c block, or block proc. call */
-                       datasize = sizeof(data_arg.data->block);
-
-               if ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
-                   (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
-                   (data_arg.size == I2C_SMBUS_I2C_BLOCK_DATA) ||
-                   (data_arg.read_write == I2C_SMBUS_WRITE)) {
-                       if (copy_from_user(&temp, data_arg.data, datasize))
-                               return -EFAULT;
-               }
-               if (data_arg.size == I2C_SMBUS_I2C_BLOCK_BROKEN) {
-                       /* Convert old I2C block commands to the new
-                          convention. This preserves binary compatibility. */
-                       data_arg.size = I2C_SMBUS_I2C_BLOCK_DATA;
-                       if (data_arg.read_write == I2C_SMBUS_READ)
-                               temp.block[0] = I2C_SMBUS_BLOCK_MAX;
-               }
-               res = i2c_smbus_xfer(client->adapter,client->addr,client->flags,
-                     data_arg.read_write,
-                     data_arg.command,data_arg.size,&temp);
-               if (! res && ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
-                             (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
-                             (data_arg.read_write == I2C_SMBUS_READ))) {
-                       if (copy_to_user(data_arg.data, &temp, datasize))
-                               return -EFAULT;
-               }
-               return res;
        case I2C_RETRIES:
                client->adapter->retries = arg;
                break;
index 044da5828a787537b9744cf6401a06e48c4c00d2..3c7968f25ec2d70210d702f3e0c4966467489e53 100644 (file)
@@ -1,6 +1,6 @@
 config INFINIBAND_IPATH
        tristate "QLogic InfiniPath Driver"
-       depends on (PCI_MSI || HT_IRQ) && 64BIT && NET
+       depends on 64BIT && NET
        ---help---
        This is a driver for QLogic InfiniPath host channel adapters,
        including InfiniBand verbs support.  This driver allows these
index 75a6c91944c4b7d8ccfd6bc5eb8af815fdba99d7..bf945006198645eeff5e75f5ffa8b6f004f895ba 100644 (file)
@@ -29,11 +29,13 @@ ib_ipath-y := \
        ipath_user_pages.o \
        ipath_user_sdma.o \
        ipath_verbs_mcast.o \
-       ipath_verbs.o
+       ipath_verbs.o \
+       ipath_iba7220.o \
+       ipath_sd7220.o \
+       ipath_sd7220_img.o
 
 ib_ipath-$(CONFIG_HT_IRQ) += ipath_iba6110.o
 ib_ipath-$(CONFIG_PCI_MSI) += ipath_iba6120.o
-ib_ipath-$(CONFIG_PCI_MSI) += ipath_iba7220.o ipath_sd7220.o ipath_sd7220_img.o
 
 ib_ipath-$(CONFIG_X86_64) += ipath_wc_x86_64.o
 ib_ipath-$(CONFIG_PPC64) += ipath_wc_ppc64.o
index e0a64f070b9753ad511d85fda8540178f8e968d7..acf30c06a0c0ff8eb1981e692c7cc2818b78c4cc 100644 (file)
@@ -538,7 +538,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
        case PCI_DEVICE_ID_INFINIPATH_7220:
 #ifndef CONFIG_PCI_MSI
                ipath_dbg("CONFIG_PCI_MSI is not enabled, "
-                         "using IntX for unit %u\n", dd->ipath_unit);
+                         "using INTx for unit %u\n", dd->ipath_unit);
 #endif
                ipath_init_iba7220_funcs(dd);
                break;
index 1b2de2cfb69b01d511f83faf245d2c19012a978e..e3ec0d1bdf505ae50d592174bfb2633a6d48b522 100644 (file)
@@ -1215,13 +1215,13 @@ static int ipath_msi_enabled(struct pci_dev *pdev)
 
 /*
  * disable msi interrupt if enabled, and clear the flag.
- * flag is used primarily for the fallback to IntX, but
+ * flag is used primarily for the fallback to INTx, but
  * is also used in reinit after reset as a flag.
  */
 static void ipath_7220_nomsi(struct ipath_devdata *dd)
 {
        dd->ipath_msi_lo = 0;
-#ifdef CONFIG_PCI_MSI
+
        if (ipath_msi_enabled(dd->pcidev)) {
                /*
                 * free, but don't zero; later kernels require
@@ -1232,7 +1232,6 @@ static void ipath_7220_nomsi(struct ipath_devdata *dd)
                        free_irq(dd->ipath_irq, dd);
                pci_disable_msi(dd->pcidev);
        }
-#endif
 }
 
 /*
@@ -1344,7 +1343,7 @@ static int ipath_setup_7220_config(struct ipath_devdata *dd,
        u32 boardrev;
 
        dd->ipath_msi_lo = 0;   /* used as a flag during reset processing */
-#ifdef CONFIG_PCI_MSI
+
        pos = pci_find_capability(pdev, PCI_CAP_ID_MSI);
        if (!strcmp(int_type, "force_msi") || !strcmp(int_type, "auto"))
                ret = pci_enable_msi(pdev);
@@ -1377,10 +1376,6 @@ static int ipath_setup_7220_config(struct ipath_devdata *dd,
        } else
                ipath_dev_err(dd, "Can't find MSI capability, "
                              "can't save MSI settings for reset\n");
-#else
-       ipath_dbg("PCI_MSI not configured, using IntX interrupts\n");
-       ipath_enable_intx(pdev);
-#endif
 
        dd->ipath_irq = pdev->irq;
 
@@ -1583,7 +1578,7 @@ static void ipath_init_7220_variables(struct ipath_devdata *dd)
 static int ipath_reinit_msi(struct ipath_devdata *dd)
 {
        int ret = 0;
-#ifdef CONFIG_PCI_MSI
+
        int pos;
        u16 control;
        if (!dd->ipath_msi_lo) /* Using intX, or init problem */
@@ -1617,10 +1612,10 @@ static int ipath_reinit_msi(struct ipath_devdata *dd)
                              ((control & PCI_MSI_FLAGS_64BIT) ? 12 : 8),
                              dd->ipath_msi_data);
        ret = 1;
+
 bail:
-#endif
        if (!ret) {
-               ipath_dbg("Using IntX, MSI disabled or not configured\n");
+               ipath_dbg("Using INTx, MSI disabled or not configured\n");
                ipath_enable_intx(dd->pcidev);
                ret = 1;
        }
@@ -2149,12 +2144,12 @@ static void ipath_7220_read_counters(struct ipath_devdata *dd,
                counters[i] = ipath_snap_cntr(dd, i);
 }
 
-/* if we are using MSI, try to fallback to IntX */
+/* if we are using MSI, try to fallback to INTx */
 static int ipath_7220_intr_fallback(struct ipath_devdata *dd)
 {
        if (dd->ipath_msi_lo) {
                dev_info(&dd->pcidev->dev, "MSI interrupt not detected,"
-                       " trying IntX interrupts\n");
+                       " trying INTx interrupts\n");
                ipath_7220_nomsi(dd);
                ipath_enable_intx(dd->pcidev);
                /*
@@ -2167,7 +2162,7 @@ static int ipath_7220_intr_fallback(struct ipath_devdata *dd)
                if (request_irq(dd->ipath_irq, ipath_intr, IRQF_SHARED,
                        IPATH_DRV_NAME, dd))
                        ipath_dev_err(dd,
-                               "Could not re-request_irq for IntX\n");
+                               "Could not re-request_irq for INTx\n");
                return 1;
        }
        return 0;
index c38f9aa8be8dc000c26124da1477759a5a20fa76..e63927cce5b52180563bb4d03ffe2a41537959dc 100644 (file)
@@ -109,7 +109,7 @@ MODULE_PARM_DESC(max_srq_wrs, "Maximum number of SRQ WRs support");
 
 static unsigned int ib_ipath_disable_sma;
 module_param_named(disable_sma, ib_ipath_disable_sma, uint, S_IWUSR | S_IRUGO);
-MODULE_PARM_DESC(ib_ipath_disable_sma, "Disable the SMA");
+MODULE_PARM_DESC(disable_sma, "Disable the SMA");
 
 const int ib_ipath_state_ops[IB_QPS_ERR + 1] = {
        [IB_QPS_RESET] = 0,
@@ -2067,7 +2067,6 @@ int ipath_register_ib_device(struct ipath_devdata *dd)
        dev->phys_port_cnt = 1;
        dev->num_comp_vectors = 1;
        dev->dma_device = &dd->pcidev->dev;
-       dev->class_dev.dev = dev->dma_device;
        dev->query_device = ipath_query_device;
        dev->modify_device = ipath_modify_device;
        dev->query_port = ipath_query_port;
index b00b0e3a91dc9d6bad94d4f3deaaec10f5388636..b046262ed638114bb8ce8c3d64ff9dd22267a62b 100644 (file)
@@ -96,12 +96,6 @@ static LIST_HEAD(nes_dev_list);
 
 atomic_t qps_destroyed;
 
-static void nes_print_macaddr(struct net_device *netdev);
-static irqreturn_t nes_interrupt(int, void *);
-static int __devinit nes_probe(struct pci_dev *, const struct pci_device_id *);
-static void __devexit nes_remove(struct pci_dev *);
-static int __init nes_init_module(void);
-static void __exit nes_exit_module(void);
 static unsigned int ee_flsh_adapter;
 static unsigned int sysfs_nonidx_addr;
 static unsigned int sysfs_idx_addr;
index 34166641f207c52571546b7d0855ce823ce0f7c9..01cd0effc492b0712e880ac016117d082a295ae6 100644 (file)
@@ -92,15 +92,6 @@ static const u32 default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK
                | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN;
 static int debug = -1;
 
-
-static int nes_netdev_open(struct net_device *);
-static int nes_netdev_stop(struct net_device *);
-static int nes_netdev_start_xmit(struct sk_buff *, struct net_device *);
-static struct net_device_stats *nes_netdev_get_stats(struct net_device *);
-static void nes_netdev_tx_timeout(struct net_device *);
-static int nes_netdev_set_mac_address(struct net_device *, void *);
-static int nes_netdev_change_mtu(struct net_device *, int);
-
 /**
  * nes_netdev_poll
  */
index b96667448eb5618ffcfae4e02e15cfaeca52146f..01ced4c5a61d45016234654c9e0cf3313ad0ff3d 100644 (file)
 #include "sd_ops.h"
 #include "sdio_ops.h"
 
-extern int mmc_attach_mmc(struct mmc_host *host, u32 ocr);
-extern int mmc_attach_sd(struct mmc_host *host, u32 ocr);
-extern int mmc_attach_sdio(struct mmc_host *host, u32 ocr);
-
 static struct workqueue_struct *workqueue;
 
 /*
@@ -516,7 +512,7 @@ static void mmc_power_off(struct mmc_host *host)
 /*
  * Cleanup when the last reference to the bus operator is dropped.
  */
-void __mmc_release_bus(struct mmc_host *host)
+static void __mmc_release_bus(struct mmc_host *host)
 {
        BUG_ON(!host);
        BUG_ON(host->bus_refs);
index cfa8e15b5923a8c40ccca0f111fbf51c282a03c3..cdb332b7dedc87340ef5ff0aacedc71f8b4fe931 100644 (file)
@@ -46,6 +46,10 @@ void mmc_rescan(struct work_struct *work);
 void mmc_start_host(struct mmc_host *host);
 void mmc_stop_host(struct mmc_host *host);
 
+int mmc_attach_mmc(struct mmc_host *host, u32 ocr);
+int mmc_attach_sd(struct mmc_host *host, u32 ocr);
+int mmc_attach_sdio(struct mmc_host *host, u32 ocr);
+
 extern int use_spi_crc;
 
 #endif
index c65d203a846d6e91dc5689e0bee82311474468a2..1d795c5379b548f5869b83d7aabf05848a6d27b1 100644 (file)
@@ -2,7 +2,7 @@
  *  linux/drivers/mmc/core/host.c
  *
  *  Copyright (C) 2003 Russell King, All Rights Reserved.
- *  Copyright (C) 2007 Pierre Ossman
+ *  Copyright (C) 2007-2008 Pierre Ossman
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -57,12 +57,25 @@ static DEFINE_SPINLOCK(mmc_host_lock);
  */
 struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 {
+       int err;
        struct mmc_host *host;
 
+       if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL))
+               return NULL;
+
        host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
        if (!host)
                return NULL;
 
+       spin_lock(&mmc_host_lock);
+       err = idr_get_new(&mmc_host_idr, host, &host->index);
+       spin_unlock(&mmc_host_lock);
+       if (err)
+               goto free;
+
+       snprintf(host->class_dev.bus_id, BUS_ID_SIZE,
+                "mmc%d", host->index);
+
        host->parent = dev;
        host->class_dev.parent = dev;
        host->class_dev.class = &mmc_host_class;
@@ -85,6 +98,10 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
        host->max_blk_count = PAGE_CACHE_SIZE / 512;
 
        return host;
+
+free:
+       kfree(host);
+       return NULL;
 }
 
 EXPORT_SYMBOL(mmc_alloc_host);
@@ -104,18 +121,6 @@ int mmc_add_host(struct mmc_host *host)
        WARN_ON((host->caps & MMC_CAP_SDIO_IRQ) &&
                !host->ops->enable_sdio_irq);
 
-       if (!idr_pre_get(&mmc_host_idr, GFP_KERNEL))
-               return -ENOMEM;
-
-       spin_lock(&mmc_host_lock);
-       err = idr_get_new(&mmc_host_idr, host, &host->index);
-       spin_unlock(&mmc_host_lock);
-       if (err)
-               return err;
-
-       snprintf(host->class_dev.bus_id, BUS_ID_SIZE,
-                "mmc%d", host->index);
-
        led_trigger_register_simple(host->class_dev.bus_id, &host->led);
 
        err = device_add(&host->class_dev);
@@ -144,10 +149,6 @@ void mmc_remove_host(struct mmc_host *host)
        device_del(&host->class_dev);
 
        led_trigger_unregister_simple(host->led);
-
-       spin_lock(&mmc_host_lock);
-       idr_remove(&mmc_host_idr, host->index);
-       spin_unlock(&mmc_host_lock);
 }
 
 EXPORT_SYMBOL(mmc_remove_host);
@@ -160,6 +161,10 @@ EXPORT_SYMBOL(mmc_remove_host);
  */
 void mmc_free_host(struct mmc_host *host)
 {
+       spin_lock(&mmc_host_lock);
+       idr_remove(&mmc_host_idr, host->index);
+       spin_unlock(&mmc_host_lock);
+
        put_device(&host->class_dev);
 }
 
index 3bd3021f5e808866d7e45bebb78de5535e84d67b..c292e124107ac13ec36be751024ad3728cafaa40 100644 (file)
@@ -128,12 +128,12 @@ static int sdio_irq_thread(void *_host)
                        }
                }
 
-               set_task_state(current, TASK_INTERRUPTIBLE);
+               set_current_state(TASK_INTERRUPTIBLE);
                if (host->caps & MMC_CAP_SDIO_IRQ)
                        host->ops->enable_sdio_irq(host, 1);
                if (!kthread_should_stop())
                        schedule_timeout(period);
-               set_task_state(current, TASK_RUNNING);
+               set_current_state(TASK_RUNNING);
        } while (!kthread_should_stop());
 
        if (host->caps & MMC_CAP_SDIO_IRQ)
index e1fca588e3853b5a10c477b6bd55ee7078fd19b8..c8fa095a4488689bb9ae35dee41bd482abe3a157 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/mmc/sdio.h>
 
 #include "core.h"
+#include "sdio_ops.h"
 
 int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
 {
index 90c358b57d1cb25bf4a47ec289393d438a151af6..14759e9f42adb922fc15fa84b40347b43caed1d6 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm/mach-types.h>
 
 #include <asm/arch/board.h>
+#include <asm/arch/mmc.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/dma.h>
 #include <asm/arch/mux.h>
 
 /* Specifies how often in millisecs to poll for card status changes
  * when the cover switch is open */
-#define OMAP_MMC_SWITCH_POLL_DELAY     500
-
-static int mmc_omap_enable_poll = 1;
+#define OMAP_MMC_COVER_POLL_DELAY      500
+
+struct mmc_omap_host;
+
+struct mmc_omap_slot {
+       int                     id;
+       unsigned int            vdd;
+       u16                     saved_con;
+       u16                     bus_mode;
+       unsigned int            fclk_freq;
+       unsigned                powered:1;
+
+       struct tasklet_struct   cover_tasklet;
+       struct timer_list       cover_timer;
+       unsigned                cover_open;
+
+       struct mmc_request      *mrq;
+       struct mmc_omap_host    *host;
+       struct mmc_host         *mmc;
+       struct omap_mmc_slot_data *pdata;
+};
 
 struct mmc_omap_host {
        int                     initialized;
@@ -115,6 +134,15 @@ struct mmc_omap_host {
        unsigned char           bus_mode;
        unsigned char           hw_bus_mode;
 
+       struct work_struct      cmd_abort_work;
+       unsigned                abort:1;
+       struct timer_list       cmd_abort_timer;
+
+       struct work_struct      slot_release_work;
+       struct mmc_omap_slot    *next_slot;
+       struct work_struct      send_stop_work;
+       struct mmc_data         *stop_data;
+
        unsigned int            sg_len;
        int                     sg_idx;
        u16 *                   buffer;
@@ -131,63 +159,178 @@ struct mmc_omap_host {
        unsigned                dma_len;
 
        short                   power_pin;
-       short                   wp_pin;
 
-       int                     switch_pin;
-       struct work_struct      switch_work;
-       struct timer_list       switch_timer;
-       int                     switch_last_state;
+       struct mmc_omap_slot    *slots[OMAP_MMC_MAX_SLOTS];
+       struct mmc_omap_slot    *current_slot;
+       spinlock_t              slot_lock;
+       wait_queue_head_t       slot_wq;
+       int                     nr_slots;
+
+       struct timer_list       clk_timer;
+       spinlock_t              clk_lock;     /* for changing enabled state */
+       unsigned int            fclk_enabled:1;
+
+       struct omap_mmc_platform_data *pdata;
 };
 
-static inline int
-mmc_omap_cover_is_open(struct mmc_omap_host *host)
+void mmc_omap_fclk_offdelay(struct mmc_omap_slot *slot)
 {
-       if (host->switch_pin < 0)
-               return 0;
-       return omap_get_gpio_datain(host->switch_pin);
+       unsigned long tick_ns;
+
+       if (slot != NULL && slot->host->fclk_enabled && slot->fclk_freq > 0) {
+               tick_ns = (1000000000 + slot->fclk_freq - 1) / slot->fclk_freq;
+               ndelay(8 * tick_ns);
+       }
 }
 
-static ssize_t
-mmc_omap_show_cover_switch(struct device *dev,
-       struct device_attribute *attr, char *buf)
+void mmc_omap_fclk_enable(struct mmc_omap_host *host, unsigned int enable)
 {
-       struct mmc_omap_host *host = dev_get_drvdata(dev);
+       unsigned long flags;
 
-       return sprintf(buf, "%s\n", mmc_omap_cover_is_open(host) ? "open" :
-                       "closed");
+       spin_lock_irqsave(&host->clk_lock, flags);
+       if (host->fclk_enabled != enable) {
+               host->fclk_enabled = enable;
+               if (enable)
+                       clk_enable(host->fclk);
+               else
+                       clk_disable(host->fclk);
+       }
+       spin_unlock_irqrestore(&host->clk_lock, flags);
 }
 
-static DEVICE_ATTR(cover_switch, S_IRUGO, mmc_omap_show_cover_switch, NULL);
+static void mmc_omap_select_slot(struct mmc_omap_slot *slot, int claimed)
+{
+       struct mmc_omap_host *host = slot->host;
+       unsigned long flags;
 
-static ssize_t
-mmc_omap_show_enable_poll(struct device *dev,
-       struct device_attribute *attr, char *buf)
+       if (claimed)
+               goto no_claim;
+       spin_lock_irqsave(&host->slot_lock, flags);
+       while (host->mmc != NULL) {
+               spin_unlock_irqrestore(&host->slot_lock, flags);
+               wait_event(host->slot_wq, host->mmc == NULL);
+               spin_lock_irqsave(&host->slot_lock, flags);
+       }
+       host->mmc = slot->mmc;
+       spin_unlock_irqrestore(&host->slot_lock, flags);
+no_claim:
+       del_timer(&host->clk_timer);
+       if (host->current_slot != slot || !claimed)
+               mmc_omap_fclk_offdelay(host->current_slot);
+
+       if (host->current_slot != slot) {
+               OMAP_MMC_WRITE(host, CON, slot->saved_con & 0xFC00);
+               if (host->pdata->switch_slot != NULL)
+                       host->pdata->switch_slot(mmc_dev(slot->mmc), slot->id);
+               host->current_slot = slot;
+       }
+
+       if (claimed) {
+               mmc_omap_fclk_enable(host, 1);
+
+               /* Doing the dummy read here seems to work around some bug
+                * at least in OMAP24xx silicon where the command would not
+                * start after writing the CMD register. Sigh. */
+               OMAP_MMC_READ(host, CON);
+
+               OMAP_MMC_WRITE(host, CON, slot->saved_con);
+       } else
+               mmc_omap_fclk_enable(host, 0);
+}
+
+static void mmc_omap_start_request(struct mmc_omap_host *host,
+                                  struct mmc_request *req);
+
+static void mmc_omap_slot_release_work(struct work_struct *work)
 {
-       return snprintf(buf, PAGE_SIZE, "%d\n", mmc_omap_enable_poll);
+       struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
+                                                 slot_release_work);
+       struct mmc_omap_slot *next_slot = host->next_slot;
+       struct mmc_request *rq;
+
+       host->next_slot = NULL;
+       mmc_omap_select_slot(next_slot, 1);
+
+       rq = next_slot->mrq;
+       next_slot->mrq = NULL;
+       mmc_omap_start_request(host, rq);
 }
 
-static ssize_t
-mmc_omap_store_enable_poll(struct device *dev,
-       struct device_attribute *attr, const char *buf,
-       size_t size)
+static void mmc_omap_release_slot(struct mmc_omap_slot *slot, int clk_enabled)
 {
-       int enable_poll;
+       struct mmc_omap_host *host = slot->host;
+       unsigned long flags;
+       int i;
+
+       BUG_ON(slot == NULL || host->mmc == NULL);
+
+       if (clk_enabled)
+               /* Keeps clock running for at least 8 cycles on valid freq */
+               mod_timer(&host->clk_timer, jiffies  + HZ/10);
+       else {
+               del_timer(&host->clk_timer);
+               mmc_omap_fclk_offdelay(slot);
+               mmc_omap_fclk_enable(host, 0);
+       }
 
-       if (sscanf(buf, "%10d", &enable_poll) != 1)
-               return -EINVAL;
+       spin_lock_irqsave(&host->slot_lock, flags);
+       /* Check for any pending requests */
+       for (i = 0; i < host->nr_slots; i++) {
+               struct mmc_omap_slot *new_slot;
 
-       if (enable_poll != mmc_omap_enable_poll) {
-               struct mmc_omap_host *host = dev_get_drvdata(dev);
+               if (host->slots[i] == NULL || host->slots[i]->mrq == NULL)
+                       continue;
 
-               mmc_omap_enable_poll = enable_poll;
-               if (enable_poll && host->switch_pin >= 0)
-                       schedule_work(&host->switch_work);
+               BUG_ON(host->next_slot != NULL);
+               new_slot = host->slots[i];
+               /* The current slot should not have a request in queue */
+               BUG_ON(new_slot == host->current_slot);
+
+               host->next_slot = new_slot;
+               host->mmc = new_slot->mmc;
+               spin_unlock_irqrestore(&host->slot_lock, flags);
+               schedule_work(&host->slot_release_work);
+               return;
        }
-       return size;
+
+       host->mmc = NULL;
+       wake_up(&host->slot_wq);
+       spin_unlock_irqrestore(&host->slot_lock, flags);
+}
+
+static inline
+int mmc_omap_cover_is_open(struct mmc_omap_slot *slot)
+{
+       if (slot->pdata->get_cover_state)
+               return slot->pdata->get_cover_state(mmc_dev(slot->mmc),
+                                                   slot->id);
+       return 0;
+}
+
+static ssize_t
+mmc_omap_show_cover_switch(struct device *dev, struct device_attribute *attr,
+                          char *buf)
+{
+       struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
+       struct mmc_omap_slot *slot = mmc_priv(mmc);
+
+       return sprintf(buf, "%s\n", mmc_omap_cover_is_open(slot) ? "open" :
+                      "closed");
 }
 
-static DEVICE_ATTR(enable_poll, 0664,
-                  mmc_omap_show_enable_poll, mmc_omap_store_enable_poll);
+static DEVICE_ATTR(cover_switch, S_IRUGO, mmc_omap_show_cover_switch, NULL);
+
+static ssize_t
+mmc_omap_show_slot_name(struct device *dev, struct device_attribute *attr,
+                       char *buf)
+{
+       struct mmc_host *mmc = container_of(dev, struct mmc_host, class_dev);
+       struct mmc_omap_slot *slot = mmc_priv(mmc);
+
+       return sprintf(buf, "%s\n", slot->pdata->name);
+}
+
+static DEVICE_ATTR(slot_name, S_IRUGO, mmc_omap_show_slot_name, NULL);
 
 static void
 mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd)
@@ -233,7 +376,7 @@ mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd)
 
        cmdreg = cmd->opcode | (resptype << 8) | (cmdtype << 12);
 
-       if (host->bus_mode == MMC_BUSMODE_OPENDRAIN)
+       if (host->current_slot->bus_mode == MMC_BUSMODE_OPENDRAIN)
                cmdreg |= 1 << 6;
 
        if (cmd->flags & MMC_RSP_BUSY)
@@ -242,7 +385,7 @@ mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd)
        if (host->data && !(host->data->flags & MMC_DATA_WRITE))
                cmdreg |= 1 << 15;
 
-       clk_enable(host->fclk);
+       mod_timer(&host->cmd_abort_timer, jiffies + HZ/2);
 
        OMAP_MMC_WRITE(host, CTO, 200);
        OMAP_MMC_WRITE(host, ARGL, cmd->arg & 0xffff);
@@ -256,27 +399,47 @@ mmc_omap_start_command(struct mmc_omap_host *host, struct mmc_command *cmd)
        OMAP_MMC_WRITE(host, CMD, cmdreg);
 }
 
+static void
+mmc_omap_release_dma(struct mmc_omap_host *host, struct mmc_data *data,
+                    int abort)
+{
+       enum dma_data_direction dma_data_dir;
+
+       BUG_ON(host->dma_ch < 0);
+       if (data->error)
+               omap_stop_dma(host->dma_ch);
+       /* Release DMA channel lazily */
+       mod_timer(&host->dma_timer, jiffies + HZ);
+       if (data->flags & MMC_DATA_WRITE)
+               dma_data_dir = DMA_TO_DEVICE;
+       else
+               dma_data_dir = DMA_FROM_DEVICE;
+       dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_len,
+                    dma_data_dir);
+}
+
+static void mmc_omap_send_stop_work(struct work_struct *work)
+{
+       struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
+                                                 send_stop_work);
+       struct mmc_omap_slot *slot = host->current_slot;
+       struct mmc_data *data = host->stop_data;
+       unsigned long tick_ns;
+
+       tick_ns = (1000000000 + slot->fclk_freq - 1)/slot->fclk_freq;
+       ndelay(8*tick_ns);
+
+       mmc_omap_start_command(host, data->stop);
+}
+
 static void
 mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data)
 {
-       if (host->dma_in_use) {
-               enum dma_data_direction dma_data_dir;
-
-               BUG_ON(host->dma_ch < 0);
-               if (data->error)
-                       omap_stop_dma(host->dma_ch);
-               /* Release DMA channel lazily */
-               mod_timer(&host->dma_timer, jiffies + HZ);
-               if (data->flags & MMC_DATA_WRITE)
-                       dma_data_dir = DMA_TO_DEVICE;
-               else
-                       dma_data_dir = DMA_FROM_DEVICE;
-               dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_len,
-                            dma_data_dir);
-       }
+       if (host->dma_in_use)
+               mmc_omap_release_dma(host, data, data->error);
+
        host->data = NULL;
        host->sg_len = 0;
-       clk_disable(host->fclk);
 
        /* NOTE:  MMC layer will sometimes poll-wait CMD13 next, issuing
         * dozens of requests until the card finishes writing data.
@@ -284,12 +447,58 @@ mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data)
         */
 
        if (!data->stop) {
+               struct mmc_host *mmc;
+
                host->mrq = NULL;
-               mmc_request_done(host->mmc, data->mrq);
+               mmc = host->mmc;
+               mmc_omap_release_slot(host->current_slot, 1);
+               mmc_request_done(mmc, data->mrq);
                return;
        }
 
-       mmc_omap_start_command(host, data->stop);
+       host->stop_data = data;
+       schedule_work(&host->send_stop_work);
+}
+
+static void
+mmc_omap_send_abort(struct mmc_omap_host *host, int maxloops)
+{
+       struct mmc_omap_slot *slot = host->current_slot;
+       unsigned int restarts, passes, timeout;
+       u16 stat = 0;
+
+       /* Sending abort takes 80 clocks. Have some extra and round up */
+       timeout = (120*1000000 + slot->fclk_freq - 1)/slot->fclk_freq;
+       restarts = 0;
+       while (restarts < maxloops) {
+               OMAP_MMC_WRITE(host, STAT, 0xFFFF);
+               OMAP_MMC_WRITE(host, CMD, (3 << 12) | (1 << 7));
+
+               passes = 0;
+               while (passes < timeout) {
+                       stat = OMAP_MMC_READ(host, STAT);
+                       if (stat & OMAP_MMC_STAT_END_OF_CMD)
+                               goto out;
+                       udelay(1);
+                       passes++;
+               }
+
+               restarts++;
+       }
+out:
+       OMAP_MMC_WRITE(host, STAT, stat);
+}
+
+static void
+mmc_omap_abort_xfer(struct mmc_omap_host *host, struct mmc_data *data)
+{
+       if (host->dma_in_use)
+               mmc_omap_release_dma(host, data, 1);
+
+       host->data = NULL;
+       host->sg_len = 0;
+
+       mmc_omap_send_abort(host, 10000);
 }
 
 static void
@@ -345,6 +554,8 @@ mmc_omap_cmd_done(struct mmc_omap_host *host, struct mmc_command *cmd)
 {
        host->cmd = NULL;
 
+       del_timer(&host->cmd_abort_timer);
+
        if (cmd->flags & MMC_RSP_PRESENT) {
                if (cmd->flags & MMC_RSP_136) {
                        /* response type 2 */
@@ -369,10 +580,66 @@ mmc_omap_cmd_done(struct mmc_omap_host *host, struct mmc_command *cmd)
        }
 
        if (host->data == NULL || cmd->error) {
+               struct mmc_host *mmc;
+
+               if (host->data != NULL)
+                       mmc_omap_abort_xfer(host, host->data);
                host->mrq = NULL;
-               clk_disable(host->fclk);
-               mmc_request_done(host->mmc, cmd->mrq);
+               mmc = host->mmc;
+               mmc_omap_release_slot(host->current_slot, 1);
+               mmc_request_done(mmc, cmd->mrq);
+       }
+}
+
+/*
+ * Abort stuck command. Can occur when card is removed while it is being
+ * read.
+ */
+static void mmc_omap_abort_command(struct work_struct *work)
+{
+       struct mmc_omap_host *host = container_of(work, struct mmc_omap_host,
+                                                 cmd_abort_work);
+       BUG_ON(!host->cmd);
+
+       dev_dbg(mmc_dev(host->mmc), "Aborting stuck command CMD%d\n",
+               host->cmd->opcode);
+
+       if (host->cmd->error == 0)
+               host->cmd->error = -ETIMEDOUT;
+
+       if (host->data == NULL) {
+               struct mmc_command *cmd;
+               struct mmc_host    *mmc;
+
+               cmd = host->cmd;
+               host->cmd = NULL;
+               mmc_omap_send_abort(host, 10000);
+
+               host->mrq = NULL;
+               mmc = host->mmc;
+               mmc_omap_release_slot(host->current_slot, 1);
+               mmc_request_done(mmc, cmd->mrq);
+       } else
+               mmc_omap_cmd_done(host, host->cmd);
+
+       host->abort = 0;
+       enable_irq(host->irq);
+}
+
+static void
+mmc_omap_cmd_timer(unsigned long data)
+{
+       struct mmc_omap_host *host = (struct mmc_omap_host *) data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&host->slot_lock, flags);
+       if (host->cmd != NULL && !host->abort) {
+               OMAP_MMC_WRITE(host, IE, 0);
+               disable_irq(host->irq);
+               host->abort = 1;
+               schedule_work(&host->cmd_abort_work);
        }
+       spin_unlock_irqrestore(&host->slot_lock, flags);
 }
 
 /* PIO only */
@@ -388,6 +655,14 @@ mmc_omap_sg_to_buf(struct mmc_omap_host *host)
                host->buffer_bytes_left = host->total_bytes_left;
 }
 
+static void
+mmc_omap_clk_timer(unsigned long data)
+{
+       struct mmc_omap_host *host = (struct mmc_omap_host *) data;
+
+       mmc_omap_fclk_enable(host, 0);
+}
+
 /* PIO only */
 static void
 mmc_omap_xfer_data(struct mmc_omap_host *host, int write)
@@ -436,11 +711,12 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
        u16 status;
        int end_command;
        int end_transfer;
-       int transfer_error;
+       int transfer_error, cmd_error;
 
        if (host->cmd == NULL && host->data == NULL) {
                status = OMAP_MMC_READ(host, STAT);
-               dev_info(mmc_dev(host->mmc),"spurious irq 0x%04x\n", status);
+               dev_info(mmc_dev(host->slots[0]->mmc),
+                        "Spurious IRQ 0x%04x\n", status);
                if (status != 0) {
                        OMAP_MMC_WRITE(host, STAT, status);
                        OMAP_MMC_WRITE(host, IE, 0);
@@ -451,12 +727,19 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
        end_command = 0;
        end_transfer = 0;
        transfer_error = 0;
+       cmd_error = 0;
 
        while ((status = OMAP_MMC_READ(host, STAT)) != 0) {
+               int cmd;
+
                OMAP_MMC_WRITE(host, STAT, status);
+               if (host->cmd != NULL)
+                       cmd = host->cmd->opcode;
+               else
+                       cmd = -1;
 #ifdef CONFIG_MMC_DEBUG
                dev_dbg(mmc_dev(host->mmc), "MMC IRQ %04x (CMD %d): ",
-                       status, host->cmd != NULL ? host->cmd->opcode : -1);
+                       status, cmd);
                mmc_omap_report_irq(status);
                printk("\n");
 #endif
@@ -468,12 +751,12 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
                                mmc_omap_xfer_data(host, 1);
                }
 
-               if (status & OMAP_MMC_STAT_END_OF_DATA) {
+               if (status & OMAP_MMC_STAT_END_OF_DATA)
                        end_transfer = 1;
-               }
 
                if (status & OMAP_MMC_STAT_DATA_TOUT) {
-                       dev_dbg(mmc_dev(host->mmc), "data timeout\n");
+                       dev_dbg(mmc_dev(host->mmc), "data timeout (CMD%d)\n",
+                               cmd);
                        if (host->data) {
                                host->data->error = -ETIMEDOUT;
                                transfer_error = 1;
@@ -495,17 +778,16 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
                if (status & OMAP_MMC_STAT_CMD_TOUT) {
                        /* Timeouts are routine with some commands */
                        if (host->cmd) {
-                               if (host->cmd->opcode != MMC_ALL_SEND_CID &&
-                                               host->cmd->opcode !=
-                                               MMC_SEND_OP_COND &&
-                                               host->cmd->opcode !=
-                                               MMC_APP_CMD &&
-                                               !mmc_omap_cover_is_open(host))
+                               struct mmc_omap_slot *slot =
+                                       host->current_slot;
+                               if (slot == NULL ||
+                                   !mmc_omap_cover_is_open(slot))
                                        dev_err(mmc_dev(host->mmc),
-                                               "command timeout, CMD %d\n",
-                                               host->cmd->opcode);
+                                               "command timeout (CMD%d)\n",
+                                               cmd);
                                host->cmd->error = -ETIMEDOUT;
                                end_command = 1;
+                               cmd_error = 1;
                        }
                }
 
@@ -513,9 +795,10 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
                        if (host->cmd) {
                                dev_err(mmc_dev(host->mmc),
                                        "command CRC error (CMD%d, arg 0x%08x)\n",
-                                       host->cmd->opcode, host->cmd->arg);
+                                       cmd, host->cmd->arg);
                                host->cmd->error = -EILSEQ;
                                end_command = 1;
+                               cmd_error = 1;
                        } else
                                dev_err(mmc_dev(host->mmc),
                                        "command CRC error without cmd?\n");
@@ -524,13 +807,13 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
                if (status & OMAP_MMC_STAT_CARD_ERR) {
                        dev_dbg(mmc_dev(host->mmc),
                                "ignoring card status error (CMD%d)\n",
-                               host->cmd->opcode);
+                               cmd);
                        end_command = 1;
                }
 
                /*
                 * NOTE: On 1610 the END_OF_CMD may come too early when
-                * starting a write 
+                * starting a write
                 */
                if ((status & OMAP_MMC_STAT_END_OF_CMD) &&
                    (!(status & OMAP_MMC_STAT_A_EMPTY))) {
@@ -538,63 +821,72 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
                }
        }
 
-       if (end_command) {
+       if (cmd_error && host->data) {
+               del_timer(&host->cmd_abort_timer);
+               host->abort = 1;
+               OMAP_MMC_WRITE(host, IE, 0);
+               disable_irq(host->irq);
+               schedule_work(&host->cmd_abort_work);
+               return IRQ_HANDLED;
+       }
+
+       if (end_command)
                mmc_omap_cmd_done(host, host->cmd);
+       if (host->data != NULL) {
+               if (transfer_error)
+                       mmc_omap_xfer_done(host, host->data);
+               else if (end_transfer)
+                       mmc_omap_end_of_data(host, host->data);
        }
-       if (transfer_error)
-               mmc_omap_xfer_done(host, host->data);
-       else if (end_transfer)
-               mmc_omap_end_of_data(host, host->data);
 
        return IRQ_HANDLED;
 }
 
-static irqreturn_t mmc_omap_switch_irq(int irq, void *dev_id)
+void omap_mmc_notify_cover_event(struct device *dev, int num, int is_closed)
 {
-       struct mmc_omap_host *host = (struct mmc_omap_host *) dev_id;
+       int cover_open;
+       struct mmc_omap_host *host = dev_get_drvdata(dev);
+       struct mmc_omap_slot *slot = host->slots[num];
 
-       schedule_work(&host->switch_work);
+       BUG_ON(num >= host->nr_slots);
 
-       return IRQ_HANDLED;
+       /* Other subsystems can call in here before we're initialised. */
+       if (host->nr_slots == 0 || !host->slots[num])
+               return;
+
+       cover_open = mmc_omap_cover_is_open(slot);
+       if (cover_open != slot->cover_open) {
+               slot->cover_open = cover_open;
+               sysfs_notify(&slot->mmc->class_dev.kobj, NULL, "cover_switch");
+       }
+
+       tasklet_hi_schedule(&slot->cover_tasklet);
 }
 
-static void mmc_omap_switch_timer(unsigned long arg)
+static void mmc_omap_cover_timer(unsigned long arg)
 {
-       struct mmc_omap_host *host = (struct mmc_omap_host *) arg;
-
-       schedule_work(&host->switch_work);
+       struct mmc_omap_slot *slot = (struct mmc_omap_slot *) arg;
+       tasklet_schedule(&slot->cover_tasklet);
 }
 
-static void mmc_omap_switch_handler(struct work_struct *work)
+static void mmc_omap_cover_handler(unsigned long param)
 {
-       struct mmc_omap_host *host = container_of(work, struct mmc_omap_host, switch_work);
-       struct mmc_card *card;
-       static int complained = 0;
-       int cards = 0, cover_open;
+       struct mmc_omap_slot *slot = (struct mmc_omap_slot *)param;
+       int cover_open = mmc_omap_cover_is_open(slot);
 
-       if (host->switch_pin == -1)
+       mmc_detect_change(slot->mmc, 0);
+       if (!cover_open)
                return;
-       cover_open = mmc_omap_cover_is_open(host);
-       if (cover_open != host->switch_last_state) {
-               kobject_uevent(&host->dev->kobj, KOBJ_CHANGE);
-               host->switch_last_state = cover_open;
-       }
-       mmc_detect_change(host->mmc, 0);
-       list_for_each_entry(card, &host->mmc->cards, node) {
-               if (mmc_card_present(card))
-                       cards++;
-       }
-       if (mmc_omap_cover_is_open(host)) {
-               if (!complained) {
-                       dev_info(mmc_dev(host->mmc), "cover is open\n");
-                       complained = 1;
-               }
-               if (mmc_omap_enable_poll)
-                       mod_timer(&host->switch_timer, jiffies +
-                               msecs_to_jiffies(OMAP_MMC_SWITCH_POLL_DELAY));
-       } else {
-               complained = 0;
-       }
+
+       /*
+        * If no card is inserted, we postpone polling until
+        * the cover has been closed.
+        */
+       if (slot->mmc->card == NULL || !mmc_card_present(slot->mmc->card))
+               return;
+
+       mod_timer(&slot->cover_timer,
+                 jiffies + msecs_to_jiffies(OMAP_MMC_COVER_POLL_DELAY));
 }
 
 /* Prepare to transfer the next segment of a scatterlist */
@@ -765,13 +1057,12 @@ static inline void set_cmd_timeout(struct mmc_omap_host *host, struct mmc_reques
 
 static inline void set_data_timeout(struct mmc_omap_host *host, struct mmc_request *req)
 {
-       int timeout;
+       unsigned int timeout, cycle_ns;
        u16 reg;
 
-       /* Convert ns to clock cycles by assuming 20MHz frequency
-        * 1 cycle at 20MHz = 500 ns
-        */
-       timeout = req->data->timeout_clks + req->data->timeout_ns / 500;
+       cycle_ns = 1000000000 / host->current_slot->fclk_freq;
+       timeout = req->data->timeout_ns / cycle_ns;
+       timeout += req->data->timeout_clks;
 
        /* Check if we need to use timeout multiplier register */
        reg = OMAP_MMC_READ(host, SDIO);
@@ -854,11 +1145,10 @@ mmc_omap_prepare_data(struct mmc_omap_host *host, struct mmc_request *req)
        }
 }
 
-static void mmc_omap_request(struct mmc_host *mmc, struct mmc_request *req)
+static void mmc_omap_start_request(struct mmc_omap_host *host,
+                                  struct mmc_request *req)
 {
-       struct mmc_omap_host *host = mmc_priv(mmc);
-
-       WARN_ON(host->mrq != NULL);
+       BUG_ON(host->mrq != NULL);
 
        host->mrq = req;
 
@@ -867,60 +1157,56 @@ static void mmc_omap_request(struct mmc_host *mmc, struct mmc_request *req)
        mmc_omap_start_command(host, req->cmd);
        if (host->dma_in_use)
                omap_start_dma(host->dma_ch);
+       BUG_ON(irqs_disabled());
 }
 
-static void innovator_fpga_socket_power(int on)
+static void mmc_omap_request(struct mmc_host *mmc, struct mmc_request *req)
 {
-#if defined(CONFIG_MACH_OMAP_INNOVATOR) && defined(CONFIG_ARCH_OMAP15XX)
-       if (on) {
-               fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3),
-                    OMAP1510_FPGA_POWER);
-       } else {
-               fpga_write(fpga_read(OMAP1510_FPGA_POWER) & ~(1 << 3),
-                    OMAP1510_FPGA_POWER);
-       }
-#endif
+       struct mmc_omap_slot *slot = mmc_priv(mmc);
+       struct mmc_omap_host *host = slot->host;
+       unsigned long flags;
+
+       spin_lock_irqsave(&host->slot_lock, flags);
+       if (host->mmc != NULL) {
+               BUG_ON(slot->mrq != NULL);
+               slot->mrq = req;
+               spin_unlock_irqrestore(&host->slot_lock, flags);
+               return;
+       } else
+               host->mmc = mmc;
+       spin_unlock_irqrestore(&host->slot_lock, flags);
+       mmc_omap_select_slot(slot, 1);
+       mmc_omap_start_request(host, req);
 }
 
-/*
- * Turn the socket power on/off. Innovator uses FPGA, most boards
- * probably use GPIO.
- */
-static void mmc_omap_power(struct mmc_omap_host *host, int on)
+static void mmc_omap_set_power(struct mmc_omap_slot *slot, int power_on,
+                               int vdd)
 {
-       if (on) {
-               if (machine_is_omap_innovator())
-                       innovator_fpga_socket_power(1);
-               else if (machine_is_omap_h2())
-                       tps65010_set_gpio_out_value(GPIO3, HIGH);
-               else if (machine_is_omap_h3())
-                       /* GPIO 4 of TPS65010 sends SD_EN signal */
-                       tps65010_set_gpio_out_value(GPIO4, HIGH);
-               else if (cpu_is_omap24xx()) {
-                       u16 reg = OMAP_MMC_READ(host, CON);
-                       OMAP_MMC_WRITE(host, CON, reg | (1 << 11));
-               } else
-                       if (host->power_pin >= 0)
-                               omap_set_gpio_dataout(host->power_pin, 1);
-       } else {
-               if (machine_is_omap_innovator())
-                       innovator_fpga_socket_power(0);
-               else if (machine_is_omap_h2())
-                       tps65010_set_gpio_out_value(GPIO3, LOW);
-               else if (machine_is_omap_h3())
-                       tps65010_set_gpio_out_value(GPIO4, LOW);
-               else if (cpu_is_omap24xx()) {
-                       u16 reg = OMAP_MMC_READ(host, CON);
-                       OMAP_MMC_WRITE(host, CON, reg & ~(1 << 11));
-               } else
-                       if (host->power_pin >= 0)
-                               omap_set_gpio_dataout(host->power_pin, 0);
+       struct mmc_omap_host *host;
+
+       host = slot->host;
+
+       if (slot->pdata->set_power != NULL)
+               slot->pdata->set_power(mmc_dev(slot->mmc), slot->id, power_on,
+                                       vdd);
+
+       if (cpu_is_omap24xx()) {
+               u16 w;
+
+               if (power_on) {
+                       w = OMAP_MMC_READ(host, CON);
+                       OMAP_MMC_WRITE(host, CON, w | (1 << 11));
+               } else {
+                       w = OMAP_MMC_READ(host, CON);
+                       OMAP_MMC_WRITE(host, CON, w & ~(1 << 11));
+               }
        }
 }
 
 static int mmc_omap_calc_divisor(struct mmc_host *mmc, struct mmc_ios *ios)
 {
-       struct mmc_omap_host *host = mmc_priv(mmc);
+       struct mmc_omap_slot *slot = mmc_priv(mmc);
+       struct mmc_omap_host *host = slot->host;
        int func_clk_rate = clk_get_rate(host->fclk);
        int dsor;
 
@@ -936,7 +1222,8 @@ static int mmc_omap_calc_divisor(struct mmc_host *mmc, struct mmc_ios *ios)
 
        if (dsor > 250)
                dsor = 250;
-       dsor++;
+
+       slot->fclk_freq = func_clk_rate / dsor;
 
        if (ios->bus_width == MMC_BUS_WIDTH_4)
                dsor |= 1 << 15;
@@ -946,28 +1233,40 @@ static int mmc_omap_calc_divisor(struct mmc_host *mmc, struct mmc_ios *ios)
 
 static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
-       struct mmc_omap_host *host = mmc_priv(mmc);
-       int dsor;
-       int i;
+       struct mmc_omap_slot *slot = mmc_priv(mmc);
+       struct mmc_omap_host *host = slot->host;
+       int i, dsor;
+       int clk_enabled;
+
+       mmc_omap_select_slot(slot, 0);
 
        dsor = mmc_omap_calc_divisor(mmc, ios);
-       host->bus_mode = ios->bus_mode;
-       host->hw_bus_mode = host->bus_mode;
 
+       if (ios->vdd != slot->vdd)
+               slot->vdd = ios->vdd;
+
+       clk_enabled = 0;
        switch (ios->power_mode) {
        case MMC_POWER_OFF:
-               mmc_omap_power(host, 0);
+               mmc_omap_set_power(slot, 0, ios->vdd);
                break;
        case MMC_POWER_UP:
                /* Cannot touch dsor yet, just power up MMC */
-               mmc_omap_power(host, 1);
-               return;
+               mmc_omap_set_power(slot, 1, ios->vdd);
+               goto exit;
        case MMC_POWER_ON:
+               mmc_omap_fclk_enable(host, 1);
+               clk_enabled = 1;
                dsor |= 1 << 11;
                break;
        }
 
-       clk_enable(host->fclk);
+       if (slot->bus_mode != ios->bus_mode) {
+               if (slot->pdata->set_bus_mode != NULL)
+                       slot->pdata->set_bus_mode(mmc_dev(mmc), slot->id,
+                                                 ios->bus_mode);
+               slot->bus_mode = ios->bus_mode;
+       }
 
        /* On insanely high arm_per frequencies something sometimes
         * goes somehow out of sync, and the POW bit is not being set,
@@ -975,43 +1274,143 @@ static void mmc_omap_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
         * Writing to the CON register twice seems to do the trick. */
        for (i = 0; i < 2; i++)
                OMAP_MMC_WRITE(host, CON, dsor);
+       slot->saved_con = dsor;
        if (ios->power_mode == MMC_POWER_ON) {
+               /* worst case at 400kHz, 80 cycles makes 200 microsecs */
+               int usecs = 250;
+
                /* Send clock cycles, poll completion */
                OMAP_MMC_WRITE(host, IE, 0);
                OMAP_MMC_WRITE(host, STAT, 0xffff);
                OMAP_MMC_WRITE(host, CMD, 1 << 7);
-               while ((OMAP_MMC_READ(host, STAT) & 1) == 0);
+               while (usecs > 0 && (OMAP_MMC_READ(host, STAT) & 1) == 0) {
+                       udelay(1);
+                       usecs--;
+               }
                OMAP_MMC_WRITE(host, STAT, 1);
        }
-       clk_disable(host->fclk);
-}
-
-static int mmc_omap_get_ro(struct mmc_host *mmc)
-{
-       struct mmc_omap_host *host = mmc_priv(mmc);
 
-       return host->wp_pin && omap_get_gpio_datain(host->wp_pin);
+exit:
+       mmc_omap_release_slot(slot, clk_enabled);
 }
 
 static const struct mmc_host_ops mmc_omap_ops = {
        .request        = mmc_omap_request,
        .set_ios        = mmc_omap_set_ios,
-       .get_ro         = mmc_omap_get_ro,
 };
 
-static int __init mmc_omap_probe(struct platform_device *pdev)
+static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id)
 {
-       struct omap_mmc_conf *minfo = pdev->dev.platform_data;
+       struct mmc_omap_slot *slot = NULL;
        struct mmc_host *mmc;
+       int r;
+
+       mmc = mmc_alloc_host(sizeof(struct mmc_omap_slot), host->dev);
+       if (mmc == NULL)
+               return -ENOMEM;
+
+       slot = mmc_priv(mmc);
+       slot->host = host;
+       slot->mmc = mmc;
+       slot->id = id;
+       slot->pdata = &host->pdata->slots[id];
+
+       host->slots[id] = slot;
+
+       mmc->caps = MMC_CAP_MULTIWRITE;
+       if (host->pdata->conf.wire4)
+               mmc->caps |= MMC_CAP_4_BIT_DATA;
+
+       mmc->ops = &mmc_omap_ops;
+       mmc->f_min = 400000;
+
+       if (cpu_class_is_omap2())
+               mmc->f_max = 48000000;
+       else
+               mmc->f_max = 24000000;
+       if (host->pdata->max_freq)
+               mmc->f_max = min(host->pdata->max_freq, mmc->f_max);
+       mmc->ocr_avail = slot->pdata->ocr_mask;
+
+       /* Use scatterlist DMA to reduce per-transfer costs.
+        * NOTE max_seg_size assumption that small blocks aren't
+        * normally used (except e.g. for reading SD registers).
+        */
+       mmc->max_phys_segs = 32;
+       mmc->max_hw_segs = 32;
+       mmc->max_blk_size = 2048;       /* BLEN is 11 bits (+1) */
+       mmc->max_blk_count = 2048;      /* NBLK is 11 bits (+1) */
+       mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
+       mmc->max_seg_size = mmc->max_req_size;
+
+       r = mmc_add_host(mmc);
+       if (r < 0)
+               goto err_remove_host;
+
+       if (slot->pdata->name != NULL) {
+               r = device_create_file(&mmc->class_dev,
+                                       &dev_attr_slot_name);
+               if (r < 0)
+                       goto err_remove_host;
+       }
+
+       if (slot->pdata->get_cover_state != NULL) {
+               r = device_create_file(&mmc->class_dev,
+                                       &dev_attr_cover_switch);
+               if (r < 0)
+                       goto err_remove_slot_name;
+
+               setup_timer(&slot->cover_timer, mmc_omap_cover_timer,
+                           (unsigned long)slot);
+               tasklet_init(&slot->cover_tasklet, mmc_omap_cover_handler,
+                            (unsigned long)slot);
+               tasklet_schedule(&slot->cover_tasklet);
+       }
+
+       return 0;
+
+err_remove_slot_name:
+       if (slot->pdata->name != NULL)
+               device_remove_file(&mmc->class_dev, &dev_attr_slot_name);
+err_remove_host:
+       mmc_remove_host(mmc);
+       mmc_free_host(mmc);
+       return r;
+}
+
+static void mmc_omap_remove_slot(struct mmc_omap_slot *slot)
+{
+       struct mmc_host *mmc = slot->mmc;
+
+       if (slot->pdata->name != NULL)
+               device_remove_file(&mmc->class_dev, &dev_attr_slot_name);
+       if (slot->pdata->get_cover_state != NULL)
+               device_remove_file(&mmc->class_dev, &dev_attr_cover_switch);
+
+       tasklet_kill(&slot->cover_tasklet);
+       del_timer_sync(&slot->cover_timer);
+       flush_scheduled_work();
+
+       mmc_remove_host(mmc);
+       mmc_free_host(mmc);
+}
+
+static int __init mmc_omap_probe(struct platform_device *pdev)
+{
+       struct omap_mmc_platform_data *pdata = pdev->dev.platform_data;
        struct mmc_omap_host *host = NULL;
        struct resource *res;
-       int ret = 0;
+       int i, ret = 0;
        int irq;
 
-       if (minfo == NULL) {
+       if (pdata == NULL) {
                dev_err(&pdev->dev, "platform data missing\n");
                return -ENXIO;
        }
+       if (pdata->nr_slots == 0) {
+               dev_err(&pdev->dev, "no slots\n");
+               return -ENXIO;
+       }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        irq = platform_get_irq(pdev, 0);
@@ -1019,28 +1418,46 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
                return -ENXIO;
 
        res = request_mem_region(res->start, res->end - res->start + 1,
-                                pdev->name);
+                                pdev->name);
        if (res == NULL)
                return -EBUSY;
 
-       mmc = mmc_alloc_host(sizeof(struct mmc_omap_host), &pdev->dev);
-       if (mmc == NULL) {
+       host = kzalloc(sizeof(struct mmc_omap_host), GFP_KERNEL);
+       if (host == NULL) {
                ret = -ENOMEM;
                goto err_free_mem_region;
        }
 
-       host = mmc_priv(mmc);
-       host->mmc = mmc;
+       INIT_WORK(&host->slot_release_work, mmc_omap_slot_release_work);
+       INIT_WORK(&host->send_stop_work, mmc_omap_send_stop_work);
+
+       INIT_WORK(&host->cmd_abort_work, mmc_omap_abort_command);
+       setup_timer(&host->cmd_abort_timer, mmc_omap_cmd_timer,
+                   (unsigned long) host);
+
+       spin_lock_init(&host->clk_lock);
+       setup_timer(&host->clk_timer, mmc_omap_clk_timer, (unsigned long) host);
 
        spin_lock_init(&host->dma_lock);
-       init_timer(&host->dma_timer);
-       host->dma_timer.function = mmc_omap_dma_timer;
-       host->dma_timer.data = (unsigned long) host;
+       setup_timer(&host->dma_timer, mmc_omap_dma_timer, (unsigned long) host);
+       spin_lock_init(&host->slot_lock);
+       init_waitqueue_head(&host->slot_wq);
+
+       host->pdata = pdata;
+       host->dev = &pdev->dev;
+       platform_set_drvdata(pdev, host);
 
        host->id = pdev->id;
        host->mem_res = res;
        host->irq = irq;
 
+       host->use_dma = 1;
+       host->dma_ch = -1;
+
+       host->irq = irq;
+       host->phys_base = host->mem_res->start;
+       host->virt_base = (void __iomem *) IO_ADDRESS(host->phys_base);
+
        if (cpu_is_omap24xx()) {
                host->iclk = clk_get(&pdev->dev, "mmc_ick");
                if (IS_ERR(host->iclk))
@@ -1058,109 +1475,34 @@ static int __init mmc_omap_probe(struct platform_device *pdev)
                goto err_free_iclk;
        }
 
-       /* REVISIT:
-        * Also, use minfo->cover to decide how to manage
-        * the card detect sensing.
-        */
-       host->power_pin = minfo->power_pin;
-       host->switch_pin = minfo->switch_pin;
-       host->wp_pin = minfo->wp_pin;
-       host->use_dma = 1;
-       host->dma_ch = -1;
-
-       host->irq = irq;
-       host->phys_base = host->mem_res->start;
-       host->virt_base = (void __iomem *) IO_ADDRESS(host->phys_base);
-
-       mmc->ops = &mmc_omap_ops;
-       mmc->f_min = 400000;
-       mmc->f_max = 24000000;
-       mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
-       mmc->caps = MMC_CAP_MULTIWRITE | MMC_CAP_BYTEBLOCK;
-
-       if (minfo->wire4)
-                mmc->caps |= MMC_CAP_4_BIT_DATA;
-
-       /* Use scatterlist DMA to reduce per-transfer costs.
-        * NOTE max_seg_size assumption that small blocks aren't
-        * normally used (except e.g. for reading SD registers).
-        */
-       mmc->max_phys_segs = 32;
-       mmc->max_hw_segs = 32;
-       mmc->max_blk_size = 2048;       /* BLEN is 11 bits (+1) */
-       mmc->max_blk_count = 2048;      /* NBLK is 11 bits (+1) */
-       mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
-       mmc->max_seg_size = mmc->max_req_size;
-
-       if (host->power_pin >= 0) {
-               if ((ret = omap_request_gpio(host->power_pin)) != 0) {
-                       dev_err(mmc_dev(host->mmc),
-                               "Unable to get GPIO pin for MMC power\n");
-                       goto err_free_fclk;
-               }
-               omap_set_gpio_direction(host->power_pin, 0);
-       }
-
        ret = request_irq(host->irq, mmc_omap_irq, 0, DRIVER_NAME, host);
        if (ret)
-               goto err_free_power_gpio;
+               goto err_free_fclk;
 
-       host->dev = &pdev->dev;
-       platform_set_drvdata(pdev, host);
+       if (pdata->init != NULL) {
+               ret = pdata->init(&pdev->dev);
+               if (ret < 0)
+                       goto err_free_irq;
+       }
 
-       if (host->switch_pin >= 0) {
-               INIT_WORK(&host->switch_work, mmc_omap_switch_handler);
-               init_timer(&host->switch_timer);
-               host->switch_timer.function = mmc_omap_switch_timer;
-               host->switch_timer.data = (unsigned long) host;
-               if (omap_request_gpio(host->switch_pin) != 0) {
-                       dev_warn(mmc_dev(host->mmc), "Unable to get GPIO pin for MMC cover switch\n");
-                       host->switch_pin = -1;
-                       goto no_switch;
-               }
+       host->nr_slots = pdata->nr_slots;
+       for (i = 0; i < pdata->nr_slots; i++) {
+               ret = mmc_omap_new_slot(host, i);
+               if (ret < 0) {
+                       while (--i >= 0)
+                               mmc_omap_remove_slot(host->slots[i]);
 
-               omap_set_gpio_direction(host->switch_pin, 1);
-               ret = request_irq(OMAP_GPIO_IRQ(host->switch_pin),
-                                 mmc_omap_switch_irq, IRQF_TRIGGER_RISING, DRIVER_NAME, host);
-               if (ret) {
-                       dev_warn(mmc_dev(host->mmc), "Unable to get IRQ for MMC cover switch\n");
-                       omap_free_gpio(host->switch_pin);
-                       host->switch_pin = -1;
-                       goto no_switch;
-               }
-               ret = device_create_file(&pdev->dev, &dev_attr_cover_switch);
-               if (ret == 0) {
-                       ret = device_create_file(&pdev->dev, &dev_attr_enable_poll);
-                       if (ret != 0)
-                               device_remove_file(&pdev->dev, &dev_attr_cover_switch);
+                       goto err_plat_cleanup;
                }
-               if (ret) {
-                       dev_warn(mmc_dev(host->mmc), "Unable to create sysfs attributes\n");
-                       free_irq(OMAP_GPIO_IRQ(host->switch_pin), host);
-                       omap_free_gpio(host->switch_pin);
-                       host->switch_pin = -1;
-                       goto no_switch;
-               }
-               if (mmc_omap_enable_poll && mmc_omap_cover_is_open(host))
-                       schedule_work(&host->switch_work);
        }
 
-       mmc_add_host(mmc);
-
        return 0;
 
-no_switch:
-       /* FIXME: Free other resources too. */
-       if (host) {
-               if (host->iclk && !IS_ERR(host->iclk))
-                       clk_put(host->iclk);
-               if (host->fclk && !IS_ERR(host->fclk))
-                       clk_put(host->fclk);
-               mmc_free_host(host->mmc);
-       }
-err_free_power_gpio:
-       if (host->power_pin >= 0)
-               omap_free_gpio(host->power_pin);
+err_plat_cleanup:
+       if (pdata->cleanup)
+               pdata->cleanup(&pdev->dev);
+err_free_irq:
+       free_irq(host->irq, host);
 err_free_fclk:
        clk_put(host->fclk);
 err_free_iclk:
@@ -1169,7 +1511,7 @@ err_free_iclk:
                clk_put(host->iclk);
        }
 err_free_mmc_host:
-       mmc_free_host(host->mmc);
+       kfree(host);
 err_free_mem_region:
        release_mem_region(res->start, res->end - res->start + 1);
        return ret;
@@ -1178,25 +1520,18 @@ err_free_mem_region:
 static int mmc_omap_remove(struct platform_device *pdev)
 {
        struct mmc_omap_host *host = platform_get_drvdata(pdev);
+       int i;
 
        platform_set_drvdata(pdev, NULL);
 
        BUG_ON(host == NULL);
 
-       mmc_remove_host(host->mmc);
-       free_irq(host->irq, host);
+       for (i = 0; i < host->nr_slots; i++)
+               mmc_omap_remove_slot(host->slots[i]);
+
+       if (host->pdata->cleanup)
+               host->pdata->cleanup(&pdev->dev);
 
-       if (host->power_pin >= 0)
-               omap_free_gpio(host->power_pin);
-       if (host->switch_pin >= 0) {
-               device_remove_file(&pdev->dev, &dev_attr_enable_poll);
-               device_remove_file(&pdev->dev, &dev_attr_cover_switch);
-               free_irq(OMAP_GPIO_IRQ(host->switch_pin), host);
-               omap_free_gpio(host->switch_pin);
-               host->switch_pin = -1;
-               del_timer_sync(&host->switch_timer);
-               flush_scheduled_work();
-       }
        if (host->iclk && !IS_ERR(host->iclk))
                clk_put(host->iclk);
        if (host->fclk && !IS_ERR(host->fclk))
@@ -1205,7 +1540,7 @@ static int mmc_omap_remove(struct platform_device *pdev)
        release_mem_region(pdev->resource[0].start,
                           pdev->resource[0].end - pdev->resource[0].start + 1);
 
-       mmc_free_host(host->mmc);
+       kfree(host);
 
        return 0;
 }
@@ -1213,35 +1548,47 @@ static int mmc_omap_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM
 static int mmc_omap_suspend(struct platform_device *pdev, pm_message_t mesg)
 {
-       int ret = 0;
+       int i, ret = 0;
        struct mmc_omap_host *host = platform_get_drvdata(pdev);
 
-       if (host && host->suspended)
+       if (host == NULL || host->suspended)
                return 0;
 
-       if (host) {
-               ret = mmc_suspend_host(host->mmc, mesg);
-               if (ret == 0)
-                       host->suspended = 1;
+       for (i = 0; i < host->nr_slots; i++) {
+               struct mmc_omap_slot *slot;
+
+               slot = host->slots[i];
+               ret = mmc_suspend_host(slot->mmc, mesg);
+               if (ret < 0) {
+                       while (--i >= 0) {
+                               slot = host->slots[i];
+                               mmc_resume_host(slot->mmc);
+                       }
+                       return ret;
+               }
        }
-       return ret;
+       host->suspended = 1;
+       return 0;
 }
 
 static int mmc_omap_resume(struct platform_device *pdev)
 {
-       int ret = 0;
+       int i, ret = 0;
        struct mmc_omap_host *host = platform_get_drvdata(pdev);
 
-       if (host && !host->suspended)
+       if (host == NULL || !host->suspended)
                return 0;
 
-       if (host) {
-               ret = mmc_resume_host(host->mmc);
-               if (ret == 0)
-                       host->suspended = 0;
-       }
+       for (i = 0; i < host->nr_slots; i++) {
+               struct mmc_omap_slot *slot;
+               slot = host->slots[i];
+               ret = mmc_resume_host(slot->mmc);
+               if (ret < 0)
+                       return ret;
 
-       return ret;
+               host->suspended = 0;
+       }
+       return 0;
 }
 #else
 #define mmc_omap_suspend       NULL
index 4b673aa2dc3cae7a7e588e1d306e59437848f54f..07c2048b230ba0ec37d8ca3d140921162ae96253 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  linux/drivers/mmc/host/sdhci.c - Secure Digital Host Controller Interface driver
  *
- *  Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
+ *  Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,6 +19,8 @@
 #include <linux/dma-mapping.h>
 #include <linux/scatterlist.h>
 
+#include <linux/leds.h>
+
 #include <linux/mmc/host.h>
 
 #include "sdhci.h"
 
 static unsigned int debug_quirks = 0;
 
-/* For multi controllers in one platform case */
-static u16 chip_index = 0;
-static spinlock_t index_lock;
-
 /*
  * Different quirks to handle when the hardware deviates from a strict
  * interpretation of the SDHCI specification.
@@ -43,7 +41,7 @@ static spinlock_t index_lock;
 #define SDHCI_QUIRK_CLOCK_BEFORE_RESET                 (1<<0)
 /* Controller has bad caps bits, but really supports DMA */
 #define SDHCI_QUIRK_FORCE_DMA                          (1<<1)
-/* Controller doesn't like some resets when there is no card inserted. */
+/* Controller doesn't like to be reset when there is no card inserted. */
 #define SDHCI_QUIRK_NO_CARD_NO_RESET                   (1<<2)
 /* Controller doesn't like clearing the power reg before a change */
 #define SDHCI_QUIRK_SINGLE_POWER_WRITE                 (1<<3)
@@ -71,12 +69,20 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
        {
                .vendor         = PCI_VENDOR_ID_RICOH,
                .device         = PCI_DEVICE_ID_RICOH_R5C822,
-               .subvendor      = PCI_ANY_ID,
+               .subvendor      = PCI_VENDOR_ID_SAMSUNG,
                .subdevice      = PCI_ANY_ID,
                .driver_data    = SDHCI_QUIRK_FORCE_DMA |
                                  SDHCI_QUIRK_NO_CARD_NO_RESET,
        },
 
+       {
+               .vendor         = PCI_VENDOR_ID_RICOH,
+               .device         = PCI_DEVICE_ID_RICOH_R5C822,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .driver_data    = SDHCI_QUIRK_FORCE_DMA,
+       },
+
        {
                .vendor         = PCI_VENDOR_ID_TI,
                .device         = PCI_DEVICE_ID_TI_XX21_XX11_SD,
@@ -256,6 +262,24 @@ static void sdhci_deactivate_led(struct sdhci_host *host)
        writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);
 }
 
+#ifdef CONFIG_LEDS_CLASS
+static void sdhci_led_control(struct led_classdev *led,
+       enum led_brightness brightness)
+{
+       struct sdhci_host *host = container_of(led, struct sdhci_host, led);
+       unsigned long flags;
+
+       spin_lock_irqsave(&host->lock, flags);
+
+       if (brightness == LED_OFF)
+               sdhci_deactivate_led(host);
+       else
+               sdhci_activate_led(host);
+
+       spin_unlock_irqrestore(&host->lock, flags);
+}
+#endif
+
 /*****************************************************************************\
  *                                                                           *
  * Core functions                                                            *
@@ -773,7 +797,9 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
 
        WARN_ON(host->mrq != NULL);
 
+#ifndef CONFIG_LEDS_CLASS
        sdhci_activate_led(host);
+#endif
 
        host->mrq = mrq;
 
@@ -965,7 +991,9 @@ static void sdhci_tasklet_finish(unsigned long param)
        host->cmd = NULL;
        host->data = NULL;
 
+#ifndef CONFIG_LEDS_CLASS
        sdhci_deactivate_led(host);
+#endif
 
        mmiowb();
        spin_unlock_irqrestore(&host->lock, flags);
@@ -1105,7 +1133,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
                goto out;
        }
 
-       DBG("*** %s got interrupt: 0x%08x\n", host->slot_descr, intmask);
+       DBG("*** %s got interrupt: 0x%08x\n",
+               mmc_hostname(host->mmc), intmask);
 
        if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) {
                writel(intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE),
@@ -1235,7 +1264,7 @@ static int sdhci_resume (struct pci_dev *pdev)
                if (chip->hosts[i]->flags & SDHCI_USE_DMA)
                        pci_set_master(pdev);
                ret = request_irq(chip->hosts[i]->irq, sdhci_irq,
-                       IRQF_SHARED, chip->hosts[i]->slot_descr,
+                       IRQF_SHARED, mmc_hostname(chip->hosts[i]->mmc),
                        chip->hosts[i]);
                if (ret)
                        return ret;
@@ -1324,9 +1353,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
 
        DBG("slot %d at 0x%08lx, irq %d\n", slot, host->addr, host->irq);
 
-       snprintf(host->slot_descr, 20, "sdhc%d:slot%d", chip->index, slot);
-
-       ret = pci_request_region(pdev, host->bar, host->slot_descr);
+       ret = pci_request_region(pdev, host->bar, mmc_hostname(mmc));
        if (ret)
                goto free;
 
@@ -1343,7 +1370,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
        version = (version & SDHCI_SPEC_VER_MASK) >> SDHCI_SPEC_VER_SHIFT;
        if (version > 1) {
                printk(KERN_ERR "%s: Unknown controller version (%d). "
-                       "You may experience problems.\n", host->slot_descr,
+                       "You may experience problems.\n", mmc_hostname(mmc),
                        version);
        }
 
@@ -1366,13 +1393,13 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
                (host->flags & SDHCI_USE_DMA)) {
                printk(KERN_WARNING "%s: Will use DMA "
                        "mode even though HW doesn't fully "
-                       "claim to support it.\n", host->slot_descr);
+                       "claim to support it.\n", mmc_hostname(mmc));
        }
 
        if (host->flags & SDHCI_USE_DMA) {
                if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
                        printk(KERN_WARNING "%s: No suitable DMA available. "
-                               "Falling back to PIO.\n", host->slot_descr);
+                               "Falling back to PIO.\n", mmc_hostname(mmc));
                        host->flags &= ~SDHCI_USE_DMA;
                }
        }
@@ -1386,7 +1413,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
                (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT;
        if (host->max_clk == 0) {
                printk(KERN_ERR "%s: Hardware doesn't specify base clock "
-                       "frequency.\n", host->slot_descr);
+                       "frequency.\n", mmc_hostname(mmc));
                ret = -ENODEV;
                goto unmap;
        }
@@ -1396,7 +1423,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
                (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
        if (host->timeout_clk == 0) {
                printk(KERN_ERR "%s: Hardware doesn't specify timeout clock "
-                       "frequency.\n", host->slot_descr);
+                       "frequency.\n", mmc_hostname(mmc));
                ret = -ENODEV;
                goto unmap;
        }
@@ -1424,7 +1451,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
 
        if (mmc->ocr_avail == 0) {
                printk(KERN_ERR "%s: Hardware doesn't report any "
-                       "support voltages.\n", host->slot_descr);
+                       "support voltages.\n", mmc_hostname(mmc));
                ret = -ENODEV;
                goto unmap;
        }
@@ -1458,8 +1485,8 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
         */
        mmc->max_blk_size = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT;
        if (mmc->max_blk_size >= 3) {
-               printk(KERN_WARNING "%s: Invalid maximum block size, assuming 512\n",
-                       host->slot_descr);
+               printk(KERN_WARNING "%s: Invalid maximum block size, "
+                       "assuming 512 bytes\n", mmc_hostname(mmc));
                mmc->max_blk_size = 512;
        } else
                mmc->max_blk_size = 512 << mmc->max_blk_size;
@@ -1480,7 +1507,7 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
        setup_timer(&host->timer, sdhci_timeout_timer, (unsigned long)host);
 
        ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED,
-               host->slot_descr, host);
+               mmc_hostname(mmc), host);
        if (ret)
                goto untasklet;
 
@@ -1490,16 +1517,32 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
        sdhci_dumpregs(host);
 #endif
 
+#ifdef CONFIG_LEDS_CLASS
+       host->led.name = mmc_hostname(mmc);
+       host->led.brightness = LED_OFF;
+       host->led.default_trigger = mmc_hostname(mmc);
+       host->led.brightness_set = sdhci_led_control;
+
+       ret = led_classdev_register(&pdev->dev, &host->led);
+       if (ret)
+               goto reset;
+#endif
+
        mmiowb();
 
        mmc_add_host(mmc);
 
-       printk(KERN_INFO "%s: SDHCI at 0x%08lx irq %d %s\n", mmc_hostname(mmc),
-               host->addr, host->irq,
+       printk(KERN_INFO "%s: SDHCI at 0x%08lx irq %d %s\n",
+               mmc_hostname(mmc), host->addr, host->irq,
                (host->flags & SDHCI_USE_DMA)?"DMA":"PIO");
 
        return 0;
 
+#ifdef CONFIG_LEDS_CLASS
+reset:
+       sdhci_reset(host, SDHCI_RESET_ALL);
+       free_irq(host->irq, host);
+#endif
 untasklet:
        tasklet_kill(&host->card_tasklet);
        tasklet_kill(&host->finish_tasklet);
@@ -1527,6 +1570,10 @@ static void sdhci_remove_slot(struct pci_dev *pdev, int slot)
 
        mmc_remove_host(mmc);
 
+#ifdef CONFIG_LEDS_CLASS
+       led_classdev_unregister(&host->led);
+#endif
+
        sdhci_reset(host, SDHCI_RESET_ALL);
 
        free_irq(host->irq, host);
@@ -1589,11 +1636,6 @@ static int __devinit sdhci_probe(struct pci_dev *pdev,
        chip->num_slots = slots;
        pci_set_drvdata(pdev, chip);
 
-       /* Add for multi controller case */
-       spin_lock(&index_lock);
-       chip->index = chip_index++;
-       spin_unlock(&index_lock);
-
        for (i = 0;i < slots;i++) {
                ret = sdhci_probe_slot(pdev, i);
                if (ret) {
@@ -1654,8 +1696,6 @@ static int __init sdhci_drv_init(void)
                ": Secure Digital Host Controller Interface driver\n");
        printk(KERN_INFO DRIVER_NAME ": Copyright(c) Pierre Ossman\n");
 
-       spin_lock_init(&index_lock);
-
        return pci_register_driver(&sdhci_driver);
 }
 
index d5a38f1b755ae1855cca9a0d40713fe3a7c77d65..7fb02e177a3d13cd4b3439486b8dfb297bec2756 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  linux/drivers/mmc/host/sdhci.h - Secure Digital Host Controller Interface driver
  *
- *  Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
+ *  Copyright (C) 2005-2008 Pierre Ossman, All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -168,6 +168,10 @@ struct sdhci_host {
        struct sdhci_chip       *chip;
        struct mmc_host         *mmc;           /* MMC structure */
 
+#ifdef CONFIG_LEDS_CLASS
+       struct led_classdev     led;            /* LED control */
+#endif
+
        spinlock_t              lock;           /* Mutex */
 
        int                     flags;          /* Host attributes */
@@ -190,8 +194,6 @@ struct sdhci_host {
        int                     offset;         /* Offset into current sg */
        int                     remain;         /* Bytes left in current */
 
-       char                    slot_descr[20]; /* Name for reservations */
-
        int                     irq;            /* Device IRQ */
        int                     bar;            /* PCI BAR index */
        unsigned long           addr;           /* Bus address */
@@ -208,7 +210,6 @@ struct sdhci_chip {
 
        unsigned long           quirks;
 
-       int                     index;          /* Index for chip0, chip1 ...*/
        int                     num_slots;      /* Slots on controller */
        struct sdhci_host       *hosts[0];      /* Pointers to hosts */
 };
index 028ae38ecc52538038d76051c6862345fe431349..8b18a875867751cc9a95bdf85a9f6f9935b6b68d 100644 (file)
@@ -689,6 +689,7 @@ config ZISOFS
 
 config UDF_FS
        tristate "UDF file system support"
+       select CRC_ITU_T
        help
          This is the new file system used on some CD-ROMs and DVDs. Say Y if
          you intend to mount DVD discs or CDRW's written in packet mode, or
index b5c3b6114add3860febc8b1c20fc9287be5e4f52..853845abcca676889bc854da217082de463e637a 100644 (file)
@@ -62,7 +62,7 @@ config BINFMT_SHARED_FLAT
 config BINFMT_AOUT
        tristate "Kernel support for a.out and ECOFF binaries"
        depends on ARCH_SUPPORTS_AOUT && \
-               (X86_32 || ALPHA || ARM || M68K || SPARC32)
+               (X86_32 || ALPHA || ARM || M68K)
        ---help---
          A.out (Assembler.OUTput) is a set of formats for libraries and
          executables used in the earliest versions of UNIX.  Linux used
index d248e60951bac0ce8d04b19f291e380814f3826c..ca1c9124c8cec014e2c49cc58aaa35903eb5a08c 100644 (file)
@@ -10,6 +10,7 @@ dlm-y :=                      ast.o \
                                midcomms.o \
                                netlink.o \
                                lowcomms.o \
+                               plock.o \
                                rcom.o \
                                recover.o \
                                recoverd.o \
index c3ad1dff3b25bfd673b84a92c64168a70e0dbc31..eac23bd288b202cb6e8b099c6c3e8cdd7a93c687 100644 (file)
@@ -114,7 +114,7 @@ struct cluster_attribute {
 };
 
 static ssize_t cluster_set(struct cluster *cl, unsigned int *cl_field,
-                          unsigned int *info_field, int check_zero,
+                          int *info_field, int check_zero,
                           const char *buf, size_t len)
 {
        unsigned int x;
@@ -284,6 +284,7 @@ struct node {
        struct list_head list; /* space->members */
        int nodeid;
        int weight;
+       int new;
 };
 
 static struct configfs_group_operations clusters_ops = {
@@ -565,6 +566,7 @@ static struct config_item *make_node(struct config_group *g, const char *name)
        config_item_init_type_name(&nd->item, name, &node_type);
        nd->nodeid = -1;
        nd->weight = 1;  /* default weight of 1 if none is set */
+       nd->new = 1;     /* set to 0 once it's been read by dlm_nodeid_list() */
 
        mutex_lock(&sp->members_lock);
        list_add(&nd->list, &sp->members);
@@ -805,12 +807,13 @@ static void put_comm(struct comm *cm)
 }
 
 /* caller must free mem */
-int dlm_nodeid_list(char *lsname, int **ids_out)
+int dlm_nodeid_list(char *lsname, int **ids_out, int *ids_count_out,
+                   int **new_out, int *new_count_out)
 {
        struct space *sp;
        struct node *nd;
-       int i = 0, rv = 0;
-       int *ids;
+       int i = 0, rv = 0, ids_count = 0, new_count = 0;
+       int *ids, *new;
 
        sp = get_space(lsname);
        if (!sp)
@@ -818,23 +821,50 @@ int dlm_nodeid_list(char *lsname, int **ids_out)
 
        mutex_lock(&sp->members_lock);
        if (!sp->members_count) {
-               rv = 0;
+               rv = -EINVAL;
+               printk(KERN_ERR "dlm: zero members_count\n");
                goto out;
        }
 
-       ids = kcalloc(sp->members_count, sizeof(int), GFP_KERNEL);
+       ids_count = sp->members_count;
+
+       ids = kcalloc(ids_count, sizeof(int), GFP_KERNEL);
        if (!ids) {
                rv = -ENOMEM;
                goto out;
        }
 
-       rv = sp->members_count;
-       list_for_each_entry(nd, &sp->members, list)
+       list_for_each_entry(nd, &sp->members, list) {
                ids[i++] = nd->nodeid;
+               if (nd->new)
+                       new_count++;
+       }
+
+       if (ids_count != i)
+               printk(KERN_ERR "dlm: bad nodeid count %d %d\n", ids_count, i);
+
+       if (!new_count)
+               goto out_ids;
+
+       new = kcalloc(new_count, sizeof(int), GFP_KERNEL);
+       if (!new) {
+               kfree(ids);
+               rv = -ENOMEM;
+               goto out;
+       }
 
-       if (rv != i)
-               printk("bad nodeid count %d %d\n", rv, i);
+       i = 0;
+       list_for_each_entry(nd, &sp->members, list) {
+               if (nd->new) {
+                       new[i++] = nd->nodeid;
+                       nd->new = 0;
+               }
+       }
+       *new_count_out = new_count;
+       *new_out = new;
 
+ out_ids:
+       *ids_count_out = ids_count;
        *ids_out = ids;
  out:
        mutex_unlock(&sp->members_lock);
index a3170fe22090589198b21dd6cb7476ff397229ca..4f1d6fce58c5e2ff47cadf83de384e788b2f4756 100644 (file)
@@ -35,7 +35,8 @@ extern struct dlm_config_info dlm_config;
 int dlm_config_init(void);
 void dlm_config_exit(void);
 int dlm_node_weight(char *lsname, int nodeid);
-int dlm_nodeid_list(char *lsname, int **ids_out);
+int dlm_nodeid_list(char *lsname, int **ids_out, int *ids_count_out,
+                   int **new_out, int *new_count_out);
 int dlm_nodeid_to_addr(int nodeid, struct sockaddr_storage *addr);
 int dlm_addr_to_nodeid(struct sockaddr_storage *addr, int *nodeid);
 int dlm_our_nodeid(void);
index 7a8824f475f2c84029f921a1542a90b0eb700fb9..5a7ac33b629cf5db96d6546ee2b394809c4278d3 100644 (file)
@@ -42,8 +42,6 @@
 #include <linux/dlm.h>
 #include "config.h"
 
-#define DLM_LOCKSPACE_LEN      64
-
 /* Size of the temp buffer midcomms allocates on the stack.
    We try to make this large enough so most messages fit.
    FIXME: should sctp make this unnecessary? */
@@ -132,8 +130,10 @@ struct dlm_member {
 
 struct dlm_recover {
        struct list_head        list;
-       int                     *nodeids;
+       int                     *nodeids;   /* nodeids of all members */
        int                     node_count;
+       int                     *new;       /* nodeids of new members */
+       int                     new_count;
        uint64_t                seq;
 };
 
@@ -579,6 +579,8 @@ static inline int dlm_no_directory(struct dlm_ls *ls)
 int dlm_netlink_init(void);
 void dlm_netlink_exit(void);
 void dlm_timeout_warn(struct dlm_lkb *lkb);
+int dlm_plock_init(void);
+void dlm_plock_exit(void);
 
 #ifdef CONFIG_DLM_DEBUG
 int dlm_register_debugfs(void);
index 8f250ac8b92863708db55e1a3853cd71bda3b608..2d3d1027ce2bbdfbc30fef5631b1ce378deaf05e 100644 (file)
@@ -165,7 +165,7 @@ void dlm_print_lkb(struct dlm_lkb *lkb)
               lkb->lkb_grmode, lkb->lkb_wait_type, lkb->lkb_ast_type);
 }
 
-void dlm_print_rsb(struct dlm_rsb *r)
+static void dlm_print_rsb(struct dlm_rsb *r)
 {
        printk(KERN_ERR "rsb: nodeid %d flags %lx first %x rlc %d name %s\n",
               r->res_nodeid, r->res_flags, r->res_first_lkid,
@@ -1956,8 +1956,7 @@ static void confirm_master(struct dlm_rsb *r, int error)
                        list_del_init(&lkb->lkb_rsb_lookup);
                        r->res_first_lkid = lkb->lkb_id;
                        _request_lock(r, lkb);
-               } else
-                       r->res_nodeid = -1;
+               }
                break;
 
        default:
index 05d9c82e646b4485341d769cc48afe34c3f10b8e..88e93c80cc22491202dcd1843f3931678e324b76 100644 (file)
@@ -13,7 +13,6 @@
 #ifndef __LOCK_DOT_H__
 #define __LOCK_DOT_H__
 
-void dlm_print_rsb(struct dlm_rsb *r);
 void dlm_dump_rsb(struct dlm_rsb *r);
 void dlm_print_lkb(struct dlm_lkb *lkb);
 void dlm_receive_message_saved(struct dlm_ls *ls, struct dlm_message *ms);
index 58487fb95a4c258b6e33f38a167460cadfa171be..b80e0aa3cfa534e6ef130dc09bb36454fbbe260d 100644 (file)
@@ -46,10 +46,16 @@ static int __init init_dlm(void)
        if (error)
                goto out_user;
 
+       error = dlm_plock_init();
+       if (error)
+               goto out_netlink;
+
        printk("DLM (built %s %s) installed\n", __DATE__, __TIME__);
 
        return 0;
 
+ out_netlink:
+       dlm_netlink_exit();
  out_user:
        dlm_user_exit();
  out_debug:
@@ -66,6 +72,7 @@ static int __init init_dlm(void)
 
 static void __exit exit_dlm(void)
 {
+       dlm_plock_exit();
        dlm_netlink_exit();
        dlm_user_exit();
        dlm_config_exit();
index fa17f5a278831fa3acf3977930fae7fcc63af2df..26133f05ae3a7690911815358ad1f350343564b6 100644 (file)
@@ -210,6 +210,23 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out)
                }
        }
 
+       /* Add an entry to ls_nodes_gone for members that were removed and
+          then added again, so that previous state for these nodes will be
+          cleared during recovery. */
+
+       for (i = 0; i < rv->new_count; i++) {
+               if (!dlm_is_member(ls, rv->new[i]))
+                       continue;
+               log_debug(ls, "new nodeid %d is a re-added member", rv->new[i]);
+
+               memb = kzalloc(sizeof(struct dlm_member), GFP_KERNEL);
+               if (!memb)
+                       return -ENOMEM;
+               memb->nodeid = rv->new[i];
+               list_add_tail(&memb->list, &ls->ls_nodes_gone);
+               neg++;
+       }
+
        /* add new members to ls_nodes */
 
        for (i = 0; i < rv->node_count; i++) {
@@ -314,15 +331,16 @@ int dlm_ls_stop(struct dlm_ls *ls)
 int dlm_ls_start(struct dlm_ls *ls)
 {
        struct dlm_recover *rv = NULL, *rv_old;
-       int *ids = NULL;
-       int error, count;
+       int *ids = NULL, *new = NULL;
+       int error, ids_count = 0, new_count = 0;
 
        rv = kzalloc(sizeof(struct dlm_recover), GFP_KERNEL);
        if (!rv)
                return -ENOMEM;
 
-       error = count = dlm_nodeid_list(ls->ls_name, &ids);
-       if (error <= 0)
+       error = dlm_nodeid_list(ls->ls_name, &ids, &ids_count,
+                               &new, &new_count);
+       if (error < 0)
                goto fail;
 
        spin_lock(&ls->ls_recover_lock);
@@ -337,14 +355,19 @@ int dlm_ls_start(struct dlm_ls *ls)
        }
 
        rv->nodeids = ids;
-       rv->node_count = count;
+       rv->node_count = ids_count;
+       rv->new = new;
+       rv->new_count = new_count;
        rv->seq = ++ls->ls_recover_seq;
        rv_old = ls->ls_recover_args;
        ls->ls_recover_args = rv;
        spin_unlock(&ls->ls_recover_lock);
 
        if (rv_old) {
+               log_error(ls, "unused recovery %llx %d",
+                         (unsigned long long)rv_old->seq, rv_old->node_count);
                kfree(rv_old->nodeids);
+               kfree(rv_old->new);
                kfree(rv_old);
        }
 
@@ -354,6 +377,7 @@ int dlm_ls_start(struct dlm_ls *ls)
  fail:
        kfree(rv);
        kfree(ids);
+       kfree(new);
        return error;
 }
 
diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c
new file mode 100644 (file)
index 0000000..d6d6e37
--- /dev/null
@@ -0,0 +1,439 @@
+/*
+ * Copyright (C) 2005-2008 Red Hat, Inc.  All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU General Public License version 2.
+ */
+
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <linux/poll.h>
+#include <linux/dlm.h>
+#include <linux/dlm_plock.h>
+
+#include "dlm_internal.h"
+#include "lockspace.h"
+
+static spinlock_t ops_lock;
+static struct list_head send_list;
+static struct list_head recv_list;
+static wait_queue_head_t send_wq;
+static wait_queue_head_t recv_wq;
+
+struct plock_op {
+       struct list_head list;
+       int done;
+       struct dlm_plock_info info;
+};
+
+struct plock_xop {
+       struct plock_op xop;
+       void *callback;
+       void *fl;
+       void *file;
+       struct file_lock flc;
+};
+
+
+static inline void set_version(struct dlm_plock_info *info)
+{
+       info->version[0] = DLM_PLOCK_VERSION_MAJOR;
+       info->version[1] = DLM_PLOCK_VERSION_MINOR;
+       info->version[2] = DLM_PLOCK_VERSION_PATCH;
+}
+
+static int check_version(struct dlm_plock_info *info)
+{
+       if ((DLM_PLOCK_VERSION_MAJOR != info->version[0]) ||
+           (DLM_PLOCK_VERSION_MINOR < info->version[1])) {
+               log_print("plock device version mismatch: "
+                         "kernel (%u.%u.%u), user (%u.%u.%u)",
+                         DLM_PLOCK_VERSION_MAJOR,
+                         DLM_PLOCK_VERSION_MINOR,
+                         DLM_PLOCK_VERSION_PATCH,
+                         info->version[0],
+                         info->version[1],
+                         info->version[2]);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static void send_op(struct plock_op *op)
+{
+       set_version(&op->info);
+       INIT_LIST_HEAD(&op->list);
+       spin_lock(&ops_lock);
+       list_add_tail(&op->list, &send_list);
+       spin_unlock(&ops_lock);
+       wake_up(&send_wq);
+}
+
+int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+                  int cmd, struct file_lock *fl)
+{
+       struct dlm_ls *ls;
+       struct plock_op *op;
+       struct plock_xop *xop;
+       int rv;
+
+       ls = dlm_find_lockspace_local(lockspace);
+       if (!ls)
+               return -EINVAL;
+
+       xop = kzalloc(sizeof(*xop), GFP_KERNEL);
+       if (!xop) {
+               rv = -ENOMEM;
+               goto out;
+       }
+
+       op = &xop->xop;
+       op->info.optype         = DLM_PLOCK_OP_LOCK;
+       op->info.pid            = fl->fl_pid;
+       op->info.ex             = (fl->fl_type == F_WRLCK);
+       op->info.wait           = IS_SETLKW(cmd);
+       op->info.fsid           = ls->ls_global_id;
+       op->info.number         = number;
+       op->info.start          = fl->fl_start;
+       op->info.end            = fl->fl_end;
+       if (fl->fl_lmops && fl->fl_lmops->fl_grant) {
+               /* fl_owner is lockd which doesn't distinguish
+                  processes on the nfs client */
+               op->info.owner  = (__u64) fl->fl_pid;
+               xop->callback   = fl->fl_lmops->fl_grant;
+               locks_init_lock(&xop->flc);
+               locks_copy_lock(&xop->flc, fl);
+               xop->fl         = fl;
+               xop->file       = file;
+       } else {
+               op->info.owner  = (__u64)(long) fl->fl_owner;
+               xop->callback   = NULL;
+       }
+
+       send_op(op);
+
+       if (xop->callback == NULL)
+               wait_event(recv_wq, (op->done != 0));
+       else {
+               rv = -EINPROGRESS;
+               goto out;
+       }
+
+       spin_lock(&ops_lock);
+       if (!list_empty(&op->list)) {
+               log_error(ls, "dlm_posix_lock: op on list %llx",
+                         (unsigned long long)number);
+               list_del(&op->list);
+       }
+       spin_unlock(&ops_lock);
+
+       rv = op->info.rv;
+
+       if (!rv) {
+               if (posix_lock_file_wait(file, fl) < 0)
+                       log_error(ls, "dlm_posix_lock: vfs lock error %llx",
+                                 (unsigned long long)number);
+       }
+
+       kfree(xop);
+out:
+       dlm_put_lockspace(ls);
+       return rv;
+}
+EXPORT_SYMBOL_GPL(dlm_posix_lock);
+
+/* Returns failure iff a succesful lock operation should be canceled */
+static int dlm_plock_callback(struct plock_op *op)
+{
+       struct file *file;
+       struct file_lock *fl;
+       struct file_lock *flc;
+       int (*notify)(void *, void *, int) = NULL;
+       struct plock_xop *xop = (struct plock_xop *)op;
+       int rv = 0;
+
+       spin_lock(&ops_lock);
+       if (!list_empty(&op->list)) {
+               log_print("dlm_plock_callback: op on list %llx",
+                         (unsigned long long)op->info.number);
+               list_del(&op->list);
+       }
+       spin_unlock(&ops_lock);
+
+       /* check if the following 2 are still valid or make a copy */
+       file = xop->file;
+       flc = &xop->flc;
+       fl = xop->fl;
+       notify = xop->callback;
+
+       if (op->info.rv) {
+               notify(flc, NULL, op->info.rv);
+               goto out;
+       }
+
+       /* got fs lock; bookkeep locally as well: */
+       flc->fl_flags &= ~FL_SLEEP;
+       if (posix_lock_file(file, flc, NULL)) {
+               /*
+                * This can only happen in the case of kmalloc() failure.
+                * The filesystem's own lock is the authoritative lock,
+                * so a failure to get the lock locally is not a disaster.
+                * As long as the fs cannot reliably cancel locks (especially
+                * in a low-memory situation), we're better off ignoring
+                * this failure than trying to recover.
+                */
+               log_print("dlm_plock_callback: vfs lock error %llx file %p fl %p",
+                         (unsigned long long)op->info.number, file, fl);
+       }
+
+       rv = notify(flc, NULL, 0);
+       if (rv) {
+               /* XXX: We need to cancel the fs lock here: */
+               log_print("dlm_plock_callback: lock granted after lock request "
+                         "failed; dangling lock!\n");
+               goto out;
+       }
+
+out:
+       kfree(xop);
+       return rv;
+}
+
+int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+                    struct file_lock *fl)
+{
+       struct dlm_ls *ls;
+       struct plock_op *op;
+       int rv;
+
+       ls = dlm_find_lockspace_local(lockspace);
+       if (!ls)
+               return -EINVAL;
+
+       op = kzalloc(sizeof(*op), GFP_KERNEL);
+       if (!op) {
+               rv = -ENOMEM;
+               goto out;
+       }
+
+       if (posix_lock_file_wait(file, fl) < 0)
+               log_error(ls, "dlm_posix_unlock: vfs unlock error %llx",
+                         (unsigned long long)number);
+
+       op->info.optype         = DLM_PLOCK_OP_UNLOCK;
+       op->info.pid            = fl->fl_pid;
+       op->info.fsid           = ls->ls_global_id;
+       op->info.number         = number;
+       op->info.start          = fl->fl_start;
+       op->info.end            = fl->fl_end;
+       if (fl->fl_lmops && fl->fl_lmops->fl_grant)
+               op->info.owner  = (__u64) fl->fl_pid;
+       else
+               op->info.owner  = (__u64)(long) fl->fl_owner;
+
+       send_op(op);
+       wait_event(recv_wq, (op->done != 0));
+
+       spin_lock(&ops_lock);
+       if (!list_empty(&op->list)) {
+               log_error(ls, "dlm_posix_unlock: op on list %llx",
+                         (unsigned long long)number);
+               list_del(&op->list);
+       }
+       spin_unlock(&ops_lock);
+
+       rv = op->info.rv;
+
+       if (rv == -ENOENT)
+               rv = 0;
+
+       kfree(op);
+out:
+       dlm_put_lockspace(ls);
+       return rv;
+}
+EXPORT_SYMBOL_GPL(dlm_posix_unlock);
+
+int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+                 struct file_lock *fl)
+{
+       struct dlm_ls *ls;
+       struct plock_op *op;
+       int rv;
+
+       ls = dlm_find_lockspace_local(lockspace);
+       if (!ls)
+               return -EINVAL;
+
+       op = kzalloc(sizeof(*op), GFP_KERNEL);
+       if (!op) {
+               rv = -ENOMEM;
+               goto out;
+       }
+
+       op->info.optype         = DLM_PLOCK_OP_GET;
+       op->info.pid            = fl->fl_pid;
+       op->info.ex             = (fl->fl_type == F_WRLCK);
+       op->info.fsid           = ls->ls_global_id;
+       op->info.number         = number;
+       op->info.start          = fl->fl_start;
+       op->info.end            = fl->fl_end;
+       if (fl->fl_lmops && fl->fl_lmops->fl_grant)
+               op->info.owner  = (__u64) fl->fl_pid;
+       else
+               op->info.owner  = (__u64)(long) fl->fl_owner;
+
+       send_op(op);
+       wait_event(recv_wq, (op->done != 0));
+
+       spin_lock(&ops_lock);
+       if (!list_empty(&op->list)) {
+               log_error(ls, "dlm_posix_get: op on list %llx",
+                         (unsigned long long)number);
+               list_del(&op->list);
+       }
+       spin_unlock(&ops_lock);
+
+       /* info.rv from userspace is 1 for conflict, 0 for no-conflict,
+          -ENOENT if there are no locks on the file */
+
+       rv = op->info.rv;
+
+       fl->fl_type = F_UNLCK;
+       if (rv == -ENOENT)
+               rv = 0;
+       else if (rv > 0) {
+               fl->fl_type = (op->info.ex) ? F_WRLCK : F_RDLCK;
+               fl->fl_pid = op->info.pid;
+               fl->fl_start = op->info.start;
+               fl->fl_end = op->info.end;
+               rv = 0;
+       }
+
+       kfree(op);
+out:
+       dlm_put_lockspace(ls);
+       return rv;
+}
+EXPORT_SYMBOL_GPL(dlm_posix_get);
+
+/* a read copies out one plock request from the send list */
+static ssize_t dev_read(struct file *file, char __user *u, size_t count,
+                       loff_t *ppos)
+{
+       struct dlm_plock_info info;
+       struct plock_op *op = NULL;
+
+       if (count < sizeof(info))
+               return -EINVAL;
+
+       spin_lock(&ops_lock);
+       if (!list_empty(&send_list)) {
+               op = list_entry(send_list.next, struct plock_op, list);
+               list_move(&op->list, &recv_list);
+               memcpy(&info, &op->info, sizeof(info));
+       }
+       spin_unlock(&ops_lock);
+
+       if (!op)
+               return -EAGAIN;
+
+       if (copy_to_user(u, &info, sizeof(info)))
+               return -EFAULT;
+       return sizeof(info);
+}
+
+/* a write copies in one plock result that should match a plock_op
+   on the recv list */
+static ssize_t dev_write(struct file *file, const char __user *u, size_t count,
+                        loff_t *ppos)
+{
+       struct dlm_plock_info info;
+       struct plock_op *op;
+       int found = 0;
+
+       if (count != sizeof(info))
+               return -EINVAL;
+
+       if (copy_from_user(&info, u, sizeof(info)))
+               return -EFAULT;
+
+       if (check_version(&info))
+               return -EINVAL;
+
+       spin_lock(&ops_lock);
+       list_for_each_entry(op, &recv_list, list) {
+               if (op->info.fsid == info.fsid && op->info.number == info.number &&
+                   op->info.owner == info.owner) {
+                       list_del_init(&op->list);
+                       found = 1;
+                       op->done = 1;
+                       memcpy(&op->info, &info, sizeof(info));
+                       break;
+               }
+       }
+       spin_unlock(&ops_lock);
+
+       if (found) {
+               struct plock_xop *xop;
+               xop = (struct plock_xop *)op;
+               if (xop->callback)
+                       count = dlm_plock_callback(op);
+               else
+                       wake_up(&recv_wq);
+       } else
+               log_print("dev_write no op %x %llx", info.fsid,
+                         (unsigned long long)info.number);
+       return count;
+}
+
+static unsigned int dev_poll(struct file *file, poll_table *wait)
+{
+       unsigned int mask = 0;
+
+       poll_wait(file, &send_wq, wait);
+
+       spin_lock(&ops_lock);
+       if (!list_empty(&send_list))
+               mask = POLLIN | POLLRDNORM;
+       spin_unlock(&ops_lock);
+
+       return mask;
+}
+
+static const struct file_operations dev_fops = {
+       .read    = dev_read,
+       .write   = dev_write,
+       .poll    = dev_poll,
+       .owner   = THIS_MODULE
+};
+
+static struct miscdevice plock_dev_misc = {
+       .minor = MISC_DYNAMIC_MINOR,
+       .name = DLM_PLOCK_MISC_NAME,
+       .fops = &dev_fops
+};
+
+int dlm_plock_init(void)
+{
+       int rv;
+
+       spin_lock_init(&ops_lock);
+       INIT_LIST_HEAD(&send_list);
+       INIT_LIST_HEAD(&recv_list);
+       init_waitqueue_head(&send_wq);
+       init_waitqueue_head(&recv_wq);
+
+       rv = misc_register(&plock_dev_misc);
+       if (rv)
+               log_print("dlm_plock_init: misc_register failed %d", rv);
+       return rv;
+}
+
+void dlm_plock_exit(void)
+{
+       if (misc_deregister(&plock_dev_misc) < 0)
+               log_print("dlm_plock_exit: misc_deregister failed");
+}
+
index 997f9531d59482ed1d3fecee535d8aada119b302..fd677c8c3d3b041396817bc930bde7e5e5b0be87 100644 (file)
@@ -257,6 +257,7 @@ static void do_ls_recovery(struct dlm_ls *ls)
        if (rv) {
                ls_recover(ls, rv);
                kfree(rv->nodeids);
+               kfree(rv->new);
                kfree(rv);
        }
 }
index 89b93b6b45cfad5af016e35609673b5d7f4f189f..2609bb6cd01300aa744922cb2833eee8bd10723f 100644 (file)
@@ -1,3 +1,3 @@
 obj-$(CONFIG_GFS2_FS_LOCKING_DLM) += lock_dlm.o
-lock_dlm-y := lock.o main.o mount.o sysfs.o thread.o plock.o
+lock_dlm-y := lock.o main.o mount.o sysfs.o thread.o
 
index 58fcf8c5bf39ec15439c8fe2a2ad003ffe90d275..a243cf69c54ed84dbfafe37418f1c0fbf1c784e7 100644 (file)
@@ -25,6 +25,7 @@
 #include <net/sock.h>
 
 #include <linux/dlm.h>
+#include <linux/dlm_plock.h>
 #include <linux/lm_interface.h>
 
 /*
@@ -173,17 +174,6 @@ void gdlm_cancel(void *);
 int gdlm_hold_lvb(void *, char **);
 void gdlm_unhold_lvb(void *, char *);
 
-/* plock.c */
-
-int gdlm_plock_init(void);
-void gdlm_plock_exit(void);
-int gdlm_plock(void *, struct lm_lockname *, struct file *, int,
-               struct file_lock *);
-int gdlm_plock_get(void *, struct lm_lockname *, struct file *,
-               struct file_lock *);
-int gdlm_punlock(void *, struct lm_lockname *, struct file *,
-               struct file_lock *);
-
 /* mount.c */
 
 extern const struct lm_lockops gdlm_ops;
index 36a225850bd8a19adbea438e7e3d6349943cb5ba..b9a03a7ff8012efd53fbba9af7114976fa138500 100644 (file)
@@ -28,13 +28,6 @@ static int __init init_lock_dlm(void)
                return error;
        }
 
-       error = gdlm_plock_init();
-       if (error) {
-               gdlm_sysfs_exit();
-               gfs2_unregister_lockproto(&gdlm_ops);
-               return error;
-       }
-
        printk(KERN_INFO
               "Lock_DLM (built %s %s) installed\n", __DATE__, __TIME__);
        return 0;
@@ -42,7 +35,6 @@ static int __init init_lock_dlm(void)
 
 static void __exit exit_lock_dlm(void)
 {
-       gdlm_plock_exit();
        gdlm_sysfs_exit();
        gfs2_unregister_lockproto(&gdlm_ops);
 }
index f2efff424224dd3e0052284076e679d067e48ad8..470bdf650b500b6dc957c0717fb00a503dec734f 100644 (file)
@@ -236,6 +236,27 @@ static void gdlm_withdraw(void *lockspace)
        gdlm_kobject_release(ls);
 }
 
+static int gdlm_plock(void *lockspace, struct lm_lockname *name,
+              struct file *file, int cmd, struct file_lock *fl)
+{
+       struct gdlm_ls *ls = lockspace;
+       return dlm_posix_lock(ls->dlm_lockspace, name->ln_number, file, cmd, fl);
+}
+
+static int gdlm_punlock(void *lockspace, struct lm_lockname *name,
+                struct file *file, struct file_lock *fl)
+{
+       struct gdlm_ls *ls = lockspace;
+       return dlm_posix_unlock(ls->dlm_lockspace, name->ln_number, file, fl);
+}
+
+static int gdlm_plock_get(void *lockspace, struct lm_lockname *name,
+                  struct file *file, struct file_lock *fl)
+{
+       struct gdlm_ls *ls = lockspace;
+       return dlm_posix_get(ls->dlm_lockspace, name->ln_number, file, fl);
+}
+
 const struct lm_lockops gdlm_ops = {
        .lm_proto_name = "lock_dlm",
        .lm_mount = gdlm_mount,
diff --git a/fs/gfs2/locking/dlm/plock.c b/fs/gfs2/locking/dlm/plock.c
deleted file mode 100644 (file)
index 2ebd374..0000000
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Copyright (C) 2005 Red Hat, Inc.  All rights reserved.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU General Public License version 2.
- */
-
-#include <linux/miscdevice.h>
-#include <linux/lock_dlm_plock.h>
-#include <linux/poll.h>
-
-#include "lock_dlm.h"
-
-
-static spinlock_t ops_lock;
-static struct list_head send_list;
-static struct list_head recv_list;
-static wait_queue_head_t send_wq;
-static wait_queue_head_t recv_wq;
-
-struct plock_op {
-       struct list_head list;
-       int done;
-       struct gdlm_plock_info info;
-};
-
-struct plock_xop {
-       struct plock_op xop;
-       void *callback;
-       void *fl;
-       void *file;
-       struct file_lock flc;
-};
-
-
-static inline void set_version(struct gdlm_plock_info *info)
-{
-       info->version[0] = GDLM_PLOCK_VERSION_MAJOR;
-       info->version[1] = GDLM_PLOCK_VERSION_MINOR;
-       info->version[2] = GDLM_PLOCK_VERSION_PATCH;
-}
-
-static int check_version(struct gdlm_plock_info *info)
-{
-       if ((GDLM_PLOCK_VERSION_MAJOR != info->version[0]) ||
-           (GDLM_PLOCK_VERSION_MINOR < info->version[1])) {
-               log_error("plock device version mismatch: "
-                         "kernel (%u.%u.%u), user (%u.%u.%u)",
-                         GDLM_PLOCK_VERSION_MAJOR,
-                         GDLM_PLOCK_VERSION_MINOR,
-                         GDLM_PLOCK_VERSION_PATCH,
-                         info->version[0],
-                         info->version[1],
-                         info->version[2]);
-               return -EINVAL;
-       }
-       return 0;
-}
-
-static void send_op(struct plock_op *op)
-{
-       set_version(&op->info);
-       INIT_LIST_HEAD(&op->list);
-       spin_lock(&ops_lock);
-       list_add_tail(&op->list, &send_list);
-       spin_unlock(&ops_lock);
-       wake_up(&send_wq);
-}
-
-int gdlm_plock(void *lockspace, struct lm_lockname *name,
-              struct file *file, int cmd, struct file_lock *fl)
-{
-       struct gdlm_ls *ls = lockspace;
-       struct plock_op *op;
-       struct plock_xop *xop;
-       int rv;
-
-       xop = kzalloc(sizeof(*xop), GFP_KERNEL);
-       if (!xop)
-               return -ENOMEM;
-
-       op = &xop->xop;
-       op->info.optype         = GDLM_PLOCK_OP_LOCK;
-       op->info.pid            = fl->fl_pid;
-       op->info.ex             = (fl->fl_type == F_WRLCK);
-       op->info.wait           = IS_SETLKW(cmd);
-       op->info.fsid           = ls->id;
-       op->info.number         = name->ln_number;
-       op->info.start          = fl->fl_start;
-       op->info.end            = fl->fl_end;
-       if (fl->fl_lmops && fl->fl_lmops->fl_grant) {
-               /* fl_owner is lockd which doesn't distinguish
-                  processes on the nfs client */
-               op->info.owner  = (__u64) fl->fl_pid;
-               xop->callback   = fl->fl_lmops->fl_grant;
-               locks_init_lock(&xop->flc);
-               locks_copy_lock(&xop->flc, fl);
-               xop->fl         = fl;
-               xop->file       = file;
-       } else {
-               op->info.owner  = (__u64)(long) fl->fl_owner;
-               xop->callback   = NULL;
-       }
-
-       send_op(op);
-
-       if (xop->callback == NULL)
-               wait_event(recv_wq, (op->done != 0));
-       else
-               return -EINPROGRESS;
-
-       spin_lock(&ops_lock);
-       if (!list_empty(&op->list)) {
-               printk(KERN_INFO "plock op on list\n");
-               list_del(&op->list);
-       }
-       spin_unlock(&ops_lock);
-
-       rv = op->info.rv;
-
-       if (!rv) {
-               if (posix_lock_file_wait(file, fl) < 0)
-                       log_error("gdlm_plock: vfs lock error %x,%llx",
-                                 name->ln_type,
-                                 (unsigned long long)name->ln_number);
-       }
-
-       kfree(xop);
-       return rv;
-}
-
-/* Returns failure iff a succesful lock operation should be canceled */
-static int gdlm_plock_callback(struct plock_op *op)
-{
-       struct file *file;
-       struct file_lock *fl;
-       struct file_lock *flc;
-       int (*notify)(void *, void *, int) = NULL;
-       struct plock_xop *xop = (struct plock_xop *)op;
-       int rv = 0;
-
-       spin_lock(&ops_lock);
-       if (!list_empty(&op->list)) {
-               printk(KERN_INFO "plock op on list\n");
-               list_del(&op->list);
-       }
-       spin_unlock(&ops_lock);
-
-       /* check if the following 2 are still valid or make a copy */
-       file = xop->file;
-       flc = &xop->flc;
-       fl = xop->fl;
-       notify = xop->callback;
-
-       if (op->info.rv) {
-               notify(flc, NULL, op->info.rv);
-               goto out;
-       }
-
-       /* got fs lock; bookkeep locally as well: */
-       flc->fl_flags &= ~FL_SLEEP;
-       if (posix_lock_file(file, flc, NULL)) {
-               /*
-                * This can only happen in the case of kmalloc() failure.
-                * The filesystem's own lock is the authoritative lock,
-                * so a failure to get the lock locally is not a disaster.
-                * As long as GFS cannot reliably cancel locks (especially
-                * in a low-memory situation), we're better off ignoring
-                * this failure than trying to recover.
-                */
-               log_error("gdlm_plock: vfs lock error file %p fl %p",
-                               file, fl);
-       }
-
-       rv = notify(flc, NULL, 0);
-       if (rv) {
-               /* XXX: We need to cancel the fs lock here: */
-               printk("gfs2 lock granted after lock request failed;"
-                                               " dangling lock!\n");
-               goto out;
-       }
-
-out:
-       kfree(xop);
-       return rv;
-}
-
-int gdlm_punlock(void *lockspace, struct lm_lockname *name,
-                struct file *file, struct file_lock *fl)
-{
-       struct gdlm_ls *ls = lockspace;
-       struct plock_op *op;
-       int rv;
-
-       op = kzalloc(sizeof(*op), GFP_KERNEL);
-       if (!op)
-               return -ENOMEM;
-
-       if (posix_lock_file_wait(file, fl) < 0)
-               log_error("gdlm_punlock: vfs unlock error %x,%llx",
-                         name->ln_type, (unsigned long long)name->ln_number);
-
-       op->info.optype         = GDLM_PLOCK_OP_UNLOCK;
-       op->info.pid            = fl->fl_pid;
-       op->info.fsid           = ls->id;
-       op->info.number         = name->ln_number;
-       op->info.start          = fl->fl_start;
-       op->info.end            = fl->fl_end;
-       if (fl->fl_lmops && fl->fl_lmops->fl_grant)
-               op->info.owner  = (__u64) fl->fl_pid;
-       else
-               op->info.owner  = (__u64)(long) fl->fl_owner;
-
-       send_op(op);
-       wait_event(recv_wq, (op->done != 0));
-
-       spin_lock(&ops_lock);
-       if (!list_empty(&op->list)) {
-               printk(KERN_INFO "punlock op on list\n");
-               list_del(&op->list);
-       }
-       spin_unlock(&ops_lock);
-
-       rv = op->info.rv;
-
-       if (rv == -ENOENT)
-               rv = 0;
-
-       kfree(op);
-       return rv;
-}
-
-int gdlm_plock_get(void *lockspace, struct lm_lockname *name,
-                  struct file *file, struct file_lock *fl)
-{
-       struct gdlm_ls *ls = lockspace;
-       struct plock_op *op;
-       int rv;
-
-       op = kzalloc(sizeof(*op), GFP_KERNEL);
-       if (!op)
-               return -ENOMEM;
-
-       op->info.optype         = GDLM_PLOCK_OP_GET;
-       op->info.pid            = fl->fl_pid;
-       op->info.ex             = (fl->fl_type == F_WRLCK);
-       op->info.fsid           = ls->id;
-       op->info.number         = name->ln_number;
-       op->info.start          = fl->fl_start;
-       op->info.end            = fl->fl_end;
-       if (fl->fl_lmops && fl->fl_lmops->fl_grant)
-               op->info.owner  = (__u64) fl->fl_pid;
-       else
-               op->info.owner  = (__u64)(long) fl->fl_owner;
-
-       send_op(op);
-       wait_event(recv_wq, (op->done != 0));
-
-       spin_lock(&ops_lock);
-       if (!list_empty(&op->list)) {
-               printk(KERN_INFO "plock_get op on list\n");
-               list_del(&op->list);
-       }
-       spin_unlock(&ops_lock);
-
-       /* info.rv from userspace is 1 for conflict, 0 for no-conflict,
-          -ENOENT if there are no locks on the file */
-
-       rv = op->info.rv;
-
-       fl->fl_type = F_UNLCK;
-       if (rv == -ENOENT)
-               rv = 0;
-       else if (rv > 0) {
-               fl->fl_type = (op->info.ex) ? F_WRLCK : F_RDLCK;
-               fl->fl_pid = op->info.pid;
-               fl->fl_start = op->info.start;
-               fl->fl_end = op->info.end;
-               rv = 0;
-       }
-
-       kfree(op);
-       return rv;
-}
-
-/* a read copies out one plock request from the send list */
-static ssize_t dev_read(struct file *file, char __user *u, size_t count,
-                       loff_t *ppos)
-{
-       struct gdlm_plock_info info;
-       struct plock_op *op = NULL;
-
-       if (count < sizeof(info))
-               return -EINVAL;
-
-       spin_lock(&ops_lock);
-       if (!list_empty(&send_list)) {
-               op = list_entry(send_list.next, struct plock_op, list);
-               list_move(&op->list, &recv_list);
-               memcpy(&info, &op->info, sizeof(info));
-       }
-       spin_unlock(&ops_lock);
-
-       if (!op)
-               return -EAGAIN;
-
-       if (copy_to_user(u, &info, sizeof(info)))
-               return -EFAULT;
-       return sizeof(info);
-}
-
-/* a write copies in one plock result that should match a plock_op
-   on the recv list */
-static ssize_t dev_write(struct file *file, const char __user *u, size_t count,
-                        loff_t *ppos)
-{
-       struct gdlm_plock_info info;
-       struct plock_op *op;
-       int found = 0;
-
-       if (count != sizeof(info))
-               return -EINVAL;
-
-       if (copy_from_user(&info, u, sizeof(info)))
-               return -EFAULT;
-
-       if (check_version(&info))
-               return -EINVAL;
-
-       spin_lock(&ops_lock);
-       list_for_each_entry(op, &recv_list, list) {
-               if (op->info.fsid == info.fsid && op->info.number == info.number &&
-                   op->info.owner == info.owner) {
-                       list_del_init(&op->list);
-                       found = 1;
-                       op->done = 1;
-                       memcpy(&op->info, &info, sizeof(info));
-                       break;
-               }
-       }
-       spin_unlock(&ops_lock);
-
-       if (found) {
-               struct plock_xop *xop;
-               xop = (struct plock_xop *)op;
-               if (xop->callback)
-                       count = gdlm_plock_callback(op);
-               else
-                       wake_up(&recv_wq);
-       } else
-               printk(KERN_INFO "gdlm dev_write no op %x %llx\n", info.fsid,
-                       (unsigned long long)info.number);
-       return count;
-}
-
-static unsigned int dev_poll(struct file *file, poll_table *wait)
-{
-       unsigned int mask = 0;
-
-       poll_wait(file, &send_wq, wait);
-
-       spin_lock(&ops_lock);
-       if (!list_empty(&send_list))
-               mask = POLLIN | POLLRDNORM;
-       spin_unlock(&ops_lock);
-
-       return mask;
-}
-
-static const struct file_operations dev_fops = {
-       .read    = dev_read,
-       .write   = dev_write,
-       .poll    = dev_poll,
-       .owner   = THIS_MODULE
-};
-
-static struct miscdevice plock_dev_misc = {
-       .minor = MISC_DYNAMIC_MINOR,
-       .name = GDLM_PLOCK_MISC_NAME,
-       .fops = &dev_fops
-};
-
-int gdlm_plock_init(void)
-{
-       int rv;
-
-       spin_lock_init(&ops_lock);
-       INIT_LIST_HEAD(&send_list);
-       INIT_LIST_HEAD(&recv_list);
-       init_waitqueue_head(&send_wq);
-       init_waitqueue_head(&recv_wq);
-
-       rv = misc_register(&plock_dev_misc);
-       if (rv)
-               printk(KERN_INFO "gdlm_plock_init: misc_register failed %d",
-                      rv);
-       return rv;
-}
-
-void gdlm_plock_exit(void)
-{
-       if (misc_deregister(&plock_dev_misc) < 0)
-               printk(KERN_INFO "gdlm_plock_exit: misc_deregister failed");
-}
-
index be845e7540ef07d39f78bab7bb7abedf53718ded..0d4503f7446dcb5e8bb3a8441fd83537284de838 100644 (file)
@@ -6,4 +6,4 @@ obj-$(CONFIG_UDF_FS) += udf.o
 
 udf-objs     := balloc.o dir.o file.o ialloc.o inode.o lowlevel.o namei.o \
                partition.o super.o truncate.o symlink.o fsync.o \
-               crc.o directory.o misc.o udftime.o unicode.o
+               directory.o misc.o udftime.o unicode.o
index f855dcbbdfb854e1704566ae0cebd187c656c45f..1b809bd494bd098a0a7855ba10f300f66a08d46a 100644 (file)
@@ -149,8 +149,7 @@ static bool udf_add_free_space(struct udf_sb_info *sbi,
                return false;
 
        lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data;
-       lvid->freeSpaceTable[partition] = cpu_to_le32(le32_to_cpu(
-                                       lvid->freeSpaceTable[partition]) + cnt);
+       le32_add_cpu(&lvid->freeSpaceTable[partition], cnt);
        return true;
 }
 
@@ -589,10 +588,8 @@ static void udf_table_free_blocks(struct super_block *sb,
                                        sptr = oepos.bh->b_data + epos.offset;
                                        aed = (struct allocExtDesc *)
                                                oepos.bh->b_data;
-                                       aed->lengthAllocDescs =
-                                               cpu_to_le32(le32_to_cpu(
-                                                       aed->lengthAllocDescs) +
-                                                               adsize);
+                                       le32_add_cpu(&aed->lengthAllocDescs,
+                                                       adsize);
                                } else {
                                        sptr = iinfo->i_ext.i_data +
                                                                epos.offset;
@@ -645,9 +642,7 @@ static void udf_table_free_blocks(struct super_block *sb,
                                mark_inode_dirty(table);
                        } else {
                                aed = (struct allocExtDesc *)epos.bh->b_data;
-                               aed->lengthAllocDescs =
-                                       cpu_to_le32(le32_to_cpu(
-                                           aed->lengthAllocDescs) + adsize);
+                               le32_add_cpu(&aed->lengthAllocDescs, adsize);
                                udf_update_tag(epos.bh->b_data, epos.offset);
                                mark_buffer_dirty(epos.bh);
                        }
diff --git a/fs/udf/crc.c b/fs/udf/crc.c
deleted file mode 100644 (file)
index b166129..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * crc.c
- *
- * PURPOSE
- *     Routines to generate, calculate, and test a 16-bit CRC.
- *
- * DESCRIPTION
- *     The CRC code was devised by Don P. Mitchell of AT&T Bell Laboratories
- *     and Ned W. Rhodes of Software Systems Group. It has been published in
- *     "Design and Validation of Computer Protocols", Prentice Hall,
- *     Englewood Cliffs, NJ, 1991, Chapter 3, ISBN 0-13-539925-4.
- *
- *     Copyright is held by AT&T.
- *
- *     AT&T gives permission for the free use of the CRC source code.
- *
- * COPYRIGHT
- *     This file is distributed under the terms of the GNU General Public
- *     License (GPL). Copies of the GPL can be obtained from:
- *             ftp://prep.ai.mit.edu/pub/gnu/GPL
- *     Each contributing author retains all rights to their own work.
- */
-
-#include "udfdecl.h"
-
-static uint16_t crc_table[256] = {
-       0x0000U, 0x1021U, 0x2042U, 0x3063U, 0x4084U, 0x50a5U, 0x60c6U, 0x70e7U,
-       0x8108U, 0x9129U, 0xa14aU, 0xb16bU, 0xc18cU, 0xd1adU, 0xe1ceU, 0xf1efU,
-       0x1231U, 0x0210U, 0x3273U, 0x2252U, 0x52b5U, 0x4294U, 0x72f7U, 0x62d6U,
-       0x9339U, 0x8318U, 0xb37bU, 0xa35aU, 0xd3bdU, 0xc39cU, 0xf3ffU, 0xe3deU,
-       0x2462U, 0x3443U, 0x0420U, 0x1401U, 0x64e6U, 0x74c7U, 0x44a4U, 0x5485U,
-       0xa56aU, 0xb54bU, 0x8528U, 0x9509U, 0xe5eeU, 0xf5cfU, 0xc5acU, 0xd58dU,
-       0x3653U, 0x2672U, 0x1611U, 0x0630U, 0x76d7U, 0x66f6U, 0x5695U, 0x46b4U,
-       0xb75bU, 0xa77aU, 0x9719U, 0x8738U, 0xf7dfU, 0xe7feU, 0xd79dU, 0xc7bcU,
-       0x48c4U, 0x58e5U, 0x6886U, 0x78a7U, 0x0840U, 0x1861U, 0x2802U, 0x3823U,
-       0xc9ccU, 0xd9edU, 0xe98eU, 0xf9afU, 0x8948U, 0x9969U, 0xa90aU, 0xb92bU,
-       0x5af5U, 0x4ad4U, 0x7ab7U, 0x6a96U, 0x1a71U, 0x0a50U, 0x3a33U, 0x2a12U,
-       0xdbfdU, 0xcbdcU, 0xfbbfU, 0xeb9eU, 0x9b79U, 0x8b58U, 0xbb3bU, 0xab1aU,
-       0x6ca6U, 0x7c87U, 0x4ce4U, 0x5cc5U, 0x2c22U, 0x3c03U, 0x0c60U, 0x1c41U,
-       0xedaeU, 0xfd8fU, 0xcdecU, 0xddcdU, 0xad2aU, 0xbd0bU, 0x8d68U, 0x9d49U,
-       0x7e97U, 0x6eb6U, 0x5ed5U, 0x4ef4U, 0x3e13U, 0x2e32U, 0x1e51U, 0x0e70U,
-       0xff9fU, 0xefbeU, 0xdfddU, 0xcffcU, 0xbf1bU, 0xaf3aU, 0x9f59U, 0x8f78U,
-       0x9188U, 0x81a9U, 0xb1caU, 0xa1ebU, 0xd10cU, 0xc12dU, 0xf14eU, 0xe16fU,
-       0x1080U, 0x00a1U, 0x30c2U, 0x20e3U, 0x5004U, 0x4025U, 0x7046U, 0x6067U,
-       0x83b9U, 0x9398U, 0xa3fbU, 0xb3daU, 0xc33dU, 0xd31cU, 0xe37fU, 0xf35eU,
-       0x02b1U, 0x1290U, 0x22f3U, 0x32d2U, 0x4235U, 0x5214U, 0x6277U, 0x7256U,
-       0xb5eaU, 0xa5cbU, 0x95a8U, 0x8589U, 0xf56eU, 0xe54fU, 0xd52cU, 0xc50dU,
-       0x34e2U, 0x24c3U, 0x14a0U, 0x0481U, 0x7466U, 0x6447U, 0x5424U, 0x4405U,
-       0xa7dbU, 0xb7faU, 0x8799U, 0x97b8U, 0xe75fU, 0xf77eU, 0xc71dU, 0xd73cU,
-       0x26d3U, 0x36f2U, 0x0691U, 0x16b0U, 0x6657U, 0x7676U, 0x4615U, 0x5634U,
-       0xd94cU, 0xc96dU, 0xf90eU, 0xe92fU, 0x99c8U, 0x89e9U, 0xb98aU, 0xa9abU,
-       0x5844U, 0x4865U, 0x7806U, 0x6827U, 0x18c0U, 0x08e1U, 0x3882U, 0x28a3U,
-       0xcb7dU, 0xdb5cU, 0xeb3fU, 0xfb1eU, 0x8bf9U, 0x9bd8U, 0xabbbU, 0xbb9aU,
-       0x4a75U, 0x5a54U, 0x6a37U, 0x7a16U, 0x0af1U, 0x1ad0U, 0x2ab3U, 0x3a92U,
-       0xfd2eU, 0xed0fU, 0xdd6cU, 0xcd4dU, 0xbdaaU, 0xad8bU, 0x9de8U, 0x8dc9U,
-       0x7c26U, 0x6c07U, 0x5c64U, 0x4c45U, 0x3ca2U, 0x2c83U, 0x1ce0U, 0x0cc1U,
-       0xef1fU, 0xff3eU, 0xcf5dU, 0xdf7cU, 0xaf9bU, 0xbfbaU, 0x8fd9U, 0x9ff8U,
-       0x6e17U, 0x7e36U, 0x4e55U, 0x5e74U, 0x2e93U, 0x3eb2U, 0x0ed1U, 0x1ef0U
-};
-
-/*
- * udf_crc
- *
- * PURPOSE
- *     Calculate a 16-bit CRC checksum using ITU-T V.41 polynomial.
- *
- * DESCRIPTION
- *     The OSTA-UDF(tm) 1.50 standard states that using CRCs is mandatory.
- *     The polynomial used is: x^16 + x^12 + x^15 + 1
- *
- * PRE-CONDITIONS
- *     data            Pointer to the data block.
- *     size            Size of the data block.
- *
- * POST-CONDITIONS
- *     <return>        CRC of the data block.
- *
- * HISTORY
- *     July 21, 1997 - Andrew E. Mileski
- *     Adapted from OSTA-UDF(tm) 1.50 standard.
- */
-uint16_t udf_crc(uint8_t *data, uint32_t size, uint16_t crc)
-{
-       while (size--)
-               crc = crc_table[(crc >> 8 ^ *(data++)) & 0xffU] ^ (crc << 8);
-
-       return crc;
-}
-
-/****************************************************************************/
-#if defined(TEST)
-
-/*
- * PURPOSE
- *     Test udf_crc()
- *
- * HISTORY
- *     July 21, 1997 - Andrew E. Mileski
- *     Adapted from OSTA-UDF(tm) 1.50 standard.
- */
-
-unsigned char bytes[] = { 0x70U, 0x6AU, 0x77U };
-
-int main(void)
-{
-       unsigned short x;
-
-       x = udf_crc(bytes, sizeof bytes);
-       printf("udf_crc: calculated = %4.4x, correct = %4.4x\n", x, 0x3299U);
-
-       return 0;
-}
-
-#endif /* defined(TEST) */
-
-/****************************************************************************/
-#if defined(GENERATE)
-
-/*
- * PURPOSE
- *     Generate a table for fast 16-bit CRC calculations (any polynomial).
- *
- * DESCRIPTION
- *     The ITU-T V.41 polynomial is 010041.
- *
- * HISTORY
- *     July 21, 1997 - Andrew E. Mileski
- *     Adapted from OSTA-UDF(tm) 1.50 standard.
- */
-
-#include <stdio.h>
-
-int main(int argc, char **argv)
-{
-       unsigned long crc, poly;
-       int n, i;
-
-       /* Get the polynomial */
-       sscanf(argv[1], "%lo", &poly);
-       if (poly & 0xffff0000U) {
-               fprintf(stderr, "polynomial is too large\en");
-               exit(1);
-       }
-
-       printf("/* CRC 0%o */\n", poly);
-
-       /* Create a table */
-       printf("static unsigned short crc_table[256] = {\n");
-       for (n = 0; n < 256; n++) {
-               if (n % 8 == 0)
-                       printf("\t");
-               crc = n << 8;
-               for (i = 0; i < 8; i++) {
-                       if (crc & 0x8000U)
-                               crc = (crc << 1) ^ poly;
-                       else
-                               crc <<= 1;
-                       crc &= 0xFFFFU;
-               }
-               if (n == 255)
-                       printf("0x%04xU ", crc);
-               else
-                       printf("0x%04xU, ", crc);
-               if (n % 8 == 7)
-                       printf("\n");
-       }
-       printf("};\n");
-
-       return 0;
-}
-
-#endif /* defined(GENERATE) */
index 8d8643ada1994c55d449f9c63646f1fc71ec597d..62dc270c69d1addaffb0919e1d5308421a2d1200 100644 (file)
 static int do_udf_readdir(struct inode *dir, struct file *filp,
                          filldir_t filldir, void *dirent)
 {
-       struct udf_fileident_bh fibh;
+       struct udf_fileident_bh fibh = { .sbh = NULL, .ebh = NULL};
        struct fileIdentDesc *fi = NULL;
        struct fileIdentDesc cfi;
        int block, iblock;
        loff_t nf_pos = (filp->f_pos - 1) << 2;
        int flen;
-       char fname[UDF_NAME_LEN];
+       char *fname = NULL;
        char *nameptr;
        uint16_t liu;
        uint8_t lfi;
@@ -54,23 +54,32 @@ static int do_udf_readdir(struct inode *dir, struct file *filp,
        kernel_lb_addr eloc;
        uint32_t elen;
        sector_t offset;
-       int i, num;
+       int i, num, ret = 0;
        unsigned int dt_type;
        struct extent_position epos = { NULL, 0, {0, 0} };
        struct udf_inode_info *iinfo;
 
        if (nf_pos >= size)
-               return 0;
+               goto out;
+
+       fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+       if (!fname) {
+               ret = -ENOMEM;
+               goto out;
+       }
 
        if (nf_pos == 0)
                nf_pos = udf_ext0_offset(dir);
 
        fibh.soffset = fibh.eoffset = nf_pos & (dir->i_sb->s_blocksize - 1);
        iinfo = UDF_I(dir);
-       if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
-               fibh.sbh = fibh.ebh = NULL;
-       } else if (inode_bmap(dir, nf_pos >> dir->i_sb->s_blocksize_bits,
-                             &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) {
+       if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
+               if (inode_bmap(dir, nf_pos >> dir->i_sb->s_blocksize_bits,
+                   &epos, &eloc, &elen, &offset)
+                   != (EXT_RECORDED_ALLOCATED >> 30)) {
+                       ret = -ENOENT;
+                       goto out;
+               }
                block = udf_get_lb_pblock(dir->i_sb, eloc, offset);
                if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
                        if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
@@ -83,8 +92,8 @@ static int do_udf_readdir(struct inode *dir, struct file *filp,
                }
 
                if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) {
-                       brelse(epos.bh);
-                       return -EIO;
+                       ret = -EIO;
+                       goto out;
                }
 
                if (!(offset & ((16 >> (dir->i_sb->s_blocksize_bits - 9)) - 1))) {
@@ -105,9 +114,6 @@ static int do_udf_readdir(struct inode *dir, struct file *filp,
                                        brelse(bha[i]);
                        }
                }
-       } else {
-               brelse(epos.bh);
-               return -ENOENT;
        }
 
        while (nf_pos < size) {
@@ -115,13 +121,8 @@ static int do_udf_readdir(struct inode *dir, struct file *filp,
 
                fi = udf_fileident_read(dir, &nf_pos, &fibh, &cfi, &epos, &eloc,
                                        &elen, &offset);
-               if (!fi) {
-                       if (fibh.sbh != fibh.ebh)
-                               brelse(fibh.ebh);
-                       brelse(fibh.sbh);
-                       brelse(epos.bh);
-                       return 0;
-               }
+               if (!fi)
+                       goto out;
 
                liu = le16_to_cpu(cfi.lengthOfImpUse);
                lfi = cfi.lengthFileIdent;
@@ -167,53 +168,23 @@ static int do_udf_readdir(struct inode *dir, struct file *filp,
                        dt_type = DT_UNKNOWN;
                }
 
-               if (flen) {
-                       if (filldir(dirent, fname, flen, filp->f_pos, iblock, dt_type) < 0) {
-                               if (fibh.sbh != fibh.ebh)
-                                       brelse(fibh.ebh);
-                               brelse(fibh.sbh);
-                               brelse(epos.bh);
-                               return 0;
-                       }
-               }
+               if (flen && filldir(dirent, fname, flen, filp->f_pos,
+                                   iblock, dt_type) < 0)
+                       goto out;
        } /* end while */
 
        filp->f_pos = (nf_pos >> 2) + 1;
 
+out:
        if (fibh.sbh != fibh.ebh)
                brelse(fibh.ebh);
        brelse(fibh.sbh);
        brelse(epos.bh);
+       kfree(fname);
 
-       return 0;
+       return ret;
 }
 
-/*
- * udf_readdir
- *
- * PURPOSE
- *     Read a directory entry.
- *
- * DESCRIPTION
- *     Optional - sys_getdents() will return -ENOTDIR if this routine is not
- *     available.
- *
- *     Refer to sys_getdents() in fs/readdir.c
- *     sys_getdents() -> .
- *
- * PRE-CONDITIONS
- *     filp                    Pointer to directory file.
- *     buf                     Pointer to directory entry buffer.
- *     filldir                 Pointer to filldir function.
- *
- * POST-CONDITIONS
- *     <return>                >=0 on success.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
-
 static int udf_readdir(struct file *filp, void *dirent, filldir_t filldir)
 {
        struct inode *dir = filp->f_path.dentry->d_inode;
index 56387711589b0aaf2ad30ad5a9150480e6e1f522..a0974df82b318b27d2be5e772eb5cf276f6658e1 100644 (file)
@@ -70,19 +70,6 @@ typedef struct {
        uint8_t         microseconds;
 } __attribute__ ((packed)) timestamp;
 
-typedef struct {
-       uint16_t        typeAndTimezone;
-       int16_t         year;
-       uint8_t         month;
-       uint8_t         day;
-       uint8_t         hour;
-       uint8_t         minute;
-       uint8_t         second;
-       uint8_t         centiseconds;
-       uint8_t         hundredsOfMicroseconds;
-       uint8_t         microseconds;
-} __attribute__ ((packed)) kernel_timestamp;
-
 /* Type and Time Zone (ECMA 167r3 1/7.3.1) */
 #define TIMESTAMP_TYPE_MASK            0xF000
 #define TIMESTAMP_TYPE_CUT             0x0000
index 97c71ae7c68922f3cbe2f2ea48f0fb8a623fbc1d..0ed6e146a0d9968939a45b09fec96a2bf42e9e5e 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "udfdecl.h"
 #include <linux/fs.h>
-#include <linux/udf_fs.h>
 #include <asm/uaccess.h>
 #include <linux/kernel.h>
 #include <linux/string.h> /* memset */
@@ -144,40 +143,6 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
        return retval;
 }
 
-/*
- * udf_ioctl
- *
- * PURPOSE
- *     Issue an ioctl.
- *
- * DESCRIPTION
- *     Optional - sys_ioctl() will return -ENOTTY if this routine is not
- *     available, and the ioctl cannot be handled without filesystem help.
- *
- *     sys_ioctl() handles these ioctls that apply only to regular files:
- *             FIBMAP [requires udf_block_map()], FIGETBSZ, FIONREAD
- *     These ioctls are also handled by sys_ioctl():
- *             FIOCLEX, FIONCLEX, FIONBIO, FIOASYNC
- *     All other ioctls are passed to the filesystem.
- *
- *     Refer to sys_ioctl() in fs/ioctl.c
- *     sys_ioctl() -> .
- *
- * PRE-CONDITIONS
- *     inode                   Pointer to inode that ioctl was issued on.
- *     filp                    Pointer to file that ioctl was issued on.
- *     cmd                     The ioctl command.
- *     arg                     The ioctl argument [can be interpreted as a
- *                             user-space pointer if desired].
- *
- * POST-CONDITIONS
- *     <return>                Success (>=0) or an error code (<=0) that
- *                             sys_ioctl() will return.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
 int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
              unsigned long arg)
 {
@@ -225,18 +190,6 @@ int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
        return result;
 }
 
-/*
- * udf_release_file
- *
- * PURPOSE
- *  Called when all references to the file are closed
- *
- * DESCRIPTION
- *  Discard prealloced blocks
- *
- * HISTORY
- *
- */
 static int udf_release_file(struct inode *inode, struct file *filp)
 {
        if (filp->f_mode & FMODE_WRITE) {
index 84360315aca2083001727f1defc0d453b4c07779..eb9cfa23dc3d37f690edd63c9bf893844493979a 100644 (file)
@@ -21,7 +21,6 @@
 #include "udfdecl.h"
 #include <linux/fs.h>
 #include <linux/quotaops.h>
-#include <linux/udf_fs.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 
@@ -47,11 +46,9 @@ void udf_free_inode(struct inode *inode)
                struct logicalVolIntegrityDescImpUse *lvidiu =
                                                        udf_sb_lvidiu(sbi);
                if (S_ISDIR(inode->i_mode))
-                       lvidiu->numDirs =
-                               cpu_to_le32(le32_to_cpu(lvidiu->numDirs) - 1);
+                       le32_add_cpu(&lvidiu->numDirs, -1);
                else
-                       lvidiu->numFiles =
-                               cpu_to_le32(le32_to_cpu(lvidiu->numFiles) - 1);
+                       le32_add_cpu(&lvidiu->numFiles, -1);
 
                mark_buffer_dirty(sbi->s_lvid_bh);
        }
@@ -105,11 +102,9 @@ struct inode *udf_new_inode(struct inode *dir, int mode, int *err)
                lvhd = (struct logicalVolHeaderDesc *)
                                (lvid->logicalVolContentsUse);
                if (S_ISDIR(mode))
-                       lvidiu->numDirs =
-                               cpu_to_le32(le32_to_cpu(lvidiu->numDirs) + 1);
+                       le32_add_cpu(&lvidiu->numDirs, 1);
                else
-                       lvidiu->numFiles =
-                               cpu_to_le32(le32_to_cpu(lvidiu->numFiles) + 1);
+                       le32_add_cpu(&lvidiu->numFiles, 1);
                iinfo->i_unique = uniqueID = le64_to_cpu(lvhd->uniqueID);
                if (!(++uniqueID & 0x00000000FFFFFFFFUL))
                        uniqueID += 16;
index 24cfa55d0fdc4a2ecd4964f4c759a8babd428e72..6e74b117aaf0e58d078e59d88817562de8379a1d 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/buffer_head.h>
 #include <linux/writeback.h>
 #include <linux/slab.h>
+#include <linux/crc-itu-t.h>
 
 #include "udf_i.h"
 #include "udf_sb.h"
@@ -66,22 +67,7 @@ static void udf_update_extents(struct inode *,
                               struct extent_position *);
 static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);
 
-/*
- * udf_delete_inode
- *
- * PURPOSE
- *     Clean-up before the specified inode is destroyed.
- *
- * DESCRIPTION
- *     This routine is called when the kernel destroys an inode structure
- *     ie. when iput() finds i_count == 0.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- *
- *  Called at the last iput() if i_nlink is zero.
- */
+
 void udf_delete_inode(struct inode *inode)
 {
        truncate_inode_pages(&inode->i_data, 0);
@@ -323,9 +309,6 @@ static int udf_get_block(struct inode *inode, sector_t block,
 
        lock_kernel();
 
-       if (block < 0)
-               goto abort_negative;
-
        iinfo = UDF_I(inode);
        if (block == iinfo->i_next_alloc_block + 1) {
                iinfo->i_next_alloc_block++;
@@ -347,10 +330,6 @@ static int udf_get_block(struct inode *inode, sector_t block,
 abort:
        unlock_kernel();
        return err;
-
-abort_negative:
-       udf_warning(inode->i_sb, "udf_get_block", "block < 0");
-       goto abort;
 }
 
 static struct buffer_head *udf_getblk(struct inode *inode, long block,
@@ -1116,42 +1095,36 @@ static void __udf_read_inode(struct inode *inode)
        fe = (struct fileEntry *)bh->b_data;
 
        if (fe->icbTag.strategyType == cpu_to_le16(4096)) {
-               struct buffer_head *ibh = NULL, *nbh = NULL;
-               struct indirectEntry *ie;
+               struct buffer_head *ibh;
 
                ibh = udf_read_ptagged(inode->i_sb, iinfo->i_location, 1,
                                        &ident);
-               if (ident == TAG_IDENT_IE) {
-                       if (ibh) {
-                               kernel_lb_addr loc;
-                               ie = (struct indirectEntry *)ibh->b_data;
-
-                               loc = lelb_to_cpu(ie->indirectICB.extLocation);
-
-                               if (ie->indirectICB.extLength &&
-                                   (nbh = udf_read_ptagged(inode->i_sb, loc, 0,
-                                                           &ident))) {
-                                       if (ident == TAG_IDENT_FE ||
-                                           ident == TAG_IDENT_EFE) {
-                                               memcpy(&iinfo->i_location,
-                                                      &loc,
-                                                      sizeof(kernel_lb_addr));
-                                               brelse(bh);
-                                               brelse(ibh);
-                                               brelse(nbh);
-                                               __udf_read_inode(inode);
-                                               return;
-                                       } else {
-                                               brelse(nbh);
-                                               brelse(ibh);
-                                       }
-                               } else {
+               if (ident == TAG_IDENT_IE && ibh) {
+                       struct buffer_head *nbh = NULL;
+                       kernel_lb_addr loc;
+                       struct indirectEntry *ie;
+
+                       ie = (struct indirectEntry *)ibh->b_data;
+                       loc = lelb_to_cpu(ie->indirectICB.extLocation);
+
+                       if (ie->indirectICB.extLength &&
+                               (nbh = udf_read_ptagged(inode->i_sb, loc, 0,
+                                                       &ident))) {
+                               if (ident == TAG_IDENT_FE ||
+                                       ident == TAG_IDENT_EFE) {
+                                       memcpy(&iinfo->i_location,
+                                               &loc,
+                                               sizeof(kernel_lb_addr));
+                                       brelse(bh);
                                        brelse(ibh);
+                                       brelse(nbh);
+                                       __udf_read_inode(inode);
+                                       return;
                                }
+                               brelse(nbh);
                        }
-               } else {
-                       brelse(ibh);
                }
+               brelse(ibh);
        } else if (fe->icbTag.strategyType != cpu_to_le16(4)) {
                printk(KERN_ERR "udf: unsupported strategy type: %d\n",
                       le16_to_cpu(fe->icbTag.strategyType));
@@ -1168,8 +1141,6 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
 {
        struct fileEntry *fe;
        struct extendedFileEntry *efe;
-       time_t convtime;
-       long convtime_usec;
        int offset;
        struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
        struct udf_inode_info *iinfo = UDF_I(inode);
@@ -1257,29 +1228,15 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
                        (inode->i_sb->s_blocksize_bits - 9);
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(fe->accessTime))) {
-                       inode->i_atime.tv_sec = convtime;
-                       inode->i_atime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime))
                        inode->i_atime = sbi->s_record_time;
-               }
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(fe->modificationTime))) {
-                       inode->i_mtime.tv_sec = convtime;
-                       inode->i_mtime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&inode->i_mtime,
+                                           fe->modificationTime))
                        inode->i_mtime = sbi->s_record_time;
-               }
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(fe->attrTime))) {
-                       inode->i_ctime.tv_sec = convtime;
-                       inode->i_ctime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime))
                        inode->i_ctime = sbi->s_record_time;
-               }
 
                iinfo->i_unique = le64_to_cpu(fe->uniqueID);
                iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
@@ -1289,37 +1246,18 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
                    (inode->i_sb->s_blocksize_bits - 9);
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(efe->accessTime))) {
-                       inode->i_atime.tv_sec = convtime;
-                       inode->i_atime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime))
                        inode->i_atime = sbi->s_record_time;
-               }
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(efe->modificationTime))) {
-                       inode->i_mtime.tv_sec = convtime;
-                       inode->i_mtime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&inode->i_mtime,
+                                           efe->modificationTime))
                        inode->i_mtime = sbi->s_record_time;
-               }
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(efe->createTime))) {
-                       iinfo->i_crtime.tv_sec = convtime;
-                       iinfo->i_crtime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime))
                        iinfo->i_crtime = sbi->s_record_time;
-               }
 
-               if (udf_stamp_to_time(&convtime, &convtime_usec,
-                                     lets_to_cpu(efe->attrTime))) {
-                       inode->i_ctime.tv_sec = convtime;
-                       inode->i_ctime.tv_nsec = convtime_usec * 1000;
-               } else {
+               if (!udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime))
                        inode->i_ctime = sbi->s_record_time;
-               }
 
                iinfo->i_unique = le64_to_cpu(efe->uniqueID);
                iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
@@ -1338,6 +1276,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
        case ICBTAG_FILE_TYPE_REALTIME:
        case ICBTAG_FILE_TYPE_REGULAR:
        case ICBTAG_FILE_TYPE_UNDEF:
+       case ICBTAG_FILE_TYPE_VAT20:
                if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
                        inode->i_data.a_ops = &udf_adinicb_aops;
                else
@@ -1363,6 +1302,15 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                inode->i_op = &page_symlink_inode_operations;
                inode->i_mode = S_IFLNK | S_IRWXUGO;
                break;
+       case ICBTAG_FILE_TYPE_MAIN:
+               udf_debug("METADATA FILE-----\n");
+               break;
+       case ICBTAG_FILE_TYPE_MIRROR:
+               udf_debug("METADATA MIRROR FILE-----\n");
+               break;
+       case ICBTAG_FILE_TYPE_BITMAP:
+               udf_debug("METADATA BITMAP FILE-----\n");
+               break;
        default:
                printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown "
                                "file type=%d\n", inode->i_ino,
@@ -1416,21 +1364,6 @@ static mode_t udf_convert_permissions(struct fileEntry *fe)
        return mode;
 }
 
-/*
- * udf_write_inode
- *
- * PURPOSE
- *     Write out the specified inode.
- *
- * DESCRIPTION
- *     This routine is called whenever an inode is synced.
- *     Currently this routine is just a placeholder.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
-
 int udf_write_inode(struct inode *inode, int sync)
 {
        int ret;
@@ -1455,7 +1388,6 @@ static int udf_update_inode(struct inode *inode, int do_sync)
        uint32_t udfperms;
        uint16_t icbflags;
        uint16_t crclen;
-       kernel_timestamp cpu_time;
        int err = 0;
        struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
        unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;
@@ -1488,9 +1420,9 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                                                iinfo->i_location.
                                                        logicalBlockNum);
                use->descTag.descCRCLength = cpu_to_le16(crclen);
-               use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use +
-                                                          sizeof(tag), crclen,
-                                                          0));
+               use->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)use +
+                                                          sizeof(tag),
+                                                          crclen));
                use->descTag.tagChecksum = udf_tag_checksum(&use->descTag);
 
                mark_buffer_dirty(bh);
@@ -1558,12 +1490,9 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                        (inode->i_blocks + (1 << (blocksize_bits - 9)) - 1) >>
                        (blocksize_bits - 9));
 
-               if (udf_time_to_stamp(&cpu_time, inode->i_atime))
-                       fe->accessTime = cpu_to_lets(cpu_time);
-               if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
-                       fe->modificationTime = cpu_to_lets(cpu_time);
-               if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
-                       fe->attrTime = cpu_to_lets(cpu_time);
+               udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime);
+               udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime);
+               udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime);
                memset(&(fe->impIdent), 0, sizeof(regid));
                strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
                fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
@@ -1598,14 +1527,10 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                     iinfo->i_crtime.tv_nsec > inode->i_ctime.tv_nsec))
                        iinfo->i_crtime = inode->i_ctime;
 
-               if (udf_time_to_stamp(&cpu_time, inode->i_atime))
-                       efe->accessTime = cpu_to_lets(cpu_time);
-               if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
-                       efe->modificationTime = cpu_to_lets(cpu_time);
-               if (udf_time_to_stamp(&cpu_time, iinfo->i_crtime))
-                       efe->createTime = cpu_to_lets(cpu_time);
-               if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
-                       efe->attrTime = cpu_to_lets(cpu_time);
+               udf_time_to_disk_stamp(&efe->accessTime, inode->i_atime);
+               udf_time_to_disk_stamp(&efe->modificationTime, inode->i_mtime);
+               udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime);
+               udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime);
 
                memset(&(efe->impIdent), 0, sizeof(regid));
                strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
@@ -1660,8 +1585,8 @@ static int udf_update_inode(struct inode *inode, int do_sync)
        crclen += iinfo->i_lenEAttr + iinfo->i_lenAlloc -
                                                                sizeof(tag);
        fe->descTag.descCRCLength = cpu_to_le16(crclen);
-       fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag),
-                                                 crclen, 0));
+       fe->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)fe + sizeof(tag),
+                                                 crclen));
        fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag);
 
        /* write the data blocks */
@@ -1778,9 +1703,7 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos,
 
                        if (epos->bh) {
                                aed = (struct allocExtDesc *)epos->bh->b_data;
-                               aed->lengthAllocDescs =
-                                       cpu_to_le32(le32_to_cpu(
-                                       aed->lengthAllocDescs) + adsize);
+                               le32_add_cpu(&aed->lengthAllocDescs, adsize);
                        } else {
                                iinfo->i_lenAlloc += adsize;
                                mark_inode_dirty(inode);
@@ -1830,9 +1753,7 @@ int8_t udf_add_aext(struct inode *inode, struct extent_position *epos,
                mark_inode_dirty(inode);
        } else {
                aed = (struct allocExtDesc *)epos->bh->b_data;
-               aed->lengthAllocDescs =
-                       cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) +
-                                   adsize);
+               le32_add_cpu(&aed->lengthAllocDescs, adsize);
                if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
                                UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
                        udf_update_tag(epos->bh->b_data,
@@ -2046,9 +1967,7 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos,
                        mark_inode_dirty(inode);
                } else {
                        aed = (struct allocExtDesc *)oepos.bh->b_data;
-                       aed->lengthAllocDescs =
-                               cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) -
-                                           (2 * adsize));
+                       le32_add_cpu(&aed->lengthAllocDescs, -(2 * adsize));
                        if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
                            UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
                                udf_update_tag(oepos.bh->b_data,
@@ -2065,9 +1984,7 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos,
                        mark_inode_dirty(inode);
                } else {
                        aed = (struct allocExtDesc *)oepos.bh->b_data;
-                       aed->lengthAllocDescs =
-                               cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) -
-                                           adsize);
+                       le32_add_cpu(&aed->lengthAllocDescs, -adsize);
                        if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
                            UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
                                udf_update_tag(oepos.bh->b_data,
@@ -2095,11 +2012,6 @@ int8_t inode_bmap(struct inode *inode, sector_t block,
        int8_t etype;
        struct udf_inode_info *iinfo;
 
-       if (block < 0) {
-               printk(KERN_ERR "udf: inode_bmap: block < 0\n");
-               return -1;
-       }
-
        iinfo = UDF_I(inode);
        pos->offset = 0;
        pos->block = iinfo->i_location;
index 579bae71e67efe7dc62d69d3998b184da2f14f93..703843f30ffd383f556639af7146c0d99a212c25 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/cdrom.h>
 #include <asm/uaccess.h>
 
-#include <linux/udf_fs.h>
 #include "udf_sb.h"
 
 unsigned int udf_get_last_session(struct super_block *sb)
index a1d6da0caf7132121e7b5d69ea880aeeb97d1875..84bf0fd4a4f1e24a3ff70f0e8de32fb514feb6e1 100644 (file)
@@ -23,8 +23,8 @@
 
 #include <linux/fs.h>
 #include <linux/string.h>
-#include <linux/udf_fs.h>
 #include <linux/buffer_head.h>
+#include <linux/crc-itu-t.h>
 
 #include "udf_i.h"
 #include "udf_sb.h"
@@ -136,8 +136,8 @@ struct genericFormat *udf_add_extendedattr(struct inode *inode, uint32_t size,
                /* rewrite CRC + checksum of eahd */
                crclen = sizeof(struct extendedAttrHeaderDesc) - sizeof(tag);
                eahd->descTag.descCRCLength = cpu_to_le16(crclen);
-               eahd->descTag.descCRC = cpu_to_le16(udf_crc((char *)eahd +
-                                               sizeof(tag), crclen, 0));
+               eahd->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)eahd +
+                                               sizeof(tag), crclen));
                eahd->descTag.tagChecksum = udf_tag_checksum(&eahd->descTag);
                iinfo->i_lenEAttr += size;
                return (struct genericFormat *)&ea[offset];
@@ -204,16 +204,15 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block,
 {
        tag *tag_p;
        struct buffer_head *bh = NULL;
-       struct udf_sb_info *sbi = UDF_SB(sb);
 
        /* Read the block */
        if (block == 0xFFFFFFFF)
                return NULL;
 
-       bh = udf_tread(sb, block + sbi->s_session);
+       bh = udf_tread(sb, block);
        if (!bh) {
                udf_debug("block=%d, location=%d: read failed\n",
-                         block + sbi->s_session, location);
+                         block, location);
                return NULL;
        }
 
@@ -223,8 +222,7 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block,
 
        if (location != le32_to_cpu(tag_p->tagLocation)) {
                udf_debug("location mismatch block %u, tag %u != %u\n",
-                         block + sbi->s_session,
-                         le32_to_cpu(tag_p->tagLocation), location);
+                         block, le32_to_cpu(tag_p->tagLocation), location);
                goto error_out;
        }
 
@@ -244,13 +242,13 @@ struct buffer_head *udf_read_tagged(struct super_block *sb, uint32_t block,
 
        /* Verify the descriptor CRC */
        if (le16_to_cpu(tag_p->descCRCLength) + sizeof(tag) > sb->s_blocksize ||
-           le16_to_cpu(tag_p->descCRC) == udf_crc(bh->b_data + sizeof(tag),
-                                       le16_to_cpu(tag_p->descCRCLength), 0))
+           le16_to_cpu(tag_p->descCRC) == crc_itu_t(0,
+                                       bh->b_data + sizeof(tag),
+                                       le16_to_cpu(tag_p->descCRCLength)))
                return bh;
 
-       udf_debug("Crc failure block %d: crc = %d, crclen = %d\n",
-                 block + sbi->s_session, le16_to_cpu(tag_p->descCRC),
-                 le16_to_cpu(tag_p->descCRCLength));
+       udf_debug("Crc failure block %d: crc = %d, crclen = %d\n", block,
+           le16_to_cpu(tag_p->descCRC), le16_to_cpu(tag_p->descCRCLength));
 
 error_out:
        brelse(bh);
@@ -270,7 +268,7 @@ void udf_update_tag(char *data, int length)
        length -= sizeof(tag);
 
        tptr->descCRCLength = cpu_to_le16(length);
-       tptr->descCRC = cpu_to_le16(udf_crc(data + sizeof(tag), length, 0));
+       tptr->descCRC = cpu_to_le16(crc_itu_t(0, data + sizeof(tag), length));
        tptr->tagChecksum = udf_tag_checksum(tptr);
 }
 
index 112a5fb0b27ba201285e71593ccda10323277516..ba5537d4bc151fcbe9575d89a30b2b0c860e92ae 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
 #include <linux/sched.h>
+#include <linux/crc-itu-t.h>
 
 static inline int udf_match(int len1, const char *name1, int len2,
                            const char *name2)
@@ -97,25 +98,23 @@ int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
                memset(fibh->ebh->b_data, 0x00, padlen + offset);
        }
 
-       crc = udf_crc((uint8_t *)cfi + sizeof(tag),
-                     sizeof(struct fileIdentDesc) - sizeof(tag), 0);
+       crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(tag),
+                     sizeof(struct fileIdentDesc) - sizeof(tag));
 
        if (fibh->sbh == fibh->ebh) {
-               crc = udf_crc((uint8_t *)sfi->impUse,
+               crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
                              crclen + sizeof(tag) -
-                             sizeof(struct fileIdentDesc), crc);
+                             sizeof(struct fileIdentDesc));
        } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) {
-               crc = udf_crc(fibh->ebh->b_data +
+               crc = crc_itu_t(crc, fibh->ebh->b_data +
                                        sizeof(struct fileIdentDesc) +
                                        fibh->soffset,
                              crclen + sizeof(tag) -
-                                       sizeof(struct fileIdentDesc),
-                             crc);
+                                       sizeof(struct fileIdentDesc));
        } else {
-               crc = udf_crc((uint8_t *)sfi->impUse,
-                             -fibh->soffset - sizeof(struct fileIdentDesc),
-                             crc);
-               crc = udf_crc(fibh->ebh->b_data, fibh->eoffset, crc);
+               crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
+                             -fibh->soffset - sizeof(struct fileIdentDesc));
+               crc = crc_itu_t(crc, fibh->ebh->b_data, fibh->eoffset);
        }
 
        cfi->descTag.descCRC = cpu_to_le16(crc);
@@ -149,7 +148,7 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
        struct fileIdentDesc *fi = NULL;
        loff_t f_pos;
        int block, flen;
-       char fname[UDF_NAME_LEN];
+       char *fname = NULL;
        char *nameptr;
        uint8_t lfi;
        uint16_t liu;
@@ -163,12 +162,12 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
        size = udf_ext0_offset(dir) + dir->i_size;
        f_pos = udf_ext0_offset(dir);
 
+       fibh->sbh = fibh->ebh = NULL;
        fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
-       if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
-               fibh->sbh = fibh->ebh = NULL;
-       else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits,
-                             &epos, &eloc, &elen, &offset) ==
-                                       (EXT_RECORDED_ALLOCATED >> 30)) {
+       if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
+               if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos,
+                   &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30))
+                       goto out_err;
                block = udf_get_lb_pblock(dir->i_sb, eloc, offset);
                if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
                        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
@@ -179,25 +178,19 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
                        offset = 0;
 
                fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block);
-               if (!fibh->sbh) {
-                       brelse(epos.bh);
-                       return NULL;
-               }
-       } else {
-               brelse(epos.bh);
-               return NULL;
+               if (!fibh->sbh)
+                       goto out_err;
        }
 
+       fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+       if (!fname)
+               goto out_err;
+
        while (f_pos < size) {
                fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
                                        &elen, &offset);
-               if (!fi) {
-                       if (fibh->sbh != fibh->ebh)
-                               brelse(fibh->ebh);
-                       brelse(fibh->sbh);
-                       brelse(epos.bh);
-                       return NULL;
-               }
+               if (!fi)
+                       goto out_err;
 
                liu = le16_to_cpu(cfi->lengthOfImpUse);
                lfi = cfi->lengthFileIdent;
@@ -237,53 +230,22 @@ static struct fileIdentDesc *udf_find_entry(struct inode *dir,
 
                flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi);
                if (flen && udf_match(flen, fname, dentry->d_name.len,
-                                     dentry->d_name.name)) {
-                       brelse(epos.bh);
-                       return fi;
-               }
+                                     dentry->d_name.name))
+                       goto out_ok;
        }
 
+out_err:
+       fi = NULL;
        if (fibh->sbh != fibh->ebh)
                brelse(fibh->ebh);
        brelse(fibh->sbh);
+out_ok:
        brelse(epos.bh);
+       kfree(fname);
 
-       return NULL;
+       return fi;
 }
 
-/*
- * udf_lookup
- *
- * PURPOSE
- *     Look-up the inode for a given name.
- *
- * DESCRIPTION
- *     Required - lookup_dentry() will return -ENOTDIR if this routine is not
- *     available for a directory. The filesystem is useless if this routine is
- *     not available for at least the filesystem's root directory.
- *
- *     This routine is passed an incomplete dentry - it must be completed by
- *     calling d_add(dentry, inode). If the name does not exist, then the
- *     specified inode must be set to null. An error should only be returned
- *     when the lookup fails for a reason other than the name not existing.
- *     Note that the directory inode semaphore is held during the call.
- *
- *     Refer to lookup_dentry() in fs/namei.c
- *     lookup_dentry() -> lookup() -> real_lookup() -> .
- *
- * PRE-CONDITIONS
- *     dir                     Pointer to inode of parent directory.
- *     dentry                  Pointer to dentry to complete.
- *     nd                      Pointer to lookup nameidata
- *
- * POST-CONDITIONS
- *     <return>                Zero on success.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
-
 static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
                                 struct nameidata *nd)
 {
@@ -336,11 +298,9 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
 {
        struct super_block *sb = dir->i_sb;
        struct fileIdentDesc *fi = NULL;
-       char name[UDF_NAME_LEN], fname[UDF_NAME_LEN];
+       char *name = NULL;
        int namelen;
        loff_t f_pos;
-       int flen;
-       char *nameptr;
        loff_t size = udf_ext0_offset(dir) + dir->i_size;
        int nfidlen;
        uint8_t lfi;
@@ -352,16 +312,23 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
        struct extent_position epos = {};
        struct udf_inode_info *dinfo;
 
+       fibh->sbh = fibh->ebh = NULL;
+       name = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+       if (!name) {
+               *err = -ENOMEM;
+               goto out_err;
+       }
+
        if (dentry) {
                if (!dentry->d_name.len) {
                        *err = -EINVAL;
-                       return NULL;
+                       goto out_err;
                }
                namelen = udf_put_filename(sb, dentry->d_name.name, name,
                                                 dentry->d_name.len);
                if (!namelen) {
                        *err = -ENAMETOOLONG;
-                       return NULL;
+                       goto out_err;
                }
        } else {
                namelen = 0;
@@ -373,11 +340,14 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
 
        fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
        dinfo = UDF_I(dir);
-       if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
-               fibh->sbh = fibh->ebh = NULL;
-       else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits,
-                             &epos, &eloc, &elen, &offset) ==
-                                       (EXT_RECORDED_ALLOCATED >> 30)) {
+       if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
+               if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos,
+                   &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
+                       block = udf_get_lb_pblock(dir->i_sb,
+                                       dinfo->i_location, 0);
+                       fibh->soffset = fibh->eoffset = sb->s_blocksize;
+                       goto add;
+               }
                block = udf_get_lb_pblock(dir->i_sb, eloc, offset);
                if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
                        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
@@ -389,17 +359,11 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
 
                fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block);
                if (!fibh->sbh) {
-                       brelse(epos.bh);
                        *err = -EIO;
-                       return NULL;
+                       goto out_err;
                }
 
                block = dinfo->i_location.logicalBlockNum;
-       } else {
-               block = udf_get_lb_pblock(dir->i_sb, dinfo->i_location, 0);
-               fibh->sbh = fibh->ebh = NULL;
-               fibh->soffset = fibh->eoffset = sb->s_blocksize;
-               goto add;
        }
 
        while (f_pos < size) {
@@ -407,41 +371,16 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
                                        &elen, &offset);
 
                if (!fi) {
-                       if (fibh->sbh != fibh->ebh)
-                               brelse(fibh->ebh);
-                       brelse(fibh->sbh);
-                       brelse(epos.bh);
                        *err = -EIO;
-                       return NULL;
+                       goto out_err;
                }
 
                liu = le16_to_cpu(cfi->lengthOfImpUse);
                lfi = cfi->lengthFileIdent;
 
-               if (fibh->sbh == fibh->ebh)
-                       nameptr = fi->fileIdent + liu;
-               else {
-                       int poffset;    /* Unpaded ending offset */
-
-                       poffset = fibh->soffset + sizeof(struct fileIdentDesc) +
-                                       liu + lfi;
-
-                       if (poffset >= lfi)
-                               nameptr = (char *)(fibh->ebh->b_data +
-                                                  poffset - lfi);
-                       else {
-                               nameptr = fname;
-                               memcpy(nameptr, fi->fileIdent + liu,
-                                       lfi - poffset);
-                               memcpy(nameptr + lfi - poffset,
-                                       fibh->ebh->b_data, poffset);
-                       }
-               }
-
                if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
                        if (((sizeof(struct fileIdentDesc) +
                                        liu + lfi + 3) & ~3) == nfidlen) {
-                               brelse(epos.bh);
                                cfi->descTag.tagSerialNum = cpu_to_le16(1);
                                cfi->fileVersionNum = cpu_to_le16(1);
                                cfi->fileCharacteristics = 0;
@@ -449,27 +388,13 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
                                cfi->lengthOfImpUse = cpu_to_le16(0);
                                if (!udf_write_fi(dir, cfi, fi, fibh, NULL,
                                                  name))
-                                       return fi;
+                                       goto out_ok;
                                else {
                                        *err = -EIO;
-                                       return NULL;
+                                       goto out_err;
                                }
                        }
                }
-
-               if (!lfi || !dentry)
-                       continue;
-
-               flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi);
-               if (flen && udf_match(flen, fname, dentry->d_name.len,
-                                     dentry->d_name.name)) {
-                       if (fibh->sbh != fibh->ebh)
-                               brelse(fibh->ebh);
-                       brelse(fibh->sbh);
-                       brelse(epos.bh);
-                       *err = -EEXIST;
-                       return NULL;
-               }
        }
 
 add:
@@ -496,7 +421,7 @@ add:
                fibh->sbh = fibh->ebh =
                                udf_expand_dir_adinicb(dir, &block, err);
                if (!fibh->sbh)
-                       return NULL;
+                       goto out_err;
                epos.block = dinfo->i_location;
                epos.offset = udf_file_entry_alloc_offset(dir);
                /* Load extent udf_expand_dir_adinicb() has created */
@@ -537,11 +462,8 @@ add:
                                                dir->i_sb->s_blocksize_bits);
                fibh->ebh = udf_bread(dir,
                                f_pos >> dir->i_sb->s_blocksize_bits, 1, err);
-               if (!fibh->ebh) {
-                       brelse(epos.bh);
-                       brelse(fibh->sbh);
-                       return NULL;
-               }
+               if (!fibh->ebh)
+                       goto out_err;
 
                if (!fibh->soffset) {
                        if (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
@@ -572,20 +494,25 @@ add:
        cfi->lengthFileIdent = namelen;
        cfi->lengthOfImpUse = cpu_to_le16(0);
        if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) {
-               brelse(epos.bh);
                dir->i_size += nfidlen;
                if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
                        dinfo->i_lenAlloc += nfidlen;
                mark_inode_dirty(dir);
-               return fi;
+               goto out_ok;
        } else {
-               brelse(epos.bh);
-               if (fibh->sbh != fibh->ebh)
-                       brelse(fibh->ebh);
-               brelse(fibh->sbh);
                *err = -EIO;
-               return NULL;
+               goto out_err;
        }
+
+out_err:
+       fi = NULL;
+       if (fibh->sbh != fibh->ebh)
+               brelse(fibh->ebh);
+       brelse(fibh->sbh);
+out_ok:
+       brelse(epos.bh);
+       kfree(name);
+       return fi;
 }
 
 static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi,
@@ -940,7 +867,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
        char *ea;
        int err;
        int block;
-       char name[UDF_NAME_LEN];
+       char *name = NULL;
        int namelen;
        struct buffer_head *bh;
        struct udf_inode_info *iinfo;
@@ -950,6 +877,12 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
        if (!inode)
                goto out;
 
+       name = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+       if (!name) {
+               err = -ENOMEM;
+               goto out_no_entry;
+       }
+
        iinfo = UDF_I(inode);
        inode->i_mode = S_IFLNK | S_IRWXUGO;
        inode->i_data.a_ops = &udf_symlink_aops;
@@ -1089,6 +1022,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
        err = 0;
 
 out:
+       kfree(name);
        unlock_kernel();
        return err;
 
index fc533345ab89198a12fb472765f7c9073a356970..63610f026ae15046d701d3ab45ab93a04ff51371 100644 (file)
@@ -24,7 +24,6 @@
 
 #include <linux/fs.h>
 #include <linux/string.h>
-#include <linux/udf_fs.h>
 #include <linux/slab.h>
 #include <linux/buffer_head.h>
 
@@ -55,11 +54,10 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block,
        struct udf_sb_info *sbi = UDF_SB(sb);
        struct udf_part_map *map;
        struct udf_virtual_data *vdata;
-       struct udf_inode_info *iinfo;
+       struct udf_inode_info *iinfo = UDF_I(sbi->s_vat_inode);
 
        map = &sbi->s_partmaps[partition];
        vdata = &map->s_type_specific.s_virtual;
-       index = (sb->s_blocksize - vdata->s_start_offset) / sizeof(uint32_t);
 
        if (block > vdata->s_num_entries) {
                udf_debug("Trying to access block beyond end of VAT "
@@ -67,6 +65,12 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block,
                return 0xFFFFFFFF;
        }
 
+       if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
+               loc = le32_to_cpu(((__le32 *)(iinfo->i_ext.i_data +
+                       vdata->s_start_offset))[block]);
+               goto translate;
+       }
+       index = (sb->s_blocksize - vdata->s_start_offset) / sizeof(uint32_t);
        if (block >= index) {
                block -= index;
                newblock = 1 + (block / (sb->s_blocksize / sizeof(uint32_t)));
@@ -89,7 +93,7 @@ uint32_t udf_get_pblock_virt15(struct super_block *sb, uint32_t block,
 
        brelse(bh);
 
-       iinfo = UDF_I(sbi->s_vat_inode);
+translate:
        if (iinfo->i_location.partitionReferenceNum == partition) {
                udf_debug("recursive call to udf_get_pblock!\n");
                return 0xFFFFFFFF;
@@ -263,3 +267,58 @@ int udf_relocate_blocks(struct super_block *sb, long old_block, long *new_block)
 
        return 0;
 }
+
+static uint32_t udf_try_read_meta(struct inode *inode, uint32_t block,
+                                       uint16_t partition, uint32_t offset)
+{
+       struct super_block *sb = inode->i_sb;
+       struct udf_part_map *map;
+       kernel_lb_addr eloc;
+       uint32_t elen;
+       sector_t ext_offset;
+       struct extent_position epos = {};
+       uint32_t phyblock;
+
+       if (inode_bmap(inode, block, &epos, &eloc, &elen, &ext_offset) !=
+                                               (EXT_RECORDED_ALLOCATED >> 30))
+               phyblock = 0xFFFFFFFF;
+       else {
+               map = &UDF_SB(sb)->s_partmaps[partition];
+               /* map to sparable/physical partition desc */
+               phyblock = udf_get_pblock(sb, eloc.logicalBlockNum,
+                       map->s_partition_num, ext_offset + offset);
+       }
+
+       brelse(epos.bh);
+       return phyblock;
+}
+
+uint32_t udf_get_pblock_meta25(struct super_block *sb, uint32_t block,
+                               uint16_t partition, uint32_t offset)
+{
+       struct udf_sb_info *sbi = UDF_SB(sb);
+       struct udf_part_map *map;
+       struct udf_meta_data *mdata;
+       uint32_t retblk;
+       struct inode *inode;
+
+       udf_debug("READING from METADATA\n");
+
+       map = &sbi->s_partmaps[partition];
+       mdata = &map->s_type_specific.s_metadata;
+       inode = mdata->s_metadata_fe ? : mdata->s_mirror_fe;
+
+       /* We shouldn't mount such media... */
+       BUG_ON(!inode);
+       retblk = udf_try_read_meta(inode, block, partition, offset);
+       if (retblk == 0xFFFFFFFF) {
+               udf_warning(sb, __func__, "error reading from METADATA, "
+                       "trying to read from MIRROR");
+               inode = mdata->s_mirror_fe;
+               if (!inode)
+                       return 0xFFFFFFFF;
+               retblk = udf_try_read_meta(inode, block, partition, offset);
+       }
+
+       return retblk;
+}
index f3ac4abfc9467a093ac54ebdef4283e9eaec166c..b564fc140fe4e90efc24b7b7f231a5676aa979b6 100644 (file)
 #include <linux/errno.h>
 #include <linux/mount.h>
 #include <linux/seq_file.h>
+#include <linux/bitmap.h>
+#include <linux/crc-itu-t.h>
 #include <asm/byteorder.h>
 
-#include <linux/udf_fs.h>
 #include "udf_sb.h"
 #include "udf_i.h"
 
@@ -84,22 +85,19 @@ static void udf_write_super(struct super_block *);
 static int udf_remount_fs(struct super_block *, int *, char *);
 static int udf_check_valid(struct super_block *, int, int);
 static int udf_vrs(struct super_block *sb, int silent);
-static int udf_load_partition(struct super_block *, kernel_lb_addr *);
-static int udf_load_logicalvol(struct super_block *, struct buffer_head *,
-                              kernel_lb_addr *);
 static void udf_load_logicalvolint(struct super_block *, kernel_extent_ad);
 static void udf_find_anchor(struct super_block *);
 static int udf_find_fileset(struct super_block *, kernel_lb_addr *,
                            kernel_lb_addr *);
-static void udf_load_pvoldesc(struct super_block *, struct buffer_head *);
 static void udf_load_fileset(struct super_block *, struct buffer_head *,
                             kernel_lb_addr *);
-static int udf_load_partdesc(struct super_block *, struct buffer_head *);
 static void udf_open_lvid(struct super_block *);
 static void udf_close_lvid(struct super_block *);
 static unsigned int udf_count_free(struct super_block *);
 static int udf_statfs(struct dentry *, struct kstatfs *);
 static int udf_show_options(struct seq_file *, struct vfsmount *);
+static void udf_error(struct super_block *sb, const char *function,
+                     const char *fmt, ...);
 
 struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi)
 {
@@ -587,48 +585,10 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
        return 0;
 }
 
-/*
- * udf_set_blocksize
- *
- * PURPOSE
- *     Set the block size to be used in all transfers.
- *
- * DESCRIPTION
- *     To allow room for a DMA transfer, it is best to guess big when unsure.
- *     This routine picks 2048 bytes as the blocksize when guessing. This
- *     should be adequate until devices with larger block sizes become common.
- *
- *     Note that the Linux kernel can currently only deal with blocksizes of
- *     512, 1024, 2048, 4096, and 8192 bytes.
- *
- * PRE-CONDITIONS
- *     sb                      Pointer to _locked_ superblock.
- *
- * POST-CONDITIONS
- *     sb->s_blocksize         Blocksize.
- *     sb->s_blocksize_bits    log2 of blocksize.
- *     <return>        0       Blocksize is valid.
- *     <return>        1       Blocksize is invalid.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
-static int udf_set_blocksize(struct super_block *sb, int bsize)
-{
-       if (!sb_min_blocksize(sb, bsize)) {
-               udf_debug("Bad block size (%d)\n", bsize);
-               printk(KERN_ERR "udf: bad block size (%d)\n", bsize);
-               return 0;
-       }
-
-       return sb->s_blocksize;
-}
-
 static int udf_vrs(struct super_block *sb, int silent)
 {
        struct volStructDesc *vsd = NULL;
-       int sector = 32768;
+       loff_t sector = 32768;
        int sectorsize;
        struct buffer_head *bh = NULL;
        int iso9660 = 0;
@@ -649,7 +609,8 @@ static int udf_vrs(struct super_block *sb, int silent)
        sector += (sbi->s_session << sb->s_blocksize_bits);
 
        udf_debug("Starting at sector %u (%ld byte sectors)\n",
-                 (sector >> sb->s_blocksize_bits), sb->s_blocksize);
+                 (unsigned int)(sector >> sb->s_blocksize_bits),
+                 sb->s_blocksize);
        /* Process the sequence (if applicable) */
        for (; !nsr02 && !nsr03; sector += sectorsize) {
                /* Read a block */
@@ -719,162 +680,140 @@ static int udf_vrs(struct super_block *sb, int silent)
 }
 
 /*
- * udf_find_anchor
- *
- * PURPOSE
- *     Find an anchor volume descriptor.
- *
- * PRE-CONDITIONS
- *     sb                      Pointer to _locked_ superblock.
- *     lastblock               Last block on media.
- *
- * POST-CONDITIONS
- *     <return>                1 if not found, 0 if ok
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
+ * Check whether there is an anchor block in the given block
  */
-static void udf_find_anchor(struct super_block *sb)
+static int udf_check_anchor_block(struct super_block *sb, sector_t block,
+                                       bool varconv)
 {
-       int lastblock;
        struct buffer_head *bh = NULL;
+       tag *t;
        uint16_t ident;
        uint32_t location;
-       int i;
-       struct udf_sb_info *sbi;
 
-       sbi = UDF_SB(sb);
-       lastblock = sbi->s_last_block;
+       if (varconv) {
+               if (udf_fixed_to_variable(block) >=
+                   sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits)
+                       return 0;
+               bh = sb_bread(sb, udf_fixed_to_variable(block));
+       }
+       else
+               bh = sb_bread(sb, block);
 
-       if (lastblock) {
-               int varlastblock = udf_variable_to_fixed(lastblock);
-               int last[] =  { lastblock, lastblock - 2,
-                               lastblock - 150, lastblock - 152,
-                               varlastblock, varlastblock - 2,
-                               varlastblock - 150, varlastblock - 152 };
-
-               lastblock = 0;
-
-               /* Search for an anchor volume descriptor pointer */
-
-               /*  according to spec, anchor is in either:
-                *     block 256
-                *     lastblock-256
-                *     lastblock
-                *  however, if the disc isn't closed, it could be 512 */
-
-               for (i = 0; !lastblock && i < ARRAY_SIZE(last); i++) {
-                       ident = location = 0;
-                       if (last[i] >= 0) {
-                               bh = sb_bread(sb, last[i]);
-                               if (bh) {
-                                       tag *t = (tag *)bh->b_data;
-                                       ident = le16_to_cpu(t->tagIdent);
-                                       location = le32_to_cpu(t->tagLocation);
-                                       brelse(bh);
-                               }
-                       }
+       if (!bh)
+               return 0;
 
-                       if (ident == TAG_IDENT_AVDP) {
-                               if (location == last[i] - sbi->s_session) {
-                                       lastblock = last[i] - sbi->s_session;
-                                       sbi->s_anchor[0] = lastblock;
-                                       sbi->s_anchor[1] = lastblock - 256;
-                               } else if (location ==
-                                               udf_variable_to_fixed(last[i]) -
-                                                       sbi->s_session) {
-                                       UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
-                                       lastblock =
-                                               udf_variable_to_fixed(last[i]) -
-                                                       sbi->s_session;
-                                       sbi->s_anchor[0] = lastblock;
-                                       sbi->s_anchor[1] = lastblock - 256 -
-                                                               sbi->s_session;
-                               } else {
-                                       udf_debug("Anchor found at block %d, "
-                                                 "location mismatch %d.\n",
-                                                 last[i], location);
-                               }
-                       } else if (ident == TAG_IDENT_FE ||
-                                       ident == TAG_IDENT_EFE) {
-                               lastblock = last[i];
-                               sbi->s_anchor[3] = 512;
-                       } else {
-                               ident = location = 0;
-                               if (last[i] >= 256) {
-                                       bh = sb_bread(sb, last[i] - 256);
-                                       if (bh) {
-                                               tag *t = (tag *)bh->b_data;
-                                               ident = le16_to_cpu(
-                                                               t->tagIdent);
-                                               location = le32_to_cpu(
-                                                               t->tagLocation);
-                                               brelse(bh);
-                                       }
-                               }
+       t = (tag *)bh->b_data;
+       ident = le16_to_cpu(t->tagIdent);
+       location = le32_to_cpu(t->tagLocation);
+       brelse(bh);
+       if (ident != TAG_IDENT_AVDP)
+               return 0;
+       return location == block;
+}
 
-                               if (ident == TAG_IDENT_AVDP &&
-                                   location == last[i] - 256 -
-                                               sbi->s_session) {
-                                       lastblock = last[i];
-                                       sbi->s_anchor[1] = last[i] - 256;
-                               } else {
-                                       ident = location = 0;
-                                       if (last[i] >= 312 + sbi->s_session) {
-                                               bh = sb_bread(sb,
-                                                               last[i] - 312 -
-                                                               sbi->s_session);
-                                               if (bh) {
-                                                       tag *t = (tag *)
-                                                                bh->b_data;
-                                                       ident = le16_to_cpu(
-                                                               t->tagIdent);
-                                                       location = le32_to_cpu(
-                                                               t->tagLocation);
-                                                       brelse(bh);
-                                               }
-                                       }
+/* Search for an anchor volume descriptor pointer */
+static sector_t udf_scan_anchors(struct super_block *sb, bool varconv,
+                                       sector_t lastblock)
+{
+       sector_t last[6];
+       int i;
+       struct udf_sb_info *sbi = UDF_SB(sb);
 
-                                       if (ident == TAG_IDENT_AVDP &&
-                                           location == udf_variable_to_fixed(last[i]) - 256) {
-                                               UDF_SET_FLAG(sb,
-                                                            UDF_FLAG_VARCONV);
-                                               lastblock = udf_variable_to_fixed(last[i]);
-                                               sbi->s_anchor[1] = lastblock - 256;
-                                       }
-                               }
-                       }
+       last[0] = lastblock;
+       last[1] = last[0] - 1;
+       last[2] = last[0] + 1;
+       last[3] = last[0] - 2;
+       last[4] = last[0] - 150;
+       last[5] = last[0] - 152;
+
+       /*  according to spec, anchor is in either:
+        *     block 256
+        *     lastblock-256
+        *     lastblock
+        *  however, if the disc isn't closed, it could be 512 */
+
+       for (i = 0; i < ARRAY_SIZE(last); i++) {
+               if (last[i] < 0)
+                       continue;
+               if (last[i] >= sb->s_bdev->bd_inode->i_size >>
+                               sb->s_blocksize_bits)
+                       continue;
+
+               if (udf_check_anchor_block(sb, last[i], varconv)) {
+                       sbi->s_anchor[0] = last[i];
+                       sbi->s_anchor[1] = last[i] - 256;
+                       return last[i];
                }
-       }
 
-       if (!lastblock) {
-               /* We haven't found the lastblock. check 312 */
-               bh = sb_bread(sb, 312 + sbi->s_session);
-               if (bh) {
-                       tag *t = (tag *)bh->b_data;
-                       ident = le16_to_cpu(t->tagIdent);
-                       location = le32_to_cpu(t->tagLocation);
-                       brelse(bh);
+               if (last[i] < 256)
+                       continue;
 
-                       if (ident == TAG_IDENT_AVDP && location == 256)
-                               UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
+               if (udf_check_anchor_block(sb, last[i] - 256, varconv)) {
+                       sbi->s_anchor[1] = last[i] - 256;
+                       return last[i];
                }
        }
 
+       if (udf_check_anchor_block(sb, sbi->s_session + 256, varconv)) {
+               sbi->s_anchor[0] = sbi->s_session + 256;
+               return last[0];
+       }
+       if (udf_check_anchor_block(sb, sbi->s_session + 512, varconv)) {
+               sbi->s_anchor[0] = sbi->s_session + 512;
+               return last[0];
+       }
+       return 0;
+}
+
+/*
+ * Find an anchor volume descriptor. The function expects sbi->s_lastblock to
+ * be the last block on the media.
+ *
+ * Return 1 if not found, 0 if ok
+ *
+ */
+static void udf_find_anchor(struct super_block *sb)
+{
+       sector_t lastblock;
+       struct buffer_head *bh = NULL;
+       uint16_t ident;
+       int i;
+       struct udf_sb_info *sbi = UDF_SB(sb);
+
+       lastblock = udf_scan_anchors(sb, 0, sbi->s_last_block);
+       if (lastblock)
+               goto check_anchor;
+
+       /* No anchor found? Try VARCONV conversion of block numbers */
+       /* Firstly, we try to not convert number of the last block */
+       lastblock = udf_scan_anchors(sb, 1,
+                               udf_variable_to_fixed(sbi->s_last_block));
+       if (lastblock) {
+               UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
+               goto check_anchor;
+       }
+
+       /* Secondly, we try with converted number of the last block */
+       lastblock = udf_scan_anchors(sb, 1, sbi->s_last_block);
+       if (lastblock)
+               UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
+
+check_anchor:
+       /*
+        * Check located anchors and the anchor block supplied via
+        * mount options
+        */
        for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) {
-               if (sbi->s_anchor[i]) {
-                       bh = udf_read_tagged(sb, sbi->s_anchor[i],
-                                            sbi->s_anchor[i], &ident);
-                       if (!bh)
+               if (!sbi->s_anchor[i])
+                       continue;
+               bh = udf_read_tagged(sb, sbi->s_anchor[i],
+                                       sbi->s_anchor[i], &ident);
+               if (!bh)
+                       sbi->s_anchor[i] = 0;
+               else {
+                       brelse(bh);
+                       if (ident != TAG_IDENT_AVDP)
                                sbi->s_anchor[i] = 0;
-                       else {
-                               brelse(bh);
-                               if ((ident != TAG_IDENT_AVDP) &&
-                                   (i || (ident != TAG_IDENT_FE &&
-                                          ident != TAG_IDENT_EFE)))
-                                       sbi->s_anchor[i] = 0;
-                       }
                }
        }
 
@@ -971,27 +910,30 @@ static int udf_find_fileset(struct super_block *sb,
        return 1;
 }
 
-static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh)
+static int udf_load_pvoldesc(struct super_block *sb, sector_t block)
 {
        struct primaryVolDesc *pvoldesc;
-       time_t recording;
-       long recording_usec;
        struct ustr instr;
        struct ustr outstr;
+       struct buffer_head *bh;
+       uint16_t ident;
+
+       bh = udf_read_tagged(sb, block, block, &ident);
+       if (!bh)
+               return 1;
+       BUG_ON(ident != TAG_IDENT_PVD);
 
        pvoldesc = (struct primaryVolDesc *)bh->b_data;
 
-       if (udf_stamp_to_time(&recording, &recording_usec,
-                             lets_to_cpu(pvoldesc->recordingDateAndTime))) {
-               kernel_timestamp ts;
-               ts = lets_to_cpu(pvoldesc->recordingDateAndTime);
-               udf_debug("recording time %ld/%ld, %04u/%02u/%02u"
+       if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time,
+                             pvoldesc->recordingDateAndTime)) {
+#ifdef UDFFS_DEBUG
+               timestamp *ts = &pvoldesc->recordingDateAndTime;
+               udf_debug("recording time %04u/%02u/%02u"
                          " %02u:%02u (%x)\n",
-                         recording, recording_usec,
-                         ts.year, ts.month, ts.day, ts.hour,
-                         ts.minute, ts.typeAndTimezone);
-               UDF_SB(sb)->s_record_time.tv_sec = recording;
-               UDF_SB(sb)->s_record_time.tv_nsec = recording_usec * 1000;
+                         le16_to_cpu(ts->year), ts->month, ts->day, ts->hour,
+                         ts->minute, le16_to_cpu(ts->typeAndTimezone));
+#endif
        }
 
        if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32))
@@ -1005,6 +947,104 @@ static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh)
        if (!udf_build_ustr(&instr, pvoldesc->volSetIdent, 128))
                if (udf_CS0toUTF8(&outstr, &instr))
                        udf_debug("volSetIdent[] = '%s'\n", outstr.u_name);
+
+       brelse(bh);
+       return 0;
+}
+
+static int udf_load_metadata_files(struct super_block *sb, int partition)
+{
+       struct udf_sb_info *sbi = UDF_SB(sb);
+       struct udf_part_map *map;
+       struct udf_meta_data *mdata;
+       kernel_lb_addr addr;
+       int fe_error = 0;
+
+       map = &sbi->s_partmaps[partition];
+       mdata = &map->s_type_specific.s_metadata;
+
+       /* metadata address */
+       addr.logicalBlockNum =  mdata->s_meta_file_loc;
+       addr.partitionReferenceNum = map->s_partition_num;
+
+       udf_debug("Metadata file location: block = %d part = %d\n",
+                         addr.logicalBlockNum, addr.partitionReferenceNum);
+
+       mdata->s_metadata_fe = udf_iget(sb, addr);
+
+       if (mdata->s_metadata_fe == NULL) {
+               udf_warning(sb, __func__, "metadata inode efe not found, "
+                               "will try mirror inode.");
+               fe_error = 1;
+       } else if (UDF_I(mdata->s_metadata_fe)->i_alloc_type !=
+                ICBTAG_FLAG_AD_SHORT) {
+               udf_warning(sb, __func__, "metadata inode efe does not have "
+                       "short allocation descriptors!");
+               fe_error = 1;
+               iput(mdata->s_metadata_fe);
+               mdata->s_metadata_fe = NULL;
+       }
+
+       /* mirror file entry */
+       addr.logicalBlockNum = mdata->s_mirror_file_loc;
+       addr.partitionReferenceNum = map->s_partition_num;
+
+       udf_debug("Mirror metadata file location: block = %d part = %d\n",
+                         addr.logicalBlockNum, addr.partitionReferenceNum);
+
+       mdata->s_mirror_fe = udf_iget(sb, addr);
+
+       if (mdata->s_mirror_fe == NULL) {
+               if (fe_error) {
+                       udf_error(sb, __func__, "mirror inode efe not found "
+                       "and metadata inode is missing too, exiting...");
+                       goto error_exit;
+               } else
+                       udf_warning(sb, __func__, "mirror inode efe not found,"
+                                       " but metadata inode is OK");
+       } else if (UDF_I(mdata->s_mirror_fe)->i_alloc_type !=
+                ICBTAG_FLAG_AD_SHORT) {
+               udf_warning(sb, __func__, "mirror inode efe does not have "
+                       "short allocation descriptors!");
+               iput(mdata->s_mirror_fe);
+               mdata->s_mirror_fe = NULL;
+               if (fe_error)
+                       goto error_exit;
+       }
+
+       /*
+        * bitmap file entry
+        * Note:
+        * Load only if bitmap file location differs from 0xFFFFFFFF (DCN-5102)
+       */
+       if (mdata->s_bitmap_file_loc != 0xFFFFFFFF) {
+               addr.logicalBlockNum = mdata->s_bitmap_file_loc;
+               addr.partitionReferenceNum = map->s_partition_num;
+
+               udf_debug("Bitmap file location: block = %d part = %d\n",
+                       addr.logicalBlockNum, addr.partitionReferenceNum);
+
+               mdata->s_bitmap_fe = udf_iget(sb, addr);
+
+               if (mdata->s_bitmap_fe == NULL) {
+                       if (sb->s_flags & MS_RDONLY)
+                               udf_warning(sb, __func__, "bitmap inode efe "
+                                       "not found but it's ok since the disc"
+                                       " is mounted read-only");
+                       else {
+                               udf_error(sb, __func__, "bitmap inode efe not "
+                                       "found and attempted read-write mount");
+                               goto error_exit;
+                       }
+               }
+       }
+
+       udf_debug("udf_load_metadata_files Ok\n");
+
+       return 0;
+
+error_exit:
+       return 1;
 }
 
 static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh,
@@ -1025,10 +1065,9 @@ static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh,
 int udf_compute_nr_groups(struct super_block *sb, u32 partition)
 {
        struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
-       return (map->s_partition_len +
-               (sizeof(struct spaceBitmapDesc) << 3) +
-               (sb->s_blocksize * 8) - 1) /
-               (sb->s_blocksize * 8);
+       return DIV_ROUND_UP(map->s_partition_len +
+                           (sizeof(struct spaceBitmapDesc) << 3),
+                           sb->s_blocksize * 8);
 }
 
 static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index)
@@ -1059,134 +1098,241 @@ static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index)
        return bitmap;
 }
 
-static int udf_load_partdesc(struct super_block *sb, struct buffer_head *bh)
+static int udf_fill_partdesc_info(struct super_block *sb,
+               struct partitionDesc *p, int p_index)
+{
+       struct udf_part_map *map;
+       struct udf_sb_info *sbi = UDF_SB(sb);
+       struct partitionHeaderDesc *phd;
+
+       map = &sbi->s_partmaps[p_index];
+
+       map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */
+       map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);
+
+       if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
+               map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY;
+       if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE))
+               map->s_partition_flags |= UDF_PART_FLAG_WRITE_ONCE;
+       if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE))
+               map->s_partition_flags |= UDF_PART_FLAG_REWRITABLE;
+       if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE))
+               map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE;
+
+       udf_debug("Partition (%d type %x) starts at physical %d, "
+                 "block length %d\n", p_index,
+                 map->s_partition_type, map->s_partition_root,
+                 map->s_partition_len);
+
+       if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) &&
+           strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03))
+               return 0;
+
+       phd = (struct partitionHeaderDesc *)p->partitionContentsUse;
+       if (phd->unallocSpaceTable.extLength) {
+               kernel_lb_addr loc = {
+                       .logicalBlockNum = le32_to_cpu(
+                               phd->unallocSpaceTable.extPosition),
+                       .partitionReferenceNum = p_index,
+               };
+
+               map->s_uspace.s_table = udf_iget(sb, loc);
+               if (!map->s_uspace.s_table) {
+                       udf_debug("cannot load unallocSpaceTable (part %d)\n",
+                                       p_index);
+                       return 1;
+               }
+               map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE;
+               udf_debug("unallocSpaceTable (part %d) @ %ld\n",
+                               p_index, map->s_uspace.s_table->i_ino);
+       }
+
+       if (phd->unallocSpaceBitmap.extLength) {
+               struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
+               if (!bitmap)
+                       return 1;
+               map->s_uspace.s_bitmap = bitmap;
+               bitmap->s_extLength = le32_to_cpu(
+                               phd->unallocSpaceBitmap.extLength);
+               bitmap->s_extPosition = le32_to_cpu(
+                               phd->unallocSpaceBitmap.extPosition);
+               map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
+               udf_debug("unallocSpaceBitmap (part %d) @ %d\n", p_index,
+                                               bitmap->s_extPosition);
+       }
+
+       if (phd->partitionIntegrityTable.extLength)
+               udf_debug("partitionIntegrityTable (part %d)\n", p_index);
+
+       if (phd->freedSpaceTable.extLength) {
+               kernel_lb_addr loc = {
+                       .logicalBlockNum = le32_to_cpu(
+                               phd->freedSpaceTable.extPosition),
+                       .partitionReferenceNum = p_index,
+               };
+
+               map->s_fspace.s_table = udf_iget(sb, loc);
+               if (!map->s_fspace.s_table) {
+                       udf_debug("cannot load freedSpaceTable (part %d)\n",
+                               p_index);
+                       return 1;
+               }
+
+               map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE;
+               udf_debug("freedSpaceTable (part %d) @ %ld\n",
+                               p_index, map->s_fspace.s_table->i_ino);
+       }
+
+       if (phd->freedSpaceBitmap.extLength) {
+               struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
+               if (!bitmap)
+                       return 1;
+               map->s_fspace.s_bitmap = bitmap;
+               bitmap->s_extLength = le32_to_cpu(
+                               phd->freedSpaceBitmap.extLength);
+               bitmap->s_extPosition = le32_to_cpu(
+                               phd->freedSpaceBitmap.extPosition);
+               map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP;
+               udf_debug("freedSpaceBitmap (part %d) @ %d\n", p_index,
+                                       bitmap->s_extPosition);
+       }
+       return 0;
+}
+
+static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
+{
+       struct udf_sb_info *sbi = UDF_SB(sb);
+       struct udf_part_map *map = &sbi->s_partmaps[p_index];
+       kernel_lb_addr ino;
+       struct buffer_head *bh = NULL;
+       struct udf_inode_info *vati;
+       uint32_t pos;
+       struct virtualAllocationTable20 *vat20;
+
+       /* VAT file entry is in the last recorded block */
+       ino.partitionReferenceNum = type1_index;
+       ino.logicalBlockNum = sbi->s_last_block - map->s_partition_root;
+       sbi->s_vat_inode = udf_iget(sb, ino);
+       if (!sbi->s_vat_inode)
+               return 1;
+
+       if (map->s_partition_type == UDF_VIRTUAL_MAP15) {
+               map->s_type_specific.s_virtual.s_start_offset = 0;
+               map->s_type_specific.s_virtual.s_num_entries =
+                       (sbi->s_vat_inode->i_size - 36) >> 2;
+       } else if (map->s_partition_type == UDF_VIRTUAL_MAP20) {
+               vati = UDF_I(sbi->s_vat_inode);
+               if (vati->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
+                       pos = udf_block_map(sbi->s_vat_inode, 0);
+                       bh = sb_bread(sb, pos);
+                       if (!bh)
+                               return 1;
+                       vat20 = (struct virtualAllocationTable20 *)bh->b_data;
+               } else {
+                       vat20 = (struct virtualAllocationTable20 *)
+                                                       vati->i_ext.i_data;
+               }
+
+               map->s_type_specific.s_virtual.s_start_offset =
+                       le16_to_cpu(vat20->lengthHeader);
+               map->s_type_specific.s_virtual.s_num_entries =
+                       (sbi->s_vat_inode->i_size -
+                               map->s_type_specific.s_virtual.
+                                       s_start_offset) >> 2;
+               brelse(bh);
+       }
+       return 0;
+}
+
+static int udf_load_partdesc(struct super_block *sb, sector_t block)
 {
+       struct buffer_head *bh;
        struct partitionDesc *p;
-       int i;
        struct udf_part_map *map;
-       struct udf_sb_info *sbi;
+       struct udf_sb_info *sbi = UDF_SB(sb);
+       int i, type1_idx;
+       uint16_t partitionNumber;
+       uint16_t ident;
+       int ret = 0;
+
+       bh = udf_read_tagged(sb, block, block, &ident);
+       if (!bh)
+               return 1;
+       if (ident != TAG_IDENT_PD)
+               goto out_bh;
 
        p = (struct partitionDesc *)bh->b_data;
-       sbi = UDF_SB(sb);
+       partitionNumber = le16_to_cpu(p->partitionNumber);
 
+       /* First scan for TYPE1, SPARABLE and METADATA partitions */
        for (i = 0; i < sbi->s_partitions; i++) {
                map = &sbi->s_partmaps[i];
                udf_debug("Searching map: (%d == %d)\n",
-                         map->s_partition_num,
-                         le16_to_cpu(p->partitionNumber));
-               if (map->s_partition_num ==
-                               le16_to_cpu(p->partitionNumber)) {
-                       map->s_partition_len =
-                               le32_to_cpu(p->partitionLength); /* blocks */
-                       map->s_partition_root =
-                               le32_to_cpu(p->partitionStartingLocation);
-                       if (p->accessType ==
-                                       cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
-                               map->s_partition_flags |=
-                                               UDF_PART_FLAG_READ_ONLY;
-                       if (p->accessType ==
-                                       cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE))
-                               map->s_partition_flags |=
-                                               UDF_PART_FLAG_WRITE_ONCE;
-                       if (p->accessType ==
-                                       cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE))
-                               map->s_partition_flags |=
-                                               UDF_PART_FLAG_REWRITABLE;
-                       if (p->accessType ==
-                                   cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE))
-                               map->s_partition_flags |=
-                                               UDF_PART_FLAG_OVERWRITABLE;
-
-                       if (!strcmp(p->partitionContents.ident,
-                                   PD_PARTITION_CONTENTS_NSR02) ||
-                           !strcmp(p->partitionContents.ident,
-                                   PD_PARTITION_CONTENTS_NSR03)) {
-                               struct partitionHeaderDesc *phd;
-
-                               phd = (struct partitionHeaderDesc *)
-                                               (p->partitionContentsUse);
-                               if (phd->unallocSpaceTable.extLength) {
-                                       kernel_lb_addr loc = {
-                                               .logicalBlockNum = le32_to_cpu(phd->unallocSpaceTable.extPosition),
-                                               .partitionReferenceNum = i,
-                                       };
-
-                                       map->s_uspace.s_table =
-                                               udf_iget(sb, loc);
-                                       if (!map->s_uspace.s_table) {
-                                               udf_debug("cannot load unallocSpaceTable (part %d)\n", i);
-                                               return 1;
-                                       }
-                                       map->s_partition_flags |=
-                                               UDF_PART_FLAG_UNALLOC_TABLE;
-                                       udf_debug("unallocSpaceTable (part %d) @ %ld\n",
-                                                 i, map->s_uspace.s_table->i_ino);
-                               }
-                               if (phd->unallocSpaceBitmap.extLength) {
-                                       struct udf_bitmap *bitmap =
-                                               udf_sb_alloc_bitmap(sb, i);
-                                       map->s_uspace.s_bitmap = bitmap;
-                                       if (bitmap != NULL) {
-                                               bitmap->s_extLength =
-                                                       le32_to_cpu(phd->unallocSpaceBitmap.extLength);
-                                               bitmap->s_extPosition =
-                                                       le32_to_cpu(phd->unallocSpaceBitmap.extPosition);
-                                               map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
-                                               udf_debug("unallocSpaceBitmap (part %d) @ %d\n",
-                                                         i, bitmap->s_extPosition);
-                                       }
-                               }
-                               if (phd->partitionIntegrityTable.extLength)
-                                       udf_debug("partitionIntegrityTable (part %d)\n", i);
-                               if (phd->freedSpaceTable.extLength) {
-                                       kernel_lb_addr loc = {
-                                               .logicalBlockNum = le32_to_cpu(phd->freedSpaceTable.extPosition),
-                                               .partitionReferenceNum = i,
-                                       };
-
-                                       map->s_fspace.s_table =
-                                               udf_iget(sb, loc);
-                                       if (!map->s_fspace.s_table) {
-                                               udf_debug("cannot load freedSpaceTable (part %d)\n", i);
-                                               return 1;
-                                       }
-                                       map->s_partition_flags |=
-                                               UDF_PART_FLAG_FREED_TABLE;
-                                       udf_debug("freedSpaceTable (part %d) @ %ld\n",
-                                                 i, map->s_fspace.s_table->i_ino);
-                               }
-                               if (phd->freedSpaceBitmap.extLength) {
-                                       struct udf_bitmap *bitmap =
-                                               udf_sb_alloc_bitmap(sb, i);
-                                       map->s_fspace.s_bitmap = bitmap;
-                                       if (bitmap != NULL) {
-                                               bitmap->s_extLength =
-                                                       le32_to_cpu(phd->freedSpaceBitmap.extLength);
-                                               bitmap->s_extPosition =
-                                                       le32_to_cpu(phd->freedSpaceBitmap.extPosition);
-                                               map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP;
-                                               udf_debug("freedSpaceBitmap (part %d) @ %d\n",
-                                                         i, bitmap->s_extPosition);
-                                       }
-                               }
-                       }
+                         map->s_partition_num, partitionNumber);
+               if (map->s_partition_num == partitionNumber &&
+                   (map->s_partition_type == UDF_TYPE1_MAP15 ||
+                    map->s_partition_type == UDF_SPARABLE_MAP15))
                        break;
-               }
        }
-       if (i == sbi->s_partitions)
+
+       if (i >= sbi->s_partitions) {
                udf_debug("Partition (%d) not found in partition map\n",
-                         le16_to_cpu(p->partitionNumber));
-       else
-               udf_debug("Partition (%d:%d type %x) starts at physical %d, "
-                         "block length %d\n",
-                         le16_to_cpu(p->partitionNumber), i,
-                         map->s_partition_type,
-                         map->s_partition_root,
-                         map->s_partition_len);
-       return 0;
+                         partitionNumber);
+               goto out_bh;
+       }
+
+       ret = udf_fill_partdesc_info(sb, p, i);
+
+       /*
+        * Now rescan for VIRTUAL or METADATA partitions when SPARABLE and
+        * PHYSICAL partitions are already set up
+        */
+       type1_idx = i;
+       for (i = 0; i < sbi->s_partitions; i++) {
+               map = &sbi->s_partmaps[i];
+
+               if (map->s_partition_num == partitionNumber &&
+                   (map->s_partition_type == UDF_VIRTUAL_MAP15 ||
+                    map->s_partition_type == UDF_VIRTUAL_MAP20 ||
+                    map->s_partition_type == UDF_METADATA_MAP25))
+                       break;
+       }
+
+       if (i >= sbi->s_partitions)
+               goto out_bh;
+
+       ret = udf_fill_partdesc_info(sb, p, i);
+       if (ret)
+               goto out_bh;
+
+       if (map->s_partition_type == UDF_METADATA_MAP25) {
+               ret = udf_load_metadata_files(sb, i);
+               if (ret) {
+                       printk(KERN_ERR "UDF-fs: error loading MetaData "
+                       "partition map %d\n", i);
+                       goto out_bh;
+               }
+       } else {
+               ret = udf_load_vat(sb, i, type1_idx);
+               if (ret)
+                       goto out_bh;
+               /*
+                * Mark filesystem read-only if we have a partition with
+                * virtual map since we don't handle writing to it (we
+                * overwrite blocks instead of relocating them).
+                */
+               sb->s_flags |= MS_RDONLY;
+               printk(KERN_NOTICE "UDF-fs: Filesystem marked read-only "
+                       "because writing to pseudooverwrite partition is "
+                       "not implemented.\n");
+       }
+out_bh:
+       /* In case loading failed, we handle cleanup in udf_fill_super */
+       brelse(bh);
+       return ret;
 }
 
-static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh,
+static int udf_load_logicalvol(struct super_block *sb, sector_t block,
                               kernel_lb_addr *fileset)
 {
        struct logicalVolDesc *lvd;
@@ -1194,12 +1340,21 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh,
        uint8_t type;
        struct udf_sb_info *sbi = UDF_SB(sb);
        struct genericPartitionMap *gpm;
+       uint16_t ident;
+       struct buffer_head *bh;
+       int ret = 0;
 
+       bh = udf_read_tagged(sb, block, block, &ident);
+       if (!bh)
+               return 1;
+       BUG_ON(ident != TAG_IDENT_LVD);
        lvd = (struct logicalVolDesc *)bh->b_data;
 
        i = udf_sb_alloc_partition_maps(sb, le32_to_cpu(lvd->numPartitionMaps));
-       if (i != 0)
-               return i;
+       if (i != 0) {
+               ret = i;
+               goto out_bh;
+       }
 
        for (i = 0, offset = 0;
             i < sbi->s_partitions && offset < le32_to_cpu(lvd->mapTableLength);
@@ -1223,12 +1378,12 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh,
                                u16 suf =
                                        le16_to_cpu(((__le16 *)upm2->partIdent.
                                                        identSuffix)[0]);
-                               if (suf == 0x0150) {
+                               if (suf < 0x0200) {
                                        map->s_partition_type =
                                                        UDF_VIRTUAL_MAP15;
                                        map->s_partition_func =
                                                        udf_get_pblock_virt15;
-                               } else if (suf == 0x0200) {
+                               } else {
                                        map->s_partition_type =
                                                        UDF_VIRTUAL_MAP20;
                                        map->s_partition_func =
@@ -1238,7 +1393,6 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh,
                                                UDF_ID_SPARABLE,
                                                strlen(UDF_ID_SPARABLE))) {
                                uint32_t loc;
-                               uint16_t ident;
                                struct sparingTable *st;
                                struct sparablePartitionMap *spm =
                                        (struct sparablePartitionMap *)gpm;
@@ -1256,22 +1410,64 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh,
                                        map->s_type_specific.s_sparing.
                                                        s_spar_map[j] = bh2;
 
-                                       if (bh2 != NULL) {
-                                               st = (struct sparingTable *)
-                                                               bh2->b_data;
-                                               if (ident != 0 || strncmp(
-                                                       st->sparingIdent.ident,
-                                                       UDF_ID_SPARING,
-                                                       strlen(UDF_ID_SPARING))) {
-                                                       brelse(bh2);
-                                                       map->s_type_specific.
-                                                               s_sparing.
-                                                               s_spar_map[j] =
-                                                                       NULL;
-                                               }
+                                       if (bh2 == NULL)
+                                               continue;
+
+                                       st = (struct sparingTable *)bh2->b_data;
+                                       if (ident != 0 || strncmp(
+                                               st->sparingIdent.ident,
+                                               UDF_ID_SPARING,
+                                               strlen(UDF_ID_SPARING))) {
+                                               brelse(bh2);
+                                               map->s_type_specific.s_sparing.
+                                                       s_spar_map[j] = NULL;
                                        }
                                }
                                map->s_partition_func = udf_get_pblock_spar15;
+                       } else if (!strncmp(upm2->partIdent.ident,
+                                               UDF_ID_METADATA,
+                                               strlen(UDF_ID_METADATA))) {
+                               struct udf_meta_data *mdata =
+                                       &map->s_type_specific.s_metadata;
+                               struct metadataPartitionMap *mdm =
+                                               (struct metadataPartitionMap *)
+                                               &(lvd->partitionMaps[offset]);
+                               udf_debug("Parsing Logical vol part %d "
+                                       "type %d  id=%s\n", i, type,
+                                       UDF_ID_METADATA);
+
+                               map->s_partition_type = UDF_METADATA_MAP25;
+                               map->s_partition_func = udf_get_pblock_meta25;
+
+                               mdata->s_meta_file_loc   =
+                                       le32_to_cpu(mdm->metadataFileLoc);
+                               mdata->s_mirror_file_loc =
+                                       le32_to_cpu(mdm->metadataMirrorFileLoc);
+                               mdata->s_bitmap_file_loc =
+                                       le32_to_cpu(mdm->metadataBitmapFileLoc);
+                               mdata->s_alloc_unit_size =
+                                       le32_to_cpu(mdm->allocUnitSize);
+                               mdata->s_align_unit_size =
+                                       le16_to_cpu(mdm->alignUnitSize);
+                               mdata->s_dup_md_flag     =
+                                       mdm->flags & 0x01;
+
+                               udf_debug("Metadata Ident suffix=0x%x\n",
+                                       (le16_to_cpu(
+                                        ((__le16 *)
+                                             mdm->partIdent.identSuffix)[0])));
+                               udf_debug("Metadata part num=%d\n",
+                                       le16_to_cpu(mdm->partitionNum));
+                               udf_debug("Metadata part alloc unit size=%d\n",
+                                       le32_to_cpu(mdm->allocUnitSize));
+                               udf_debug("Metadata file loc=%d\n",
+                                       le32_to_cpu(mdm->metadataFileLoc));
+                               udf_debug("Mirror file loc=%d\n",
+                                      le32_to_cpu(mdm->metadataMirrorFileLoc));
+                               udf_debug("Bitmap file loc=%d\n",
+                                      le32_to_cpu(mdm->metadataBitmapFileLoc));
+                               udf_debug("Duplicate Flag: %d %d\n",
+                                       mdata->s_dup_md_flag, mdm->flags);
                        } else {
                                udf_debug("Unknown ident: %s\n",
                                          upm2->partIdent.ident);
@@ -1296,7 +1492,9 @@ static int udf_load_logicalvol(struct super_block *sb, struct buffer_head *bh,
        if (lvd->integritySeqExt.extLength)
                udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt));
 
-       return 0;
+out_bh:
+       brelse(bh);
+       return ret;
 }
 
 /*
@@ -1345,7 +1543,7 @@ static void udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc)
  *     July 1, 1997 - Andrew E. Mileski
  *     Written, tested, and released.
  */
-static int udf_process_sequence(struct super_block *sb, long block,
+static noinline int udf_process_sequence(struct super_block *sb, long block,
                                long lastblock, kernel_lb_addr *fileset)
 {
        struct buffer_head *bh = NULL;
@@ -1354,19 +1552,25 @@ static int udf_process_sequence(struct super_block *sb, long block,
        struct generic_desc *gd;
        struct volDescPtr *vdp;
        int done = 0;
-       int i, j;
        uint32_t vdsn;
        uint16_t ident;
        long next_s = 0, next_e = 0;
 
        memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH);
 
-       /* Read the main descriptor sequence */
+       /*
+        * Read the main descriptor sequence and find which descriptors
+        * are in it.
+        */
        for (; (!done && block <= lastblock); block++) {
 
                bh = udf_read_tagged(sb, block, block, &ident);
-               if (!bh)
-                       break;
+               if (!bh) {
+                       printk(KERN_ERR "udf: Block %Lu of volume descriptor "
+                              "sequence is corrupted or we could not read "
+                              "it.\n", (unsigned long long)block);
+                       return 1;
+               }
 
                /* Process each descriptor (ISO 13346 3/8.3-8.4) */
                gd = (struct generic_desc *)bh->b_data;
@@ -1432,41 +1636,31 @@ static int udf_process_sequence(struct super_block *sb, long block,
                }
                brelse(bh);
        }
-       for (i = 0; i < VDS_POS_LENGTH; i++) {
-               if (vds[i].block) {
-                       bh = udf_read_tagged(sb, vds[i].block, vds[i].block,
-                                            &ident);
-
-                       if (i == VDS_POS_PRIMARY_VOL_DESC) {
-                               udf_load_pvoldesc(sb, bh);
-                       } else if (i == VDS_POS_LOGICAL_VOL_DESC) {
-                               if (udf_load_logicalvol(sb, bh, fileset)) {
-                                       brelse(bh);
-                                       return 1;
-                               }
-                       } else if (i == VDS_POS_PARTITION_DESC) {
-                               struct buffer_head *bh2 = NULL;
-                               if (udf_load_partdesc(sb, bh)) {
-                                       brelse(bh);
-                                       return 1;
-                               }
-                               for (j = vds[i].block + 1;
-                                    j <  vds[VDS_POS_TERMINATING_DESC].block;
-                                    j++) {
-                                       bh2 = udf_read_tagged(sb, j, j, &ident);
-                                       gd = (struct generic_desc *)bh2->b_data;
-                                       if (ident == TAG_IDENT_PD)
-                                               if (udf_load_partdesc(sb,
-                                                                     bh2)) {
-                                                       brelse(bh);
-                                                       brelse(bh2);
-                                                       return 1;
-                                               }
-                                       brelse(bh2);
-                               }
-                       }
-                       brelse(bh);
-               }
+       /*
+        * Now read interesting descriptors again and process them
+        * in a suitable order
+        */
+       if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) {
+               printk(KERN_ERR "udf: Primary Volume Descriptor not found!\n");
+               return 1;
+       }
+       if (udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block))
+               return 1;
+
+       if (vds[VDS_POS_LOGICAL_VOL_DESC].block && udf_load_logicalvol(sb,
+           vds[VDS_POS_LOGICAL_VOL_DESC].block, fileset))
+               return 1;
+
+       if (vds[VDS_POS_PARTITION_DESC].block) {
+               /*
+                * We rescan the whole descriptor sequence to find
+                * partition descriptor blocks and process them.
+                */
+               for (block = vds[VDS_POS_PARTITION_DESC].block;
+                    block < vds[VDS_POS_TERMINATING_DESC].block;
+                    block++)
+                       if (udf_load_partdesc(sb, block))
+                               return 1;
        }
 
        return 0;
@@ -1478,6 +1672,7 @@ static int udf_process_sequence(struct super_block *sb, long block,
 static int udf_check_valid(struct super_block *sb, int novrs, int silent)
 {
        long block;
+       struct udf_sb_info *sbi = UDF_SB(sb);
 
        if (novrs) {
                udf_debug("Validity check skipped because of novrs option\n");
@@ -1485,27 +1680,22 @@ static int udf_check_valid(struct super_block *sb, int novrs, int silent)
        }
        /* Check that it is NSR02 compliant */
        /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */
-       else {
-               block = udf_vrs(sb, silent);
-               if (block == -1) {
-                       struct udf_sb_info *sbi = UDF_SB(sb);
-                       udf_debug("Failed to read byte 32768. Assuming open "
-                                 "disc. Skipping validity check\n");
-                       if (!sbi->s_last_block)
-                               sbi->s_last_block = udf_get_last_block(sb);
-                       return 0;
-               } else
-                       return !block;
-       }
+       block = udf_vrs(sb, silent);
+       if (block == -1)
+               udf_debug("Failed to read byte 32768. Assuming open "
+                         "disc. Skipping validity check\n");
+       if (block && !sbi->s_last_block)
+               sbi->s_last_block = udf_get_last_block(sb);
+       return !block;
 }
 
-static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset)
+static int udf_load_sequence(struct super_block *sb, kernel_lb_addr *fileset)
 {
        struct anchorVolDescPtr *anchor;
        uint16_t ident;
        struct buffer_head *bh;
        long main_s, main_e, reserve_s, reserve_e;
-       int i, j;
+       int i;
        struct udf_sb_info *sbi;
 
        if (!sb)
@@ -1515,6 +1705,7 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset)
        for (i = 0; i < ARRAY_SIZE(sbi->s_anchor); i++) {
                if (!sbi->s_anchor[i])
                        continue;
+
                bh = udf_read_tagged(sb, sbi->s_anchor[i], sbi->s_anchor[i],
                                     &ident);
                if (!bh)
@@ -1553,76 +1744,6 @@ static int udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset)
        }
        udf_debug("Using anchor in block %d\n", sbi->s_anchor[i]);
 
-       for (i = 0; i < sbi->s_partitions; i++) {
-               kernel_lb_addr uninitialized_var(ino);
-               struct udf_part_map *map = &sbi->s_partmaps[i];
-               switch (map->s_partition_type) {
-               case UDF_VIRTUAL_MAP15:
-               case UDF_VIRTUAL_MAP20:
-                       if (!sbi->s_last_block) {
-                               sbi->s_last_block = udf_get_last_block(sb);
-                               udf_find_anchor(sb);
-                       }
-
-                       if (!sbi->s_last_block) {
-                               udf_debug("Unable to determine Lastblock (For "
-                                         "Virtual Partition)\n");
-                               return 1;
-                       }
-
-                       for (j = 0; j < sbi->s_partitions; j++) {
-                               struct udf_part_map *map2 = &sbi->s_partmaps[j];
-                               if (j != i &&
-                                   map->s_volumeseqnum ==
-                                               map2->s_volumeseqnum &&
-                                   map->s_partition_num ==
-                                               map2->s_partition_num) {
-                                       ino.partitionReferenceNum = j;
-                                       ino.logicalBlockNum =
-                                               sbi->s_last_block -
-                                                       map2->s_partition_root;
-                                       break;
-                               }
-                       }
-
-                       if (j == sbi->s_partitions)
-                               return 1;
-
-                       sbi->s_vat_inode = udf_iget(sb, ino);
-                       if (!sbi->s_vat_inode)
-                               return 1;
-
-                       if (map->s_partition_type == UDF_VIRTUAL_MAP15) {
-                               map->s_type_specific.s_virtual.s_start_offset =
-                                       udf_ext0_offset(sbi->s_vat_inode);
-                               map->s_type_specific.s_virtual.s_num_entries =
-                                       (sbi->s_vat_inode->i_size - 36) >> 2;
-                       } else if (map->s_partition_type == UDF_VIRTUAL_MAP20) {
-                               uint32_t pos;
-                               struct virtualAllocationTable20 *vat20;
-
-                               pos = udf_block_map(sbi->s_vat_inode, 0);
-                               bh = sb_bread(sb, pos);
-                               if (!bh)
-                                       return 1;
-                               vat20 = (struct virtualAllocationTable20 *)
-                                       bh->b_data +
-                                       udf_ext0_offset(sbi->s_vat_inode);
-                               map->s_type_specific.s_virtual.s_start_offset =
-                                       le16_to_cpu(vat20->lengthHeader) +
-                                       udf_ext0_offset(sbi->s_vat_inode);
-                               map->s_type_specific.s_virtual.s_num_entries =
-                                       (sbi->s_vat_inode->i_size -
-                                        map->s_type_specific.s_virtual.
-                                                       s_start_offset) >> 2;
-                               brelse(bh);
-                       }
-                       map->s_partition_root = udf_get_pblock(sb, 0, i, 0);
-                       map->s_partition_len =
-                               sbi->s_partmaps[ino.partitionReferenceNum].
-                                                               s_partition_len;
-               }
-       }
        return 0;
 }
 
@@ -1630,65 +1751,61 @@ static void udf_open_lvid(struct super_block *sb)
 {
        struct udf_sb_info *sbi = UDF_SB(sb);
        struct buffer_head *bh = sbi->s_lvid_bh;
-       if (bh) {
-               kernel_timestamp cpu_time;
-               struct logicalVolIntegrityDesc *lvid =
-                               (struct logicalVolIntegrityDesc *)bh->b_data;
-               struct logicalVolIntegrityDescImpUse *lvidiu =
-                                                       udf_sb_lvidiu(sbi);
+       struct logicalVolIntegrityDesc *lvid;
+       struct logicalVolIntegrityDescImpUse *lvidiu;
+       if (!bh)
+               return;
 
-               lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
-               lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
-               if (udf_time_to_stamp(&cpu_time, CURRENT_TIME))
-                       lvid->recordingDateAndTime = cpu_to_lets(cpu_time);
-               lvid->integrityType = LVID_INTEGRITY_TYPE_OPEN;
+       lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
+       lvidiu = udf_sb_lvidiu(sbi);
 
-               lvid->descTag.descCRC = cpu_to_le16(
-                       udf_crc((char *)lvid + sizeof(tag),
-                               le16_to_cpu(lvid->descTag.descCRCLength),
-                               0));
+       lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
+       lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
+       udf_time_to_disk_stamp(&lvid->recordingDateAndTime,
+                               CURRENT_TIME);
+       lvid->integrityType = LVID_INTEGRITY_TYPE_OPEN;
 
-               lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
-               mark_buffer_dirty(bh);
-       }
+       lvid->descTag.descCRC = cpu_to_le16(
+               crc_itu_t(0, (char *)lvid + sizeof(tag),
+                       le16_to_cpu(lvid->descTag.descCRCLength)));
+
+       lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
+       mark_buffer_dirty(bh);
 }
 
 static void udf_close_lvid(struct super_block *sb)
 {
-       kernel_timestamp cpu_time;
        struct udf_sb_info *sbi = UDF_SB(sb);
        struct buffer_head *bh = sbi->s_lvid_bh;
        struct logicalVolIntegrityDesc *lvid;
+       struct logicalVolIntegrityDescImpUse *lvidiu;
 
        if (!bh)
                return;
 
        lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
 
-       if (lvid->integrityType == LVID_INTEGRITY_TYPE_OPEN) {
-               struct logicalVolIntegrityDescImpUse *lvidiu =
-                                                       udf_sb_lvidiu(sbi);
-               lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
-               lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
-               if (udf_time_to_stamp(&cpu_time, CURRENT_TIME))
-                       lvid->recordingDateAndTime = cpu_to_lets(cpu_time);
-               if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
-                       lvidiu->maxUDFWriteRev =
-                                       cpu_to_le16(UDF_MAX_WRITE_VERSION);
-               if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev))
-                       lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev);
-               if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev))
-                       lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev);
-               lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE);
-
-               lvid->descTag.descCRC = cpu_to_le16(
-                       udf_crc((char *)lvid + sizeof(tag),
-                               le16_to_cpu(lvid->descTag.descCRCLength),
-                               0));
-
-               lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
-               mark_buffer_dirty(bh);
-       }
+       if (lvid->integrityType != LVID_INTEGRITY_TYPE_OPEN)
+               return;
+
+       lvidiu = udf_sb_lvidiu(sbi);
+       lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
+       lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
+       udf_time_to_disk_stamp(&lvid->recordingDateAndTime, CURRENT_TIME);
+       if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
+               lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
+       if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev))
+               lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev);
+       if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev))
+               lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev);
+       lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE);
+
+       lvid->descTag.descCRC = cpu_to_le16(
+                       crc_itu_t(0, (char *)lvid + sizeof(tag),
+                               le16_to_cpu(lvid->descTag.descCRCLength)));
+
+       lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
+       mark_buffer_dirty(bh);
 }
 
 static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
@@ -1708,22 +1825,35 @@ static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
                vfree(bitmap);
 }
 
-/*
- * udf_read_super
- *
- * PURPOSE
- *     Complete the specified super block.
- *
- * PRE-CONDITIONS
- *     sb                      Pointer to superblock to complete - never NULL.
- *     sb->s_dev               Device to read suberblock from.
- *     options                 Pointer to mount options.
- *     silent                  Silent flag.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
+static void udf_free_partition(struct udf_part_map *map)
+{
+       int i;
+       struct udf_meta_data *mdata;
+
+       if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
+               iput(map->s_uspace.s_table);
+       if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
+               iput(map->s_fspace.s_table);
+       if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
+               udf_sb_free_bitmap(map->s_uspace.s_bitmap);
+       if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
+               udf_sb_free_bitmap(map->s_fspace.s_bitmap);
+       if (map->s_partition_type == UDF_SPARABLE_MAP15)
+               for (i = 0; i < 4; i++)
+                       brelse(map->s_type_specific.s_sparing.s_spar_map[i]);
+       else if (map->s_partition_type == UDF_METADATA_MAP25) {
+               mdata = &map->s_type_specific.s_metadata;
+               iput(mdata->s_metadata_fe);
+               mdata->s_metadata_fe = NULL;
+
+               iput(mdata->s_mirror_fe);
+               mdata->s_mirror_fe = NULL;
+
+               iput(mdata->s_bitmap_fe);
+               mdata->s_bitmap_fe = NULL;
+       }
+}
+
 static int udf_fill_super(struct super_block *sb, void *options, int silent)
 {
        int i;
@@ -1776,8 +1906,11 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
        sbi->s_nls_map = uopt.nls_map;
 
        /* Set the block size for all transfers */
-       if (!udf_set_blocksize(sb, uopt.blocksize))
+       if (!sb_min_blocksize(sb, uopt.blocksize)) {
+               udf_debug("Bad block size (%d)\n", uopt.blocksize);
+               printk(KERN_ERR "udf: bad block size (%d)\n", uopt.blocksize);
                goto error_out;
+       }
 
        if (uopt.session == 0xFFFFFFFF)
                sbi->s_session = udf_get_last_session(sb);
@@ -1789,7 +1922,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
        sbi->s_last_block = uopt.lastblock;
        sbi->s_anchor[0] = sbi->s_anchor[1] = 0;
        sbi->s_anchor[2] = uopt.anchor;
-       sbi->s_anchor[3] = 256;
 
        if (udf_check_valid(sb, uopt.novrs, silent)) {
                /* read volume recognition sequences */
@@ -1806,7 +1938,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
        sb->s_magic = UDF_SUPER_MAGIC;
        sb->s_time_gran = 1000;
 
-       if (udf_load_partition(sb, &fileset)) {
+       if (udf_load_sequence(sb, &fileset)) {
                printk(KERN_WARNING "UDF-fs: No partition found (1)\n");
                goto error_out;
        }
@@ -1856,12 +1988,12 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
        }
 
        if (!silent) {
-               kernel_timestamp ts;
-               udf_time_to_stamp(&ts, sbi->s_record_time);
+               timestamp ts;
+               udf_time_to_disk_stamp(&ts, sbi->s_record_time);
                udf_info("UDF: Mounting volume '%s', "
                         "timestamp %04u/%02u/%02u %02u:%02u (%x)\n",
-                        sbi->s_volume_ident, ts.year, ts.month, ts.day,
-                        ts.hour, ts.minute, ts.typeAndTimezone);
+                        sbi->s_volume_ident, le16_to_cpu(ts.year), ts.month, ts.day,
+                        ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone));
        }
        if (!(sb->s_flags & MS_RDONLY))
                udf_open_lvid(sb);
@@ -1890,21 +2022,9 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent)
 error_out:
        if (sbi->s_vat_inode)
                iput(sbi->s_vat_inode);
-       if (sbi->s_partitions) {
-               struct udf_part_map *map = &sbi->s_partmaps[sbi->s_partition];
-               if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
-                       iput(map->s_uspace.s_table);
-               if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
-                       iput(map->s_fspace.s_table);
-               if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
-                       udf_sb_free_bitmap(map->s_uspace.s_bitmap);
-               if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
-                       udf_sb_free_bitmap(map->s_fspace.s_bitmap);
-               if (map->s_partition_type == UDF_SPARABLE_MAP15)
-                       for (i = 0; i < 4; i++)
-                               brelse(map->s_type_specific.s_sparing.
-                                               s_spar_map[i]);
-       }
+       if (sbi->s_partitions)
+               for (i = 0; i < sbi->s_partitions; i++)
+                       udf_free_partition(&sbi->s_partmaps[i]);
 #ifdef CONFIG_UDF_NLS
        if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
                unload_nls(sbi->s_nls_map);
@@ -1920,8 +2040,8 @@ error_out:
        return -EINVAL;
 }
 
-void udf_error(struct super_block *sb, const char *function,
-              const char *fmt, ...)
+static void udf_error(struct super_block *sb, const char *function,
+                     const char *fmt, ...)
 {
        va_list args;
 
@@ -1948,19 +2068,6 @@ void udf_warning(struct super_block *sb, const char *function,
               sb->s_id, function, error_buf);
 }
 
-/*
- * udf_put_super
- *
- * PURPOSE
- *     Prepare for destruction of the superblock.
- *
- * DESCRIPTION
- *     Called before the filesystem is unmounted.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
 static void udf_put_super(struct super_block *sb)
 {
        int i;
@@ -1969,21 +2076,9 @@ static void udf_put_super(struct super_block *sb)
        sbi = UDF_SB(sb);
        if (sbi->s_vat_inode)
                iput(sbi->s_vat_inode);
-       if (sbi->s_partitions) {
-               struct udf_part_map *map = &sbi->s_partmaps[sbi->s_partition];
-               if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
-                       iput(map->s_uspace.s_table);
-               if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
-                       iput(map->s_fspace.s_table);
-               if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
-                       udf_sb_free_bitmap(map->s_uspace.s_bitmap);
-               if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
-                       udf_sb_free_bitmap(map->s_fspace.s_bitmap);
-               if (map->s_partition_type == UDF_SPARABLE_MAP15)
-                       for (i = 0; i < 4; i++)
-                               brelse(map->s_type_specific.s_sparing.
-                                               s_spar_map[i]);
-       }
+       if (sbi->s_partitions)
+               for (i = 0; i < sbi->s_partitions; i++)
+                       udf_free_partition(&sbi->s_partmaps[i]);
 #ifdef CONFIG_UDF_NLS
        if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
                unload_nls(sbi->s_nls_map);
@@ -1996,19 +2091,6 @@ static void udf_put_super(struct super_block *sb)
        sb->s_fs_info = NULL;
 }
 
-/*
- * udf_stat_fs
- *
- * PURPOSE
- *     Return info about the filesystem.
- *
- * DESCRIPTION
- *     Called by sys_statfs()
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- */
 static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
 {
        struct super_block *sb = dentry->d_sb;
@@ -2035,10 +2117,6 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
        return 0;
 }
 
-static unsigned char udf_bitmap_lookup[16] = {
-       0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
-};
-
 static unsigned int udf_count_free_bitmap(struct super_block *sb,
                                          struct udf_bitmap *bitmap)
 {
@@ -2048,7 +2126,6 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb,
        int block = 0, newblock;
        kernel_lb_addr loc;
        uint32_t bytes;
-       uint8_t value;
        uint8_t *ptr;
        uint16_t ident;
        struct spaceBitmapDesc *bm;
@@ -2074,13 +2151,10 @@ static unsigned int udf_count_free_bitmap(struct super_block *sb,
        ptr = (uint8_t *)bh->b_data;
 
        while (bytes > 0) {
-               while ((bytes > 0) && (index < sb->s_blocksize)) {
-                       value = ptr[index];
-                       accum += udf_bitmap_lookup[value & 0x0f];
-                       accum += udf_bitmap_lookup[value >> 4];
-                       index++;
-                       bytes--;
-               }
+               u32 cur_bytes = min_t(u32, bytes, sb->s_blocksize - index);
+               accum += bitmap_weight((const unsigned long *)(ptr + index),
+                                       cur_bytes * 8);
+               bytes -= cur_bytes;
                if (bytes) {
                        brelse(bh);
                        newblock = udf_get_lb_pblock(sb, loc, ++block);
index 6ec99221e50c6c02dd90df64e8b0a39d9bc771b8..c3265e1385d43c5c6ed0e2960cf9d83a72493e4a 100644 (file)
@@ -23,7 +23,6 @@
 #include <asm/uaccess.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
-#include <linux/udf_fs.h>
 #include <linux/time.h>
 #include <linux/mm.h>
 #include <linux/stat.h>
index fe61be17cdab93315f5f66b32d5add96b20b1d23..65e19b4f9424c20f8f616b7ee5de3db55f33ed0e 100644 (file)
@@ -22,7 +22,6 @@
 #include "udfdecl.h"
 #include <linux/fs.h>
 #include <linux/mm.h>
-#include <linux/udf_fs.h>
 #include <linux/buffer_head.h>
 
 #include "udf_i.h"
@@ -180,6 +179,24 @@ void udf_discard_prealloc(struct inode *inode)
        brelse(epos.bh);
 }
 
+static void udf_update_alloc_ext_desc(struct inode *inode,
+                                     struct extent_position *epos,
+                                     u32 lenalloc)
+{
+       struct super_block *sb = inode->i_sb;
+       struct udf_sb_info *sbi = UDF_SB(sb);
+
+       struct allocExtDesc *aed = (struct allocExtDesc *) (epos->bh->b_data);
+       int len = sizeof(struct allocExtDesc);
+
+       aed->lengthAllocDescs = cpu_to_le32(lenalloc);
+       if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) || sbi->s_udfrev >= 0x0201)
+               len += lenalloc;
+
+       udf_update_tag(epos->bh->b_data, len);
+       mark_buffer_dirty_inode(epos->bh, inode);
+}
+
 void udf_truncate_extents(struct inode *inode)
 {
        struct extent_position epos;
@@ -187,7 +204,6 @@ void udf_truncate_extents(struct inode *inode)
        uint32_t elen, nelen = 0, indirect_ext_len = 0, lenalloc;
        int8_t etype;
        struct super_block *sb = inode->i_sb;
-       struct udf_sb_info *sbi = UDF_SB(sb);
        sector_t first_block = inode->i_size >> sb->s_blocksize_bits, offset;
        loff_t byte_offset;
        int adsize;
@@ -224,35 +240,15 @@ void udf_truncate_extents(struct inode *inode)
                                if (indirect_ext_len) {
                                        /* We managed to free all extents in the
                                         * indirect extent - free it too */
-                                       if (!epos.bh)
-                                               BUG();
+                                       BUG_ON(!epos.bh);
                                        udf_free_blocks(sb, inode, epos.block,
                                                        0, indirect_ext_len);
-                               } else {
-                                       if (!epos.bh) {
-                                               iinfo->i_lenAlloc =
-                                                               lenalloc;
-                                               mark_inode_dirty(inode);
-                                       } else {
-                                               struct allocExtDesc *aed =
-                                                       (struct allocExtDesc *)
-                                                       (epos.bh->b_data);
-                                               int len =
-                                                   sizeof(struct allocExtDesc);
-
-                                               aed->lengthAllocDescs =
-                                                   cpu_to_le32(lenalloc);
-                                               if (!UDF_QUERY_FLAG(sb,
-                                                       UDF_FLAG_STRICT) ||
-                                                   sbi->s_udfrev >= 0x0201)
-                                                       len += lenalloc;
-
-                                               udf_update_tag(epos.bh->b_data,
-                                                               len);
-                                               mark_buffer_dirty_inode(
-                                                               epos.bh, inode);
-                                       }
-                               }
+                               } else if (!epos.bh) {
+                                       iinfo->i_lenAlloc = lenalloc;
+                                       mark_inode_dirty(inode);
+                               } else
+                                       udf_update_alloc_ext_desc(inode,
+                                                       &epos, lenalloc);
                                brelse(epos.bh);
                                epos.offset = sizeof(struct allocExtDesc);
                                epos.block = eloc;
@@ -272,29 +268,14 @@ void udf_truncate_extents(struct inode *inode)
                }
 
                if (indirect_ext_len) {
-                       if (!epos.bh)
-                               BUG();
+                       BUG_ON(!epos.bh);
                        udf_free_blocks(sb, inode, epos.block, 0,
                                        indirect_ext_len);
-               } else {
-                       if (!epos.bh) {
-                               iinfo->i_lenAlloc = lenalloc;
-                               mark_inode_dirty(inode);
-                       } else {
-                               struct allocExtDesc *aed =
-                                   (struct allocExtDesc *)(epos.bh->b_data);
-                               aed->lengthAllocDescs = cpu_to_le32(lenalloc);
-                               if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT) ||
-                                   sbi->s_udfrev >= 0x0201)
-                                       udf_update_tag(epos.bh->b_data,
-                                               lenalloc +
-                                               sizeof(struct allocExtDesc));
-                               else
-                                       udf_update_tag(epos.bh->b_data,
-                                               sizeof(struct allocExtDesc));
-                               mark_buffer_dirty_inode(epos.bh, inode);
-                       }
-               }
+               } else if (!epos.bh) {
+                       iinfo->i_lenAlloc = lenalloc;
+                       mark_inode_dirty(inode);
+               } else
+                       udf_update_alloc_ext_desc(inode, &epos, lenalloc);
        } else if (inode->i_size) {
                if (byte_offset) {
                        kernel_long_ad extent;
index ccc52f16bf7d573291a94aedab5ef6d33cfc8bee..4f86b1d98a5d44ffbf1ae64bee4618c2dfcf3b4a 100644 (file)
@@ -1,10 +1,32 @@
-#ifndef __LINUX_UDF_I_H
-#define __LINUX_UDF_I_H
+#ifndef _UDF_I_H
+#define _UDF_I_H
+
+struct udf_inode_info {
+       struct timespec         i_crtime;
+       /* Physical address of inode */
+       kernel_lb_addr          i_location;
+       __u64                   i_unique;
+       __u32                   i_lenEAttr;
+       __u32                   i_lenAlloc;
+       __u64                   i_lenExtents;
+       __u32                   i_next_alloc_block;
+       __u32                   i_next_alloc_goal;
+       unsigned                i_alloc_type : 3;
+       unsigned                i_efe : 1;      /* extendedFileEntry */
+       unsigned                i_use : 1;      /* unallocSpaceEntry */
+       unsigned                i_strat4096 : 1;
+       unsigned                reserved : 26;
+       union {
+               short_ad        *i_sad;
+               long_ad         *i_lad;
+               __u8            *i_data;
+       } i_ext;
+       struct inode vfs_inode;
+};
 
-#include <linux/udf_fs_i.h>
 static inline struct udf_inode_info *UDF_I(struct inode *inode)
 {
        return list_entry(inode, struct udf_inode_info, vfs_inode);
 }
 
-#endif /* !defined(_LINUX_UDF_I_H) */
+#endif /* _UDF_I_H) */
index 737d1c604eea0330848b1223dc4e696f4fee0cb7..1c1c514a9725116f19cf559e3af969251d99c74e 100644 (file)
@@ -1,10 +1,12 @@
 #ifndef __LINUX_UDF_SB_H
 #define __LINUX_UDF_SB_H
 
+#include <linux/mutex.h>
+
 /* Since UDF 2.01 is ISO 13346 based... */
 #define UDF_SUPER_MAGIC                        0x15013346
 
-#define UDF_MAX_READ_VERSION           0x0201
+#define UDF_MAX_READ_VERSION           0x0250
 #define UDF_MAX_WRITE_VERSION          0x0201
 
 #define UDF_FLAG_USE_EXTENDED_FE       0
 #define UDF_PART_FLAG_REWRITABLE       0x0040
 #define UDF_PART_FLAG_OVERWRITABLE     0x0080
 
+#define UDF_MAX_BLOCK_LOADED   8
+
+#define UDF_TYPE1_MAP15                        0x1511U
+#define UDF_VIRTUAL_MAP15              0x1512U
+#define UDF_VIRTUAL_MAP20              0x2012U
+#define UDF_SPARABLE_MAP15             0x1522U
+#define UDF_METADATA_MAP25             0x2511U
+
+#pragma pack(1) /* XXX(hch): Why?  This file just defines in-core structures */
+
+struct udf_meta_data {
+       __u32   s_meta_file_loc;
+       __u32   s_mirror_file_loc;
+       __u32   s_bitmap_file_loc;
+       __u32   s_alloc_unit_size;
+       __u16   s_align_unit_size;
+       __u8    s_dup_md_flag;
+       struct inode *s_metadata_fe;
+       struct inode *s_mirror_fe;
+       struct inode *s_bitmap_fe;
+};
+
+struct udf_sparing_data {
+       __u16   s_packet_len;
+       struct buffer_head *s_spar_map[4];
+};
+
+struct udf_virtual_data {
+       __u32   s_num_entries;
+       __u16   s_start_offset;
+};
+
+struct udf_bitmap {
+       __u32                   s_extLength;
+       __u32                   s_extPosition;
+       __u16                   s_nr_groups;
+       struct buffer_head      **s_block_bitmap;
+};
+
+struct udf_part_map {
+       union {
+               struct udf_bitmap       *s_bitmap;
+               struct inode            *s_table;
+       } s_uspace;
+       union {
+               struct udf_bitmap       *s_bitmap;
+               struct inode            *s_table;
+       } s_fspace;
+       __u32   s_partition_root;
+       __u32   s_partition_len;
+       __u16   s_partition_type;
+       __u16   s_partition_num;
+       union {
+               struct udf_sparing_data s_sparing;
+               struct udf_virtual_data s_virtual;
+               struct udf_meta_data s_metadata;
+       } s_type_specific;
+       __u32   (*s_partition_func)(struct super_block *, __u32, __u16, __u32);
+       __u16   s_volumeseqnum;
+       __u16   s_partition_flags;
+};
+
+#pragma pack()
+
+struct udf_sb_info {
+       struct udf_part_map     *s_partmaps;
+       __u8                    s_volume_ident[32];
+
+       /* Overall info */
+       __u16                   s_partitions;
+       __u16                   s_partition;
+
+       /* Sector headers */
+       __s32                   s_session;
+       __u32                   s_anchor[3];
+       __u32                   s_last_block;
+
+       struct buffer_head      *s_lvid_bh;
+
+       /* Default permissions */
+       mode_t                  s_umask;
+       gid_t                   s_gid;
+       uid_t                   s_uid;
+
+       /* Root Info */
+       struct timespec         s_record_time;
+
+       /* Fileset Info */
+       __u16                   s_serial_number;
+
+       /* highest UDF revision we have recorded to this media */
+       __u16                   s_udfrev;
+
+       /* Miscellaneous flags */
+       __u32                   s_flags;
+
+       /* Encoding info */
+       struct nls_table        *s_nls_map;
+
+       /* VAT inode */
+       struct inode            *s_vat_inode;
+
+       struct mutex            s_alloc_mutex;
+};
+
 static inline struct udf_sb_info *UDF_SB(struct super_block *sb)
 {
        return sb->s_fs_info;
index 681dc2b66cdbb9583e7c8f2d958f227f96928380..f3f45d029277a4f1b038c6baf38ca2cce8703739 100644 (file)
@@ -1,17 +1,37 @@
 #ifndef __UDF_DECL_H
 #define __UDF_DECL_H
 
-#include <linux/udf_fs.h>
 #include "ecma_167.h"
 #include "osta_udf.h"
 
 #include <linux/fs.h>
 #include <linux/types.h>
-#include <linux/udf_fs_i.h>
-#include <linux/udf_fs_sb.h>
 #include <linux/buffer_head.h>
+#include <linux/udf_fs_i.h>
 
+#include "udf_sb.h"
 #include "udfend.h"
+#include "udf_i.h"
+
+#define UDF_PREALLOCATE
+#define UDF_DEFAULT_PREALLOC_BLOCKS    8
+
+#define UDFFS_DEBUG
+
+#ifdef UDFFS_DEBUG
+#define udf_debug(f, a...) \
+do { \
+       printk(KERN_DEBUG "UDF-fs DEBUG %s:%d:%s: ", \
+               __FILE__, __LINE__, __func__); \
+       printk(f, ##a); \
+} while (0)
+#else
+#define udf_debug(f, a...) /**/
+#endif
+
+#define udf_info(f, a...) \
+       printk(KERN_INFO "UDF-fs INFO " f, ##a);
+
 
 #define udf_fixed_to_variable(x) ( ( ( (x) >> 5 ) * 39 ) + ( (x) & 0x0000001F ) )
 #define udf_variable_to_fixed(x) ( ( ( (x) / 39 ) << 5 ) + ( (x) % 39 ) )
 #define UDF_NAME_LEN           256
 #define UDF_PATH_LEN           1023
 
-#define udf_file_entry_alloc_offset(inode)\
-       (UDF_I(inode)->i_use ?\
-               sizeof(struct unallocSpaceEntry) :\
-               ((UDF_I(inode)->i_efe ?\
-                       sizeof(struct extendedFileEntry) :\
-                       sizeof(struct fileEntry)) + UDF_I(inode)->i_lenEAttr))
-
-#define udf_ext0_offset(inode)\
-       (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB ?\
-               udf_file_entry_alloc_offset(inode) : 0)
+static inline size_t udf_file_entry_alloc_offset(struct inode *inode)
+{
+       struct udf_inode_info *iinfo = UDF_I(inode);
+       if (iinfo->i_use)
+               return sizeof(struct unallocSpaceEntry);
+       else if (iinfo->i_efe)
+               return sizeof(struct extendedFileEntry) + iinfo->i_lenEAttr;
+       else
+               return sizeof(struct fileEntry) + iinfo->i_lenEAttr;
+}
+
+static inline size_t udf_ext0_offset(struct inode *inode)
+{
+       if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
+               return udf_file_entry_alloc_offset(inode);
+       else
+               return 0;
+}
 
 #define udf_get_lb_pblock(sb,loc,offset) udf_get_pblock((sb), (loc).logicalBlockNum, (loc).partitionReferenceNum, (offset))
 
@@ -83,7 +111,6 @@ struct extent_position {
 };
 
 /* super.c */
-extern void udf_error(struct super_block *, const char *, const char *, ...);
 extern void udf_warning(struct super_block *, const char *, const char *, ...);
 
 /* namei.c */
@@ -150,6 +177,8 @@ extern uint32_t udf_get_pblock_virt20(struct super_block *, uint32_t, uint16_t,
                                      uint32_t);
 extern uint32_t udf_get_pblock_spar15(struct super_block *, uint32_t, uint16_t,
                                      uint32_t);
+extern uint32_t udf_get_pblock_meta25(struct super_block *, uint32_t, uint16_t,
+                                         uint32_t);
 extern int udf_relocate_blocks(struct super_block *, long, long *);
 
 /* unicode.c */
@@ -157,7 +186,7 @@ extern int udf_get_filename(struct super_block *, uint8_t *, uint8_t *, int);
 extern int udf_put_filename(struct super_block *, const uint8_t *, uint8_t *,
                            int);
 extern int udf_build_ustr(struct ustr *, dstring *, int);
-extern int udf_CS0toUTF8(struct ustr *, struct ustr *);
+extern int udf_CS0toUTF8(struct ustr *, const struct ustr *);
 
 /* ialloc.c */
 extern void udf_free_inode(struct inode *);
@@ -191,11 +220,9 @@ extern struct fileIdentDesc *udf_get_fileident(void *buffer, int bufsize,
 extern long_ad *udf_get_filelongad(uint8_t *, int, uint32_t *, int);
 extern short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int);
 
-/* crc.c */
-extern uint16_t udf_crc(uint8_t *, uint32_t, uint16_t);
-
 /* udftime.c */
-extern time_t *udf_stamp_to_time(time_t *, long *, kernel_timestamp);
-extern kernel_timestamp *udf_time_to_stamp(kernel_timestamp *, struct timespec);
+extern struct timespec *udf_disk_stamp_to_time(struct timespec *dest,
+                                               timestamp src);
+extern timestamp *udf_time_to_disk_stamp(timestamp *dest, struct timespec src);
 
 #endif                         /* __UDF_DECL_H */
index c4bd1203f857a5bb72c8df677c23aaebacc5f396..489f52fb428cd309fb73002be58ce8b38bb09f0d 100644 (file)
@@ -24,17 +24,6 @@ static inline lb_addr cpu_to_lelb(kernel_lb_addr in)
        return out;
 }
 
-static inline kernel_timestamp lets_to_cpu(timestamp in)
-{
-       kernel_timestamp out;
-
-       memcpy(&out, &in, sizeof(timestamp));
-       out.typeAndTimezone = le16_to_cpu(in.typeAndTimezone);
-       out.year = le16_to_cpu(in.year);
-
-       return out;
-}
-
 static inline short_ad lesa_to_cpu(short_ad in)
 {
        short_ad out;
@@ -85,15 +74,4 @@ static inline kernel_extent_ad leea_to_cpu(extent_ad in)
        return out;
 }
 
-static inline timestamp cpu_to_lets(kernel_timestamp in)
-{
-       timestamp out;
-
-       memcpy(&out, &in, sizeof(timestamp));
-       out.typeAndTimezone = cpu_to_le16(in.typeAndTimezone);
-       out.year = cpu_to_le16(in.year);
-
-       return out;
-}
-
 #endif /* __UDF_ENDIAN_H */
index ce595732ba6f37e0fd697ddc3ca4cfe9ab5f9423..5f811655c9b51abbdbd33f39113a9e963df66aa5 100644 (file)
@@ -85,39 +85,38 @@ extern struct timezone sys_tz;
 #define SECS_PER_HOUR  (60 * 60)
 #define SECS_PER_DAY   (SECS_PER_HOUR * 24)
 
-time_t *udf_stamp_to_time(time_t *dest, long *dest_usec, kernel_timestamp src)
+struct timespec *udf_disk_stamp_to_time(struct timespec *dest, timestamp src)
 {
        int yday;
-       uint8_t type = src.typeAndTimezone >> 12;
+       u16 typeAndTimezone = le16_to_cpu(src.typeAndTimezone);
+       u16 year = le16_to_cpu(src.year);
+       uint8_t type = typeAndTimezone >> 12;
        int16_t offset;
 
        if (type == 1) {
-               offset = src.typeAndTimezone << 4;
+               offset = typeAndTimezone << 4;
                /* sign extent offset */
                offset = (offset >> 4);
                if (offset == -2047) /* unspecified offset */
                        offset = 0;
-       } else {
+       } else
                offset = 0;
-       }
 
-       if ((src.year < EPOCH_YEAR) ||
-           (src.year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) {
-               *dest = -1;
-               *dest_usec = -1;
+       if ((year < EPOCH_YEAR) ||
+           (year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) {
                return NULL;
        }
-       *dest = year_seconds[src.year - EPOCH_YEAR];
-       *dest -= offset * 60;
+       dest->tv_sec = year_seconds[year - EPOCH_YEAR];
+       dest->tv_sec -= offset * 60;
 
-       yday = ((__mon_yday[__isleap(src.year)][src.month - 1]) + src.day - 1);
-       *dest += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second;
-       *dest_usec = src.centiseconds * 10000 +
-                       src.hundredsOfMicroseconds * 100 + src.microseconds;
+       yday = ((__mon_yday[__isleap(year)][src.month - 1]) + src.day - 1);
+       dest->tv_sec += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second;
+       dest->tv_nsec = 1000 * (src.centiseconds * 10000 +
+                       src.hundredsOfMicroseconds * 100 + src.microseconds);
        return dest;
 }
 
-kernel_timestamp *udf_time_to_stamp(kernel_timestamp *dest, struct timespec ts)
+timestamp *udf_time_to_disk_stamp(timestamp *dest, struct timespec ts)
 {
        long int days, rem, y;
        const unsigned short int *ip;
@@ -128,7 +127,7 @@ kernel_timestamp *udf_time_to_stamp(kernel_timestamp *dest, struct timespec ts)
        if (!dest)
                return NULL;
 
-       dest->typeAndTimezone = 0x1000 | (offset & 0x0FFF);
+       dest->typeAndTimezone = cpu_to_le16(0x1000 | (offset & 0x0FFF));
 
        ts.tv_sec += offset * 60;
        days = ts.tv_sec / SECS_PER_DAY;
@@ -151,7 +150,7 @@ kernel_timestamp *udf_time_to_stamp(kernel_timestamp *dest, struct timespec ts)
                         - LEAPS_THRU_END_OF(y - 1));
                y = yg;
        }
-       dest->year = y;
+       dest->year = cpu_to_le16(y);
        ip = __mon_yday[__isleap(y)];
        for (y = 11; days < (long int)ip[y]; --y)
                continue;
index e533b11703bf60a1e8e5d2a0d94b909585940a1d..9fdf8c93c58e7893616bea99730cc594a3731361 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/kernel.h>
 #include <linux/string.h>      /* for memset */
 #include <linux/nls.h>
-#include <linux/udf_fs.h>
+#include <linux/crc-itu-t.h>
 
 #include "udf_sb.h"
 
@@ -49,14 +49,16 @@ int udf_build_ustr(struct ustr *dest, dstring *ptr, int size)
 {
        int usesize;
 
-       if ((!dest) || (!ptr) || (!size))
+       if (!dest || !ptr || !size)
                return -1;
+       BUG_ON(size < 2);
 
-       memset(dest, 0, sizeof(struct ustr));
-       usesize = (size > UDF_NAME_LEN) ? UDF_NAME_LEN : size;
+       usesize = min_t(size_t, ptr[size - 1], sizeof(dest->u_name));
+       usesize = min(usesize, size - 2);
        dest->u_cmpID = ptr[0];
-       dest->u_len = ptr[size - 1];
-       memcpy(dest->u_name, ptr + 1, usesize - 1);
+       dest->u_len = usesize;
+       memcpy(dest->u_name, ptr + 1, usesize);
+       memset(dest->u_name + usesize, 0, sizeof(dest->u_name) - usesize);
 
        return 0;
 }
@@ -83,9 +85,6 @@ static int udf_build_ustr_exact(struct ustr *dest, dstring *ptr, int exactsize)
  * PURPOSE
  *     Convert OSTA Compressed Unicode to the UTF-8 equivalent.
  *
- * DESCRIPTION
- *     This routine is only called by udf_filldir().
- *
  * PRE-CONDITIONS
  *     utf                     Pointer to UTF-8 output buffer.
  *     ocu                     Pointer to OSTA Compressed Unicode input buffer
@@ -99,43 +98,39 @@ static int udf_build_ustr_exact(struct ustr *dest, dstring *ptr, int exactsize)
  *     November 12, 1997 - Andrew E. Mileski
  *     Written, tested, and released.
  */
-int udf_CS0toUTF8(struct ustr *utf_o, struct ustr *ocu_i)
+int udf_CS0toUTF8(struct ustr *utf_o, const struct ustr *ocu_i)
 {
-       uint8_t *ocu;
-       uint32_t c;
+       const uint8_t *ocu;
        uint8_t cmp_id, ocu_len;
        int i;
 
-       ocu = ocu_i->u_name;
-
        ocu_len = ocu_i->u_len;
-       cmp_id = ocu_i->u_cmpID;
-       utf_o->u_len = 0;
-
        if (ocu_len == 0) {
                memset(utf_o, 0, sizeof(struct ustr));
-               utf_o->u_cmpID = 0;
-               utf_o->u_len = 0;
                return 0;
        }
 
-       if ((cmp_id != 8) && (cmp_id != 16)) {
+       cmp_id = ocu_i->u_cmpID;
+       if (cmp_id != 8 && cmp_id != 16) {
+               memset(utf_o, 0, sizeof(struct ustr));
                printk(KERN_ERR "udf: unknown compression code (%d) stri=%s\n",
                       cmp_id, ocu_i->u_name);
                return 0;
        }
 
+       ocu = ocu_i->u_name;
+       utf_o->u_len = 0;
        for (i = 0; (i < ocu_len) && (utf_o->u_len <= (UDF_NAME_LEN - 3));) {
 
                /* Expand OSTA compressed Unicode to Unicode */
-               c = ocu[i++];
+               uint32_t c = ocu[i++];
                if (cmp_id == 16)
                        c = (c << 8) | ocu[i++];
 
                /* Compress Unicode to UTF-8 */
-               if (c < 0x80U) {
+               if (c < 0x80U)
                        utf_o->u_name[utf_o->u_len++] = (uint8_t)c;
-               else if (c < 0x800U) {
+               else if (c < 0x800U) {
                        utf_o->u_name[utf_o->u_len++] =
                                                (uint8_t)(0xc0 | (c >> 6));
                        utf_o->u_name[utf_o->u_len++] =
@@ -255,35 +250,32 @@ error_out:
 }
 
 static int udf_CS0toNLS(struct nls_table *nls, struct ustr *utf_o,
-                       struct ustr *ocu_i)
+                       const struct ustr *ocu_i)
 {
-       uint8_t *ocu;
-       uint32_t c;
+       const uint8_t *ocu;
        uint8_t cmp_id, ocu_len;
        int i;
 
-       ocu = ocu_i->u_name;
 
        ocu_len = ocu_i->u_len;
-       cmp_id = ocu_i->u_cmpID;
-       utf_o->u_len = 0;
-
        if (ocu_len == 0) {
                memset(utf_o, 0, sizeof(struct ustr));
-               utf_o->u_cmpID = 0;
-               utf_o->u_len = 0;
                return 0;
        }
 
-       if ((cmp_id != 8) && (cmp_id != 16)) {
+       cmp_id = ocu_i->u_cmpID;
+       if (cmp_id != 8 && cmp_id != 16) {
+               memset(utf_o, 0, sizeof(struct ustr));
                printk(KERN_ERR "udf: unknown compression code (%d) stri=%s\n",
                       cmp_id, ocu_i->u_name);
                return 0;
        }
 
+       ocu = ocu_i->u_name;
+       utf_o->u_len = 0;
        for (i = 0; (i < ocu_len) && (utf_o->u_len <= (UDF_NAME_LEN - 3));) {
                /* Expand OSTA compressed Unicode to Unicode */
-               c = ocu[i++];
+               uint32_t c = ocu[i++];
                if (cmp_id == 16)
                        c = (c << 8) | ocu[i++];
 
@@ -463,7 +455,7 @@ static int udf_translate_to_linux(uint8_t *newName, uint8_t *udfName,
                } else if (newIndex > 250)
                        newIndex = 250;
                newName[newIndex++] = CRC_MARK;
-               valueCRC = udf_crc(fidName, fidNameLen, 0);
+               valueCRC = crc_itu_t(0, fidName, fidNameLen);
                newName[newIndex++] = hexChar[(valueCRC & 0xf000) >> 12];
                newName[newIndex++] = hexChar[(valueCRC & 0x0f00) >> 8];
                newName[newIndex++] = hexChar[(valueCRC & 0x00f0) >> 4];
index b70e37b6124244ee8e8142f965bd85f03827fb45..c9588f49eb5253bb23ce4150722d4b7181607fd6 100644 (file)
@@ -18,6 +18,8 @@
 #define OMAP_MMC_MAX_SLOTS     2
 
 struct omap_mmc_platform_data {
+       struct omap_mmc_conf    conf;
+
        unsigned enabled:1;
        /* number of slots on board */
        unsigned nr_slots:2;
diff --git a/include/asm-sh/i2c-sh7760.h b/include/asm-sh/i2c-sh7760.h
new file mode 100644 (file)
index 0000000..2418211
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * MMIO/IRQ and platform data for SH7760 I2C channels
+ */
+
+#ifndef _I2C_SH7760_H_
+#define _I2C_SH7760_H_
+
+#define SH7760_I2C_DEVNAME     "sh7760-i2c"
+
+#define SH7760_I2C0_MMIO       0xFE140000
+#define SH7760_I2C0_MMIOEND    0xFE14003B
+#define SH7760_I2C0_IRQ                62
+
+#define SH7760_I2C1_MMIO       0xFE150000
+#define SH7760_I2C1_MMIOEND    0xFE15003B
+#define SH7760_I2C1_IRQ                63
+
+struct sh7760_i2c_platdata {
+       unsigned int speed_khz;
+};
+
+#endif
index c6a55cf0d3371b5b0de22da320670f87dfe74658..671223718f0af6e07fd19c5e94247bb555e7de95 100644 (file)
@@ -5,7 +5,6 @@ header-y += asi.h
 header-y += bpp.h
 header-y += jsflash.h
 header-y += openpromio.h
-header-y += pconf.h
 header-y += reg.h
 header-y += traps.h
 header-y += vfc_ioctls.h
diff --git a/include/asm-sparc/a.out-core.h b/include/asm-sparc/a.out-core.h
deleted file mode 100644 (file)
index e8fd338..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/* a.out coredump register dumper
- *
- * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public Licence
- * as published by the Free Software Foundation; either version
- * 2 of the Licence, or (at your option) any later version.
- */
-
-#ifndef _ASM_A_OUT_CORE_H
-#define _ASM_A_OUT_CORE_H
-
-#ifdef __KERNEL__
-
-#include <linux/user.h>
-
-/*
- * fill in the user structure for an a.out core dump
- */
-static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
-{
-       unsigned long first_stack_page;
-
-       dump->magic = SUNOS_CORE_MAGIC;
-       dump->len = sizeof(struct user);
-       dump->regs.psr = regs->psr;
-       dump->regs.pc = regs->pc;
-       dump->regs.npc = regs->npc;
-       dump->regs.y = regs->y;
-       /* fuck me plenty */
-       memcpy(&dump->regs.regs[0], &regs->u_regs[1], (sizeof(unsigned long) * 15));
-       dump->uexec = current->thread.core_exec;
-       dump->u_tsize = (((unsigned long) current->mm->end_code) -
-               ((unsigned long) current->mm->start_code)) & ~(PAGE_SIZE - 1);
-       dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1)));
-       dump->u_dsize -= dump->u_tsize;
-       dump->u_dsize &= ~(PAGE_SIZE - 1);
-       first_stack_page = (regs->u_regs[UREG_FP] & ~(PAGE_SIZE - 1));
-       dump->u_ssize = (TASK_SIZE - first_stack_page) & ~(PAGE_SIZE - 1);
-       memcpy(&dump->fpu.fpstatus.fregs.regs[0], &current->thread.float_regs[0], (sizeof(unsigned long) * 32));
-       dump->fpu.fpstatus.fsr = current->thread.fsr;
-       dump->fpu.fpstatus.flags = dump->fpu.fpstatus.extra = 0;
-       dump->fpu.fpstatus.fpq_count = current->thread.fpqdepth;
-       memcpy(&dump->fpu.fpstatus.fpq[0], &current->thread.fpqueue[0],
-              ((sizeof(unsigned long) * 2) * 16));
-       dump->sigcode = 0;
-}
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_A_OUT_CORE_H */
diff --git a/include/asm-sparc/a.out.h b/include/asm-sparc/a.out.h
deleted file mode 100644 (file)
index 2f1c374..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef __SPARC_A_OUT_H__
-#define __SPARC_A_OUT_H__
-
-#define SPARC_PGSIZE    0x2000        /* Thanks to the sun4 architecture... */
-#define SEGMENT_SIZE    SPARC_PGSIZE  /* whee... */
-
-#ifndef __ASSEMBLY__
-
-struct exec {
-       unsigned char a_dynamic:1;      /* A __DYNAMIC is in this image */
-       unsigned char a_toolversion:7;
-       unsigned char a_machtype;
-       unsigned short a_info;
-       unsigned int a_text;            /* length of text, in bytes */
-       unsigned int a_data;            /* length of data, in bytes */
-       unsigned int a_bss;             /* length of bss, in bytes */
-       unsigned int a_syms;            /* length of symbol table, in bytes */
-       unsigned int a_entry;           /* where program begins */
-       unsigned int a_trsize;
-       unsigned int a_drsize;
-};
-
-#endif /* !__ASSEMBLY__ */
-
-/* Where in the file does the text information begin? */
-#define N_TXTOFF(x)     (N_MAGIC(x) == ZMAGIC ? 0 : sizeof (struct exec))
-
-/* Where do the Symbols start? */
-#define N_SYMOFF(x)     (N_TXTOFF(x) + (x).a_text +   \
-                         (x).a_data + (x).a_trsize +  \
-                         (x).a_drsize)
-
-/* Where does text segment go in memory after being loaded? */
-#define N_TXTADDR(x)    (unsigned long)(((N_MAGIC(x) == ZMAGIC) && \
-                        ((x).a_entry < SPARC_PGSIZE)) ?   \
-                          0 : SPARC_PGSIZE)
-
-/* And same for the data segment.. */
-#define N_DATADDR(x) (N_MAGIC(x)==OMAGIC ?         \
-                      (N_TXTADDR(x) + (x).a_text)  \
-                      : (unsigned long) (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
-
-#define N_TRSIZE(a)    ((a).a_trsize)
-#define N_DRSIZE(a)    ((a).a_drsize)
-#define N_SYMSIZE(a)   ((a).a_syms)
-
-#ifndef __ASSEMBLY__
-
-/*
- * Sparc relocation types
- */
-enum reloc_type
-{
-       RELOC_8,
-       RELOC_16,
-       RELOC_32,       /* simplest relocs */
-       RELOC_DISP8,
-       RELOC_DISP16,
-       RELOC_DISP32,   /* Disp's (pc-rel) */
-       RELOC_WDISP30,
-       RELOC_WDISP22,  /* SR word disp's */
-       RELOC_HI22,
-       RELOC_22,       /* SR 22-bit relocs */
-       RELOC_13,
-       RELOC_LO10,     /* SR 13&10-bit relocs */
-       RELOC_SFA_BASE,
-       RELOC_SFA_OFF13, /* SR S.F.A. relocs */
-       RELOC_BASE10,
-       RELOC_BASE13,
-       RELOC_BASE22,   /* base_relative pic */
-       RELOC_PC10,
-       RELOC_PC22,     /* special pc-rel pic */
-       RELOC_JMP_TBL,  /* jmp_tbl_rel in pic */
-       RELOC_SEGOFF16, /* ShLib offset-in-seg */
-       RELOC_GLOB_DAT,
-       RELOC_JMP_SLOT,
-       RELOC_RELATIVE  /* rtld relocs */
-};
-
-/*
- * Format of a relocation datum.
- */
-struct relocation_info /* used when header.a_machtype == M_SPARC */
-{
-        unsigned int    r_address;  /* relocation addr */
-        unsigned int    r_index:24; /* segment index or symbol index */
-        unsigned int    r_extern:1; /* if F, r_index==SEG#; if T, SYM idx */
-        unsigned int    r_pad:2;    /* <unused> */
-        enum reloc_type r_type:5;   /* type of relocation to perform */
-        int             r_addend;   /* addend for relocation value */
-};
-
-#define N_RELOCATION_INFO_DECLARED 1
-
-#endif /* !(__ASSEMBLY__) */
-
-#endif /* __SPARC_A_OUT_H__ */
index 1a03c28da92d5c0638a624aaf2ab99e189947e9c..fcdba511633977559a3c2d3afbc76af406be6e6c 100644 (file)
         b linux_sparc_syscall; \
         rd %psr, %l0;
 
-/* Software trap for SunOS4.1.x system calls. */
-#define SUNOS_SYSCALL_TRAP \
-        rd %psr, %l0; \
-        sethi %hi(sunos_sys_table), %l7; \
-        b linux_sparc_syscall; \
-        or %l7, %lo(sunos_sys_table), %l7;
-
-#define SUNOS_NO_SYSCALL_TRAP \
-        b sunos_syscall; \
-        rd %psr, %l0; \
-        nop; \
-        nop;
-
-/* Software trap for Slowaris system calls. */
-#define SOLARIS_SYSCALL_TRAP \
-        b solaris_syscall; \
-        rd %psr, %l0; \
-        nop; \
-        nop;
-
-#define INDIRECT_SOLARIS_SYSCALL(x) \
-       mov x, %g1; \
-       b solaris_syscall; \
-       rd %psr, %l0; \
-       nop;
-
 #define BREAKPOINT_TRAP \
        b breakpoint_trap; \
        rd %psr,%l0; \
        nop; \
        nop;
 
-/* Software trap for Sparc-netbsd system calls. */
-#define NETBSD_SYSCALL_TRAP \
-        sethi %hi(sys_call_table), %l7; \
-        or %l7, %lo(sys_call_table), %l7; \
-        b bsd_syscall; \
-        rd %psr, %l0;
-
 /* The Get Condition Codes software trap for userland. */
 #define GETCC_TRAP \
         b getcc_trap_handler; mov %psr, %l0; nop; nop;
index 058c2064f706feabed5a7e10d9ef8790a185b2d7..3f4d0087b6a3c1a3d39e432d0d74f851caedc354 100644 (file)
@@ -43,8 +43,6 @@
 #define __TIOCSETX        _IOW('t', 34, int) /* SunOS Specific */
 #define __TIOCGETX        _IOR('t', 35, int) /* SunOS Specific */
 #define TIOCCONS       _IO('t', 36)
-#define __TIOCSSIZE     _IOW('t', 37, struct sunos_ttysize) /* SunOS Specific */
-#define __TIOCGSIZE     _IOR('t', 38, struct sunos_ttysize) /* SunOS Specific */
 #define TIOCGSOFTCAR   _IOR('t', 100, int)
 #define TIOCSSOFTCAR   _IOW('t', 101, int)
 #define __TIOCUCNTL       _IOW('t', 102, int) /* SunOS Specific */
index b7dc40bc68f401cabbc89c556cb424070c652852..e18be984c01d695e06de0db3ed24c088769c5771 100644 (file)
 #define MAP_POPULATE   0x8000          /* populate (prefault) pagetables */
 #define MAP_NONBLOCK   0x10000         /* do not block on IO */
 
-/* XXX Need to add flags to SunOS's mctl, mlockall, and madvise system
- * XXX calls.
- */
-
-/* SunOS sys_mctl() stuff... */
-#define MC_SYNC         1  /* Sync pages in memory with storage (usu. a file) */
-#define MC_LOCK         2  /* Lock pages into core ram, do not allow swapping of them */
-#define MC_UNLOCK       3  /* Unlock pages locked via previous mctl() with MC_LOCK arg */
-#define MC_LOCKAS       5  /* Lock an entire address space of the calling process */
-#define MC_UNLOCKAS     6  /* Unlock entire address space of calling process */
-
-#define MADV_FREE      0x5             /* (Solaris) contents can be freed */
-
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 #define arch_mmap_check        sparc_mmap_check
index f2461e8a11ac989646802e5cd9bd15c55928d9ed..618344d89cc44b726586ff4db9ba8eb4beaa2996 100644 (file)
@@ -8,19 +8,6 @@
 #ifndef __SPARC_NAMEI_H
 #define __SPARC_NAMEI_H
 
-#define SPARC_BSD_EMUL "/usr/gnemul/sunos/"
-#define SPARC_SOL_EMUL "/usr/gnemul/solaris/"
-
-static inline char * __emul_prefix(void)
-{
-       switch (current->personality) {
-       case PER_SUNOS:
-               return SPARC_BSD_EMUL;
-       case PER_SVR4:
-               return SPARC_SOL_EMUL;
-       default:
-               return NULL;
-       }
-}
+#define __emul_prefix() NULL
 
 #endif /* __SPARC_NAMEI_H */
diff --git a/include/asm-sparc/pconf.h b/include/asm-sparc/pconf.h
deleted file mode 100644 (file)
index d73c1f1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id: pconf.h,v 1.3 1996/04/25 06:13:25 davem Exp $
- * pconf.h: pathconf() and fpathconf() defines for SunOS
- *          system call compatibility.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#ifndef _SPARC_PCONF_H
-#define _SPARC_PCONF_H
-
-#include <linux/fs.h>
-#include <linux/limits.h>
-
-#define _PCONF_LINK       1 /* Max number of links to an object        */
-#define _PCONF_CANON      2 /* TTY input buffer line size              */
-#define _PCONF_INPUT      3 /* Biggest packet a tty can imbibe at once */
-#define _PCONF_NAME       4 /* Filename length max                     */
-#define _PCONF_PATH       5 /* Max size of a pathname                  */
-#define _PCONF_PIPE       6 /* Buffer size for a pipe                  */
-#define _PCONF_CHRESTRICT 7 /* Can only root chown files?              */
-#define _PCONF_NOTRUNC    8 /* Are pathnames truncated if too big?     */
-#define _PCONF_VDISABLE   9 /* Magic char to disable special tty chars */
-#define _PCONF_MAXPCONF   9
-
-#endif /* !(_SPARC_PCONF_H) */
index 40b1e41fdea7037e8d361c372674dd8cb55e39de..e3006979709b6fe4777e580c726895bc210e30a5 100644 (file)
@@ -13,8 +13,6 @@
  */
 #define current_text_addr() ({ void *pc; __asm__("sethi %%hi(1f), %0; or %0, %%lo(1f), %0;\n1:" : "=r" (pc)); pc; })
 
-#include <linux/a.out.h>
-
 #include <asm/psr.h>
 #include <asm/ptrace.h>
 #include <asm/head.h>
@@ -67,7 +65,6 @@ struct thread_struct {
        struct fpq      fpqueue[16];
        unsigned long flags;
        mm_segment_t current_ds;
-       struct exec core_exec;     /* just what it says. */
        int new_signal;
 };
 
index 2e2bd0b7c8e3e34616c6621b8e7dbd2cc7683567..a00e15df227cf9b970139427b94d24281c67156d 100644 (file)
@@ -24,9 +24,6 @@
 #define SO_SNDTIMEO     0x4000
 #define SO_ACCEPTCONN  0x8000
 
-/* wha!??? */
-#define SO_DONTLINGER   (~SO_LINGER)  /* Older SunOS compat. hack */
-
 #define SO_SNDBUF      0x1001
 #define SO_RCVBUF      0x1002
 #define SO_SNDBUFFORCE 0x100a
diff --git a/include/asm-sparc/solerrno.h b/include/asm-sparc/solerrno.h
deleted file mode 100644 (file)
index 8abce7e..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/* $Id: solerrno.h,v 1.5 1996/04/25 06:13:32 davem Exp $
- * solerrno.h: Solaris error return codes for compatibility.
- *
- * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#ifndef _SPARC_SOLERRNO_H
-#define _SPARC_SOLERRNO_H
-
-#define SOL_EPERM          1     /* Required superuser access perms  */
-#define SOL_ENOENT         2     /* File or directory does not exist */
-#define SOL_ESRCH          3     /* Process did not exist            */
-#define        SOL_EINTR          4     /* System call was interrupted      */
-#define        SOL_EIO            5     /* An i/o error occurred            */
-#define        SOL_ENXIO          6     /* Device or Address does not exist */
-#define        SOL_E2BIG          7     /* Too many arguments were given    */
-#define        SOL_ENOEXEC        8     /* Header of executable was munged  */
-#define        SOL_EBADF          9     /* Bogus file number                */
-#define        SOL_ECHILD         10    /* No children of process exist     */
-#define        SOL_EAGAIN         11    /* beep beep, "try again later"     */
-#define        SOL_ENOMEM         12    /* No memory available              */
-#define        SOL_EACCES         13    /* Access not allowed               */
-#define        SOL_EFAULT         14    /* Address passed was invalid       */
-#define        SOL_ENOTBLK        15    /* blkdev op on non-block device    */
-#define        SOL_EBUSY          16    /* Mounted device was busy          */
-#define        SOL_EEXIST         17    /* File specified already exists    */
-#define        SOL_EXDEV          18    /* Link request across diff devices */
-#define        SOL_ENODEV         19    /* Device does not exist on system  */
-#define        SOL_ENOTDIR        20    /* Dir operation on non-directory   */
-#define        SOL_EISDIR         21    /* File was of directory type       */
-#define        SOL_EINVAL         22    /* Argument passed was invalid      */
-#define        SOL_ENFILE         23    /* No more room in file table       */
-#define        SOL_EMFILE         24    /* Proc has too many files open     */
-#define        SOL_ENOTTY         25    /* Ioctl was invalid for req device */
-#define        SOL_ETXTBSY        26    /* Text file in busy state          */
-#define        SOL_EFBIG          27    /* Too big of a file for operation  */
-#define        SOL_ENOSPC         28    /* Disk is full                     */
-#define        SOL_ESPIPE         29    /* Seek attempted on non-seeking dev*/
-#define        SOL_EROFS          30    /* Write attempted on read-only fs  */
-#define        SOL_EMLINK         31    /* Too many links in file search    */
-#define        SOL_EPIPE          32    /* Call a plumber                   */
-#define        SOL_EDOM           33    /* Argument was out of fct domain   */
-#define        SOL_ERANGE         34    /* Could not represent math result  */
-#define        SOL_ENOMSG         35    /* Message of req type doesn't exist */
-#define        SOL_EIDRM          36    /* Identifier has been removed      */
-#define        SOL_ECHRNG         37    /* Req channel number out of range  */
-#define        SOL_EL2NSYNC       38    /* Could not sync at run level 2    */
-#define        SOL_EL3HLT         39    /* Halted at run level 3            */
-#define        SOL_EL3RST         40    /* Reset at run level 3             */
-#define        SOL_ELNRNG         41    /* Out of range link number         */
-#define        SOL_EUNATCH        42    /* Driver for protocol not attached */
-#define        SOL_ENOCSI         43    /* CSI structure not around         */
-#define        SOL_EL2HLT         44    /* Halted at run level 2            */
-#define        SOL_EDEADLK        45    /* Deadlock condition detected      */
-#define        SOL_ENOLCK         46    /* Record locks unavailable         */
-#define        SOL_ECANCELED      47    /* Cancellation of oper. happened   */
-#define        SOL_ENOTSUP        48    /* Attempt of unsupported operation */
-#define        SOL_EDQUOT         49    /* Users disk quota exceeded        */
-#define        SOL_EBADE          50    /* Invalid exchange                 */
-#define        SOL_EBADR          51    /* Request descriptor was invalid   */
-#define        SOL_EXFULL         52    /* Full exchange                    */
-#define        SOL_ENOANO         53    /* ano does not exist               */
-#define        SOL_EBADRQC        54    /* Req code was invalid             */
-#define        SOL_EBADSLT        55    /* Bad slot number                  */
-#define        SOL_EDEADLOCK      56    /* Deadlock in fs error             */
-#define        SOL_EBFONT         57    /* Font file format invalid         */
-/* YOW, I LOVE SYSV STREAMS!!!! */
-#define        SOL_ENOSTR         60    /* Stream-op on non-stream dev      */
-#define        SOL_ENODATA        61    /* No data avail at this time       */
-#define        SOL_ETIME          62    /* Expiration of time occurred      */
-#define        SOL_ENOSR          63    /* Streams resources exhausted      */
-#define        SOL_ENONET         64    /* No network connected             */
-#define        SOL_ENOPKG         65    /* Non-installed package            */
-#define        SOL_EREMOTE        66    /* Object was on remote machine     */
-#define        SOL_ENOLINK        67    /* Cut link                         */
-#define        SOL_EADV           68    /* Error in advertise               */
-#define        SOL_ESRMNT         69    /* Some magic srmount problem       */
-#define        SOL_ECOMM          70    /* During send, comm error occurred */
-#define        SOL_EPROTO         71    /* Protocol botch                   */
-#define        SOL_EMULTIHOP      74    /* Multihop attempted               */
-#define        SOL_EBADMSG        77    /* Message was unreadable           */
-#define        SOL_ENAMETOOLONG   78    /* Too long of a path name          */
-#define        SOL_EOVERFLOW      79    /* Data type too small for datum    */
-#define        SOL_ENOTUNIQ       80    /* Logical name was not unique      */
-#define        SOL_EBADFD         81    /* Op cannot be performed on fd     */
-#define        SOL_EREMCHG        82    /* Remote address is now different  */
-#define        SOL_ELIBACC        83    /* Shared lib could not be accessed */
-#define        SOL_ELIBBAD        84    /* ShLib is corrupted in some way   */
-#define        SOL_ELIBSCN        85    /* A.out ShLib problems             */
-#define        SOL_ELIBMAX        86    /* Exceeded ShLib linkage limit     */
-#define        SOL_ELIBEXEC       87    /* Execution of ShLib attempted     */
-#define        SOL_EILSEQ         88    /* Bad byte sequence found          */
-#define        SOL_ENOSYS         89    /* Invalid filesystem operation     */
-#define        SOL_ELOOP          90    /* Detected loop in symbolic links  */
-#define        SOL_ERESTART       91    /* System call is restartable       */
-#define        SOL_ESTRPIPE       92    /* Do not sleep in head of stream   */
-#define        SOL_ENOTEMPTY      93    /* Rmdir of non-empty directory     */
-#define        SOL_EUSERS         94    /* Over abundance of users for ufs  */
-#define        SOL_ENOTSOCK       95    /* Sock-op on non-sock              */
-#define        SOL_EDESTADDRREQ   96    /* No dest addr given, but needed   */
-#define        SOL_EMSGSIZE       97    /* Msg too big                      */
-#define        SOL_EPROTOTYPE     98    /* Bad socket protocol              */
-#define        SOL_ENOPROTOOPT    99    /* Unavailable protocol             */
-#define        SOL_EPROTONOSUPPORT 120  /* Unsupported protocol             */
-#define        SOL_ESOCKTNOSUPPORT 121  /* Unsupported socket type          */
-#define        SOL_EOPNOTSUPP     122   /* Unsupported sock-op              */
-#define        SOL_EPFNOSUPPORT   123   /* Unsupported protocol family      */
-#define        SOL_EAFNOSUPPORT   124   /* Unsup addr family for protocol   */
-#define        SOL_EADDRINUSE     125   /* Req addr is already in use       */
-#define        SOL_EADDRNOTAVAIL  126   /* Req addr not available right now */
-#define        SOL_ENETDOWN       127   /* Your subnet is on fire           */
-#define        SOL_ENETUNREACH    128   /* Someone playing with gateway and */
-                                 /* did not tell you he was going to */
-#define        SOL_ENETRESET      129   /* Buy less-buggy ethernet cards    */
-#define        SOL_ECONNABORTED   130   /* Aborted connection due to sw     */
-#define        SOL_ECONNRESET     131   /* Your peers reset your connection */
-#define        SOL_ENOBUFS        132   /* No buffer space available        */
-#define        SOL_EISCONN        133   /* Connect on already connected     */
-                                 /* socket attempted                 */
-#define        SOL_ENOTCONN       134   /* Comm on non-connected socket     */
-#define        SOL_ESHUTDOWN      143   /* Op attempted after sock-shutdown */
-#define        SOL_ETOOMANYREFS   144   /* Reference limit exceeded         */
-#define        SOL_ETIMEDOUT      145   /* Timed out connection             */
-#define        SOL_ECONNREFUSED   146   /* Connection refused by remote host*/
-#define        SOL_EHOSTDOWN      147   /* Remote host is up in flames      */
-#define        SOL_EHOSTUNREACH   148   /* Make a left at Easton Ave.....   */
-#define        SOL_EWOULDBLOCK    EAGAIN /* Just an alias */
-#define        SOL_EALREADY       149   /* Operation is already occurring   */
-#define        SOL_EINPROGRESS    150   /* Operation is happening now       */
-#define        SOL_ESTALE         151   /* Fungus growth on NFS file handle */
-
-#endif /* !(_SPARC_SOLERRNO_H) */
diff --git a/include/asm-sparc/svr4.h b/include/asm-sparc/svr4.h
deleted file mode 100644 (file)
index da1f1c9..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Solaris/SPARC constants and definitions -- 
- * (C) 1996 Miguel de Icaza
- *
- * This file is not meant to be included by user level applications
- * but the solaris syscall emulator
- */
-
-#ifndef _SPARC_SVR4_H
-#define _SPARC_SVR4_H
-
-/* Signals as used by svr4 */
-typedef struct {                /* signal set type */
-       ulong sigbits[4];
-} svr4_sigset_t;
-
-/* Values for siginfo.code */
-#define SVR4_SINOINFO 32767
-/* Siginfo, sucker expects bunch of information on those parameters */
-typedef union {
-       char total_size [128];
-       struct {
-               int signo;
-               int code;
-               int error;
-               union {
-               } data; 
-       } siginfo;
-} svr4_siginfo_t;
-
-/* Context definition */
-
-/* Location of the user stored registers into a greg_t */
-enum {
-       SVR4_PSR, SVR4_PC, SVR4_NPC, SVR4_Y,
-       SVR4_G1,  SVR4_G2, SVR4_G3,  SVR4_G4,
-       SVR4_G5,  SVR4_G6, SVR4_G7,  SVR4_O0,
-       SVR4_O1,  SVR4_O2, SVR4_O3,  SVR4_O4,
-       SVR4_O5,  SVR4_O6, SVR4_O7
-};
-
-/* sizeof (regs) / sizeof (greg_t), defined in the ABI */
-#define SVR4_NREGS  19
-#define SVR4_MAXWIN 31
-
-typedef struct {
-       uint rwin_lo[8];
-       uint rwin_in[8];
-} svr4_rwindow_t;
-
-typedef struct {
-       int            count;
-       int            __user *winptr [SVR4_MAXWIN]; /* pointer to the windows */
-       svr4_rwindow_t win[SVR4_MAXWIN];      /* the windows */
-} svr4_gwindows_t;
-
-typedef int svr4_gregset_t[SVR4_NREGS];
-
-typedef struct {
-       double   fpu_regs[32];
-       void     *fp_q;
-       unsigned fp_fsr;
-       u_char   fp_nqel;
-       u_char   fp_nqsize;
-       u_char   inuse;         /* if fpu is in use */
-} svr4_fregset_t;
-
-typedef struct {
-       uint    id;             /* if this holds "xrs" string => ptr is valid */
-       caddr_t ptr;
-} svr4_xrs_t;
-
-/* Machine dependent context */
-typedef struct {
-       svr4_gregset_t   greg;  /* registers 0..19 (see top) */
-       svr4_gwindows_t  __user *gwin;  /* may point to register windows */
-       svr4_fregset_t   freg;  /* floating point registers */
-       svr4_xrs_t       xrs;   /* mhm? */
-       long             pad[19];
-} svr4_mcontext_t;
-
-/* flags for stack_t.flags */
-enum svr4_stack_flags {
-       SVR4_SS_ONSTACK,
-       SVR4_SS_DISABLE,
-};
-
-/* signal stack exection place, unsupported */
-typedef struct svr4_stack_t {
-        char __user *sp;
-        int  size;
-        int  flags;
-} svr4_stack_t;
-
-/* Context used by getcontext and setcontext */
-typedef struct svr4_ucontext_t {
-       u_long               flags; /* context flags, indicate what is loaded */
-       struct svr4_ucontext *link;
-       svr4_sigset_t        sigmask;
-       svr4_stack_t         stack;
-       svr4_mcontext_t      mcontext;
-       long                 pad[23];
-} svr4_ucontext_t;                          
-
-/* windows hold the windows as they were at signal time,
- * ucontext->mcontext holds a pointer to them.
- * addresses for uc and si are passed as parameters to svr4 signal
- * handler
- */
-
-/* This is the signal frame that is passed to the signal handler */
-typedef struct {
-       svr4_gwindows_t gw;     /* windows */
-       svr4_ucontext_t uc;     /* machine context */
-       svr4_siginfo_t  si;     /* siginfo */
-} svr4_signal_frame_t;
-
-#define SVR4_SF_ALIGNED (((sizeof (svr4_signal_frame_t) + 7) & (~7)))
-
-#endif /* include control */
index 4333232abb9f4e393619585086a408f243868b83..733d40504e1e09a8fbb1322a8a20029f5ac90476 100644 (file)
@@ -33,11 +33,6 @@ struct ltchars {
 };
 #endif /* __KERNEL__ */
 
-struct sunos_ttysize {
-       int st_lines;   /* Lines on the terminal */
-       int st_columns; /* Columns on the terminal */
-};
-
 struct winsize {
        unsigned short ws_row;
        unsigned short ws_col;
index b5f1abf733d5251f3aa7ec8e4d5b5821420fa89e..3400ea87f148a6b54927825420a7de2492a14fcc 100644 (file)
@@ -1,60 +1,6 @@
-/* $Id: user.h,v 1.5 1998/02/23 01:49:22 rth Exp $
- * asm-sparc/user.h: Core file definitions for the Sparc.
- *
- * Keep in sync with reg.h.  Actually, we could get rid of this
- * one, since we won't a.out core dump that much anyways - miguel.
- * Copyright (C) 1995 (davem@caip.rutgers.edu)
- */
 #ifndef _SPARC_USER_H
 #define _SPARC_USER_H
 
-#include <asm/a.out.h>
-struct sunos_regs {
-       unsigned long psr, pc, npc, y;
-       unsigned long regs[15];
-};
-
-struct sunos_fpqueue {
-       unsigned long *addr;
-       unsigned long inst;
-};
-
-struct sunos_fp {
-       union {
-               unsigned long regs[32];
-               double reg_dbls[16];
-       } fregs;
-       unsigned long fsr;
-       unsigned long flags;
-       unsigned long extra;
-       unsigned long fpq_count;
-       struct sunos_fpqueue fpq[16];
-};
-
-struct sunos_fpu {
-       struct sunos_fp fpstatus;
-};
-
-/* The SunOS core file header layout. */
-struct user {
-       unsigned long magic;
-       unsigned long len;
-       struct sunos_regs regs;
-       struct exec uexec;
-       int           signal;
-       size_t        u_tsize; /* all of these in bytes! */
-       size_t        u_dsize;
-       size_t        u_ssize;
-       char          u_comm[17];
-       struct sunos_fpu fpu;
-       unsigned long sigcode;   /* Special sigcontext subcode, if any */
-};
-
-#define NBPG                   0x2000
-#define UPAGES                 1
-#define HOST_TEXT_START_ADDR   (u.start_code)
-#define HOST_DATA_START_ADDR   (u.uexec.a_data)
-#define HOST_STACK_END_ADDR    (- u.u_ssize * NBPG)
-#define SUNOS_CORE_MAGIC       0x080456
+/* Nothing to define.  */
 
 #endif /* !(_SPARC_USER_H) */
index a90dc82129d1eaad506862a50fb8419652dc2716..dce1cf9a931390d97f8046e2de5281676eccc42b 100644 (file)
@@ -12,7 +12,6 @@ header-y += display7seg.h
 header-y += envctrl.h
 header-y += openprom.h
 header-y += openpromio.h
-header-y += pconf.h
 header-y += psrcompat.h
 header-y += pstate.h
 header-y += reg.h
diff --git a/include/asm-sparc64/a.out-core.h b/include/asm-sparc64/a.out-core.h
deleted file mode 100644 (file)
index 3499b3c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* a.out coredump register dumper
- *
- * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells@redhat.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public Licence
- * as published by the Free Software Foundation; either version
- * 2 of the Licence, or (at your option) any later version.
- */
-
-#ifndef _ASM_A_OUT_CORE_H
-#define _ASM_A_OUT_CORE_H
-
-#ifdef __KERNEL__
-
-#include <linux/user.h>
-
-/*
- * fill in the user structure for an a.out core dump
- */
-static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump)
-{
-       /* Only should be used for SunOS and ancient a.out
-        * SparcLinux binaries...  Not worth implementing.
-        */
-       memset(dump, 0, sizeof(struct user));
-}
-
-#endif /* __KERNEL__ */
-#endif /* _ASM_A_OUT_CORE_H */
diff --git a/include/asm-sparc64/a.out.h b/include/asm-sparc64/a.out.h
deleted file mode 100644 (file)
index 44208c2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-sparc/a.out.h>
index 083c9a0f37deb9907a149036ca5ea13e979d3fb3..c1be40647c9977c6a2d031b55a04d1f21fb59b02 100644 (file)
@@ -44,8 +44,6 @@
 #define __TIOCSETX        _IOW('t', 34, int) /* SunOS Specific */
 #define __TIOCGETX        _IOR('t', 35, int) /* SunOS Specific */
 #define TIOCCONS       _IO('t', 36)
-#define __TIOCSSIZE     _IOW('t', 37, struct sunos_ttysize) /* SunOS Specific */
-#define __TIOCGSIZE     _IOR('t', 38, struct sunos_ttysize) /* SunOS Specific */
 #define TIOCGSOFTCAR   _IOR('t', 100, int)
 #define TIOCSSOFTCAR   _IOW('t', 101, int)
 #define __TIOCUCNTL       _IOW('t', 102, int) /* SunOS Specific */
index 8cc1860be63077f312eaef0832f31fb47de06b74..e584563b56eb26f7bc8187250223e27bc3c421cb 100644 (file)
 #define MAP_POPULATE   0x8000          /* populate (prefault) pagetables */
 #define MAP_NONBLOCK   0x10000         /* do not block on IO */
 
-/* XXX Need to add flags to SunOS's mctl, mlockall, and madvise system
- * XXX calls.
- */
-
-/* SunOS sys_mctl() stuff... */
-#define MC_SYNC         1  /* Sync pages in memory with storage (usu. a file) */
-#define MC_LOCK         2  /* Lock pages into core ram, do not allow swapping of them */
-#define MC_UNLOCK       3  /* Unlock pages locked via previous mctl() with MC_LOCK arg */
-#define MC_LOCKAS       5  /* Lock an entire address space of the calling process */
-#define MC_UNLOCKAS     6  /* Unlock entire address space of calling process */
-
-#define MADV_FREE      0x5             /* (Solaris) contents can be freed */
-
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 #define arch_mmap_check        sparc64_mmap_check
index ccda19e286952bba18c41c2f23f191eb3e95dbe0..275161f21213cde6e63fcf3b0f50fd4928657838 100644 (file)
@@ -8,19 +8,6 @@
 #ifndef __SPARC64_NAMEI_H
 #define __SPARC64_NAMEI_H
 
-#define SPARC_BSD_EMUL "/usr/gnemul/sunos/"
-#define SPARC_SOL_EMUL "/usr/gnemul/solaris/"
-
-static inline char * __emul_prefix(void)
-{
-       switch (current->personality) {
-       case PER_SUNOS:
-               return SPARC_BSD_EMUL;
-       case PER_SVR4:
-               return SPARC_SOL_EMUL;
-       default:
-               return NULL;
-       }
-}
+#define __emul_prefix() NULL
 
 #endif /* __SPARC64_NAMEI_H */
diff --git a/include/asm-sparc64/pconf.h b/include/asm-sparc64/pconf.h
deleted file mode 100644 (file)
index aad106a..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $Id: pconf.h,v 1.1 1996/12/02 00:09:10 davem Exp $
- * pconf.h: pathconf() and fpathconf() defines for SunOS
- *          system call compatibility.
- *
- * Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#ifndef _SPARC64_PCONF_H
-#define _SPARC64_PCONF_H
-
-#include <linux/fs.h>
-#include <linux/limits.h>
-
-#define _PCONF_LINK       1 /* Max number of links to an object        */
-#define _PCONF_CANON      2 /* TTY input buffer line size              */
-#define _PCONF_INPUT      3 /* Biggest packet a tty can imbibe at once */
-#define _PCONF_NAME       4 /* Filename length max                     */
-#define _PCONF_PATH       5 /* Max size of a pathname                  */
-#define _PCONF_PIPE       6 /* Buffer size for a pipe                  */
-#define _PCONF_CHRESTRICT 7 /* Can only root chown files?              */
-#define _PCONF_NOTRUNC    8 /* Are pathnames truncated if too big?     */
-#define _PCONF_VDISABLE   9 /* Magic char to disable special tty chars */
-#define _PCONF_MAXPCONF   9
-
-#endif /* !(_SPARC64_PCONF_H) */
index 44a625af6e317e91758494fd906a3ef1597cdc79..8cf071fae3eb52be7725a7349f736cb9825b3b71 100644 (file)
@@ -24,9 +24,6 @@
 #define SO_SNDTIMEO     0x4000
 #define SO_ACCEPTCONN  0x8000
 
-/* wha!??? */
-#define SO_DONTLINGER   (~SO_LINGER)  /* Older SunOS compat. hack */
-
 #define SO_SNDBUF      0x1001
 #define SO_RCVBUF      0x1002
 #define SO_SNDBUFFORCE 0x100a
diff --git a/include/asm-sparc64/solerrno.h b/include/asm-sparc64/solerrno.h
deleted file mode 100644 (file)
index a2ea6fc..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/* $Id: solerrno.h,v 1.1 1996/12/26 14:22:40 davem Exp $
- * solerrno.h: Solaris error return codes for compatibility.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#ifndef _SPARC64_SOLERRNO_H
-#define _SPARC64_SOLERRNO_H
-
-#define SOL_EPERM          1     /* Required superuser access perms  */
-#define SOL_ENOENT         2     /* File or directory does not exist */
-#define SOL_ESRCH          3     /* Process did not exist            */
-#define        SOL_EINTR          4     /* System call was interrupted      */
-#define        SOL_EIO            5     /* An i/o error occurred            */
-#define        SOL_ENXIO          6     /* Device or Address does not exist */
-#define        SOL_E2BIG          7     /* Too many arguments were given    */
-#define        SOL_ENOEXEC        8     /* Header of executable was munged  */
-#define        SOL_EBADF          9     /* Bogus file number                */
-#define        SOL_ECHILD         10    /* No children of process exist     */
-#define        SOL_EAGAIN         11    /* beep beep, "try again later"     */
-#define        SOL_ENOMEM         12    /* No memory available              */
-#define        SOL_EACCES         13    /* Access not allowed               */
-#define        SOL_EFAULT         14    /* Address passed was invalid       */
-#define        SOL_ENOTBLK        15    /* blkdev op on non-block device    */
-#define        SOL_EBUSY          16    /* Mounted device was busy          */
-#define        SOL_EEXIST         17    /* File specified already exists    */
-#define        SOL_EXDEV          18    /* Link request across diff devices */
-#define        SOL_ENODEV         19    /* Device does not exist on system  */
-#define        SOL_ENOTDIR        20    /* Dir operation on non-directory   */
-#define        SOL_EISDIR         21    /* File was of directory type       */
-#define        SOL_EINVAL         22    /* Argument passed was invalid      */
-#define        SOL_ENFILE         23    /* No more room in file table       */
-#define        SOL_EMFILE         24    /* Proc has too many files open     */
-#define        SOL_ENOTTY         25    /* Ioctl was invalid for req device */
-#define        SOL_ETXTBSY        26    /* Text file in busy state          */
-#define        SOL_EFBIG          27    /* Too big of a file for operation  */
-#define        SOL_ENOSPC         28    /* Disk is full                     */
-#define        SOL_ESPIPE         29    /* Seek attempted on non-seeking dev*/
-#define        SOL_EROFS          30    /* Write attempted on read-only fs  */
-#define        SOL_EMLINK         31    /* Too many links in file search    */
-#define        SOL_EPIPE          32    /* Call a plumber                   */
-#define        SOL_EDOM           33    /* Argument was out of fct domain   */
-#define        SOL_ERANGE         34    /* Could not represent math result  */
-#define        SOL_ENOMSG         35    /* Message of req type doesn't exist */
-#define        SOL_EIDRM          36    /* Identifier has been removed      */
-#define        SOL_ECHRNG         37    /* Req channel number out of range  */
-#define        SOL_EL2NSYNC       38    /* Could not sync at run level 2    */
-#define        SOL_EL3HLT         39    /* Halted at run level 3            */
-#define        SOL_EL3RST         40    /* Reset at run level 3             */
-#define        SOL_ELNRNG         41    /* Out of range link number         */
-#define        SOL_EUNATCH        42    /* Driver for protocol not attached */
-#define        SOL_ENOCSI         43    /* CSI structure not around         */
-#define        SOL_EL2HLT         44    /* Halted at run level 2            */
-#define        SOL_EDEADLK        45    /* Deadlock condition detected      */
-#define        SOL_ENOLCK         46    /* Record locks unavailable         */
-#define        SOL_ECANCELED      47    /* Cancellation of oper. happened   */
-#define        SOL_ENOTSUP        48    /* Attempt of unsupported operation */
-#define        SOL_EDQUOT         49    /* Users disk quota exceeded        */
-#define        SOL_EBADE          50    /* Invalid exchange                 */
-#define        SOL_EBADR          51    /* Request descriptor was invalid   */
-#define        SOL_EXFULL         52    /* Full exchange                    */
-#define        SOL_ENOANO         53    /* ano does not exist               */
-#define        SOL_EBADRQC        54    /* Req code was invalid             */
-#define        SOL_EBADSLT        55    /* Bad slot number                  */
-#define        SOL_EDEADLOCK      56    /* Deadlock in fs error             */
-#define        SOL_EBFONT         57    /* Font file format invalid         */
-/* YOW, I LOVE SYSV STREAMS!!!! */
-#define        SOL_ENOSTR         60    /* Stream-op on non-stream dev      */
-#define        SOL_ENODATA        61    /* No data avail at this time       */
-#define        SOL_ETIME          62    /* Expiration of time occurred      */
-#define        SOL_ENOSR          63    /* Streams resources exhausted      */
-#define        SOL_ENONET         64    /* No network connected             */
-#define        SOL_ENOPKG         65    /* Non-installed package            */
-#define        SOL_EREMOTE        66    /* Object was on remote machine     */
-#define        SOL_ENOLINK        67    /* Cut link                         */
-#define        SOL_EADV           68    /* Error in advertise               */
-#define        SOL_ESRMNT         69    /* Some magic srmount problem       */
-#define        SOL_ECOMM          70    /* During send, comm error occurred */
-#define        SOL_EPROTO         71    /* Protocol botch                   */
-#define        SOL_EMULTIHOP      74    /* Multihop attempted               */
-#define        SOL_EBADMSG        77    /* Message was unreadable           */
-#define        SOL_ENAMETOOLONG   78    /* Too long of a path name          */
-#define        SOL_EOVERFLOW      79    /* Data type too small for datum    */
-#define        SOL_ENOTUNIQ       80    /* Logical name was not unique      */
-#define        SOL_EBADFD         81    /* Op cannot be performed on fd     */
-#define        SOL_EREMCHG        82    /* Remote address is now different  */
-#define        SOL_ELIBACC        83    /* Shared lib could not be accessed */
-#define        SOL_ELIBBAD        84    /* ShLib is corrupted in some way   */
-#define        SOL_ELIBSCN        85    /* A.out ShLib problems             */
-#define        SOL_ELIBMAX        86    /* Exceeded ShLib linkage limit     */
-#define        SOL_ELIBEXEC       87    /* Execution of ShLib attempted     */
-#define        SOL_EILSEQ         88    /* Bad byte sequence found          */
-#define        SOL_ENOSYS         89    /* Invalid filesystem operation     */
-#define        SOL_ELOOP          90    /* Detected loop in symbolic links  */
-#define        SOL_ERESTART       91    /* System call is restartable       */
-#define        SOL_ESTRPIPE       92    /* Do not sleep in head of stream   */
-#define        SOL_ENOTEMPTY      93    /* Rmdir of non-empty directory     */
-#define        SOL_EUSERS         94    /* Over abundance of users for ufs  */
-#define        SOL_ENOTSOCK       95    /* Sock-op on non-sock              */
-#define        SOL_EDESTADDRREQ   96    /* No dest addr given, but needed   */
-#define        SOL_EMSGSIZE       97    /* Msg too big                      */
-#define        SOL_EPROTOTYPE     98    /* Bad socket protocol              */
-#define        SOL_ENOPROTOOPT    99    /* Unavailable protocol             */
-#define        SOL_EPROTONOSUPPORT 120  /* Unsupported protocol             */
-#define        SOL_ESOCKTNOSUPPORT 121  /* Unsupported socket type          */
-#define        SOL_EOPNOTSUPP     122   /* Unsupported sock-op              */
-#define        SOL_EPFNOSUPPORT   123   /* Unsupported protocol family      */
-#define        SOL_EAFNOSUPPORT   124   /* Unsup addr family for protocol   */
-#define        SOL_EADDRINUSE     125   /* Req addr is already in use       */
-#define        SOL_EADDRNOTAVAIL  126   /* Req addr not available right now */
-#define        SOL_ENETDOWN       127   /* Your subnet is on fire           */
-#define        SOL_ENETUNREACH    128   /* Someone playing with gateway and */
-                                 /* did not tell you he was going to */
-#define        SOL_ENETRESET      129   /* Buy less-buggy ethernet cards    */
-#define        SOL_ECONNABORTED   130   /* Aborted connection due to sw     */
-#define        SOL_ECONNRESET     131   /* Your peers reset your connection */
-#define        SOL_ENOBUFS        132   /* No buffer space available        */
-#define        SOL_EISCONN        133   /* Connect on already connected     */
-                                 /* socket attempted                 */
-#define        SOL_ENOTCONN       134   /* Comm on non-connected socket     */
-#define        SOL_ESHUTDOWN      143   /* Op attempted after sock-shutdown */
-#define        SOL_ETOOMANYREFS   144   /* Reference limit exceeded         */
-#define        SOL_ETIMEDOUT      145   /* Timed out connection             */
-#define        SOL_ECONNREFUSED   146   /* Connection refused by remote host*/
-#define        SOL_EHOSTDOWN      147   /* Remote host is up in flames      */
-#define        SOL_EHOSTUNREACH   148   /* Make a left at Easton Ave.....   */
-#define        SOL_EWOULDBLOCK    EAGAIN /* Just an alias */
-#define        SOL_EALREADY       149   /* Operation is already occurring   */
-#define        SOL_EINPROGRESS    150   /* Operation is happening now       */
-#define        SOL_ESTALE         151   /* Fungus growth on NFS file handle */
-
-#endif /* !(_SPARC64_SOLERRNO_H) */
diff --git a/include/asm-sparc64/svr4.h b/include/asm-sparc64/svr4.h
deleted file mode 100644 (file)
index c96d5f1..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Solaris/SPARC constants and definitions -- 
- * (C) 1996 Miguel de Icaza
- *
- * This file is not meant to be included by user level applications
- * but the solaris syscall emulator
- */
-
-#ifndef _SPARC64_SVR4_H
-#define _SPARC64_SVR4_H
-
-/* Signals as used by svr4 */
-typedef struct {                /* signal set type */
-       uint sigbits[4];
-} svr4_sigset_t;
-
-/* Values for siginfo.code */
-#define SVR4_SINOINFO 32767
-/* Siginfo, sucker expects bunch of information on those parameters */
-typedef union {
-       char total_size [128];
-       struct {
-               int signo;
-               int code;
-               int error;
-               union {
-               } data; 
-       } siginfo;
-} svr4_siginfo_t;
-
-/* Context definition */
-
-/* Location of the user stored registers into a greg_t */
-enum {
-       SVR4_PSR, SVR4_PC, SVR4_NPC, SVR4_Y,
-       SVR4_G1,  SVR4_G2, SVR4_G3,  SVR4_G4,
-       SVR4_G5,  SVR4_G6, SVR4_G7,  SVR4_O0,
-       SVR4_O1,  SVR4_O2, SVR4_O3,  SVR4_O4,
-       SVR4_O5,  SVR4_O6, SVR4_O7
-};
-
-/* sizeof (regs) / sizeof (greg_t), defined in the ABI */
-#define SVR4_NREGS  19
-#define SVR4_MAXWIN 31
-
-typedef struct {
-       u32 rwin_lo[8];
-       u32 rwin_in[8];
-} svr4_rwindow_t;
-
-typedef struct {
-       int            count;
-       u32            winptr [SVR4_MAXWIN]; /* pointer to the windows */
-
-       svr4_rwindow_t win[SVR4_MAXWIN];      /* the windows */
-} svr4_gwindows_t;
-
-typedef int svr4_gregset_t[SVR4_NREGS];
-
-typedef struct {
-       u64      fpu_regs[32];
-       u32      fp_q;
-       u32      fp_fsr;
-       u_char   fp_nqel;
-       u_char   fp_nqsize;
-       u_char   inuse;         /* if fpu is in use */
-} svr4_fregset_t;
-
-typedef struct {
-       u32    id;              /* if this holds "xrs" string => ptr is valid */
-       u32    ptr;
-} svr4_xrs_t;
-
-/* Machine dependent context */
-typedef struct {
-       svr4_gregset_t   greg;  /* registers 0..19 (see top) */
-       u32              gwin;  /* may point to register windows */
-       svr4_fregset_t   freg;  /* floating point registers */
-       svr4_xrs_t       xrs;   /* mhm? */
-       int              pad[19];
-} svr4_mcontext_t;
-
-/* flags for stack_t.flags */
-enum svr4_stack_flags {
-       SVR4_SS_ONSTACK,
-       SVR4_SS_DISABLE,
-};
-
-/* signal stack execution place, unsupported */
-typedef struct svr4_stack_t {
-        u32  sp;
-        int  size;
-        int  flags;
-} svr4_stack_t;
-
-/* Context used by getcontext and setcontext */
-typedef struct svr4_ucontext_t {
-       u32             flags; /* context flags, indicate what is loaded */
-       u32             link;
-       svr4_sigset_t   sigmask;
-       svr4_stack_t    stack;
-       svr4_mcontext_t mcontext;
-       int             pad[23];
-} svr4_ucontext_t;                          
-
-/* windows hold the windows as they were at signal time,
- * ucontext->mcontext holds a pointer to them.
- * addresses for uc and si are passed as parameters to svr4 signal
- * handler
- */
-
-/* This is the signal frame that is passed to the signal handler */
-typedef struct {
-       svr4_gwindows_t gw;     /* windows */
-       svr4_ucontext_t uc;     /* machine context */
-       svr4_siginfo_t  si;     /* siginfo */
-} svr4_signal_frame_t;
-
-#define SVR4_SF_ALIGNED (((sizeof (svr4_signal_frame_t) + 7) & (~7)))
-
-#endif /* include control */
index ef527211f8a89a3a6e1e90cd44b7ddb753ef6483..cacbea171ad74bc60800e8b2601d99595a3bd6fb 100644 (file)
@@ -33,11 +33,6 @@ struct ltchars {
 };
 #endif /* __KERNEL__ */
 
-struct sunos_ttysize {
-       int st_lines;   /* Lines on the terminal */
-       int st_columns; /* Columns on the terminal */
-};
-
 struct winsize {
        unsigned short ws_row;
        unsigned short ws_col;
index bbb9c8f13d61814c2d8115c6f54deb6531993b08..7208a777750e77e624507f7ce4a53b5c44335c0d 100644 (file)
         or     %l7, %lo(systbl), %l7;                  \
        nop; nop;
        
-#define INDIRECT_SOLARIS_SYSCALL(num)                  \
-       sethi   %hi(109f), %g7;                         \
-       ba,pt   %xcc, etrap;                            \
-109:    or     %g7, %lo(109b), %g7;                    \
-       ba,pt   %xcc, tl0_solaris + 0xc;                \
-        mov    num, %g1;                               \
-       nop;nop;nop;
-       
 #define TRAP_UTRAP(handler,lvl)                                \
        mov     handler, %g3;                           \
        ba,pt   %xcc, utrap_trap;                       \
        nop;                                            \
        nop;
 
-#ifdef CONFIG_SUNOS_EMUL
-#define SUNOS_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sunos_sys_table)
-#else
-#define SUNOS_SYSCALL_TRAP TRAP(sunos_syscall)
-#endif
 #ifdef CONFIG_COMPAT
 #define        LINUX_32BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall32, sys_call_table32)
 #else
 #define LINUX_64BIT_SYSCALL_TRAP SYSCALL_TRAP(linux_sparc_syscall, sys_call_table64)
 #define GETCC_TRAP TRAP(getcc)
 #define SETCC_TRAP TRAP(setcc)
-#ifdef CONFIG_SOLARIS_EMUL
-#define SOLARIS_SYSCALL_TRAP TRAP(solaris_sparc_syscall)
-#else
-#define SOLARIS_SYSCALL_TRAP TRAP(solaris_syscall)
-#endif
 #define BREAKPOINT_TRAP TRAP(breakpoint_trap)
 
 #ifdef CONFIG_TRACE_IRQFLAGS
index 77559da0ea3fa92aee70ed7059df904c8bd8656f..13be4453a1f0808f62cfa4cd276e15b664848a9b 100644 (file)
 #define NR_SYSCALLS            317
 
 #ifdef __KERNEL__
-/* sysconf options, for SunOS compatibility */
-#define   _SC_ARG_MAX             1
-#define   _SC_CHILD_MAX           2
-#define   _SC_CLK_TCK             3
-#define   _SC_NGROUPS_MAX         4
-#define   _SC_OPEN_MAX            5
-#define   _SC_JOB_CONTROL         6
-#define   _SC_SAVED_IDS           7
-#define   _SC_VERSION             8
-
 #define __ARCH_WANT_IPC_PARSE_VERSION
 #define __ARCH_WANT_OLD_READDIR
 #define __ARCH_WANT_STAT64
index 02b138943837347e45112cf6f4f35f40ab216387..29fc6e906c298c5b28eab09fd6dea1a71d114c36 100644 (file)
@@ -1,60 +1 @@
-/* $Id: user.h,v 1.1 1996/12/26 14:22:44 davem Exp $
- * asm-sparc64/user.h: Core file definitions for the Sparc.
- *
- * Keep in sync with reg.h.  Actually, we could get rid of this
- * one, since we won't a.out core dump that much anyways - miguel.
- * Copyright (C) 1995 (davem@caip.rutgers.edu)
- */
-#ifndef _SPARC64_USER_H
-#define _SPARC64_USER_H
-
-#include <linux/a.out.h>
-struct sunos_regs {
-       unsigned int psr, pc, npc, y;
-       unsigned int regs[15];
-};
-
-struct sunos_fpqueue {
-       unsigned int *addr;
-       unsigned int inst;
-};
-
-struct sunos_fp {
-       union {
-               unsigned int regs[32];
-               double reg_dbls[16];
-       } fregs;
-       unsigned int fsr;
-       unsigned int flags;
-       unsigned int extra;
-       unsigned int fpq_count;
-       struct sunos_fpqueue fpq[16];
-};
-
-struct sunos_fpu {
-       struct sunos_fp fpstatus;
-};
-
-/* The SunOS core file header layout. */
-struct user {
-       unsigned int magic;
-       unsigned int len;
-       struct sunos_regs regs;
-       struct exec uexec;
-       int           signal;
-       size_t        u_tsize; /* all of these in bytes! */
-       size_t        u_dsize;
-       size_t        u_ssize;
-       char          u_comm[17];
-       struct sunos_fpu fpu;
-       unsigned int  sigcode;   /* Special sigcontext subcode, if any */
-};
-
-#define NBPG                   PAGE_SIZE /* XXX 4096 maybe? */
-#define UPAGES                 1
-#define HOST_TEXT_START_ADDR   (u.start_code)
-#define HOST_DATA_START_ADDR   (u.start_data)
-#define HOST_STACK_END_ADDR    (u.start_stack + u.u_ssize * NBPG)
-#define SUNOS_CORE_MAGIC       0x080456
-
-#endif /* !(_SPARC64_USER_H) */
+#include <asm-sparc/user.h>
index b3d9ccde0c278983954f2105771ac0761efc16d3..cbb5ccb27de3e0a377566d2b9459a2af5ba66ef0 100644 (file)
@@ -100,7 +100,7 @@ header-y += ixjuser.h
 header-y += jffs2.h
 header-y += keyctl.h
 header-y += limits.h
-header-y += lock_dlm_plock.h
+header-y += dlm_plock.h
 header-y += magic.h
 header-y += major.h
 header-y += matroxfb.h
@@ -150,6 +150,7 @@ header-y += tiocl.h
 header-y += tipc.h
 header-y += tipc_config.h
 header-y += toshiba.h
+header-y += udf_fs_i.h
 header-y += ultrasound.h
 header-y += un.h
 header-y += utime.h
@@ -210,7 +211,9 @@ unifdef-y += hdlcdrv.h
 unifdef-y += hdlc.h
 unifdef-y += hdreg.h
 unifdef-y += hdsmart.h
+unifdef-y += hid.h
 unifdef-y += hiddev.h
+unifdef-y += hidraw.h
 unifdef-y += hpet.h
 unifdef-y += i2c.h
 unifdef-y += i2c-dev.h
@@ -334,7 +337,6 @@ unifdef-y += time.h
 unifdef-y += timex.h
 unifdef-y += tty.h
 unifdef-y += types.h
-unifdef-y += udf_fs_i.h
 unifdef-y += udp.h
 unifdef-y += uinput.h
 unifdef-y += uio.h
index c743fbc769dbb19905773828ca69f2f2a89722d7..203a025e30e5a88251d909b263a9b0046dc18d2a 100644 (file)
 
 /* Lock levels and flags are here */
 #include <linux/dlmconstants.h>
-
-
-#define DLM_RESNAME_MAXLEN     64
-
+#include <linux/types.h>
 
 typedef void dlm_lockspace_t;
 
@@ -63,7 +60,7 @@ typedef void dlm_lockspace_t;
 
 struct dlm_lksb {
        int      sb_status;
-       uint32_t sb_lkid;
+       __u32    sb_lkid;
        char     sb_flags;
        char *   sb_lvbptr;
 };
index 9642277a152a2d3d764317d03400a53d2f5eae94..c6034508fed9a3c1e795f27a8ef188e6452db834 100644 (file)
 *******************************************************************************
 ******************************************************************************/
 
+#ifndef _LINUX_DLM_DEVICE_H
+#define _LINUX_DLM_DEVICE_H
+
 /* This is the device interface for dlm, most users will use a library
  * interface.
  */
 
+#include <linux/dlm.h>
+#include <linux/types.h>
+
 #define DLM_USER_LVB_LEN       32
 
 /* Version of the device interface */
@@ -94,10 +100,9 @@ struct dlm_lock_result {
 #define DLM_USER_PURGE        6
 #define DLM_USER_DEADLOCK     7
 
-/* Arbitrary length restriction */
-#define MAX_LS_NAME_LEN 64
-
 /* Lockspace flags */
 #define DLM_USER_LSFLG_AUTOFREE   1
 #define DLM_USER_LSFLG_FORCEFREE  2
 
+#endif
+
diff --git a/include/linux/dlm_plock.h b/include/linux/dlm_plock.h
new file mode 100644 (file)
index 0000000..18d5fdb
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2005-2008 Red Hat, Inc.  All rights reserved.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU General Public License v.2.
+ */
+
+#ifndef __DLM_PLOCK_DOT_H__
+#define __DLM_PLOCK_DOT_H__
+
+#define DLM_PLOCK_MISC_NAME            "dlm_plock"
+
+#define DLM_PLOCK_VERSION_MAJOR        1
+#define DLM_PLOCK_VERSION_MINOR        1
+#define DLM_PLOCK_VERSION_PATCH        0
+
+enum {
+       DLM_PLOCK_OP_LOCK = 1,
+       DLM_PLOCK_OP_UNLOCK,
+       DLM_PLOCK_OP_GET,
+};
+
+struct dlm_plock_info {
+       __u32 version[3];
+       __u8 optype;
+       __u8 ex;
+       __u8 wait;
+       __u8 pad;
+       __u32 pid;
+       __s32 nodeid;
+       __s32 rv;
+       __u32 fsid;
+       __u64 number;
+       __u64 start;
+       __u64 end;
+       __u64 owner;
+};
+
+#ifdef __KERNEL__
+int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+               int cmd, struct file_lock *fl);
+int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+               struct file_lock *fl);
+int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+               struct file_lock *fl);
+#endif /* __KERNEL__ */
+
+#endif
+
index fddb3d3ff321bfd8928f3317ef6f8a50f726f6cf..47bf08dc75665a1a2163ff63145cca89bf900a7e 100644 (file)
  * Constants used by DLM interface.
  */
 
+#define DLM_LOCKSPACE_LEN       64
+#define DLM_RESNAME_MAXLEN      64
+
+
 /*
  * Lock Modes
  */
index 74ff57596eb1a856dc7ff3fa528d80d2373f2440..d951ec4112419e640588923f67b548819ae6c914 100644 (file)
@@ -284,6 +284,7 @@ struct hid_item {
 #define HID_QUIRK_2WHEEL_MOUSE_HACK_B8         0x02000000
 #define HID_QUIRK_HWHEEL_WHEEL_INVERT          0x04000000
 #define HID_QUIRK_MICROSOFT_KEYS               0x08000000
+#define HID_QUIRK_FULLSPEED_INTERVAL           0x10000000
 
 /*
  * Separate quirks for runtime report descriptor fixup
@@ -296,6 +297,8 @@ struct hid_item {
 #define HID_QUIRK_RDESC_MACBOOK_JIS            0x00000010
 #define HID_QUIRK_RDESC_BUTTON_CONSUMER                0x00000020
 #define HID_QUIRK_RDESC_SAMSUNG_REMOTE         0x00000040
+#define HID_QUIRK_RDESC_MICROSOFT_RECV_1028    0x00000080
+#define HID_QUIRK_RDESC_SUNPLUS_WDESKTOP       0x00000100
 
 /*
  * This is the global environment of the parser. This information is
@@ -320,7 +323,7 @@ struct hid_global {
  * This is the local environment. It is persistent up the next main-item.
  */
 
-#define HID_MAX_USAGES                 8192
+#define HID_MAX_USAGES                 12288
 #define HID_DEFAULT_NUM_COLLECTIONS    16
 
 struct hid_local {
@@ -421,6 +424,7 @@ struct hid_control_fifo {
 #define HID_RESET_PENDING      4
 #define HID_SUSPENDED          5
 #define HID_CLEAR_HALT         6
+#define HID_DISCONNECTED       7
 
 struct hid_input {
        struct list_head list;
@@ -452,8 +456,6 @@ struct hid_device {                                                 /* device report descriptor */
        void *hidraw;
        int minor;                                                      /* Hiddev minor number */
 
-       wait_queue_head_t wait;                                         /* For sleeping */
-
        int open;                                                       /* is the device open by anyone? */
        char name[128];                                                 /* Device name */
        char phys[64];                                                  /* Device physical location */
@@ -530,14 +532,12 @@ int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int
 int hidinput_mapping_quirks(struct hid_usage *, struct input_dev *, unsigned long **, int *);
 int hidinput_event_quirks(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);
 int hidinput_apple_event(struct hid_device *, struct input_dev *, struct hid_usage *, __s32);
-void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt);
 void hid_output_report(struct hid_report *report, __u8 *data);
 void hid_free_device(struct hid_device *device);
 struct hid_device *hid_parse_report(__u8 *start, unsigned size);
 
 /* HID quirks API */
 u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct);
-int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct, const u32 quirks);
 int usbhid_quirks_init(char **quirks_param);
 void usbhid_quirks_exit(void);
 void usbhid_fixup_report_descriptor(const u16, const u16, char *, unsigned, char **);
@@ -546,6 +546,7 @@ void usbhid_fixup_report_descriptor(const u16, const u16, char *, unsigned, char
 int hid_ff_init(struct hid_device *hid);
 
 int hid_lgff_init(struct hid_device *hid);
+int hid_lg2ff_init(struct hid_device *hid);
 int hid_plff_init(struct hid_device *hid);
 int hid_tmff_init(struct hid_device *hid);
 int hid_zpff_init(struct hid_device *hid);
@@ -566,7 +567,11 @@ static inline int hid_ff_init(struct hid_device *hid) { return -1; }
 #define dbg_hid_line(format, arg...) if (hid_debug) \
                                printk(format, ## arg)
 #else
-#define dbg_hid(format, arg...) do {} while (0)
+static inline int __attribute__((format(printf, 1, 2)))
+dbg_hid(const char *fmt, ...)
+{
+       return 0;
+}
 #define dbg_hid_line dbg_hid
 #endif
 
index 0536f299f7ff8292e6cebf77bcd2c7c66eff3bef..dbb5c8c374f01c286e1bfaa0e2da00c67718c88c 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include <linux/hid.h>
+#include <linux/types.h>
 
 struct hidraw_report_descriptor {
        __u32 size;
index fce47c051bb1331a7eb4e051dbc9dacf3437cac1..adcb3dc7ac26dcb647aee61c9dd2f3f22ab91f6c 100644 (file)
@@ -1,14 +1,41 @@
 #ifndef _LINUX_I2C_ALGO_PCA_H
 #define _LINUX_I2C_ALGO_PCA_H
 
+/* Clock speeds for the bus */
+#define I2C_PCA_CON_330kHz     0x00
+#define I2C_PCA_CON_288kHz     0x01
+#define I2C_PCA_CON_217kHz     0x02
+#define I2C_PCA_CON_146kHz     0x03
+#define I2C_PCA_CON_88kHz      0x04
+#define I2C_PCA_CON_59kHz      0x05
+#define I2C_PCA_CON_44kHz      0x06
+#define I2C_PCA_CON_36kHz      0x07
+
+/* PCA9564 registers */
+#define I2C_PCA_STA            0x00 /* STATUS  Read Only  */
+#define I2C_PCA_TO             0x00 /* TIMEOUT Write Only */
+#define I2C_PCA_DAT            0x01 /* DATA    Read/Write */
+#define I2C_PCA_ADR            0x02 /* OWN ADR Read/Write */
+#define I2C_PCA_CON            0x03 /* CONTROL Read/Write */
+
+#define I2C_PCA_CON_AA         0x80 /* Assert Acknowledge */
+#define I2C_PCA_CON_ENSIO      0x40 /* Enable */
+#define I2C_PCA_CON_STA                0x20 /* Start */
+#define I2C_PCA_CON_STO                0x10 /* Stop */
+#define I2C_PCA_CON_SI         0x08 /* Serial Interrupt */
+#define I2C_PCA_CON_CR         0x07 /* Clock Rate (MASK) */
+
 struct i2c_algo_pca_data {
-       int  (*get_own)                 (struct i2c_algo_pca_data *adap); /* Obtain own address */
-       int  (*get_clock)               (struct i2c_algo_pca_data *adap);
-       void (*write_byte)              (struct i2c_algo_pca_data *adap, int reg, int val);
-       int  (*read_byte)               (struct i2c_algo_pca_data *adap, int reg);
-       int  (*wait_for_interrupt)      (struct i2c_algo_pca_data *adap);
+       void                            *data;  /* private low level data */
+       void (*write_byte)              (void *data, int reg, int val);
+       int  (*read_byte)               (void *data, int reg);
+       int  (*wait_for_completion)     (void *data);
+       void (*reset_chip)              (void *data);
+       /* i2c_clock values are defined in linux/i2c-algo-pca.h */
+       unsigned int                    i2c_clock;
 };
 
 int i2c_pca_add_bus(struct i2c_adapter *);
+int i2c_pca_add_numbered_bus(struct i2c_adapter *);
 
 #endif /* _LINUX_I2C_ALGO_PCA_H */
diff --git a/include/linux/i2c-pca-platform.h b/include/linux/i2c-pca-platform.h
new file mode 100644 (file)
index 0000000..3d19187
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef I2C_PCA9564_PLATFORM_H
+#define I2C_PCA9564_PLATFORM_H
+
+struct i2c_pca9564_pf_platform_data {
+       int gpio;               /* pin to reset chip. driver will work when
+                                * not supplied (negative value), but it
+                                * cannot exit some error conditions then */
+       int i2c_clock_speed;    /* values are defined in linux/i2c-algo-pca.h */
+       int timeout;            /* timeout = this value * 10us */
+};
+
+#endif /* I2C_PCA9564_PLATFORM_H */
diff --git a/include/linux/lock_dlm_plock.h b/include/linux/lock_dlm_plock.h
deleted file mode 100644 (file)
index fc34151..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2005 Red Hat, Inc.  All rights reserved.
- *
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU General Public License v.2.
- */
-
-#ifndef __LOCK_DLM_PLOCK_DOT_H__
-#define __LOCK_DLM_PLOCK_DOT_H__
-
-#define GDLM_PLOCK_MISC_NAME           "lock_dlm_plock"
-
-#define GDLM_PLOCK_VERSION_MAJOR       1
-#define GDLM_PLOCK_VERSION_MINOR       1
-#define GDLM_PLOCK_VERSION_PATCH       0
-
-enum {
-       GDLM_PLOCK_OP_LOCK = 1,
-       GDLM_PLOCK_OP_UNLOCK,
-       GDLM_PLOCK_OP_GET,
-};
-
-struct gdlm_plock_info {
-       __u32 version[3];
-       __u8 optype;
-       __u8 ex;
-       __u8 wait;
-       __u8 pad;
-       __u32 pid;
-       __s32 nodeid;
-       __s32 rv;
-       __u32 fsid;
-       __u64 number;
-       __u64 start;
-       __u64 end;
-       __u64 owner;
-};
-
-#endif
-
diff --git a/include/linux/udf_fs.h b/include/linux/udf_fs.h
deleted file mode 100644 (file)
index aa88654..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * udf_fs.h
- *
- * PURPOSE
- *  Included by fs/filesystems.c
- *
- * DESCRIPTION
- *  OSTA-UDF(tm) = Optical Storage Technology Association
- *  Universal Disk Format.
- *
- *  This code is based on version 2.50 of the UDF specification,
- *  and revision 3 of the ECMA 167 standard [equivalent to ISO 13346].
- *    http://www.osta.org/ *    http://www.ecma.ch/
- *    http://www.iso.org/
- *
- * COPYRIGHT
- *     This file is distributed under the terms of the GNU General Public
- *     License (GPL). Copies of the GPL can be obtained from:
- *             ftp://prep.ai.mit.edu/pub/gnu/GPL
- *     Each contributing author retains all rights to their own work.
- *
- *  (C) 1999-2004 Ben Fennema
- *  (C) 1999-2000 Stelias Computing Inc
- *
- * HISTORY
- *
- */
-
-#ifndef _UDF_FS_H
-#define _UDF_FS_H 1
-
-#define UDF_PREALLOCATE
-#define UDF_DEFAULT_PREALLOC_BLOCKS    8
-
-#undef UDFFS_DEBUG
-
-#ifdef UDFFS_DEBUG
-#define udf_debug(f, a...) \
-       do { \
-               printk (KERN_DEBUG "UDF-fs DEBUG %s:%d:%s: ", \
-                       __FILE__, __LINE__, __FUNCTION__); \
-               printk (f, ##a); \
-       } while (0)
-#else
-#define udf_debug(f, a...) /**/
-#endif
-
-#define udf_info(f, a...) \
-               printk (KERN_INFO "UDF-fs INFO " f, ##a);
-
-#endif /* _UDF_FS_H */
index ffaf05679ffb2dad2e5d4ee58fc899bf35612e3d..3536965913b09262f3bb202088f4ade104fd3417 100644 (file)
@@ -9,41 +9,10 @@
  *             ftp://prep.ai.mit.edu/pub/gnu/GPL
  *     Each contributing author retains all rights to their own work.
  */
-
 #ifndef _UDF_FS_I_H
 #define _UDF_FS_I_H 1
 
-#ifdef __KERNEL__
-
-struct udf_inode_info
-{
-       struct timespec         i_crtime;
-       /* Physical address of inode */
-       kernel_lb_addr          i_location;
-       __u64                   i_unique;
-       __u32                   i_lenEAttr;
-       __u32                   i_lenAlloc;
-       __u64                   i_lenExtents;
-       __u32                   i_next_alloc_block;
-       __u32                   i_next_alloc_goal;
-       unsigned                i_alloc_type : 3;
-       unsigned                i_efe : 1;
-       unsigned                i_use : 1;
-       unsigned                i_strat4096 : 1;
-       unsigned                reserved : 26;
-       union
-       {
-               short_ad        *i_sad;
-               long_ad         *i_lad;
-               __u8            *i_data;
-       } i_ext;
-       struct inode vfs_inode;
-};
-
-#endif
-
 /* exported IOCTLs, we have 'l', 0x40-0x7f */
-
 #define UDF_GETEASIZE   _IOR('l', 0x40, int)
 #define UDF_GETEABLOCK  _IOR('l', 0x41, void *)
 #define UDF_GETVOLIDENT _IOR('l', 0x42, void *)
diff --git a/include/linux/udf_fs_sb.h b/include/linux/udf_fs_sb.h
deleted file mode 100644 (file)
index 9bc4735..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * udf_fs_sb.h
- * 
- * This include file is for the Linux kernel/module.
- *
- * COPYRIGHT
- *     This file is distributed under the terms of the GNU General Public
- *     License (GPL). Copies of the GPL can be obtained from:
- *             ftp://prep.ai.mit.edu/pub/gnu/GPL
- *     Each contributing author retains all rights to their own work.
- */
-
-#ifndef _UDF_FS_SB_H
-#define _UDF_FS_SB_H 1
-
-#include <linux/mutex.h>
-
-#pragma pack(1)
-
-#define UDF_MAX_BLOCK_LOADED   8
-
-#define UDF_TYPE1_MAP15                        0x1511U
-#define UDF_VIRTUAL_MAP15              0x1512U
-#define UDF_VIRTUAL_MAP20              0x2012U
-#define UDF_SPARABLE_MAP15             0x1522U
-
-struct udf_sparing_data
-{
-       __u16   s_packet_len;
-       struct buffer_head *s_spar_map[4];
-};
-
-struct udf_virtual_data
-{
-       __u32   s_num_entries;
-       __u16   s_start_offset;
-};
-
-struct udf_bitmap
-{
-       __u32                   s_extLength;
-       __u32                   s_extPosition;
-       __u16                   s_nr_groups;
-       struct buffer_head      **s_block_bitmap;
-};
-
-struct udf_part_map
-{
-       union
-       {
-               struct udf_bitmap       *s_bitmap;
-               struct inode            *s_table;
-       } s_uspace;
-       union
-       {
-               struct udf_bitmap       *s_bitmap;
-               struct inode            *s_table;
-       } s_fspace;
-       __u32   s_partition_root;
-       __u32   s_partition_len;
-       __u16   s_partition_type;
-       __u16   s_partition_num;
-       union
-       {
-               struct udf_sparing_data s_sparing;
-               struct udf_virtual_data s_virtual;
-       } s_type_specific;
-       __u32   (*s_partition_func)(struct super_block *, __u32, __u16, __u32);
-       __u16   s_volumeseqnum;
-       __u16   s_partition_flags;
-};
-
-#pragma pack()
-
-struct udf_sb_info
-{
-       struct udf_part_map     *s_partmaps;
-       __u8                    s_volume_ident[32];
-
-       /* Overall info */
-       __u16                   s_partitions;
-       __u16                   s_partition;
-
-       /* Sector headers */
-       __s32                   s_session;
-       __u32                   s_anchor[4];
-       __u32                   s_last_block;
-
-       struct buffer_head      *s_lvid_bh;
-
-       /* Default permissions */
-       mode_t                  s_umask;
-       gid_t                   s_gid;
-       uid_t                   s_uid;
-
-       /* Root Info */
-       struct timespec         s_record_time;
-
-       /* Fileset Info */
-       __u16                   s_serial_number;
-
-       /* highest UDF revision we have recorded to this media */
-       __u16                   s_udfrev;
-
-       /* Miscellaneous flags */
-       __u32                   s_flags;
-
-       /* Encoding info */
-       struct nls_table        *s_nls_map;
-
-       /* VAT inode */
-       struct inode            *s_vat_inode;
-
-       struct mutex            s_alloc_mutex;
-};
-
-#endif /* _UDF_FS_SB_H */
index 57ba7ea9b744558949a6f07bc3f4f11b6a94d483..0014b03adaca0af7d09d25d3b5c0df3c007b2462 100644 (file)
@@ -7035,6 +7035,7 @@ static int find_next_best_node(int node, nodemask_t *used_nodes)
 /**
  * sched_domain_node_span - get a cpumask for a node's sched_domain
  * @node: node whose cpumask we're constructing
+ * @span: resulting cpumask
  *
  * Given a node, construct a good cpumask for its sched_domain to span. It
  * should be one that prevents unnecessary balancing, but also spreads tasks
index 5ac05269355474dafda721357934be004a52ac3d..5dbb81bc96733d260e97c9c573acde9260b58174 100644 (file)
@@ -450,15 +450,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
         *      Options without arguments
         */
 
-#ifdef SO_DONTLINGER           /* Compatibility item... */
-       if (optname == SO_DONTLINGER) {
-               lock_sock(sk);
-               sock_reset_flag(sk, SOCK_LINGER);
-               release_sock(sk);
-               return 0;
-       }
-#endif
-
        if (optname == SO_BINDTODEVICE)
                return sock_bindtodevice(sk, optval, optlen);