Merge branch 'master' of /usr/src/ntfs-2.6/
This commit is contained in:
commit
29d8699ebb
|
@ -0,0 +1,161 @@
|
|||
===================
|
||||
KEY REQUEST SERVICE
|
||||
===================
|
||||
|
||||
The key request service is part of the key retention service (refer to
|
||||
Documentation/keys.txt). This document explains more fully how that the
|
||||
requesting algorithm works.
|
||||
|
||||
The process starts by either the kernel requesting a service by calling
|
||||
request_key():
|
||||
|
||||
struct key *request_key(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string);
|
||||
|
||||
Or by userspace invoking the request_key system call:
|
||||
|
||||
key_serial_t request_key(const char *type,
|
||||
const char *description,
|
||||
const char *callout_info,
|
||||
key_serial_t dest_keyring);
|
||||
|
||||
The main difference between the two access points is that the in-kernel
|
||||
interface does not need to link the key to a keyring to prevent it from being
|
||||
immediately destroyed. The kernel interface returns a pointer directly to the
|
||||
key, and it's up to the caller to destroy the key.
|
||||
|
||||
The userspace interface links the key to a keyring associated with the process
|
||||
to prevent the key from going away, and returns the serial number of the key to
|
||||
the caller.
|
||||
|
||||
|
||||
===========
|
||||
THE PROCESS
|
||||
===========
|
||||
|
||||
A request proceeds in the following manner:
|
||||
|
||||
(1) Process A calls request_key() [the userspace syscall calls the kernel
|
||||
interface].
|
||||
|
||||
(2) request_key() searches the process's subscribed keyrings to see if there's
|
||||
a suitable key there. If there is, it returns the key. If there isn't, and
|
||||
callout_info is not set, an error is returned. Otherwise the process
|
||||
proceeds to the next step.
|
||||
|
||||
(3) request_key() sees that A doesn't have the desired key yet, so it creates
|
||||
two things:
|
||||
|
||||
(a) An uninstantiated key U of requested type and description.
|
||||
|
||||
(b) An authorisation key V that refers to key U and notes that process A
|
||||
is the context in which key U should be instantiated and secured, and
|
||||
from which associated key requests may be satisfied.
|
||||
|
||||
(4) request_key() then forks and executes /sbin/request-key with a new session
|
||||
keyring that contains a link to auth key V.
|
||||
|
||||
(5) /sbin/request-key execs an appropriate program to perform the actual
|
||||
instantiation.
|
||||
|
||||
(6) The program may want to access another key from A's context (say a
|
||||
Kerberos TGT key). It just requests the appropriate key, and the keyring
|
||||
search notes that the session keyring has auth key V in its bottom level.
|
||||
|
||||
This will permit it to then search the keyrings of process A with the
|
||||
UID, GID, groups and security info of process A as if it was process A,
|
||||
and come up with key W.
|
||||
|
||||
(7) The program then does what it must to get the data with which to
|
||||
instantiate key U, using key W as a reference (perhaps it contacts a
|
||||
Kerberos server using the TGT) and then instantiates key U.
|
||||
|
||||
(8) Upon instantiating key U, auth key V is automatically revoked so that it
|
||||
may not be used again.
|
||||
|
||||
(9) The program then exits 0 and request_key() deletes key V and returns key
|
||||
U to the caller.
|
||||
|
||||
This also extends further. If key W (step 5 above) didn't exist, key W would be
|
||||
created uninstantiated, another auth key (X) would be created [as per step 3]
|
||||
and another copy of /sbin/request-key spawned [as per step 4]; but the context
|
||||
specified by auth key X will still be process A, as it was in auth key V.
|
||||
|
||||
This is because process A's keyrings can't simply be attached to
|
||||
/sbin/request-key at the appropriate places because (a) execve will discard two
|
||||
of them, and (b) it requires the same UID/GID/Groups all the way through.
|
||||
|
||||
|
||||
======================
|
||||
NEGATIVE INSTANTIATION
|
||||
======================
|
||||
|
||||
Rather than instantiating a key, it is possible for the possessor of an
|
||||
authorisation key to negatively instantiate a key that's under construction.
|
||||
This is a short duration placeholder that causes any attempt at re-requesting
|
||||
the key whilst it exists to fail with error ENOKEY.
|
||||
|
||||
This is provided to prevent excessive repeated spawning of /sbin/request-key
|
||||
processes for a key that will never be obtainable.
|
||||
|
||||
Should the /sbin/request-key process exit anything other than 0 or die on a
|
||||
signal, the key under construction will be automatically negatively
|
||||
instantiated for a short amount of time.
|
||||
|
||||
|
||||
====================
|
||||
THE SEARCH ALGORITHM
|
||||
====================
|
||||
|
||||
A search of any particular keyring proceeds in the following fashion:
|
||||
|
||||
(1) When the key management code searches for a key (keyring_search_aux) it
|
||||
firstly calls key_permission(SEARCH) on the keyring it's starting with,
|
||||
if this denies permission, it doesn't search further.
|
||||
|
||||
(2) It considers all the non-keyring keys within that keyring and, if any key
|
||||
matches the criteria specified, calls key_permission(SEARCH) on it to see
|
||||
if the key is allowed to be found. If it is, that key is returned; if
|
||||
not, the search continues, and the error code is retained if of higher
|
||||
priority than the one currently set.
|
||||
|
||||
(3) It then considers all the keyring-type keys in the keyring it's currently
|
||||
searching. It calls key_permission(SEARCH) on each keyring, and if this
|
||||
grants permission, it recurses, executing steps (2) and (3) on that
|
||||
keyring.
|
||||
|
||||
The process stops immediately a valid key is found with permission granted to
|
||||
use it. Any error from a previous match attempt is discarded and the key is
|
||||
returned.
|
||||
|
||||
When search_process_keyrings() is invoked, it performs the following searches
|
||||
until one succeeds:
|
||||
|
||||
(1) If extant, the process's thread keyring is searched.
|
||||
|
||||
(2) If extant, the process's process keyring is searched.
|
||||
|
||||
(3) The process's session keyring is searched.
|
||||
|
||||
(4) If the process has a request_key() authorisation key in its session
|
||||
keyring then:
|
||||
|
||||
(a) If extant, the calling process's thread keyring is searched.
|
||||
|
||||
(b) If extant, the calling process's process keyring is searched.
|
||||
|
||||
(c) The calling process's session keyring is searched.
|
||||
|
||||
The moment one succeeds, all pending errors are discarded and the found key is
|
||||
returned.
|
||||
|
||||
Only if all these fail does the whole thing fail with the highest priority
|
||||
error. Note that several errors may have come from LSM.
|
||||
|
||||
The error priority is:
|
||||
|
||||
EKEYREVOKED > EKEYEXPIRED > ENOKEY
|
||||
|
||||
EACCES/EPERM are only returned on a direct search of a specific keyring where
|
||||
the basal keyring does not grant Search permission.
|
|
@ -361,6 +361,8 @@ The main syscalls are:
|
|||
/sbin/request-key will be invoked in an attempt to obtain a key. The
|
||||
callout_info string will be passed as an argument to the program.
|
||||
|
||||
See also Documentation/keys-request-key.txt.
|
||||
|
||||
|
||||
The keyctl syscall functions are:
|
||||
|
||||
|
@ -533,8 +535,8 @@ The keyctl syscall functions are:
|
|||
|
||||
(*) Read the payload data from a key:
|
||||
|
||||
key_serial_t keyctl(KEYCTL_READ, key_serial_t keyring, char *buffer,
|
||||
size_t buflen);
|
||||
long keyctl(KEYCTL_READ, key_serial_t keyring, char *buffer,
|
||||
size_t buflen);
|
||||
|
||||
This function attempts to read the payload data from the specified key
|
||||
into the buffer. The process must have read permission on the key to
|
||||
|
@ -555,9 +557,9 @@ The keyctl syscall functions are:
|
|||
|
||||
(*) Instantiate a partially constructed key.
|
||||
|
||||
key_serial_t keyctl(KEYCTL_INSTANTIATE, key_serial_t key,
|
||||
const void *payload, size_t plen,
|
||||
key_serial_t keyring);
|
||||
long keyctl(KEYCTL_INSTANTIATE, key_serial_t key,
|
||||
const void *payload, size_t plen,
|
||||
key_serial_t keyring);
|
||||
|
||||
If the kernel calls back to userspace to complete the instantiation of a
|
||||
key, userspace should use this call to supply data for the key before the
|
||||
|
@ -576,8 +578,8 @@ The keyctl syscall functions are:
|
|||
|
||||
(*) Negatively instantiate a partially constructed key.
|
||||
|
||||
key_serial_t keyctl(KEYCTL_NEGATE, key_serial_t key,
|
||||
unsigned timeout, key_serial_t keyring);
|
||||
long keyctl(KEYCTL_NEGATE, key_serial_t key,
|
||||
unsigned timeout, key_serial_t keyring);
|
||||
|
||||
If the kernel calls back to userspace to complete the instantiation of a
|
||||
key, userspace should use this call mark the key as negative before the
|
||||
|
@ -688,6 +690,8 @@ payload contents" for more information.
|
|||
If successful, the key will have been attached to the default keyring for
|
||||
implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING.
|
||||
|
||||
See also Documentation/keys-request-key.txt.
|
||||
|
||||
|
||||
(*) When it is no longer required, the key should be released using:
|
||||
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 14
|
||||
EXTRAVERSION =-rc3
|
||||
EXTRAVERSION =-rc4
|
||||
NAME=Affluent Albatross
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -26,6 +26,8 @@ struct scoop_pcmcia_dev *scoop_devs;
|
|||
struct scoop_dev {
|
||||
void *base;
|
||||
spinlock_t scoop_lock;
|
||||
unsigned short suspend_clr;
|
||||
unsigned short suspend_set;
|
||||
u32 scoop_gpwr;
|
||||
};
|
||||
|
||||
|
@ -90,14 +92,24 @@ EXPORT_SYMBOL(reset_scoop);
|
|||
EXPORT_SYMBOL(read_scoop_reg);
|
||||
EXPORT_SYMBOL(write_scoop_reg);
|
||||
|
||||
static void check_scoop_reg(struct scoop_dev *sdev)
|
||||
{
|
||||
unsigned short mcr;
|
||||
|
||||
mcr = SCOOP_REG(sdev->base, SCOOP_MCR);
|
||||
if ((mcr & 0x100) == 0)
|
||||
SCOOP_REG(sdev->base, SCOOP_MCR) = 0x0101;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int scoop_suspend(struct device *dev, pm_message_t state, uint32_t level)
|
||||
{
|
||||
if (level == SUSPEND_POWER_DOWN) {
|
||||
struct scoop_dev *sdev = dev_get_drvdata(dev);
|
||||
|
||||
sdev->scoop_gpwr = SCOOP_REG(sdev->base,SCOOP_GPWR);
|
||||
SCOOP_REG(sdev->base,SCOOP_GPWR) = 0;
|
||||
check_scoop_reg(sdev);
|
||||
sdev->scoop_gpwr = SCOOP_REG(sdev->base, SCOOP_GPWR);
|
||||
SCOOP_REG(sdev->base, SCOOP_GPWR) = (sdev->scoop_gpwr & ~sdev->suspend_clr) | sdev->suspend_set;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -107,6 +119,7 @@ static int scoop_resume(struct device *dev, uint32_t level)
|
|||
if (level == RESUME_POWER_ON) {
|
||||
struct scoop_dev *sdev = dev_get_drvdata(dev);
|
||||
|
||||
check_scoop_reg(sdev);
|
||||
SCOOP_REG(sdev->base,SCOOP_GPWR) = sdev->scoop_gpwr;
|
||||
}
|
||||
return 0;
|
||||
|
@ -151,6 +164,9 @@ int __init scoop_probe(struct device *dev)
|
|||
SCOOP_REG(devptr->base, SCOOP_GPCR) = inf->io_dir & 0xffff;
|
||||
SCOOP_REG(devptr->base, SCOOP_GPWR) = inf->io_out & 0xffff;
|
||||
|
||||
devptr->suspend_clr = inf->suspend_clr;
|
||||
devptr->suspend_set = inf->suspend_set;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,888 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc3
|
||||
# Sun Oct 9 16:55:14 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
# CONFIG_CLEAN_COMPILE is not set
|
||||
CONFIG_BROKEN=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
# CONFIG_ARCH_CLPS7500 is not set
|
||||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
CONFIG_ARCH_SA1100=y
|
||||
# CONFIG_ARCH_S3C2410 is not set
|
||||
# CONFIG_ARCH_SHARK is not set
|
||||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
||||
#
|
||||
# SA11x0 Implementations
|
||||
#
|
||||
# CONFIG_SA1100_ASSABET is not set
|
||||
# CONFIG_SA1100_CERF is not set
|
||||
CONFIG_SA1100_COLLIE=y
|
||||
# CONFIG_SA1100_H3100 is not set
|
||||
# CONFIG_SA1100_H3600 is not set
|
||||
# CONFIG_SA1100_H3800 is not set
|
||||
# CONFIG_SA1100_BADGE4 is not set
|
||||
# CONFIG_SA1100_JORNADA720 is not set
|
||||
# CONFIG_SA1100_HACKKIT is not set
|
||||
# CONFIG_SA1100_LART is not set
|
||||
# CONFIG_SA1100_PLEB is not set
|
||||
# CONFIG_SA1100_SHANNON is not set
|
||||
# CONFIG_SA1100_SIMPAD is not set
|
||||
# CONFIG_SA1100_SSP is not set
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
#
|
||||
CONFIG_CPU_32=y
|
||||
CONFIG_CPU_SA1100=y
|
||||
CONFIG_CPU_32v4=y
|
||||
CONFIG_CPU_ABRT_EV4=y
|
||||
CONFIG_CPU_CACHE_V4WB=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_TLB_V4WB=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
#
|
||||
CONFIG_SHARP_LOCOMO=y
|
||||
CONFIG_SHARP_PARAM=y
|
||||
CONFIG_SHARP_SCOOP=y
|
||||
|
||||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM_MANUAL=y
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_NEED_MULTIPLE_NODES=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_LEDS is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 debug"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
# CPU Frequency scaling
|
||||
#
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
|
||||
#
|
||||
# Floating point emulation
|
||||
#
|
||||
|
||||
#
|
||||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
# CONFIG_FPE_NWFPE_XP is not set
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_AOUT=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
# CONFIG_ARTHUR is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
CONFIG_PM=y
|
||||
CONFIG_APM=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=m
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
CONFIG_MTD=y
|
||||
# CONFIG_MTD_DEBUG is not set
|
||||
# CONFIG_MTD_CONCAT is not set
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
# CONFIG_MTD_CMDLINE_PARTS is not set
|
||||
# CONFIG_MTD_AFS_PARTS is not set
|
||||
|
||||
#
|
||||
# User Modules And Translation Layers
|
||||
#
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
# CONFIG_MTD_CFI is not set
|
||||
# CONFIG_MTD_JEDECPROBE is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
CONFIG_MTD_OBSOLETE_CHIPS=y
|
||||
# CONFIG_MTD_AMDSTD is not set
|
||||
CONFIG_MTD_SHARP=y
|
||||
# CONFIG_MTD_JEDEC is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
#
|
||||
# CONFIG_MTD_SLRAM is not set
|
||||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLKMTD is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
|
||||
#
|
||||
# Disk-On-Chip Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_DOC2000 is not set
|
||||
# CONFIG_MTD_DOC2001 is not set
|
||||
# CONFIG_MTD_DOC2001PLUS is not set
|
||||
|
||||
#
|
||||
# NAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
# CONFIG_PNP is not set
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_XD is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_ATA_OVER_ETH=m
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
# CONFIG_NETDEVICES is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
CONFIG_INPUT_TSDEV=y
|
||||
CONFIG_INPUT_TSDEV_SCREEN_X=240
|
||||
CONFIG_INPUT_TSDEV_SCREEN_Y=320
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_INPUT_EVBUG=y
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
CONFIG_KEYBOARD_LOCOMO=y
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
# CONFIG_SERIO_LIBPS2 is not set
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_SA1100=y
|
||||
CONFIG_SERIAL_SA1100_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=m
|
||||
# CONFIG_I2C_CHARDEV is not set
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
CONFIG_I2C_ALGOBIT=m
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
# CONFIG_I2C_ELEKTOR is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM75 is not set
|
||||
# CONFIG_SENSORS_LM77 is not set
|
||||
# CONFIG_SENSORS_LM78 is not set
|
||||
# CONFIG_SENSORS_LM80 is not set
|
||||
# CONFIG_SENSORS_LM83 is not set
|
||||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
# CONFIG_MCP_SA11X0 is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
CONFIG_VIDEO_DEV=m
|
||||
|
||||
#
|
||||
# Video For Linux
|
||||
#
|
||||
|
||||
#
|
||||
# Video Adapters
|
||||
#
|
||||
# CONFIG_VIDEO_PMS is not set
|
||||
# CONFIG_VIDEO_CPIA is not set
|
||||
# CONFIG_VIDEO_SAA5246A is not set
|
||||
# CONFIG_VIDEO_SAA5249 is not set
|
||||
# CONFIG_TUNER_3036 is not set
|
||||
# CONFIG_VIDEO_OVCAMCHIP is not set
|
||||
|
||||
#
|
||||
# Radio Adapters
|
||||
#
|
||||
# CONFIG_RADIO_CADET is not set
|
||||
# CONFIG_RADIO_RTRACK is not set
|
||||
# CONFIG_RADIO_RTRACK2 is not set
|
||||
# CONFIG_RADIO_AZTECH is not set
|
||||
# CONFIG_RADIO_GEMTEK is not set
|
||||
# CONFIG_RADIO_MAESTRO is not set
|
||||
# CONFIG_RADIO_SF16FMI is not set
|
||||
# CONFIG_RADIO_SF16FMR2 is not set
|
||||
# CONFIG_RADIO_TERRATEC is not set
|
||||
# CONFIG_RADIO_TRUST is not set
|
||||
# CONFIG_RADIO_TYPHOON is not set
|
||||
# CONFIG_RADIO_ZOLTRIX is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
CONFIG_FB_SA1100=y
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_MDA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FONTS=y
|
||||
CONFIG_FONT_8x8=y
|
||||
# CONFIG_FONT_8x16 is not set
|
||||
# CONFIG_FONT_6x11 is not set
|
||||
# CONFIG_FONT_7x14 is not set
|
||||
# CONFIG_FONT_PEARL_8x8 is not set
|
||||
# CONFIG_FONT_ACORN_8x8 is not set
|
||||
# CONFIG_FONT_MINI_4x6 is not set
|
||||
# CONFIG_FONT_SUN8x16 is not set
|
||||
# CONFIG_FONT_SUN12x22 is not set
|
||||
# CONFIG_FONT_10x18 is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
# CONFIG_LOGO is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
CONFIG_USB_GADGET=y
|
||||
# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
||||
# CONFIG_USB_GADGET_NET2280 is not set
|
||||
# CONFIG_USB_GADGET_PXA2XX is not set
|
||||
# CONFIG_USB_GADGET_GOKU is not set
|
||||
# CONFIG_USB_GADGET_LH7A40X is not set
|
||||
# CONFIG_USB_GADGET_OMAP is not set
|
||||
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
||||
# CONFIG_USB_GADGET_DUALSPEED is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
CONFIG_EXT2_FS_SECURITY=y
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
CONFIG_ROMFS_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
# CONFIG_JFFS2_RUBIN is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
# CONFIG_NFS_FS is not set
|
||||
# CONFIG_NFSD is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="cp437"
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
CONFIG_NLS_UTF8=m
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
# CONFIG_DEBUG_LL is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -305,7 +305,7 @@ long execve(const char *filename, char **argv, char **envp)
|
|||
"Ir" (THREAD_START_SP - sizeof(regs)),
|
||||
"r" (®s),
|
||||
"Ir" (sizeof(regs))
|
||||
: "r0", "r1", "r2", "r3", "ip", "memory");
|
||||
: "r0", "r1", "r2", "r3", "ip", "lr", "memory");
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
|
|
@ -504,7 +504,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
|||
|
||||
bad_access:
|
||||
spin_unlock(&mm->page_table_lock);
|
||||
/* simulate a read access fault */
|
||||
/* simulate a write access fault */
|
||||
do_DataAbort(addr, 15 + (1 << 11), regs);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -28,14 +28,15 @@
|
|||
#include <linux/module.h>
|
||||
#include <asm/arch/imxfb.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/arch/imx-regs.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
void imx_gpio_mode(int gpio_mode)
|
||||
{
|
||||
unsigned int pin = gpio_mode & GPIO_PIN_MASK;
|
||||
unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> 5;
|
||||
unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> 10;
|
||||
unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT;
|
||||
unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> GPIO_OCR_SHIFT;
|
||||
unsigned int tmp;
|
||||
|
||||
/* Pullup enable */
|
||||
|
@ -57,7 +58,7 @@ void imx_gpio_mode(int gpio_mode)
|
|||
GPR(port) &= ~(1<<pin);
|
||||
|
||||
/* use as gpio? */
|
||||
if( ocr == 3 )
|
||||
if(gpio_mode & GPIO_GIUS)
|
||||
GIUS(port) |= (1<<pin);
|
||||
else
|
||||
GIUS(port) &= ~(1<<pin);
|
||||
|
@ -72,20 +73,20 @@ void imx_gpio_mode(int gpio_mode)
|
|||
tmp |= (ocr << (pin*2));
|
||||
OCR1(port) = tmp;
|
||||
|
||||
if( gpio_mode & GPIO_AOUT )
|
||||
ICONFA1(port) &= ~( 3<<(pin*2));
|
||||
if( gpio_mode & GPIO_BOUT )
|
||||
ICONFB1(port) &= ~( 3<<(pin*2));
|
||||
ICONFA1(port) &= ~( 3<<(pin*2));
|
||||
ICONFA1(port) |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << (pin * 2);
|
||||
ICONFB1(port) &= ~( 3<<(pin*2));
|
||||
ICONFB1(port) |= ((gpio_mode >> GPIO_BOUT_SHIFT) & 3) << (pin * 2);
|
||||
} else {
|
||||
tmp = OCR2(port);
|
||||
tmp &= ~( 3<<((pin-16)*2));
|
||||
tmp |= (ocr << ((pin-16)*2));
|
||||
OCR2(port) = tmp;
|
||||
|
||||
if( gpio_mode & GPIO_AOUT )
|
||||
ICONFA2(port) &= ~( 3<<((pin-16)*2));
|
||||
if( gpio_mode & GPIO_BOUT )
|
||||
ICONFB2(port) &= ~( 3<<((pin-16)*2));
|
||||
ICONFA2(port) &= ~( 3<<((pin-16)*2));
|
||||
ICONFA2(port) |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << ((pin-16) * 2);
|
||||
ICONFB2(port) &= ~( 3<<((pin-16)*2));
|
||||
ICONFB2(port) |= ((gpio_mode >> GPIO_BOUT_SHIFT) & 3) << ((pin-16) * 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ static void __init
|
|||
mx1ads_init(void)
|
||||
{
|
||||
#ifdef CONFIG_LEDS
|
||||
imx_gpio_mode(GPIO_PORTA | GPIO_OUT | GPIO_GPIO | 2);
|
||||
imx_gpio_mode(GPIO_PORTA | GPIO_OUT | 2);
|
||||
#endif
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <asm/arch/mmc.h>
|
||||
#include <asm/arch/udc.h>
|
||||
#include <asm/arch/corgi.h>
|
||||
#include <asm/arch/sharpsl.h>
|
||||
|
||||
#include <asm/mach/sharpsl_param.h>
|
||||
#include <asm/hardware/scoop.h>
|
||||
|
|
|
@ -111,11 +111,11 @@ static struct mtd_partition collie_partitions[] = {
|
|||
|
||||
static void collie_set_vpp(int vpp)
|
||||
{
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR, read_scoop_reg(SCOOP_GPCR) | COLLIE_SCP_VPEN);
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR) | COLLIE_SCP_VPEN);
|
||||
if (vpp)
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) | COLLIE_SCP_VPEN);
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR) | COLLIE_SCP_VPEN);
|
||||
else
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) & ~COLLIE_SCP_VPEN);
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR) & ~COLLIE_SCP_VPEN);
|
||||
}
|
||||
|
||||
static struct flash_platform_data collie_flash_data = {
|
||||
|
|
|
@ -370,21 +370,21 @@ config CPU_BIG_ENDIAN
|
|||
|
||||
config CPU_ICACHE_DISABLE
|
||||
bool "Disable I-Cache"
|
||||
depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020
|
||||
depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_V6
|
||||
help
|
||||
Say Y here to disable the processor instruction cache. Unless
|
||||
you have a reason not to or are unsure, say N.
|
||||
|
||||
config CPU_DCACHE_DISABLE
|
||||
bool "Disable D-Cache"
|
||||
depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020
|
||||
depends on CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_V6
|
||||
help
|
||||
Say Y here to disable the processor data cache. Unless
|
||||
you have a reason not to or are unsure, say N.
|
||||
|
||||
config CPU_DCACHE_WRITETHROUGH
|
||||
bool "Force write through D-cache"
|
||||
depends on (CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020) && !CPU_DCACHE_DISABLE
|
||||
depends on (CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020 || CPU_V6) && !CPU_DCACHE_DISABLE
|
||||
default y if CPU_ARM925T
|
||||
help
|
||||
Say Y here to use the data cache in writethrough mode. Unless you
|
||||
|
@ -399,7 +399,7 @@ config CPU_CACHE_ROUND_ROBIN
|
|||
|
||||
config CPU_BPREDICT_DISABLE
|
||||
bool "Disable branch prediction"
|
||||
depends on CPU_ARM1020
|
||||
depends on CPU_ARM1020 || CPU_V6
|
||||
help
|
||||
Say Y here to disable branch prediction. If unsure, say N.
|
||||
|
||||
|
|
|
@ -330,6 +330,9 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
|
|||
{
|
||||
unsigned int rd = RD_BITS(instr);
|
||||
|
||||
if (((rd & 1) == 1) || (rd == 14))
|
||||
goto bad;
|
||||
|
||||
ai_dword += 1;
|
||||
|
||||
if (user_mode(regs))
|
||||
|
@ -361,7 +364,8 @@ do_alignment_ldrdstrd(unsigned long addr, unsigned long instr,
|
|||
}
|
||||
|
||||
return TYPE_LDST;
|
||||
|
||||
bad:
|
||||
return TYPE_ERROR;
|
||||
fault:
|
||||
return TYPE_FAULT;
|
||||
}
|
||||
|
@ -663,6 +667,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
else if ((instr & 0x001000f0) == 0x000000d0 || /* LDRD */
|
||||
(instr & 0x001000f0) == 0x000000f0) /* STRD */
|
||||
handler = do_alignment_ldrdstrd;
|
||||
else if ((instr & 0x01f00ff0) == 0x01000090) /* SWP */
|
||||
goto swp;
|
||||
else
|
||||
goto bad;
|
||||
break;
|
||||
|
@ -733,6 +739,9 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
do_bad_area(current, current->mm, addr, fsr, regs);
|
||||
return 0;
|
||||
|
||||
swp:
|
||||
printk(KERN_ERR "Alignment trap: not handling swp instruction\n");
|
||||
|
||||
bad:
|
||||
/*
|
||||
* Oops, we didn't handle the instruction.
|
||||
|
|
|
@ -2,11 +2,17 @@
|
|||
#
|
||||
# This file is linux/arch/arm/tools/mach-types
|
||||
#
|
||||
# Up to date versions of this file can be obtained from:
|
||||
#
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=download
|
||||
#
|
||||
# Please do not send patches to this file; it is automatically generated!
|
||||
# To add an entry into this database, please see Documentation/arm/README,
|
||||
# or contact rmk@arm.linux.org.uk
|
||||
# or visit:
|
||||
#
|
||||
# Last update: Thu Jun 23 20:19:33 2005
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||
#
|
||||
# Last update: Mon Oct 10 09:46:25 2005
|
||||
#
|
||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||
#
|
||||
|
@ -421,7 +427,7 @@ mt02 MACH_MT02 MT02 410
|
|||
mport3s MACH_MPORT3S MPORT3S 411
|
||||
ra_alpha MACH_RA_ALPHA RA_ALPHA 412
|
||||
xcep MACH_XCEP XCEP 413
|
||||
arcom_mercury MACH_ARCOM_MERCURY ARCOM_MERCURY 414
|
||||
arcom_vulcan MACH_ARCOM_VULCAN ARCOM_VULCAN 414
|
||||
stargate MACH_STARGATE STARGATE 415
|
||||
armadilloj MACH_ARMADILLOJ ARMADILLOJ 416
|
||||
elroy_jack MACH_ELROY_JACK ELROY_JACK 417
|
||||
|
@ -454,7 +460,7 @@ esl_sarva MACH_ESL_SARVA ESL_SARVA 443
|
|||
xm250 MACH_XM250 XM250 444
|
||||
t6tc1xb MACH_T6TC1XB T6TC1XB 445
|
||||
ess710 MACH_ESS710 ESS710 446
|
||||
mx3ads MACH_MX3ADS MX3ADS 447
|
||||
mx31ads MACH_MX3ADS MX3ADS 447
|
||||
himalaya MACH_HIMALAYA HIMALAYA 448
|
||||
bolfenk MACH_BOLFENK BOLFENK 449
|
||||
at91rm9200kr MACH_AT91RM9200KR AT91RM9200KR 450
|
||||
|
@ -787,3 +793,79 @@ ez_ixp42x MACH_EZ_IXP42X EZ_IXP42X 778
|
|||
tapwave_zodiac MACH_TAPWAVE_ZODIAC TAPWAVE_ZODIAC 779
|
||||
universalmeter MACH_UNIVERSALMETER UNIVERSALMETER 780
|
||||
hicoarm9 MACH_HICOARM9 HICOARM9 781
|
||||
pnx4008 MACH_PNX4008 PNX4008 782
|
||||
kws6000 MACH_KWS6000 KWS6000 783
|
||||
portux920t MACH_PORTUX920T PORTUX920T 784
|
||||
ez_x5 MACH_EZ_X5 EZ_X5 785
|
||||
omap_rudolph MACH_OMAP_RUDOLPH OMAP_RUDOLPH 786
|
||||
cpuat91 MACH_CPUAT91 CPUAT91 787
|
||||
rea9200 MACH_REA9200 REA9200 788
|
||||
acts_pune_sa1110 MACH_ACTS_PUNE_SA1110 ACTS_PUNE_SA1110 789
|
||||
ixp425 MACH_IXP425 IXP425 790
|
||||
argonplusodyssey MACH_ODYSSEY ODYSSEY 791
|
||||
perch MACH_PERCH PERCH 792
|
||||
eis05r1 MACH_EIS05R1 EIS05R1 793
|
||||
pepperpad MACH_PEPPERPAD PEPPERPAD 794
|
||||
sb3010 MACH_SB3010 SB3010 795
|
||||
rm9200 MACH_RM9200 RM9200 796
|
||||
dma03 MACH_DMA03 DMA03 797
|
||||
road_s101 MACH_ROAD_S101 ROAD_S101 798
|
||||
iq_nextgen_a MACH_IQ_NEXTGEN_A IQ_NEXTGEN_A 799
|
||||
iq_nextgen_b MACH_IQ_NEXTGEN_B IQ_NEXTGEN_B 800
|
||||
iq_nextgen_c MACH_IQ_NEXTGEN_C IQ_NEXTGEN_C 801
|
||||
iq_nextgen_d MACH_IQ_NEXTGEN_D IQ_NEXTGEN_D 802
|
||||
iq_nextgen_e MACH_IQ_NEXTGEN_E IQ_NEXTGEN_E 803
|
||||
mallow_at91 MACH_MALLOW_AT91 MALLOW_AT91 804
|
||||
cybertracker MACH_CYBERTRACKER CYBERTRACKER 805
|
||||
gesbc931x MACH_GESBC931X GESBC931X 806
|
||||
centipad MACH_CENTIPAD CENTIPAD 807
|
||||
armsoc MACH_ARMSOC ARMSOC 808
|
||||
se4200 MACH_SE4200 SE4200 809
|
||||
ems197a MACH_EMS197A EMS197A 810
|
||||
micro9 MACH_MICRO9 MICRO9 811
|
||||
micro9l MACH_MICRO9L MICRO9L 812
|
||||
uc5471dsp MACH_UC5471DSP UC5471DSP 813
|
||||
sj5471eng MACH_SJ5471ENG SJ5471ENG 814
|
||||
none MACH_CMPXA26X CMPXA26X 815
|
||||
nc MACH_NC NC 816
|
||||
omap_palmte MACH_OMAP_PALMTE OMAP_PALMTE 817
|
||||
ajax52x MACH_AJAX52X AJAX52X 818
|
||||
siriustar MACH_SIRIUSTAR SIRIUSTAR 819
|
||||
iodata_hdlg MACH_IODATA_HDLG IODATA_HDLG 820
|
||||
at91rm9200utl MACH_AT91RM9200UTL AT91RM9200UTL 821
|
||||
biosafe MACH_BIOSAFE BIOSAFE 822
|
||||
mp1000 MACH_MP1000 MP1000 823
|
||||
parsy MACH_PARSY PARSY 824
|
||||
ccxp270 MACH_CCXP CCXP 825
|
||||
omap_gsample MACH_OMAP_GSAMPLE OMAP_GSAMPLE 826
|
||||
realview_eb MACH_REALVIEW_EB REALVIEW_EB 827
|
||||
samoa MACH_SAMOA SAMOA 828
|
||||
t3xscale MACH_T3XSCALE T3XSCALE 829
|
||||
i878 MACH_I878 I878 830
|
||||
borzoi MACH_BORZOI BORZOI 831
|
||||
gecko MACH_GECKO GECKO 832
|
||||
ds101 MACH_DS101 DS101 833
|
||||
omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834
|
||||
xscale_palmld MACH_XSCALE_PALMLD XSCALE_PALMLD 835
|
||||
cc9c MACH_CC9C CC9C 836
|
||||
sbc1670 MACH_SBC1670 SBC1670 837
|
||||
ixdp28x5 MACH_IXDP28X5 IXDP28X5 838
|
||||
omap_palmtt MACH_OMAP_PALMTT OMAP_PALMTT 839
|
||||
ml696k MACH_ML696K ML696K 840
|
||||
arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841
|
||||
osiris MACH_OSIRIS OSIRIS 842
|
||||
maestro MACH_MAESTRO MAESTRO 843
|
||||
tunge2 MACH_TUNGE2 TUNGE2 844
|
||||
ixbbm MACH_IXBBM IXBBM 845
|
||||
mx27 MACH_MX27 MX27 846
|
||||
ax8004 MACH_AX8004 AX8004 847
|
||||
at91sam9261ek MACH_AT91SAM9261EK AT91SAM9261EK 848
|
||||
loft MACH_LOFT LOFT 849
|
||||
magpie MACH_MAGPIE MAGPIE 850
|
||||
mx21 MACH_MX21 MX21 851
|
||||
mb87m3400 MACH_MB87M3400 MB87M3400 852
|
||||
mguard_delta MACH_MGUARD_DELTA MGUARD_DELTA 853
|
||||
davinci_dvdp MACH_DAVINCI_DVDP DAVINCI_DVDP 854
|
||||
htcuniversal MACH_HTCUNIVERSAL HTCUNIVERSAL 855
|
||||
tpad MACH_TPAD TPAD 856
|
||||
roverp3 MACH_ROVERP3 ROVERP3 857
|
||||
|
|
|
@ -24,7 +24,7 @@ struct dma_coherent_mem {
|
|||
};
|
||||
|
||||
void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast gfp)
|
||||
dma_addr_t *dma_handle, gfp_t gfp)
|
||||
{
|
||||
void *ret;
|
||||
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
|
||||
|
|
|
@ -29,7 +29,7 @@ static void __init init_amd(struct cpuinfo_x86 *c)
|
|||
int r;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned long value;
|
||||
unsigned long long value;
|
||||
|
||||
/* Disable TLB flush filter by setting HWCR.FFDIS on K8
|
||||
* bit 6 of msr C001_0015
|
||||
|
|
|
@ -23,7 +23,7 @@ struct dma_coherent_mem {
|
|||
};
|
||||
|
||||
void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast gfp)
|
||||
dma_addr_t *dma_handle, gfp_t gfp)
|
||||
{
|
||||
void *ret;
|
||||
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
|
||||
|
|
|
@ -338,7 +338,11 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
|||
esp = (unsigned long) ka->sa.sa_restorer;
|
||||
}
|
||||
|
||||
return (void __user *)((esp - frame_size) & -8ul);
|
||||
esp -= frame_size;
|
||||
/* Align the stack pointer according to the i386 ABI,
|
||||
* i.e. so that on function entry ((sp + 4) & 15) == 0. */
|
||||
esp = ((esp + 4) & -16ul) - 4;
|
||||
return (void __user *) esp;
|
||||
}
|
||||
|
||||
/* These symbols are defined with the addresses in the vsyscall page.
|
||||
|
|
|
@ -1016,6 +1016,11 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs)
|
|||
|
||||
cmc_polling_enabled = 1;
|
||||
spin_unlock(&cmc_history_lock);
|
||||
/* If we're being hit with CMC interrupts, we won't
|
||||
* ever execute the schedule_work() below. Need to
|
||||
* disable CMC interrupts on this processor now.
|
||||
*/
|
||||
ia64_mca_cmc_vector_disable(NULL);
|
||||
schedule_work(&cmc_disable_work);
|
||||
|
||||
/*
|
||||
|
|
|
@ -195,7 +195,7 @@ via_calibrate_decr(void)
|
|||
;
|
||||
dend = get_dec();
|
||||
|
||||
tb_ticks_per_jiffy = (dstart - dend) / (6 * (HZ/100));
|
||||
tb_ticks_per_jiffy = (dstart - dend) / ((6 * HZ)/100);
|
||||
tb_to_us = mulhwu_scale_factor(dstart - dend, 60000);
|
||||
|
||||
printk(KERN_INFO "via_calibrate_decr: ticks per jiffy = %u (%u ticks)\n",
|
||||
|
|
|
@ -310,7 +310,7 @@ static void bpa_map_iommu(void)
|
|||
|
||||
|
||||
static void *bpa_alloc_coherent(struct device *hwdev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast flag)
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ int dma_set_mask(struct device *dev, u64 dma_mask)
|
|||
EXPORT_SYMBOL(dma_set_mask);
|
||||
|
||||
void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast flag)
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
|
|
|
@ -519,7 +519,7 @@ void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
|
|||
* to the dma address (mapping) of the first page.
|
||||
*/
|
||||
void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast flag)
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
void *ret = NULL;
|
||||
dma_addr_t mapping;
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include "pci.h"
|
||||
|
||||
static void *pci_direct_alloc_coherent(struct device *hwdev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast flag)
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ static inline struct iommu_table *devnode_table(struct device *dev)
|
|||
* to the dma address (mapping) of the first page.
|
||||
*/
|
||||
static void *pci_iommu_alloc_coherent(struct device *hwdev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast flag)
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
return iommu_alloc_coherent(devnode_table(hwdev), size, dma_handle,
|
||||
flag);
|
||||
|
|
|
@ -218,7 +218,7 @@ static void vio_unmap_sg(struct device *dev, struct scatterlist *sglist,
|
|||
}
|
||||
|
||||
static void *vio_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, unsigned int __nocast flag)
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
return iommu_alloc_coherent(to_vio_dev(dev)->iommu_table, size,
|
||||
dma_handle, flag);
|
||||
|
|
|
@ -21,66 +21,14 @@ config GENERIC_ISA_DMA
|
|||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_IOMAP
|
||||
bool
|
||||
default y
|
||||
|
||||
source "init/Kconfig"
|
||||
|
||||
menu "General machine setup"
|
||||
|
||||
config VT
|
||||
bool
|
||||
select INPUT
|
||||
default y
|
||||
---help---
|
||||
If you say Y here, you will get support for terminal devices with
|
||||
display and keyboard devices. These are called "virtual" because you
|
||||
can run several virtual terminals (also called virtual consoles) on
|
||||
one physical terminal. This is rather useful, for example one
|
||||
virtual terminal can collect system messages and warnings, another
|
||||
one can be used for a text-mode user session, and a third could run
|
||||
an X session, all in parallel. Switching between virtual terminals
|
||||
is done with certain key combinations, usually Alt-<function key>.
|
||||
|
||||
The setterm command ("man setterm") can be used to change the
|
||||
properties (such as colors or beeping) of a virtual terminal. The
|
||||
man page console_codes(4) ("man console_codes") contains the special
|
||||
character sequences that can be used to change those properties
|
||||
directly. The fonts used on virtual terminals can be changed with
|
||||
the setfont ("man setfont") command and the key bindings are defined
|
||||
with the loadkeys ("man loadkeys") command.
|
||||
|
||||
You need at least one virtual terminal device in order to make use
|
||||
of your keyboard and monitor. Therefore, only people configuring an
|
||||
embedded system would want to say N here in order to save some
|
||||
memory; the only way to log into such a system is then via a serial
|
||||
or network connection.
|
||||
|
||||
If unsure, say Y, or else you won't be able to do much with your new
|
||||
shiny Linux system :-)
|
||||
|
||||
config VT_CONSOLE
|
||||
bool
|
||||
default y
|
||||
---help---
|
||||
The system console is the device which receives all kernel messages
|
||||
and warnings and which allows logins in single user mode. If you
|
||||
answer Y here, a virtual terminal (the device used to interact with
|
||||
a physical terminal) can be used as system console. This is the most
|
||||
common mode of operations, so you should say Y here unless you want
|
||||
the kernel messages be output only to a serial port (in which case
|
||||
you should say Y to "Console on serial port", below).
|
||||
|
||||
If you do say Y here, by default the currently visible virtual
|
||||
terminal (/dev/tty0) will be used as system console. You can change
|
||||
that with a kernel command line option such as "console=tty3" which
|
||||
would use the third virtual terminal as system console. (Try "man
|
||||
bootparam" or see the documentation of your boot loader (lilo or
|
||||
loadlin) about how to pass options to the kernel at boot time.)
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_CONSOLE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support (does not work on sun4/sun4c)"
|
||||
depends on BROKEN
|
||||
|
|
|
@ -5,6 +5,7 @@ CONFIG_MMU=y
|
|||
CONFIG_UID16=y
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
|
|
@ -457,7 +457,7 @@ void __init time_init(void)
|
|||
sbus_time_init();
|
||||
}
|
||||
|
||||
extern __inline__ unsigned long do_gettimeoffset(void)
|
||||
static inline unsigned long do_gettimeoffset(void)
|
||||
{
|
||||
return (*master_l10_counter >> 10) & 0x1fffff;
|
||||
}
|
||||
|
|
|
@ -260,7 +260,7 @@ static inline pte_t srmmu_pte_modify(pte_t pte, pgprot_t newprot)
|
|||
{ return __pte((pte_val(pte) & SRMMU_CHG_MASK) | pgprot_val(newprot)); }
|
||||
|
||||
/* to find an entry in a top-level page table... */
|
||||
extern inline pgd_t *srmmu_pgd_offset(struct mm_struct * mm, unsigned long address)
|
||||
static inline pgd_t *srmmu_pgd_offset(struct mm_struct * mm, unsigned long address)
|
||||
{ return mm->pgd + (address >> SRMMU_PGDIR_SHIFT); }
|
||||
|
||||
/* Find an entry in the second-level page table.. */
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
/* This is trivial with the new code... */
|
||||
.globl do_fpdis
|
||||
do_fpdis:
|
||||
sethi %hi(TSTATE_PEF), %g4 ! IEU0
|
||||
sethi %hi(TSTATE_PEF), %g4
|
||||
rdpr %tstate, %g5
|
||||
andcc %g5, %g4, %g0
|
||||
be,pt %xcc, 1f
|
||||
|
@ -50,18 +50,18 @@ do_fpdis:
|
|||
add %g0, %g0, %g0
|
||||
ba,a,pt %xcc, rtrap_clr_l6
|
||||
|
||||
1: ldub [%g6 + TI_FPSAVED], %g5 ! Load Group
|
||||
wr %g0, FPRS_FEF, %fprs ! LSU Group+4bubbles
|
||||
andcc %g5, FPRS_FEF, %g0 ! IEU1 Group
|
||||
be,a,pt %icc, 1f ! CTI
|
||||
clr %g7 ! IEU0
|
||||
ldx [%g6 + TI_GSR], %g7 ! Load Group
|
||||
1: andcc %g5, FPRS_DL, %g0 ! IEU1
|
||||
bne,pn %icc, 2f ! CTI
|
||||
fzero %f0 ! FPA
|
||||
andcc %g5, FPRS_DU, %g0 ! IEU1 Group
|
||||
bne,pn %icc, 1f ! CTI
|
||||
fzero %f2 ! FPA
|
||||
1: ldub [%g6 + TI_FPSAVED], %g5
|
||||
wr %g0, FPRS_FEF, %fprs
|
||||
andcc %g5, FPRS_FEF, %g0
|
||||
be,a,pt %icc, 1f
|
||||
clr %g7
|
||||
ldx [%g6 + TI_GSR], %g7
|
||||
1: andcc %g5, FPRS_DL, %g0
|
||||
bne,pn %icc, 2f
|
||||
fzero %f0
|
||||
andcc %g5, FPRS_DU, %g0
|
||||
bne,pn %icc, 1f
|
||||
fzero %f2
|
||||
faddd %f0, %f2, %f4
|
||||
fmuld %f0, %f2, %f6
|
||||
faddd %f0, %f2, %f8
|
||||
|
@ -97,15 +97,17 @@ do_fpdis:
|
|||
faddd %f0, %f2, %f4
|
||||
fmuld %f0, %f2, %f6
|
||||
ldxa [%g3] ASI_DMMU, %g5
|
||||
cplus_fptrap_insn_1:
|
||||
sethi %hi(0), %g2
|
||||
sethi %hi(sparc64_kern_sec_context), %g2
|
||||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
|
||||
stxa %g2, [%g3] ASI_DMMU
|
||||
membar #Sync
|
||||
add %g6, TI_FPREGS + 0xc0, %g2
|
||||
faddd %f0, %f2, %f8
|
||||
fmuld %f0, %f2, %f10
|
||||
ldda [%g1] ASI_BLK_S, %f32 ! grrr, where is ASI_BLK_NUCLEUS 8-(
|
||||
membar #Sync
|
||||
ldda [%g1] ASI_BLK_S, %f32
|
||||
ldda [%g2] ASI_BLK_S, %f48
|
||||
membar #Sync
|
||||
faddd %f0, %f2, %f12
|
||||
fmuld %f0, %f2, %f14
|
||||
faddd %f0, %f2, %f16
|
||||
|
@ -116,7 +118,6 @@ cplus_fptrap_insn_1:
|
|||
fmuld %f0, %f2, %f26
|
||||
faddd %f0, %f2, %f28
|
||||
fmuld %f0, %f2, %f30
|
||||
membar #Sync
|
||||
b,pt %xcc, fpdis_exit
|
||||
nop
|
||||
2: andcc %g5, FPRS_DU, %g0
|
||||
|
@ -126,15 +127,17 @@ cplus_fptrap_insn_1:
|
|||
fzero %f34
|
||||
ldxa [%g3] ASI_DMMU, %g5
|
||||
add %g6, TI_FPREGS, %g1
|
||||
cplus_fptrap_insn_2:
|
||||
sethi %hi(0), %g2
|
||||
sethi %hi(sparc64_kern_sec_context), %g2
|
||||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
|
||||
stxa %g2, [%g3] ASI_DMMU
|
||||
membar #Sync
|
||||
add %g6, TI_FPREGS + 0x40, %g2
|
||||
faddd %f32, %f34, %f36
|
||||
fmuld %f32, %f34, %f38
|
||||
ldda [%g1] ASI_BLK_S, %f0 ! grrr, where is ASI_BLK_NUCLEUS 8-(
|
||||
membar #Sync
|
||||
ldda [%g1] ASI_BLK_S, %f0
|
||||
ldda [%g2] ASI_BLK_S, %f16
|
||||
membar #Sync
|
||||
faddd %f32, %f34, %f40
|
||||
fmuld %f32, %f34, %f42
|
||||
faddd %f32, %f34, %f44
|
||||
|
@ -147,18 +150,18 @@ cplus_fptrap_insn_2:
|
|||
fmuld %f32, %f34, %f58
|
||||
faddd %f32, %f34, %f60
|
||||
fmuld %f32, %f34, %f62
|
||||
membar #Sync
|
||||
ba,pt %xcc, fpdis_exit
|
||||
nop
|
||||
3: mov SECONDARY_CONTEXT, %g3
|
||||
add %g6, TI_FPREGS, %g1
|
||||
ldxa [%g3] ASI_DMMU, %g5
|
||||
cplus_fptrap_insn_3:
|
||||
sethi %hi(0), %g2
|
||||
sethi %hi(sparc64_kern_sec_context), %g2
|
||||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
|
||||
stxa %g2, [%g3] ASI_DMMU
|
||||
membar #Sync
|
||||
mov 0x40, %g2
|
||||
ldda [%g1] ASI_BLK_S, %f0 ! grrr, where is ASI_BLK_NUCLEUS 8-(
|
||||
membar #Sync
|
||||
ldda [%g1] ASI_BLK_S, %f0
|
||||
ldda [%g1 + %g2] ASI_BLK_S, %f16
|
||||
add %g1, 0x80, %g1
|
||||
ldda [%g1] ASI_BLK_S, %f32
|
||||
|
@ -319,8 +322,8 @@ do_fptrap_after_fsr:
|
|||
stx %g3, [%g6 + TI_GSR]
|
||||
mov SECONDARY_CONTEXT, %g3
|
||||
ldxa [%g3] ASI_DMMU, %g5
|
||||
cplus_fptrap_insn_4:
|
||||
sethi %hi(0), %g2
|
||||
sethi %hi(sparc64_kern_sec_context), %g2
|
||||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
|
||||
stxa %g2, [%g3] ASI_DMMU
|
||||
membar #Sync
|
||||
add %g6, TI_FPREGS, %g2
|
||||
|
@ -341,33 +344,6 @@ cplus_fptrap_insn_4:
|
|||
ba,pt %xcc, etrap
|
||||
wr %g0, 0, %fprs
|
||||
|
||||
cplus_fptrap_1:
|
||||
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
|
||||
|
||||
.globl cheetah_plus_patch_fpdis
|
||||
cheetah_plus_patch_fpdis:
|
||||
/* We configure the dTLB512_0 for 4MB pages and the
|
||||
* dTLB512_1 for 8K pages when in context zero.
|
||||
*/
|
||||
sethi %hi(cplus_fptrap_1), %o0
|
||||
lduw [%o0 + %lo(cplus_fptrap_1)], %o1
|
||||
|
||||
set cplus_fptrap_insn_1, %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
set cplus_fptrap_insn_2, %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
set cplus_fptrap_insn_3, %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
set cplus_fptrap_insn_4, %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
|
||||
retl
|
||||
nop
|
||||
|
||||
/* The registers for cross calls will be:
|
||||
*
|
||||
* DATA 0: [low 32-bits] Address of function to call, jmp to this
|
||||
|
|
|
@ -68,12 +68,8 @@ etrap_irq:
|
|||
|
||||
wrpr %g3, 0, %otherwin
|
||||
wrpr %g2, 0, %wstate
|
||||
cplus_etrap_insn_1:
|
||||
sethi %hi(0), %g3
|
||||
sllx %g3, 32, %g3
|
||||
cplus_etrap_insn_2:
|
||||
sethi %hi(0), %g2
|
||||
or %g3, %g2, %g3
|
||||
sethi %hi(sparc64_kern_pri_context), %g2
|
||||
ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3
|
||||
stxa %g3, [%l4] ASI_DMMU
|
||||
flush %l6
|
||||
wr %g0, ASI_AIUS, %asi
|
||||
|
@ -215,12 +211,8 @@ scetrap: rdpr %pil, %g2
|
|||
mov PRIMARY_CONTEXT, %l4
|
||||
wrpr %g3, 0, %otherwin
|
||||
wrpr %g2, 0, %wstate
|
||||
cplus_etrap_insn_3:
|
||||
sethi %hi(0), %g3
|
||||
sllx %g3, 32, %g3
|
||||
cplus_etrap_insn_4:
|
||||
sethi %hi(0), %g2
|
||||
or %g3, %g2, %g3
|
||||
sethi %hi(sparc64_kern_pri_context), %g2
|
||||
ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3
|
||||
stxa %g3, [%l4] ASI_DMMU
|
||||
flush %l6
|
||||
|
||||
|
@ -264,38 +256,3 @@ cplus_etrap_insn_4:
|
|||
|
||||
#undef TASK_REGOFF
|
||||
#undef ETRAP_PSTATE1
|
||||
|
||||
cplus_einsn_1:
|
||||
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %g3
|
||||
cplus_einsn_2:
|
||||
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
|
||||
|
||||
.globl cheetah_plus_patch_etrap
|
||||
cheetah_plus_patch_etrap:
|
||||
/* We configure the dTLB512_0 for 4MB pages and the
|
||||
* dTLB512_1 for 8K pages when in context zero.
|
||||
*/
|
||||
sethi %hi(cplus_einsn_1), %o0
|
||||
sethi %hi(cplus_etrap_insn_1), %o2
|
||||
lduw [%o0 + %lo(cplus_einsn_1)], %o1
|
||||
or %o2, %lo(cplus_etrap_insn_1), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
sethi %hi(cplus_etrap_insn_3), %o2
|
||||
or %o2, %lo(cplus_etrap_insn_3), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
|
||||
sethi %hi(cplus_einsn_2), %o0
|
||||
sethi %hi(cplus_etrap_insn_2), %o2
|
||||
lduw [%o0 + %lo(cplus_einsn_2)], %o1
|
||||
or %o2, %lo(cplus_etrap_insn_2), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
sethi %hi(cplus_etrap_insn_4), %o2
|
||||
or %o2, %lo(cplus_etrap_insn_4), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
|
||||
retl
|
||||
nop
|
||||
|
|
|
@ -325,23 +325,7 @@ cheetah_tlb_fixup:
|
|||
1: sethi %hi(tlb_type), %g1
|
||||
stw %g2, [%g1 + %lo(tlb_type)]
|
||||
|
||||
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g7,1f)
|
||||
ba,pt %xcc, 2f
|
||||
nop
|
||||
|
||||
1: /* Patch context register writes to support nucleus page
|
||||
* size correctly.
|
||||
*/
|
||||
call cheetah_plus_patch_etrap
|
||||
nop
|
||||
call cheetah_plus_patch_rtrap
|
||||
nop
|
||||
call cheetah_plus_patch_fpdis
|
||||
nop
|
||||
call cheetah_plus_patch_winfixup
|
||||
nop
|
||||
|
||||
2: /* Patch copy/page operations to cheetah optimized versions. */
|
||||
/* Patch copy/page operations to cheetah optimized versions. */
|
||||
call cheetah_patch_copyops
|
||||
nop
|
||||
call cheetah_patch_copy_page
|
||||
|
@ -398,32 +382,79 @@ tlb_fixup_done:
|
|||
nop
|
||||
/* Not reached... */
|
||||
|
||||
/* IMPORTANT NOTE: Whenever making changes here, check
|
||||
* trampoline.S as well. -jj */
|
||||
.globl setup_tba
|
||||
setup_tba: /* i0 = is_starfire */
|
||||
save %sp, -160, %sp
|
||||
/* This is meant to allow the sharing of this code between
|
||||
* boot processor invocation (via setup_tba() below) and
|
||||
* secondary processor startup (via trampoline.S). The
|
||||
* former does use this code, the latter does not yet due
|
||||
* to some complexities. That should be fixed up at some
|
||||
* point.
|
||||
*/
|
||||
.globl setup_trap_table
|
||||
setup_trap_table:
|
||||
save %sp, -192, %sp
|
||||
|
||||
rdpr %tba, %g7
|
||||
sethi %hi(prom_tba), %o1
|
||||
or %o1, %lo(prom_tba), %o1
|
||||
stx %g7, [%o1]
|
||||
/* Force interrupts to be disabled. Transferring over to
|
||||
* the Linux trap table is a very delicate operation.
|
||||
* Until we are actually on the Linux trap table, we cannot
|
||||
* get the PAGE_OFFSET linear mappings translated. We need
|
||||
* that mapping to be setup in order to initialize the firmware
|
||||
* page tables.
|
||||
*
|
||||
* So there is this window of time, from the return from
|
||||
* prom_set_trap_table() until inherit_prom_mappings_post()
|
||||
* (in arch/sparc64/mm/init.c) completes, during which no
|
||||
* firmware address space accesses can be made.
|
||||
*/
|
||||
rdpr %pstate, %o1
|
||||
andn %o1, PSTATE_IE, %o1
|
||||
wrpr %o1, 0x0, %pstate
|
||||
wrpr %g0, 15, %pil
|
||||
|
||||
/* Ok, now make the final valid firmware call to jump over
|
||||
* to the Linux trap table.
|
||||
*/
|
||||
call prom_set_trap_table
|
||||
sethi %hi(sparc64_ttable_tl0), %o0
|
||||
|
||||
/* Start using proper page size encodings in ctx register. */
|
||||
sethi %hi(sparc64_kern_pri_context), %g3
|
||||
ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2
|
||||
mov PRIMARY_CONTEXT, %g1
|
||||
stxa %g2, [%g1] ASI_DMMU
|
||||
membar #Sync
|
||||
|
||||
/* The Linux trap handlers expect various trap global registers
|
||||
* to be setup with some fixed values. So here we set these
|
||||
* up very carefully. These globals are:
|
||||
*
|
||||
* Alternate Globals (PSTATE_AG):
|
||||
*
|
||||
* %g6 --> current_thread_info()
|
||||
*
|
||||
* MMU Globals (PSTATE_MG):
|
||||
*
|
||||
* %g1 --> TLB_SFSR
|
||||
* %g2 --> ((_PAGE_VALID | _PAGE_SZ4MB |
|
||||
* _PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
|
||||
* ^ 0xfffff80000000000)
|
||||
* (this %g2 value is used for computing the PAGE_OFFSET kernel
|
||||
* TLB entries quickly, the virtual address of the fault XOR'd
|
||||
* with this %g2 value is the PTE to load into the TLB)
|
||||
* %g3 --> VPTE_BASE_CHEETAH or VPTE_BASE_SPITFIRE
|
||||
*
|
||||
* Interrupt Globals (PSTATE_IG, setup by init_irqwork_curcpu()):
|
||||
*
|
||||
* %g6 --> __irq_work[smp_processor_id()]
|
||||
*/
|
||||
|
||||
/* Setup "Linux" globals 8-) */
|
||||
rdpr %pstate, %o1
|
||||
mov %g6, %o2
|
||||
wrpr %o1, (PSTATE_AG|PSTATE_IE), %pstate
|
||||
sethi %hi(sparc64_ttable_tl0), %g1
|
||||
wrpr %g1, %tba
|
||||
wrpr %o1, PSTATE_AG, %pstate
|
||||
mov %o2, %g6
|
||||
|
||||
/* Set up MMU globals */
|
||||
wrpr %o1, (PSTATE_MG|PSTATE_IE), %pstate
|
||||
|
||||
/* Set fixed globals used by dTLB miss handler. */
|
||||
#define KERN_HIGHBITS ((_PAGE_VALID|_PAGE_SZ4MB)^0xfffff80000000000)
|
||||
#define KERN_LOWBITS (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
|
||||
|
||||
wrpr %o1, PSTATE_MG, %pstate
|
||||
mov TSB_REG, %g1
|
||||
stxa %g0, [%g1] ASI_DMMU
|
||||
membar #Sync
|
||||
|
@ -435,17 +466,17 @@ setup_tba: /* i0 = is_starfire */
|
|||
sllx %g2, 32, %g2
|
||||
or %g2, KERN_LOWBITS, %g2
|
||||
|
||||
BRANCH_IF_ANY_CHEETAH(g3,g7,cheetah_vpte_base)
|
||||
ba,pt %xcc, spitfire_vpte_base
|
||||
BRANCH_IF_ANY_CHEETAH(g3,g7,8f)
|
||||
ba,pt %xcc, 9f
|
||||
nop
|
||||
|
||||
cheetah_vpte_base:
|
||||
8:
|
||||
sethi %uhi(VPTE_BASE_CHEETAH), %g3
|
||||
or %g3, %ulo(VPTE_BASE_CHEETAH), %g3
|
||||
ba,pt %xcc, 2f
|
||||
sllx %g3, 32, %g3
|
||||
|
||||
spitfire_vpte_base:
|
||||
9:
|
||||
sethi %uhi(VPTE_BASE_SPITFIRE), %g3
|
||||
or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3
|
||||
sllx %g3, 32, %g3
|
||||
|
@ -471,36 +502,37 @@ spitfire_vpte_base:
|
|||
sllx %o2, 32, %o2
|
||||
wr %o2, %asr25
|
||||
|
||||
/* Ok, we're done setting up all the state our trap mechanims needs,
|
||||
* now get back into normal globals and let the PROM know what is up.
|
||||
*/
|
||||
2:
|
||||
wrpr %g0, %g0, %wstate
|
||||
wrpr %o1, PSTATE_IE, %pstate
|
||||
wrpr %o1, 0x0, %pstate
|
||||
|
||||
call init_irqwork_curcpu
|
||||
nop
|
||||
|
||||
call prom_set_trap_table
|
||||
sethi %hi(sparc64_ttable_tl0), %o0
|
||||
|
||||
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g2,g3,1f)
|
||||
ba,pt %xcc, 2f
|
||||
nop
|
||||
|
||||
1: /* Start using proper page size encodings in ctx register. */
|
||||
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %g3
|
||||
mov PRIMARY_CONTEXT, %g1
|
||||
sllx %g3, 32, %g3
|
||||
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
|
||||
or %g3, %g2, %g3
|
||||
stxa %g3, [%g1] ASI_DMMU
|
||||
membar #Sync
|
||||
|
||||
2:
|
||||
/* Now we can turn interrupts back on. */
|
||||
rdpr %pstate, %o1
|
||||
or %o1, PSTATE_IE, %o1
|
||||
wrpr %o1, 0, %pstate
|
||||
wrpr %g0, 0x0, %pil
|
||||
|
||||
ret
|
||||
restore
|
||||
|
||||
.globl setup_tba
|
||||
setup_tba: /* i0 = is_starfire */
|
||||
save %sp, -192, %sp
|
||||
|
||||
/* The boot processor is the only cpu which invokes this
|
||||
* routine, the other cpus set things up via trampoline.S.
|
||||
* So save the OBP trap table address here.
|
||||
*/
|
||||
rdpr %tba, %g7
|
||||
sethi %hi(prom_tba), %o1
|
||||
or %o1, %lo(prom_tba), %o1
|
||||
stx %g7, [%o1]
|
||||
|
||||
call setup_trap_table
|
||||
nop
|
||||
|
||||
ret
|
||||
restore
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <asm/atomic.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/sbus.h>
|
||||
#include <asm/iommu.h>
|
||||
#include <asm/upa.h>
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include <asm/system.h>
|
||||
#include <asm/ebus.h>
|
||||
#include <asm/isa.h>
|
||||
#include <asm/auxio.h>
|
||||
|
||||
#include <linux/unistd.h>
|
||||
|
@ -100,46 +101,83 @@ again:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init has_button_interrupt(struct linux_ebus_device *edev)
|
||||
static int __init has_button_interrupt(unsigned int irq, int prom_node)
|
||||
{
|
||||
if (edev->irqs[0] == PCI_IRQ_NONE)
|
||||
if (irq == PCI_IRQ_NONE)
|
||||
return 0;
|
||||
if (!prom_node_has_property(edev->prom_node, "button"))
|
||||
if (!prom_node_has_property(prom_node, "button"))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void __init power_init(void)
|
||||
static int __init power_probe_ebus(struct resource **resp, unsigned int *irq_p, int *prom_node_p)
|
||||
{
|
||||
struct linux_ebus *ebus;
|
||||
struct linux_ebus_device *edev;
|
||||
|
||||
for_each_ebus(ebus) {
|
||||
for_each_ebusdev(edev, ebus) {
|
||||
if (!strcmp(edev->prom_name, "power")) {
|
||||
*resp = &edev->resource[0];
|
||||
*irq_p = edev->irqs[0];
|
||||
*prom_node_p = edev->prom_node;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int __init power_probe_isa(struct resource **resp, unsigned int *irq_p, int *prom_node_p)
|
||||
{
|
||||
struct sparc_isa_bridge *isa_bus;
|
||||
struct sparc_isa_device *isa_dev;
|
||||
|
||||
for_each_isa(isa_bus) {
|
||||
for_each_isadev(isa_dev, isa_bus) {
|
||||
if (!strcmp(isa_dev->prom_name, "power")) {
|
||||
*resp = &isa_dev->resource;
|
||||
*irq_p = isa_dev->irq;
|
||||
*prom_node_p = isa_dev->prom_node;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
void __init power_init(void)
|
||||
{
|
||||
struct resource *res = NULL;
|
||||
unsigned int irq;
|
||||
int prom_node;
|
||||
static int invoked;
|
||||
|
||||
if (invoked)
|
||||
return;
|
||||
invoked = 1;
|
||||
|
||||
for_each_ebus(ebus) {
|
||||
for_each_ebusdev(edev, ebus) {
|
||||
if (!strcmp(edev->prom_name, "power"))
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
if (!power_probe_ebus(&res, &irq, &prom_node))
|
||||
goto found;
|
||||
|
||||
if (!power_probe_isa(&res, &irq, &prom_node))
|
||||
goto found;
|
||||
|
||||
return;
|
||||
|
||||
found:
|
||||
power_reg = ioremap(edev->resource[0].start, 0x4);
|
||||
power_reg = ioremap(res->start, 0x4);
|
||||
printk("power: Control reg at %p ... ", power_reg);
|
||||
poweroff_method = machine_halt; /* able to use the standard halt */
|
||||
if (has_button_interrupt(edev)) {
|
||||
if (has_button_interrupt(irq, prom_node)) {
|
||||
if (kernel_thread(powerd, NULL, CLONE_FS) < 0) {
|
||||
printk("Failed to start power daemon.\n");
|
||||
return;
|
||||
}
|
||||
printk("powerd running.\n");
|
||||
|
||||
if (request_irq(edev->irqs[0],
|
||||
if (request_irq(irq,
|
||||
power_handler, SA_SHIRQ, "power", NULL) < 0)
|
||||
printk("power: Error, cannot register IRQ handler.\n");
|
||||
} else {
|
||||
|
|
|
@ -256,9 +256,8 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
|
|||
brnz,pn %l3, kern_rtt
|
||||
mov PRIMARY_CONTEXT, %l7
|
||||
ldxa [%l7 + %l7] ASI_DMMU, %l0
|
||||
cplus_rtrap_insn_1:
|
||||
sethi %hi(0), %l1
|
||||
sllx %l1, 32, %l1
|
||||
sethi %hi(sparc64_kern_pri_nuc_bits), %l1
|
||||
ldx [%l1 + %lo(sparc64_kern_pri_nuc_bits)], %l1
|
||||
or %l0, %l1, %l0
|
||||
stxa %l0, [%l7] ASI_DMMU
|
||||
flush %g6
|
||||
|
@ -313,53 +312,36 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5
|
|||
wr %g1, FPRS_FEF, %fprs
|
||||
ldx [%o1 + %o5], %g1
|
||||
add %g6, TI_XFSR, %o1
|
||||
membar #StoreLoad | #LoadLoad
|
||||
sll %o0, 8, %o2
|
||||
add %g6, TI_FPREGS, %o3
|
||||
brz,pn %l6, 1f
|
||||
add %g6, TI_FPREGS+0x40, %o4
|
||||
|
||||
membar #Sync
|
||||
ldda [%o3 + %o2] ASI_BLK_P, %f0
|
||||
ldda [%o4 + %o2] ASI_BLK_P, %f16
|
||||
membar #Sync
|
||||
1: andcc %l2, FPRS_DU, %g0
|
||||
be,pn %icc, 1f
|
||||
wr %g1, 0, %gsr
|
||||
add %o2, 0x80, %o2
|
||||
membar #Sync
|
||||
ldda [%o3 + %o2] ASI_BLK_P, %f32
|
||||
ldda [%o4 + %o2] ASI_BLK_P, %f48
|
||||
|
||||
1: membar #Sync
|
||||
ldx [%o1 + %o5], %fsr
|
||||
2: stb %l5, [%g6 + TI_FPDEPTH]
|
||||
ba,pt %xcc, rt_continue
|
||||
nop
|
||||
5: wr %g0, FPRS_FEF, %fprs
|
||||
membar #StoreLoad | #LoadLoad
|
||||
sll %o0, 8, %o2
|
||||
|
||||
add %g6, TI_FPREGS+0x80, %o3
|
||||
add %g6, TI_FPREGS+0xc0, %o4
|
||||
membar #Sync
|
||||
ldda [%o3 + %o2] ASI_BLK_P, %f32
|
||||
ldda [%o4 + %o2] ASI_BLK_P, %f48
|
||||
membar #Sync
|
||||
wr %g0, FPRS_DU, %fprs
|
||||
ba,pt %xcc, rt_continue
|
||||
stb %l5, [%g6 + TI_FPDEPTH]
|
||||
|
||||
cplus_rinsn_1:
|
||||
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %l1
|
||||
|
||||
.globl cheetah_plus_patch_rtrap
|
||||
cheetah_plus_patch_rtrap:
|
||||
/* We configure the dTLB512_0 for 4MB pages and the
|
||||
* dTLB512_1 for 8K pages when in context zero.
|
||||
*/
|
||||
sethi %hi(cplus_rinsn_1), %o0
|
||||
sethi %hi(cplus_rtrap_insn_1), %o2
|
||||
lduw [%o0 + %lo(cplus_rinsn_1)], %o1
|
||||
or %o2, %lo(cplus_rtrap_insn_1), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
|
||||
retl
|
||||
nop
|
||||
|
|
|
@ -187,17 +187,13 @@ int prom_callback(long *args)
|
|||
}
|
||||
|
||||
if ((va >= KERNBASE) && (va < (KERNBASE + (4 * 1024 * 1024)))) {
|
||||
unsigned long kernel_pctx = 0;
|
||||
|
||||
if (tlb_type == cheetah_plus)
|
||||
kernel_pctx |= (CTX_CHEETAH_PLUS_NUC |
|
||||
CTX_CHEETAH_PLUS_CTX0);
|
||||
extern unsigned long sparc64_kern_pri_context;
|
||||
|
||||
/* Spitfire Errata #32 workaround */
|
||||
__asm__ __volatile__("stxa %0, [%1] %2\n\t"
|
||||
"flush %%g6"
|
||||
: /* No outputs */
|
||||
: "r" (kernel_pctx),
|
||||
: "r" (sparc64_kern_pri_context),
|
||||
"r" (PRIMARY_CONTEXT),
|
||||
"i" (ASI_DMMU));
|
||||
|
||||
|
|
|
@ -336,20 +336,13 @@ do_unlock:
|
|||
call init_irqwork_curcpu
|
||||
nop
|
||||
|
||||
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g2,g3,1f)
|
||||
ba,pt %xcc, 2f
|
||||
nop
|
||||
|
||||
1: /* Start using proper page size encodings in ctx register. */
|
||||
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %g3
|
||||
/* Start using proper page size encodings in ctx register. */
|
||||
sethi %hi(sparc64_kern_pri_context), %g3
|
||||
ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2
|
||||
mov PRIMARY_CONTEXT, %g1
|
||||
sllx %g3, 32, %g3
|
||||
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
|
||||
or %g3, %g2, %g3
|
||||
stxa %g3, [%g1] ASI_DMMU
|
||||
stxa %g2, [%g1] ASI_DMMU
|
||||
membar #Sync
|
||||
|
||||
2:
|
||||
rdpr %pstate, %o1
|
||||
or %o1, PSTATE_IE, %o1
|
||||
wrpr %o1, 0, %pstate
|
||||
|
|
|
@ -16,23 +16,14 @@
|
|||
.text
|
||||
|
||||
set_pcontext:
|
||||
cplus_winfixup_insn_1:
|
||||
sethi %hi(0), %l1
|
||||
sethi %hi(sparc64_kern_pri_context), %l1
|
||||
ldx [%l1 + %lo(sparc64_kern_pri_context)], %l1
|
||||
mov PRIMARY_CONTEXT, %g1
|
||||
sllx %l1, 32, %l1
|
||||
cplus_winfixup_insn_2:
|
||||
sethi %hi(0), %g2
|
||||
or %l1, %g2, %l1
|
||||
stxa %l1, [%g1] ASI_DMMU
|
||||
flush %g6
|
||||
retl
|
||||
nop
|
||||
|
||||
cplus_wfinsn_1:
|
||||
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %l1
|
||||
cplus_wfinsn_2:
|
||||
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
|
||||
|
||||
.align 32
|
||||
|
||||
/* Here are the rules, pay attention.
|
||||
|
@ -395,23 +386,3 @@ window_dax_from_user_common:
|
|||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
||||
|
||||
.globl cheetah_plus_patch_winfixup
|
||||
cheetah_plus_patch_winfixup:
|
||||
sethi %hi(cplus_wfinsn_1), %o0
|
||||
sethi %hi(cplus_winfixup_insn_1), %o2
|
||||
lduw [%o0 + %lo(cplus_wfinsn_1)], %o1
|
||||
or %o2, %lo(cplus_winfixup_insn_1), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
|
||||
sethi %hi(cplus_wfinsn_2), %o0
|
||||
sethi %hi(cplus_winfixup_insn_2), %o2
|
||||
lduw [%o0 + %lo(cplus_wfinsn_2)], %o1
|
||||
or %o2, %lo(cplus_winfixup_insn_2), %o2
|
||||
stw %o1, [%o2]
|
||||
flush %o2
|
||||
|
||||
retl
|
||||
nop
|
||||
|
|
|
@ -59,15 +59,17 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
|
|||
be,pn %icc, 9b
|
||||
add %g6, TI_FPREGS, %g2
|
||||
andcc %o5, FPRS_DL, %g0
|
||||
membar #StoreStore | #LoadStore
|
||||
|
||||
be,pn %icc, 4f
|
||||
add %g6, TI_FPREGS+0x40, %g3
|
||||
membar #Sync
|
||||
stda %f0, [%g2 + %g1] ASI_BLK_P
|
||||
stda %f16, [%g3 + %g1] ASI_BLK_P
|
||||
membar #Sync
|
||||
andcc %o5, FPRS_DU, %g0
|
||||
be,pn %icc, 5f
|
||||
4: add %g1, 128, %g1
|
||||
membar #Sync
|
||||
stda %f32, [%g2 + %g1] ASI_BLK_P
|
||||
|
||||
stda %f48, [%g3 + %g1] ASI_BLK_P
|
||||
|
@ -87,7 +89,7 @@ vis1: ldub [%g6 + TI_FPSAVED], %g3
|
|||
sll %g1, 5, %g1
|
||||
add %g6, TI_FPREGS+0xc0, %g3
|
||||
wr %g0, FPRS_FEF, %fprs
|
||||
membar #StoreStore | #LoadStore
|
||||
membar #Sync
|
||||
stda %f32, [%g2 + %g1] ASI_BLK_P
|
||||
stda %f48, [%g3 + %g1] ASI_BLK_P
|
||||
membar #Sync
|
||||
|
@ -128,8 +130,8 @@ VISenterhalf:
|
|||
be,pn %icc, 4f
|
||||
add %g6, TI_FPREGS, %g2
|
||||
|
||||
membar #StoreStore | #LoadStore
|
||||
add %g6, TI_FPREGS+0x40, %g3
|
||||
membar #Sync
|
||||
stda %f0, [%g2 + %g1] ASI_BLK_P
|
||||
stda %f16, [%g3 + %g1] ASI_BLK_P
|
||||
membar #Sync
|
||||
|
|
|
@ -133,6 +133,12 @@ extern unsigned int sparc_ramdisk_size;
|
|||
|
||||
struct page *mem_map_zero __read_mostly;
|
||||
|
||||
unsigned int sparc64_highest_unlocked_tlb_ent __read_mostly;
|
||||
|
||||
unsigned long sparc64_kern_pri_context __read_mostly;
|
||||
unsigned long sparc64_kern_pri_nuc_bits __read_mostly;
|
||||
unsigned long sparc64_kern_sec_context __read_mostly;
|
||||
|
||||
int bigkernel = 0;
|
||||
|
||||
/* XXX Tune this... */
|
||||
|
@ -362,6 +368,7 @@ struct linux_prom_translation {
|
|||
unsigned long data;
|
||||
};
|
||||
static struct linux_prom_translation prom_trans[512] __initdata;
|
||||
static unsigned int prom_trans_ents __initdata;
|
||||
|
||||
extern unsigned long prom_boot_page;
|
||||
extern void prom_remap(unsigned long physpage, unsigned long virtpage, int mmu_ihandle);
|
||||
|
@ -375,57 +382,7 @@ unsigned long kern_locked_tte_data;
|
|||
unsigned long prom_pmd_phys __read_mostly;
|
||||
unsigned int swapper_pgd_zero __read_mostly;
|
||||
|
||||
/* Allocate power-of-2 aligned chunks from the end of the
|
||||
* kernel image. Return physical address.
|
||||
*/
|
||||
static inline unsigned long early_alloc_phys(unsigned long size)
|
||||
{
|
||||
unsigned long base;
|
||||
|
||||
BUILD_BUG_ON(size & (size - 1));
|
||||
|
||||
kern_size = (kern_size + (size - 1)) & ~(size - 1);
|
||||
base = kern_base + kern_size;
|
||||
kern_size += size;
|
||||
|
||||
return base;
|
||||
}
|
||||
|
||||
static inline unsigned long load_phys32(unsigned long pa)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
__asm__ __volatile__("lduwa [%1] %2, %0"
|
||||
: "=&r" (val)
|
||||
: "r" (pa), "i" (ASI_PHYS_USE_EC));
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline unsigned long load_phys64(unsigned long pa)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
__asm__ __volatile__("ldxa [%1] %2, %0"
|
||||
: "=&r" (val)
|
||||
: "r" (pa), "i" (ASI_PHYS_USE_EC));
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline void store_phys32(unsigned long pa, unsigned long val)
|
||||
{
|
||||
__asm__ __volatile__("stwa %0, [%1] %2"
|
||||
: /* no outputs */
|
||||
: "r" (val), "r" (pa), "i" (ASI_PHYS_USE_EC));
|
||||
}
|
||||
|
||||
static inline void store_phys64(unsigned long pa, unsigned long val)
|
||||
{
|
||||
__asm__ __volatile__("stxa %0, [%1] %2"
|
||||
: /* no outputs */
|
||||
: "r" (val), "r" (pa), "i" (ASI_PHYS_USE_EC));
|
||||
}
|
||||
static pmd_t *prompmd __read_mostly;
|
||||
|
||||
#define BASE_PAGE_SIZE 8192
|
||||
|
||||
|
@ -435,34 +392,28 @@ static inline void store_phys64(unsigned long pa, unsigned long val)
|
|||
*/
|
||||
unsigned long prom_virt_to_phys(unsigned long promva, int *error)
|
||||
{
|
||||
unsigned long pmd_phys = (prom_pmd_phys +
|
||||
((promva >> 23) & 0x7ff) * sizeof(pmd_t));
|
||||
unsigned long pte_phys;
|
||||
pmd_t pmd_ent;
|
||||
pte_t pte_ent;
|
||||
pmd_t *pmdp = prompmd + ((promva >> 23) & 0x7ff);
|
||||
pte_t *ptep;
|
||||
unsigned long base;
|
||||
|
||||
pmd_val(pmd_ent) = load_phys32(pmd_phys);
|
||||
if (pmd_none(pmd_ent)) {
|
||||
if (pmd_none(*pmdp)) {
|
||||
if (error)
|
||||
*error = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pte_phys = (unsigned long)pmd_val(pmd_ent) << 11UL;
|
||||
pte_phys += ((promva >> 13) & 0x3ff) * sizeof(pte_t);
|
||||
pte_val(pte_ent) = load_phys64(pte_phys);
|
||||
if (!pte_present(pte_ent)) {
|
||||
ptep = (pte_t *)__pmd_page(*pmdp) + ((promva >> 13) & 0x3ff);
|
||||
if (!pte_present(*ptep)) {
|
||||
if (error)
|
||||
*error = 1;
|
||||
return 0;
|
||||
}
|
||||
if (error) {
|
||||
*error = 0;
|
||||
return pte_val(pte_ent);
|
||||
return pte_val(*ptep);
|
||||
}
|
||||
base = pte_val(pte_ent) & _PAGE_PADDR;
|
||||
return (base + (promva & (BASE_PAGE_SIZE - 1)));
|
||||
base = pte_val(*ptep) & _PAGE_PADDR;
|
||||
|
||||
return base + (promva & (BASE_PAGE_SIZE - 1));
|
||||
}
|
||||
|
||||
/* The obp translations are saved based on 8k pagesize, since obp can
|
||||
|
@ -475,25 +426,20 @@ static void __init build_obp_range(unsigned long start, unsigned long end, unsig
|
|||
unsigned long vaddr;
|
||||
|
||||
for (vaddr = start; vaddr < end; vaddr += BASE_PAGE_SIZE) {
|
||||
unsigned long val, pte_phys, pmd_phys;
|
||||
pmd_t pmd_ent;
|
||||
int i;
|
||||
unsigned long val;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
pmd_phys = (prom_pmd_phys +
|
||||
(((vaddr >> 23) & 0x7ff) * sizeof(pmd_t)));
|
||||
pmd_val(pmd_ent) = load_phys32(pmd_phys);
|
||||
if (pmd_none(pmd_ent)) {
|
||||
pte_phys = early_alloc_phys(BASE_PAGE_SIZE);
|
||||
|
||||
for (i = 0; i < BASE_PAGE_SIZE / sizeof(pte_t); i++)
|
||||
store_phys64(pte_phys+i*sizeof(pte_t),0);
|
||||
|
||||
pmd_val(pmd_ent) = pte_phys >> 11UL;
|
||||
store_phys32(pmd_phys, pmd_val(pmd_ent));
|
||||
pmd = prompmd + ((vaddr >> 23) & 0x7ff);
|
||||
if (pmd_none(*pmd)) {
|
||||
pte = __alloc_bootmem(BASE_PAGE_SIZE, BASE_PAGE_SIZE,
|
||||
PAGE_SIZE);
|
||||
if (!pte)
|
||||
prom_halt();
|
||||
memset(pte, 0, BASE_PAGE_SIZE);
|
||||
pmd_set(pmd, pte);
|
||||
}
|
||||
|
||||
pte_phys = (unsigned long)pmd_val(pmd_ent) << 11UL;
|
||||
pte_phys += (((vaddr >> 13) & 0x3ff) * sizeof(pte_t));
|
||||
pte = (pte_t *) __pmd_page(*pmd) + ((vaddr >> 13) & 0x3ff);
|
||||
|
||||
val = data;
|
||||
|
||||
|
@ -501,7 +447,8 @@ static void __init build_obp_range(unsigned long start, unsigned long end, unsig
|
|||
if (tlb_type == spitfire)
|
||||
val &= ~0x0003fe0000000000UL;
|
||||
|
||||
store_phys64(pte_phys, val | _PAGE_MODIFIED);
|
||||
set_pte_at(&init_mm, vaddr, pte,
|
||||
__pte(val | _PAGE_MODIFIED));
|
||||
|
||||
data += BASE_PAGE_SIZE;
|
||||
}
|
||||
|
@ -514,13 +461,17 @@ static inline int in_obp_range(unsigned long vaddr)
|
|||
}
|
||||
|
||||
#define OBP_PMD_SIZE 2048
|
||||
static void __init build_obp_pgtable(int prom_trans_ents)
|
||||
static void __init build_obp_pgtable(void)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
prom_pmd_phys = early_alloc_phys(OBP_PMD_SIZE);
|
||||
for (i = 0; i < OBP_PMD_SIZE; i += 4)
|
||||
store_phys32(prom_pmd_phys + i, 0);
|
||||
prompmd = __alloc_bootmem(OBP_PMD_SIZE, OBP_PMD_SIZE, PAGE_SIZE);
|
||||
if (!prompmd)
|
||||
prom_halt();
|
||||
|
||||
memset(prompmd, 0, OBP_PMD_SIZE);
|
||||
|
||||
prom_pmd_phys = __pa(prompmd);
|
||||
|
||||
for (i = 0; i < prom_trans_ents; i++) {
|
||||
unsigned long start, end;
|
||||
|
@ -540,7 +491,7 @@ static void __init build_obp_pgtable(int prom_trans_ents)
|
|||
/* Read OBP translations property into 'prom_trans[]'.
|
||||
* Return the number of entries.
|
||||
*/
|
||||
static int __init read_obp_translations(void)
|
||||
static void __init read_obp_translations(void)
|
||||
{
|
||||
int n, node;
|
||||
|
||||
|
@ -561,8 +512,10 @@ static int __init read_obp_translations(void)
|
|||
prom_printf("prom_mappings: Couldn't get property.\n");
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
n = n / sizeof(struct linux_prom_translation);
|
||||
return n;
|
||||
|
||||
prom_trans_ents = n;
|
||||
}
|
||||
|
||||
static void __init remap_kernel(void)
|
||||
|
@ -582,28 +535,38 @@ static void __init remap_kernel(void)
|
|||
prom_dtlb_load(tlb_ent, tte_data, tte_vaddr);
|
||||
prom_itlb_load(tlb_ent, tte_data, tte_vaddr);
|
||||
if (bigkernel) {
|
||||
prom_dtlb_load(tlb_ent - 1,
|
||||
tlb_ent -= 1;
|
||||
prom_dtlb_load(tlb_ent,
|
||||
tte_data + 0x400000,
|
||||
tte_vaddr + 0x400000);
|
||||
prom_itlb_load(tlb_ent - 1,
|
||||
prom_itlb_load(tlb_ent,
|
||||
tte_data + 0x400000,
|
||||
tte_vaddr + 0x400000);
|
||||
}
|
||||
sparc64_highest_unlocked_tlb_ent = tlb_ent - 1;
|
||||
if (tlb_type == cheetah_plus) {
|
||||
sparc64_kern_pri_context = (CTX_CHEETAH_PLUS_CTX0 |
|
||||
CTX_CHEETAH_PLUS_NUC);
|
||||
sparc64_kern_pri_nuc_bits = CTX_CHEETAH_PLUS_NUC;
|
||||
sparc64_kern_sec_context = CTX_CHEETAH_PLUS_CTX0;
|
||||
}
|
||||
}
|
||||
|
||||
static void __init inherit_prom_mappings(void)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = read_obp_translations();
|
||||
build_obp_pgtable(n);
|
||||
static void __init inherit_prom_mappings_pre(void)
|
||||
{
|
||||
read_obp_translations();
|
||||
|
||||
/* Now fixup OBP's idea about where we really are mapped. */
|
||||
prom_printf("Remapping the kernel... ");
|
||||
remap_kernel();
|
||||
|
||||
prom_printf("done.\n");
|
||||
}
|
||||
|
||||
static void __init inherit_prom_mappings_post(void)
|
||||
{
|
||||
build_obp_pgtable();
|
||||
register_prom_callbacks();
|
||||
}
|
||||
|
||||
|
@ -788,8 +751,8 @@ void inherit_locked_prom_mappings(int save_p)
|
|||
}
|
||||
}
|
||||
if (tlb_type == spitfire) {
|
||||
int high = SPITFIRE_HIGHEST_LOCKED_TLBENT - bigkernel;
|
||||
for (i = 0; i < high; i++) {
|
||||
int high = sparc64_highest_unlocked_tlb_ent;
|
||||
for (i = 0; i <= high; i++) {
|
||||
unsigned long data;
|
||||
|
||||
/* Spitfire Errata #32 workaround */
|
||||
|
@ -877,9 +840,9 @@ void inherit_locked_prom_mappings(int save_p)
|
|||
}
|
||||
}
|
||||
} else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
|
||||
int high = CHEETAH_HIGHEST_LOCKED_TLBENT - bigkernel;
|
||||
int high = sparc64_highest_unlocked_tlb_ent;
|
||||
|
||||
for (i = 0; i < high; i++) {
|
||||
for (i = 0; i <= high; i++) {
|
||||
unsigned long data;
|
||||
|
||||
data = cheetah_get_ldtlb_data(i);
|
||||
|
@ -1556,8 +1519,7 @@ void __init paging_init(void)
|
|||
|
||||
swapper_pgd_zero = pgd_val(swapper_pg_dir[0]);
|
||||
|
||||
/* Inherit non-locked OBP mappings. */
|
||||
inherit_prom_mappings();
|
||||
inherit_prom_mappings_pre();
|
||||
|
||||
/* Ok, we can use our TLB miss and window trap handlers safely.
|
||||
* We need to do a quick peek here to see if we are on StarFire
|
||||
|
@ -1568,15 +1530,23 @@ void __init paging_init(void)
|
|||
extern void setup_tba(int);
|
||||
setup_tba(this_is_starfire);
|
||||
}
|
||||
|
||||
inherit_locked_prom_mappings(1);
|
||||
|
||||
__flush_tlb_all();
|
||||
|
||||
/* Everything from this point forward, until we are done with
|
||||
* inherit_prom_mappings_post(), must complete successfully
|
||||
* without calling into the firmware. The firwmare page tables
|
||||
* have not been built, but we are running on the Linux kernel's
|
||||
* trap table.
|
||||
*/
|
||||
|
||||
/* Setup bootmem... */
|
||||
pages_avail = 0;
|
||||
last_valid_pfn = end_pfn = bootmem_init(&pages_avail);
|
||||
|
||||
inherit_prom_mappings_post();
|
||||
|
||||
inherit_locked_prom_mappings(1);
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
kernel_physical_mapping_init();
|
||||
#endif
|
||||
|
|
|
@ -152,7 +152,7 @@ archclean:
|
|||
$(SYMLINK_HEADERS):
|
||||
@echo ' SYMLINK $@'
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
ln -fsn $(srctree)/include/asm-um/$(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $@
|
||||
$(Q)ln -fsn $(srctree)/include/asm-um/$(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $@
|
||||
else
|
||||
$(Q)cd $(TOPDIR)/$(dir $@) ; \
|
||||
ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@)
|
||||
|
|
|
@ -3,15 +3,40 @@
|
|||
|
||||
#include <asm/types.h>
|
||||
|
||||
#if defined(__BIG_ENDIAN)
|
||||
# define ntohll(x) (x)
|
||||
# define htonll(x) (x)
|
||||
#elif defined(__LITTLE_ENDIAN)
|
||||
# define ntohll(x) bswap_64(x)
|
||||
# define htonll(x) bswap_64(x)
|
||||
#if defined(__KERNEL__)
|
||||
|
||||
# include <asm/byteorder.h>
|
||||
|
||||
# if defined(__BIG_ENDIAN)
|
||||
# define ntohll(x) (x)
|
||||
# define htonll(x) (x)
|
||||
# elif defined(__LITTLE_ENDIAN)
|
||||
# define ntohll(x) be64_to_cpu(x)
|
||||
# define htonll(x) cpu_to_be64(x)
|
||||
# else
|
||||
# error "Could not determine byte order"
|
||||
# endif
|
||||
|
||||
#else
|
||||
#error "__BYTE_ORDER not defined"
|
||||
/* For the definition of ntohl, htonl and __BYTE_ORDER */
|
||||
#include <endian.h>
|
||||
#include <netinet/in.h>
|
||||
#if defined(__BYTE_ORDER)
|
||||
|
||||
# if __BYTE_ORDER == __BIG_ENDIAN
|
||||
# define ntohll(x) (x)
|
||||
# define htonll(x) (x)
|
||||
# elif __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
# define ntohll(x) bswap_64(x)
|
||||
# define htonll(x) bswap_64(x)
|
||||
# else
|
||||
# error "Could not determine byte order: __BYTE_ORDER uncorrectly defined"
|
||||
# endif
|
||||
|
||||
#else /* ! defined(__BYTE_ORDER) */
|
||||
# error "Could not determine byte order: __BYTE_ORDER not defined"
|
||||
#endif
|
||||
#endif /* ! defined(__KERNEL__) */
|
||||
|
||||
extern int init_cow_file(int fd, char *cow_file, char *backing_file,
|
||||
int sectorsize, int alignment, int *bitmap_offset_out,
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
#include <sys/time.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/user.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "os.h"
|
||||
|
||||
|
|
|
@ -15,16 +15,6 @@ extern void save_registers(int pid, union uml_pt_regs *regs);
|
|||
extern void restore_registers(int pid, union uml_pt_regs *regs);
|
||||
extern void init_registers(int pid);
|
||||
extern void get_safe_registers(unsigned long * regs);
|
||||
extern void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer);
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
||||
|
|
|
@ -218,10 +218,6 @@ struct syscall_args {
|
|||
case RBP: UPT_RBP(regs) = __upt_val; break; \
|
||||
case ORIG_RAX: UPT_ORIG_RAX(regs) = __upt_val; break; \
|
||||
case CS: UPT_CS(regs) = __upt_val; break; \
|
||||
case DS: UPT_DS(regs) = __upt_val; break; \
|
||||
case ES: UPT_ES(regs) = __upt_val; break; \
|
||||
case FS: UPT_FS(regs) = __upt_val; break; \
|
||||
case GS: UPT_GS(regs) = __upt_val; break; \
|
||||
case EFLAGS: UPT_EFLAGS(regs) = __upt_val; break; \
|
||||
default : \
|
||||
panic("Bad register in UPT_SET : %d\n", reg); \
|
||||
|
|
|
@ -62,13 +62,7 @@ void show_stack(struct task_struct *task, unsigned long *esp)
|
|||
|
||||
if (esp == NULL) {
|
||||
if (task != current && task != NULL) {
|
||||
/* XXX: Isn't this bogus? I.e. isn't this the
|
||||
* *userspace* stack of this task? If not so, use this
|
||||
* even when task == current (as in i386).
|
||||
*/
|
||||
esp = (unsigned long *) KSTK_ESP(task);
|
||||
/* Which one? No actual difference - just coding style.*/
|
||||
//esp = (unsigned long *) PT_REGS_IP(&task->thread.regs);
|
||||
} else {
|
||||
esp = (unsigned long *) &esp;
|
||||
}
|
||||
|
@ -84,5 +78,5 @@ void show_stack(struct task_struct *task, unsigned long *esp)
|
|||
}
|
||||
|
||||
printk("Call Trace: \n");
|
||||
show_trace(current, esp);
|
||||
show_trace(task, esp);
|
||||
}
|
||||
|
|
|
@ -143,11 +143,22 @@ static int __init skas0_cmd_param(char *str, int* add)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* The two __uml_setup would conflict, without this stupid alias. */
|
||||
|
||||
static int __init mode_skas0_cmd_param(char *str, int* add)
|
||||
__attribute__((alias("skas0_cmd_param")));
|
||||
|
||||
__uml_setup("skas0", skas0_cmd_param,
|
||||
"skas0\n"
|
||||
" Disables SKAS3 usage, so that SKAS0 is used, unless \n"
|
||||
" you specify mode=tt.\n\n");
|
||||
|
||||
__uml_setup("mode=skas0", mode_skas0_cmd_param,
|
||||
"mode=skas0\n"
|
||||
" Disables SKAS3 usage, so that SKAS0 is used, unless you \n"
|
||||
" specify mode=tt. Note that this was recently added - on \n"
|
||||
" older kernels you must use simply \"skas0\".\n\n");
|
||||
|
||||
static int force_sysemu_disabled = 0;
|
||||
|
||||
static int __init nosysemu_cmd_param(char *str, int* add)
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <setjmp.h>
|
||||
#include "sysdep/ptrace_user.h"
|
||||
#include "sysdep/ptrace.h"
|
||||
#include "uml-config.h"
|
||||
|
@ -126,13 +127,11 @@ void get_safe_registers(unsigned long *regs)
|
|||
memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long));
|
||||
}
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
||||
void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)
|
||||
{
|
||||
struct __jmp_buf_tag *jmpbuf = buffer;
|
||||
|
||||
UPT_SET(uml_regs, EIP, jmpbuf->__jmpbuf[JB_PC]);
|
||||
UPT_SET(uml_regs, UESP, jmpbuf->__jmpbuf[JB_SP]);
|
||||
UPT_SET(uml_regs, EBP, jmpbuf->__jmpbuf[JB_BP]);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <setjmp.h>
|
||||
#include "ptrace_user.h"
|
||||
#include "uml-config.h"
|
||||
#include "skas_ptregs.h"
|
||||
|
@ -74,13 +75,11 @@ void get_safe_registers(unsigned long *regs)
|
|||
memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long));
|
||||
}
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
* adjust the settings for this buffer only. This must remain at the end
|
||||
* of the file.
|
||||
* ---------------------------------------------------------------------------
|
||||
* Local variables:
|
||||
* c-file-style: "linux"
|
||||
* End:
|
||||
*/
|
||||
void get_thread_regs(union uml_pt_regs *uml_regs, void *buffer)
|
||||
{
|
||||
struct __jmp_buf_tag *jmpbuf = buffer;
|
||||
|
||||
UPT_SET(uml_regs, RIP, jmpbuf->__jmpbuf[JB_PC]);
|
||||
UPT_SET(uml_regs, RSP, jmpbuf->__jmpbuf[JB_RSP]);
|
||||
UPT_SET(uml_regs, RBP, jmpbuf->__jmpbuf[JB_RBP]);
|
||||
}
|
||||
|
|
|
@ -7,8 +7,8 @@ USER_SINGLE_OBJS := \
|
|||
USER_OBJS += $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS))
|
||||
USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
|
||||
|
||||
$(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \
|
||||
$(CFLAGS_$(notdir $@))
|
||||
$(USER_OBJS) $(USER_OBJS:.o=.i) $(USER_OBJS:.o=.s) $(USER_OBJS:.o=.lst): \
|
||||
c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(notdir $@))
|
||||
$(USER_OBJS): cmd_checksrc =
|
||||
$(USER_OBJS): quiet_cmd_checksrc =
|
||||
$(USER_OBJS): cmd_force_checksrc =
|
||||
|
|
|
@ -88,9 +88,7 @@ void show_trace(struct task_struct* task, unsigned long * stack)
|
|||
task = current;
|
||||
|
||||
if (task != current) {
|
||||
//ebp = (unsigned long) KSTK_EBP(task);
|
||||
/* Which one? No actual difference - just coding style.*/
|
||||
ebp = (unsigned long) PT_REGS_EBP(&task->thread.regs);
|
||||
ebp = (unsigned long) KSTK_EBP(task);
|
||||
} else {
|
||||
asm ("movl %%ebp, %0" : "=r" (ebp) : );
|
||||
}
|
||||
|
@ -99,15 +97,6 @@ void show_trace(struct task_struct* task, unsigned long * stack)
|
|||
((unsigned long)stack & (~(THREAD_SIZE - 1)));
|
||||
print_context_stack(context, stack, ebp);
|
||||
|
||||
/*while (((long) stack & (THREAD_SIZE-1)) != 0) {
|
||||
addr = *stack;
|
||||
if (__kernel_text_address(addr)) {
|
||||
printk("%08lx: [<%08lx>]", (unsigned long) stack, addr);
|
||||
print_symbol(" %s", addr);
|
||||
printk("\n");
|
||||
}
|
||||
stack++;
|
||||
}*/
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ void foo(void)
|
|||
OFFSET(HOST_SC_FP_ST, _fpstate, _st);
|
||||
OFFSET(HOST_SC_FXSR_ENV, _fpstate, _fxsr_env);
|
||||
|
||||
DEFINE_LONGS(HOST_FRAME_SIZE, FRAME_SIZE);
|
||||
DEFINE(HOST_FRAME_SIZE, FRAME_SIZE);
|
||||
DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_i387_struct));
|
||||
DEFINE_LONGS(HOST_XFP_SIZE, sizeof(struct user_fxsr_struct));
|
||||
|
||||
|
|
|
@ -10,6 +10,22 @@
|
|||
#include "uml-config.h"
|
||||
#include "sysdep/sigcontext.h"
|
||||
#include "sysdep/faultinfo.h"
|
||||
#include <stddef.h>
|
||||
|
||||
/* Copied from sys-x86_64/signal.c - Can't find an equivalent definition
|
||||
* in the libc headers anywhere.
|
||||
*/
|
||||
struct rt_sigframe
|
||||
{
|
||||
char *pretcode;
|
||||
struct ucontext uc;
|
||||
struct siginfo info;
|
||||
};
|
||||
|
||||
/* Copied here from <linux/kernel.h> - we're userspace. */
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||
|
||||
void __attribute__ ((__section__ (".__syscall_stub")))
|
||||
stub_segv_handler(int sig)
|
||||
|
@ -17,16 +33,19 @@ stub_segv_handler(int sig)
|
|||
struct ucontext *uc;
|
||||
|
||||
__asm__("movq %%rdx, %0" : "=g" (uc) :);
|
||||
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA),
|
||||
&uc->uc_mcontext);
|
||||
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA),
|
||||
&uc->uc_mcontext);
|
||||
|
||||
__asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid));
|
||||
__asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid));
|
||||
__asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;"
|
||||
"syscall": : "g" (__NR_kill), "g" (SIGUSR1));
|
||||
/* Two popqs to restore the stack to the state just before entering
|
||||
* the handler, one pops the return address, the other pops the frame
|
||||
* pointer.
|
||||
"syscall": : "g" (__NR_kill), "g" (SIGUSR1) :
|
||||
"%rdi", "%rax", "%rsi");
|
||||
/* sys_sigreturn expects that the stack pointer will be 8 bytes into
|
||||
* the signal frame. So, we use the ucontext pointer, which we know
|
||||
* already, to get the signal frame pointer, and add 8 to that.
|
||||
*/
|
||||
__asm__("popq %%rax ; popq %%rax ; movq %0, %%rax ; syscall" : : "g"
|
||||
(__NR_rt_sigreturn));
|
||||
__asm__("movq %0, %%rsp": :
|
||||
"g" ((unsigned long) container_of(uc, struct rt_sigframe,
|
||||
uc) + 8));
|
||||
__asm__("movq %0, %%rax ; syscall" : : "g" (__NR_rt_sigreturn));
|
||||
}
|
||||
|
|
|
@ -425,7 +425,11 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
|||
rsp = (unsigned long) ka->sa.sa_restorer;
|
||||
}
|
||||
|
||||
return (void __user *)((rsp - frame_size) & -8UL);
|
||||
rsp -= frame_size;
|
||||
/* Align the stack pointer according to the i386 ABI,
|
||||
* i.e. so that on function entry ((sp + 4) & 15) == 0. */
|
||||
rsp = ((rsp + 4) & -16ul) - 4;
|
||||
return (void __user *) rsp;
|
||||
}
|
||||
|
||||
int ia32_setup_frame(int sig, struct k_sigaction *ka,
|
||||
|
|
|
@ -270,26 +270,26 @@ ENTRY(level3_kernel_pgt)
|
|||
.org 0x4000
|
||||
ENTRY(level2_ident_pgt)
|
||||
/* 40MB for bootup. */
|
||||
.quad 0x0000000000000183
|
||||
.quad 0x0000000000200183
|
||||
.quad 0x0000000000400183
|
||||
.quad 0x0000000000600183
|
||||
.quad 0x0000000000800183
|
||||
.quad 0x0000000000A00183
|
||||
.quad 0x0000000000C00183
|
||||
.quad 0x0000000000E00183
|
||||
.quad 0x0000000001000183
|
||||
.quad 0x0000000001200183
|
||||
.quad 0x0000000001400183
|
||||
.quad 0x0000000001600183
|
||||
.quad 0x0000000001800183
|
||||
.quad 0x0000000001A00183
|
||||
.quad 0x0000000001C00183
|
||||
.quad 0x0000000001E00183
|
||||
.quad 0x0000000002000183
|
||||
.quad 0x0000000002200183
|
||||
.quad 0x0000000002400183
|
||||
.quad 0x0000000002600183
|
||||
.quad 0x0000000000000083
|
||||
.quad 0x0000000000200083
|
||||
.quad 0x0000000000400083
|
||||
.quad 0x0000000000600083
|
||||
.quad 0x0000000000800083
|
||||
.quad 0x0000000000A00083
|
||||
.quad 0x0000000000C00083
|
||||
.quad 0x0000000000E00083
|
||||
.quad 0x0000000001000083
|
||||
.quad 0x0000000001200083
|
||||
.quad 0x0000000001400083
|
||||
.quad 0x0000000001600083
|
||||
.quad 0x0000000001800083
|
||||
.quad 0x0000000001A00083
|
||||
.quad 0x0000000001C00083
|
||||
.quad 0x0000000001E00083
|
||||
.quad 0x0000000002000083
|
||||
.quad 0x0000000002200083
|
||||
.quad 0x0000000002400083
|
||||
.quad 0x0000000002600083
|
||||
/* Temporary mappings for the super early allocator in arch/x86_64/mm/init.c */
|
||||
.globl temp_boot_pmds
|
||||
temp_boot_pmds:
|
||||
|
|
|
@ -87,6 +87,10 @@ void __init setup_per_cpu_areas(void)
|
|||
int i;
|
||||
unsigned long size;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
prefill_possible_map();
|
||||
#endif
|
||||
|
||||
/* Copy section for each CPU (we discard the original) */
|
||||
size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
|
||||
#ifdef CONFIG_MODULES
|
||||
|
|
|
@ -892,7 +892,7 @@ static __init void disable_smp(void)
|
|||
* those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
|
||||
* - Ashok Raj
|
||||
*/
|
||||
static void prefill_possible_map(void)
|
||||
__init void prefill_possible_map(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < NR_CPUS; i++)
|
||||
|
@ -967,10 +967,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
current_cpu_data = boot_cpu_data;
|
||||
current_thread_info()->cpu = 0; /* needed? */
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
prefill_possible_map();
|
||||
#endif
|
||||
|
||||
if (smp_sanity_check(max_cpus) < 0) {
|
||||
printk(KERN_INFO "SMP disabled\n");
|
||||
disable_smp();
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#include <linux/smp.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
struct saved_context saved_context;
|
||||
|
||||
|
@ -140,4 +142,129 @@ void fix_processor_context(void)
|
|||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOFTWARE_SUSPEND
|
||||
/* Defined in arch/x86_64/kernel/suspend_asm.S */
|
||||
extern int restore_image(void);
|
||||
|
||||
pgd_t *temp_level4_pgt;
|
||||
|
||||
static void **pages;
|
||||
|
||||
static inline void *__add_page(void)
|
||||
{
|
||||
void **c;
|
||||
|
||||
c = (void **)get_usable_page(GFP_ATOMIC);
|
||||
if (c) {
|
||||
*c = pages;
|
||||
pages = c;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
static inline void *__next_page(void)
|
||||
{
|
||||
void **c;
|
||||
|
||||
c = pages;
|
||||
if (c) {
|
||||
pages = *c;
|
||||
*c = NULL;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to allocate as many usable pages as needed and daisy chain them.
|
||||
* If one allocation fails, free the pages allocated so far
|
||||
*/
|
||||
static int alloc_usable_pages(unsigned long n)
|
||||
{
|
||||
void *p;
|
||||
|
||||
pages = NULL;
|
||||
do
|
||||
if (!__add_page())
|
||||
break;
|
||||
while (--n);
|
||||
if (n) {
|
||||
p = __next_page();
|
||||
while (p) {
|
||||
free_page((unsigned long)p);
|
||||
p = __next_page();
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void res_phys_pud_init(pud_t *pud, unsigned long address, unsigned long end)
|
||||
{
|
||||
long i, j;
|
||||
|
||||
i = pud_index(address);
|
||||
pud = pud + i;
|
||||
for (; i < PTRS_PER_PUD; pud++, i++) {
|
||||
unsigned long paddr;
|
||||
pmd_t *pmd;
|
||||
|
||||
paddr = address + i*PUD_SIZE;
|
||||
if (paddr >= end)
|
||||
break;
|
||||
|
||||
pmd = (pmd_t *)__next_page();
|
||||
set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE));
|
||||
for (j = 0; j < PTRS_PER_PMD; pmd++, j++, paddr += PMD_SIZE) {
|
||||
unsigned long pe;
|
||||
|
||||
if (paddr >= end)
|
||||
break;
|
||||
pe = _PAGE_NX | _PAGE_PSE | _KERNPG_TABLE | paddr;
|
||||
pe &= __supported_pte_mask;
|
||||
set_pmd(pmd, __pmd(pe));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void set_up_temporary_mappings(void)
|
||||
{
|
||||
unsigned long start, end, next;
|
||||
|
||||
temp_level4_pgt = (pgd_t *)__next_page();
|
||||
|
||||
/* It is safe to reuse the original kernel mapping */
|
||||
set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map),
|
||||
init_level4_pgt[pgd_index(__START_KERNEL_map)]);
|
||||
|
||||
/* Set up the direct mapping from scratch */
|
||||
start = (unsigned long)pfn_to_kaddr(0);
|
||||
end = (unsigned long)pfn_to_kaddr(end_pfn);
|
||||
|
||||
for (; start < end; start = next) {
|
||||
pud_t *pud = (pud_t *)__next_page();
|
||||
next = start + PGDIR_SIZE;
|
||||
if (next > end)
|
||||
next = end;
|
||||
res_phys_pud_init(pud, __pa(start), __pa(next));
|
||||
set_pgd(temp_level4_pgt + pgd_index(start),
|
||||
mk_kernel_pgd(__pa(pud)));
|
||||
}
|
||||
}
|
||||
|
||||
int swsusp_arch_resume(void)
|
||||
{
|
||||
unsigned long n;
|
||||
|
||||
n = ((end_pfn << PAGE_SHIFT) + PUD_SIZE - 1) >> PUD_SHIFT;
|
||||
n += (n + PTRS_PER_PUD - 1) / PTRS_PER_PUD + 1;
|
||||
pr_debug("swsusp_arch_resume(): pages needed = %lu\n", n);
|
||||
if (alloc_usable_pages(n)) {
|
||||
free_eaten_memory();
|
||||
return -ENOMEM;
|
||||
}
|
||||
/* We have got enough memory and from now on we cannot recover */
|
||||
set_up_temporary_mappings();
|
||||
restore_image();
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_SOFTWARE_SUSPEND */
|
||||
|
|
|
@ -39,12 +39,13 @@ ENTRY(swsusp_arch_suspend)
|
|||
call swsusp_save
|
||||
ret
|
||||
|
||||
ENTRY(swsusp_arch_resume)
|
||||
/* set up cr3 */
|
||||
leaq init_level4_pgt(%rip),%rax
|
||||
subq $__START_KERNEL_map,%rax
|
||||
movq %rax,%cr3
|
||||
|
||||
ENTRY(restore_image)
|
||||
/* switch to temporary page tables */
|
||||
movq $__PAGE_OFFSET, %rdx
|
||||
movq temp_level4_pgt(%rip), %rax
|
||||
subq %rdx, %rax
|
||||
movq %rax, %cr3
|
||||
/* Flush TLB */
|
||||
movq mmu_cr4_features(%rip), %rax
|
||||
movq %rax, %rdx
|
||||
andq $~(1<<7), %rdx # PGE
|
||||
|
@ -69,6 +70,10 @@ loop:
|
|||
movq pbe_next(%rdx), %rdx
|
||||
jmp loop
|
||||
done:
|
||||
/* go back to the original page tables */
|
||||
leaq init_level4_pgt(%rip), %rax
|
||||
subq $__START_KERNEL_map, %rax
|
||||
movq %rax, %cr3
|
||||
/* Flush TLB, including "global" things (vmalloc) */
|
||||
movq mmu_cr4_features(%rip), %rax
|
||||
movq %rax, %rdx
|
||||
|
|
|
@ -220,8 +220,6 @@ void global_flush_tlb(void)
|
|||
down_read(&init_mm.mmap_sem);
|
||||
df = xchg(&df_list, NULL);
|
||||
up_read(&init_mm.mmap_sem);
|
||||
if (!df)
|
||||
return;
|
||||
flush_map((df && !df->next) ? df->address : 0);
|
||||
for (; df; df = next_df) {
|
||||
next_df = df->next;
|
||||
|
|
|
@ -795,7 +795,7 @@ static void drain_rx_pools (amb_dev * dev) {
|
|||
}
|
||||
|
||||
static inline void fill_rx_pool (amb_dev * dev, unsigned char pool,
|
||||
unsigned int __nocast priority)
|
||||
gfp_t priority)
|
||||
{
|
||||
rx_in rx;
|
||||
amb_rxq * rxq;
|
||||
|
|
|
@ -1374,8 +1374,7 @@ static void reset_chip (struct fs_dev *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static void __devinit *aligned_kmalloc (int size, unsigned int __nocast flags,
|
||||
int alignment)
|
||||
static void __devinit *aligned_kmalloc (int size, gfp_t flags, int alignment)
|
||||
{
|
||||
void *t;
|
||||
|
||||
|
@ -1466,7 +1465,7 @@ static inline int nr_buffers_in_freepool (struct fs_dev *dev, struct freepool *f
|
|||
working again after that... -- REW */
|
||||
|
||||
static void top_off_fp (struct fs_dev *dev, struct freepool *fp,
|
||||
unsigned int __nocast gfp_flags)
|
||||
gfp_t gfp_flags)
|
||||
{
|
||||
struct FS_BPENTRY *qe, *ne;
|
||||
struct sk_buff *skb;
|
||||
|
|
|
@ -178,14 +178,12 @@ fore200e_irq_itoa(int irq)
|
|||
|
||||
|
||||
static void*
|
||||
fore200e_kmalloc(int size, int flags)
|
||||
fore200e_kmalloc(int size, gfp_t flags)
|
||||
{
|
||||
void* chunk = kmalloc(size, flags);
|
||||
void *chunk = kzalloc(size, flags);
|
||||
|
||||
if (chunk)
|
||||
memset(chunk, 0x00, size);
|
||||
else
|
||||
printk(FORE200E "kmalloc() failed, requested size = %d, flags = 0x%x\n", size, flags);
|
||||
if (!chunk)
|
||||
printk(FORE200E "kmalloc() failed, requested size = %d, flags = 0x%x\n", size, flags);
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
|
|
@ -156,7 +156,7 @@ dma_pool_create (const char *name, struct device *dev,
|
|||
|
||||
|
||||
static struct dma_page *
|
||||
pool_alloc_page (struct dma_pool *pool, unsigned int __nocast mem_flags)
|
||||
pool_alloc_page (struct dma_pool *pool, gfp_t mem_flags)
|
||||
{
|
||||
struct dma_page *page;
|
||||
int mapsize;
|
||||
|
@ -262,8 +262,7 @@ dma_pool_destroy (struct dma_pool *pool)
|
|||
* If such a memory block can't be allocated, null is returned.
|
||||
*/
|
||||
void *
|
||||
dma_pool_alloc (struct dma_pool *pool, unsigned int __nocast mem_flags,
|
||||
dma_addr_t *handle)
|
||||
dma_pool_alloc (struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct dma_page *page;
|
||||
|
|
|
@ -229,7 +229,7 @@ static int pkt_grow_pktlist(struct pktcdvd_device *pd, int nr_packets)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void *pkt_rb_alloc(unsigned int __nocast gfp_mask, void *data)
|
||||
static void *pkt_rb_alloc(gfp_t gfp_mask, void *data)
|
||||
{
|
||||
return kmalloc(sizeof(struct pkt_rb_node), gfp_mask);
|
||||
}
|
||||
|
@ -2082,7 +2082,7 @@ static int pkt_close(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
|
||||
static void *psd_pool_alloc(unsigned int __nocast gfp_mask, void *data)
|
||||
static void *psd_pool_alloc(gfp_t gfp_mask, void *data)
|
||||
{
|
||||
return kmalloc(sizeof(struct packet_stacked_data), gfp_mask);
|
||||
}
|
||||
|
|
|
@ -201,15 +201,15 @@ static int verify_command(struct file *file, unsigned char *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* And root can do any command.. */
|
||||
if (capable(CAP_SYS_RAWIO))
|
||||
return 0;
|
||||
|
||||
if (!type) {
|
||||
cmd_type[cmd[0]] = CMD_WARNED;
|
||||
printk(KERN_WARNING "scsi: unknown opcode 0x%02x\n", cmd[0]);
|
||||
}
|
||||
|
||||
/* And root can do any command.. */
|
||||
if (capable(CAP_SYS_RAWIO))
|
||||
return 0;
|
||||
|
||||
/* Otherwise fail it with an "Operation not permitted" */
|
||||
return -EPERM;
|
||||
}
|
||||
|
|
|
@ -308,7 +308,7 @@ unlock:
|
|||
}
|
||||
|
||||
static inline struct urb *bpa10x_alloc_urb(struct usb_device *udev, unsigned int pipe,
|
||||
size_t size, unsigned int __nocast flags, void *data)
|
||||
size_t size, gfp_t flags, void *data)
|
||||
{
|
||||
struct urb *urb;
|
||||
struct usb_ctrlrequest *cr;
|
||||
|
|
|
@ -132,7 +132,7 @@ static struct usb_device_id blacklist_ids[] = {
|
|||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
static struct _urb *_urb_alloc(int isoc, unsigned int __nocast gfp)
|
||||
static struct _urb *_urb_alloc(int isoc, gfp_t gfp)
|
||||
{
|
||||
struct _urb *_urb = kmalloc(sizeof(struct _urb) +
|
||||
sizeof(struct usb_iso_packet_descriptor) * isoc, gfp);
|
||||
|
|
|
@ -47,7 +47,7 @@ MODULE_PARM_DESC(cards_limit, "Maximum number of graphics cards");
|
|||
MODULE_PARM_DESC(debug, "Enable debug output");
|
||||
|
||||
module_param_named(cards_limit, drm_cards_limit, int, 0444);
|
||||
module_param_named(debug, drm_debug, int, 0666);
|
||||
module_param_named(debug, drm_debug, int, 0600);
|
||||
|
||||
drm_head_t **drm_heads;
|
||||
struct drm_sysfs_class *drm_class;
|
||||
|
|
|
@ -564,6 +564,7 @@ static int s3c2410_rtc_resume(struct device *dev, u32 level)
|
|||
|
||||
static struct device_driver s3c2410_rtcdrv = {
|
||||
.name = "s3c2410-rtc",
|
||||
.owner = THIS_MODULE,
|
||||
.bus = &platform_bus_type,
|
||||
.probe = s3c2410_rtc_probe,
|
||||
.remove = s3c2410_rtc_remove,
|
||||
|
|
|
@ -50,8 +50,8 @@
|
|||
#include <asm/io.h> /* For inb/outb/... */
|
||||
|
||||
/* Module and version information */
|
||||
#define WATCHDOG_VERSION "1.01"
|
||||
#define WATCHDOG_DATE "02 Sep 2005"
|
||||
#define WATCHDOG_VERSION "1.02"
|
||||
#define WATCHDOG_DATE "03 Sep 2005"
|
||||
#define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog"
|
||||
#define WATCHDOG_NAME "pcwd_pci"
|
||||
#define PFX WATCHDOG_NAME ": "
|
||||
|
@ -70,19 +70,30 @@
|
|||
* These are the defines that describe the control status bits for the
|
||||
* PCI-PC Watchdog card.
|
||||
*/
|
||||
#define WD_PCI_WTRP 0x01 /* Watchdog Trip status */
|
||||
#define WD_PCI_HRBT 0x02 /* Watchdog Heartbeat */
|
||||
#define WD_PCI_TTRP 0x04 /* Temperature Trip status */
|
||||
/* Port 1 : Control Status #1 */
|
||||
#define WD_PCI_WTRP 0x01 /* Watchdog Trip status */
|
||||
#define WD_PCI_HRBT 0x02 /* Watchdog Heartbeat */
|
||||
#define WD_PCI_TTRP 0x04 /* Temperature Trip status */
|
||||
#define WD_PCI_RL2A 0x08 /* Relay 2 Active */
|
||||
#define WD_PCI_RL1A 0x10 /* Relay 1 Active */
|
||||
#define WD_PCI_R2DS 0x40 /* Relay 2 Disable Temperature-trip/reset */
|
||||
#define WD_PCI_RLY2 0x80 /* Activate Relay 2 on the board */
|
||||
/* Port 2 : Control Status #2 */
|
||||
#define WD_PCI_WDIS 0x10 /* Watchdog Disable */
|
||||
#define WD_PCI_ENTP 0x20 /* Enable Temperature Trip Reset */
|
||||
#define WD_PCI_WRSP 0x40 /* Watchdog wrote response */
|
||||
#define WD_PCI_PCMD 0x80 /* PC has sent command */
|
||||
|
||||
/* according to documentation max. time to process a command for the pci
|
||||
* watchdog card is 100 ms, so we give it 150 ms to do it's job */
|
||||
#define PCI_COMMAND_TIMEOUT 150
|
||||
|
||||
/* Watchdog's internal commands */
|
||||
#define CMD_GET_STATUS 0x04
|
||||
#define CMD_GET_FIRMWARE_VERSION 0x08
|
||||
#define CMD_READ_WATCHDOG_TIMEOUT 0x18
|
||||
#define CMD_WRITE_WATCHDOG_TIMEOUT 0x19
|
||||
#define CMD_GET_STATUS 0x04
|
||||
#define CMD_GET_FIRMWARE_VERSION 0x08
|
||||
#define CMD_READ_WATCHDOG_TIMEOUT 0x18
|
||||
#define CMD_WRITE_WATCHDOG_TIMEOUT 0x19
|
||||
#define CMD_GET_CLEAR_RESET_COUNT 0x84
|
||||
|
||||
/* We can only use 1 card due to the /dev/watchdog restriction */
|
||||
static int cards_found;
|
||||
|
@ -91,15 +102,22 @@ static int cards_found;
|
|||
static int temp_panic;
|
||||
static unsigned long is_active;
|
||||
static char expect_release;
|
||||
static struct {
|
||||
int supports_temp; /* Wether or not the card has a temperature device */
|
||||
int boot_status; /* The card's boot status */
|
||||
unsigned long io_addr; /* The cards I/O address */
|
||||
spinlock_t io_lock;
|
||||
struct pci_dev *pdev;
|
||||
static struct { /* this is private data for each PCI-PC watchdog card */
|
||||
int supports_temp; /* Wether or not the card has a temperature device */
|
||||
int boot_status; /* The card's boot status */
|
||||
unsigned long io_addr; /* The cards I/O address */
|
||||
spinlock_t io_lock; /* the lock for io operations */
|
||||
struct pci_dev *pdev; /* the PCI-device */
|
||||
} pcipcwd_private;
|
||||
|
||||
/* module parameters */
|
||||
#define QUIET 0 /* Default */
|
||||
#define VERBOSE 1 /* Verbose */
|
||||
#define DEBUG 2 /* print fancy stuff too */
|
||||
static int debug = QUIET;
|
||||
module_param(debug, int, 0);
|
||||
MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)");
|
||||
|
||||
#define WATCHDOG_HEARTBEAT 2 /* 2 sec default heartbeat */
|
||||
static int heartbeat = WATCHDOG_HEARTBEAT;
|
||||
module_param(heartbeat, int, 0);
|
||||
|
@ -117,6 +135,10 @@ static int send_command(int cmd, int *msb, int *lsb)
|
|||
{
|
||||
int got_response, count;
|
||||
|
||||
if (debug >= DEBUG)
|
||||
printk(KERN_DEBUG PFX "sending following data cmd=0x%02x msb=0x%02x lsb=0x%02x\n",
|
||||
cmd, *msb, *lsb);
|
||||
|
||||
spin_lock(&pcipcwd_private.io_lock);
|
||||
/* If a command requires data it should be written first.
|
||||
* Data for commands with 8 bits of data should be written to port 4.
|
||||
|
@ -131,10 +153,19 @@ static int send_command(int cmd, int *msb, int *lsb)
|
|||
/* wait till the pci card processed the command, signaled by
|
||||
* the WRSP bit in port 2 and give it a max. timeout of
|
||||
* PCI_COMMAND_TIMEOUT to process */
|
||||
got_response = inb_p(pcipcwd_private.io_addr + 2) & 0x40;
|
||||
got_response = inb_p(pcipcwd_private.io_addr + 2) & WD_PCI_WRSP;
|
||||
for (count = 0; (count < PCI_COMMAND_TIMEOUT) && (!got_response); count++) {
|
||||
mdelay(1);
|
||||
got_response = inb_p(pcipcwd_private.io_addr + 2) & 0x40;
|
||||
got_response = inb_p(pcipcwd_private.io_addr + 2) & WD_PCI_WRSP;
|
||||
}
|
||||
|
||||
if (debug >= DEBUG) {
|
||||
if (got_response) {
|
||||
printk(KERN_DEBUG PFX "time to process command was: %d ms\n",
|
||||
count);
|
||||
} else {
|
||||
printk(KERN_DEBUG PFX "card did not respond on command!\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (got_response) {
|
||||
|
@ -144,12 +175,66 @@ static int send_command(int cmd, int *msb, int *lsb)
|
|||
|
||||
/* clear WRSP bit */
|
||||
inb_p(pcipcwd_private.io_addr + 6);
|
||||
|
||||
if (debug >= DEBUG)
|
||||
printk(KERN_DEBUG PFX "received following data for cmd=0x%02x: msb=0x%02x lsb=0x%02x\n",
|
||||
cmd, *msb, *lsb);
|
||||
}
|
||||
|
||||
spin_unlock(&pcipcwd_private.io_lock);
|
||||
|
||||
return got_response;
|
||||
}
|
||||
|
||||
static inline void pcipcwd_check_temperature_support(void)
|
||||
{
|
||||
if (inb_p(pcipcwd_private.io_addr) != 0xF0)
|
||||
pcipcwd_private.supports_temp = 1;
|
||||
}
|
||||
|
||||
static int pcipcwd_get_option_switches(void)
|
||||
{
|
||||
int option_switches;
|
||||
|
||||
option_switches = inb_p(pcipcwd_private.io_addr + 3);
|
||||
return option_switches;
|
||||
}
|
||||
|
||||
static void pcipcwd_show_card_info(void)
|
||||
{
|
||||
int got_fw_rev, fw_rev_major, fw_rev_minor;
|
||||
char fw_ver_str[20]; /* The cards firmware version */
|
||||
int option_switches;
|
||||
|
||||
got_fw_rev = send_command(CMD_GET_FIRMWARE_VERSION, &fw_rev_major, &fw_rev_minor);
|
||||
if (got_fw_rev) {
|
||||
sprintf(fw_ver_str, "%u.%02u", fw_rev_major, fw_rev_minor);
|
||||
} else {
|
||||
sprintf(fw_ver_str, "<card no answer>");
|
||||
}
|
||||
|
||||
/* Get switch settings */
|
||||
option_switches = pcipcwd_get_option_switches();
|
||||
|
||||
printk(KERN_INFO PFX "Found card at port 0x%04x (Firmware: %s) %s temp option\n",
|
||||
(int) pcipcwd_private.io_addr, fw_ver_str,
|
||||
(pcipcwd_private.supports_temp ? "with" : "without"));
|
||||
|
||||
printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n",
|
||||
option_switches,
|
||||
((option_switches & 0x10) ? "ON" : "OFF"),
|
||||
((option_switches & 0x08) ? "ON" : "OFF"));
|
||||
|
||||
if (pcipcwd_private.boot_status & WDIOF_CARDRESET)
|
||||
printk(KERN_INFO PFX "Previous reset was caused by the Watchdog card\n");
|
||||
|
||||
if (pcipcwd_private.boot_status & WDIOF_OVERHEAT)
|
||||
printk(KERN_INFO PFX "Card sensed a CPU Overheat\n");
|
||||
|
||||
if (pcipcwd_private.boot_status == 0)
|
||||
printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n");
|
||||
}
|
||||
|
||||
static int pcipcwd_start(void)
|
||||
{
|
||||
int stat_reg;
|
||||
|
@ -161,11 +246,14 @@ static int pcipcwd_start(void)
|
|||
stat_reg = inb_p(pcipcwd_private.io_addr + 2);
|
||||
spin_unlock(&pcipcwd_private.io_lock);
|
||||
|
||||
if (stat_reg & 0x10) {
|
||||
if (stat_reg & WD_PCI_WDIS) {
|
||||
printk(KERN_ERR PFX "Card timer not enabled\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (debug >= VERBOSE)
|
||||
printk(KERN_DEBUG PFX "Watchdog started\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -183,18 +271,25 @@ static int pcipcwd_stop(void)
|
|||
stat_reg = inb_p(pcipcwd_private.io_addr + 2);
|
||||
spin_unlock(&pcipcwd_private.io_lock);
|
||||
|
||||
if (!(stat_reg & 0x10)) {
|
||||
if (!(stat_reg & WD_PCI_WDIS)) {
|
||||
printk(KERN_ERR PFX "Card did not acknowledge disable attempt\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (debug >= VERBOSE)
|
||||
printk(KERN_DEBUG PFX "Watchdog stopped\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcipcwd_keepalive(void)
|
||||
{
|
||||
/* Re-trigger watchdog by writing to port 0 */
|
||||
outb_p(0x42, pcipcwd_private.io_addr);
|
||||
outb_p(0x42, pcipcwd_private.io_addr); /* send out any data */
|
||||
|
||||
if (debug >= DEBUG)
|
||||
printk(KERN_DEBUG PFX "Watchdog keepalive signal send\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -210,29 +305,64 @@ static int pcipcwd_set_heartbeat(int t)
|
|||
send_command(CMD_WRITE_WATCHDOG_TIMEOUT, &t_msb, &t_lsb);
|
||||
|
||||
heartbeat = t;
|
||||
if (debug >= VERBOSE)
|
||||
printk(KERN_DEBUG PFX "New heartbeat: %d\n",
|
||||
heartbeat);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcipcwd_get_status(int *status)
|
||||
{
|
||||
int new_status;
|
||||
int control_status;
|
||||
|
||||
*status=0;
|
||||
new_status = inb_p(pcipcwd_private.io_addr + 1);
|
||||
if (new_status & WD_PCI_WTRP)
|
||||
control_status = inb_p(pcipcwd_private.io_addr + 1);
|
||||
if (control_status & WD_PCI_WTRP)
|
||||
*status |= WDIOF_CARDRESET;
|
||||
if (new_status & WD_PCI_TTRP) {
|
||||
if (control_status & WD_PCI_TTRP) {
|
||||
*status |= WDIOF_OVERHEAT;
|
||||
if (temp_panic)
|
||||
panic(PFX "Temperature overheat trip!\n");
|
||||
}
|
||||
|
||||
if (debug >= DEBUG)
|
||||
printk(KERN_DEBUG PFX "Control Status #1: 0x%02x\n",
|
||||
control_status);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcipcwd_clear_status(void)
|
||||
{
|
||||
outb_p(0x01, pcipcwd_private.io_addr + 1);
|
||||
int control_status;
|
||||
int msb;
|
||||
int reset_counter;
|
||||
|
||||
if (debug >= VERBOSE)
|
||||
printk(KERN_INFO PFX "clearing watchdog trip status & LED\n");
|
||||
|
||||
control_status = inb_p(pcipcwd_private.io_addr + 1);
|
||||
|
||||
if (debug >= DEBUG) {
|
||||
printk(KERN_DEBUG PFX "status was: 0x%02x\n", control_status);
|
||||
printk(KERN_DEBUG PFX "sending: 0x%02x\n",
|
||||
(control_status & WD_PCI_R2DS) | WD_PCI_WTRP);
|
||||
}
|
||||
|
||||
/* clear trip status & LED and keep mode of relay 2 */
|
||||
outb_p((control_status & WD_PCI_R2DS) | WD_PCI_WTRP, pcipcwd_private.io_addr + 1);
|
||||
|
||||
/* clear reset counter */
|
||||
msb=0;
|
||||
reset_counter=0xff;
|
||||
send_command(CMD_GET_CLEAR_RESET_COUNT, &msb, &reset_counter);
|
||||
|
||||
if (debug >= DEBUG) {
|
||||
printk(KERN_DEBUG PFX "reset count was: 0x%02x\n",
|
||||
reset_counter);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -242,11 +372,18 @@ static int pcipcwd_get_temperature(int *temperature)
|
|||
if (!pcipcwd_private.supports_temp)
|
||||
return -ENODEV;
|
||||
|
||||
*temperature = inb_p(pcipcwd_private.io_addr);
|
||||
|
||||
/*
|
||||
* Convert celsius to fahrenheit, since this was
|
||||
* the decided 'standard' for this return value.
|
||||
*/
|
||||
*temperature = ((inb_p(pcipcwd_private.io_addr)) * 9 / 5) + 32;
|
||||
*temperature = (*temperature * 9 / 5) + 32;
|
||||
|
||||
if (debug >= DEBUG) {
|
||||
printk(KERN_DEBUG PFX "temperature is: %d F\n",
|
||||
*temperature);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -256,7 +393,7 @@ static int pcipcwd_get_temperature(int *temperature)
|
|||
*/
|
||||
|
||||
static ssize_t pcipcwd_write(struct file *file, const char __user *data,
|
||||
size_t len, loff_t *ppos)
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
/* See if we got the magic character 'V' and reload the timer */
|
||||
if (len) {
|
||||
|
@ -381,8 +518,11 @@ static int pcipcwd_ioctl(struct inode *inode, struct file *file,
|
|||
static int pcipcwd_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
/* /dev/watchdog can only be opened once */
|
||||
if (test_and_set_bit(0, &is_active))
|
||||
if (test_and_set_bit(0, &is_active)) {
|
||||
if (debug >= VERBOSE)
|
||||
printk(KERN_ERR PFX "Attempt to open already opened device.\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* Activate */
|
||||
pcipcwd_start();
|
||||
|
@ -492,19 +632,10 @@ static struct notifier_block pcipcwd_notifier = {
|
|||
* Init & exit routines
|
||||
*/
|
||||
|
||||
static inline void check_temperature_support(void)
|
||||
{
|
||||
if (inb_p(pcipcwd_private.io_addr) != 0xF0)
|
||||
pcipcwd_private.supports_temp = 1;
|
||||
}
|
||||
|
||||
static int __devinit pcipcwd_card_init(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
int ret = -EIO;
|
||||
int got_fw_rev, fw_rev_major, fw_rev_minor;
|
||||
char fw_ver_str[20];
|
||||
char option_switches;
|
||||
|
||||
cards_found++;
|
||||
if (cards_found == 1)
|
||||
|
@ -546,36 +677,10 @@ static int __devinit pcipcwd_card_init(struct pci_dev *pdev,
|
|||
pcipcwd_stop();
|
||||
|
||||
/* Check whether or not the card supports the temperature device */
|
||||
check_temperature_support();
|
||||
pcipcwd_check_temperature_support();
|
||||
|
||||
/* Get the Firmware Version */
|
||||
got_fw_rev = send_command(CMD_GET_FIRMWARE_VERSION, &fw_rev_major, &fw_rev_minor);
|
||||
if (got_fw_rev) {
|
||||
sprintf(fw_ver_str, "%u.%02u", fw_rev_major, fw_rev_minor);
|
||||
} else {
|
||||
sprintf(fw_ver_str, "<card no answer>");
|
||||
}
|
||||
|
||||
/* Get switch settings */
|
||||
option_switches = inb_p(pcipcwd_private.io_addr + 3);
|
||||
|
||||
printk(KERN_INFO PFX "Found card at port 0x%04x (Firmware: %s) %s temp option\n",
|
||||
(int) pcipcwd_private.io_addr, fw_ver_str,
|
||||
(pcipcwd_private.supports_temp ? "with" : "without"));
|
||||
|
||||
printk(KERN_INFO PFX "Option switches (0x%02x): Temperature Reset Enable=%s, Power On Delay=%s\n",
|
||||
option_switches,
|
||||
((option_switches & 0x10) ? "ON" : "OFF"),
|
||||
((option_switches & 0x08) ? "ON" : "OFF"));
|
||||
|
||||
if (pcipcwd_private.boot_status & WDIOF_CARDRESET)
|
||||
printk(KERN_INFO PFX "Previous reset was caused by the Watchdog card\n");
|
||||
|
||||
if (pcipcwd_private.boot_status & WDIOF_OVERHEAT)
|
||||
printk(KERN_INFO PFX "Card sensed a CPU Overheat\n");
|
||||
|
||||
if (pcipcwd_private.boot_status == 0)
|
||||
printk(KERN_INFO PFX "No previous trip detected - Cold boot or reset\n");
|
||||
/* Show info about the card itself */
|
||||
pcipcwd_show_card_info();
|
||||
|
||||
/* Check that the heartbeat value is within it's range ; if not reset to the default */
|
||||
if (pcipcwd_set_heartbeat(heartbeat)) {
|
||||
|
@ -656,7 +761,7 @@ static struct pci_driver pcipcwd_driver = {
|
|||
|
||||
static int __init pcipcwd_init_module(void)
|
||||
{
|
||||
spin_lock_init (&pcipcwd_private.io_lock);
|
||||
spin_lock_init(&pcipcwd_private.io_lock);
|
||||
|
||||
return pci_register_driver(&pcipcwd_driver);
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@ int cn_already_initialized = 0;
|
|||
* a new message.
|
||||
*
|
||||
*/
|
||||
int cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask)
|
||||
int cn_netlink_send(struct cn_msg *msg, u32 __group, gfp_t gfp_mask)
|
||||
{
|
||||
struct cn_callback_entry *__cbq;
|
||||
unsigned int size;
|
||||
|
|
|
@ -1101,6 +1101,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
|
|||
ide_hwif_t *hwif;
|
||||
struct request *rq;
|
||||
ide_startstop_t startstop;
|
||||
int loops = 0;
|
||||
|
||||
/* for atari only: POSSIBLY BROKEN HERE(?) */
|
||||
ide_get_lock(ide_intr, hwgroup);
|
||||
|
@ -1153,6 +1154,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
|
|||
/* no more work for this hwgroup (for now) */
|
||||
return;
|
||||
}
|
||||
again:
|
||||
hwif = HWIF(drive);
|
||||
if (hwgroup->hwif->sharing_irq &&
|
||||
hwif != hwgroup->hwif &&
|
||||
|
@ -1192,8 +1194,14 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
|
|||
* though. I hope that doesn't happen too much, hopefully not
|
||||
* unless the subdriver triggers such a thing in its own PM
|
||||
* state machine.
|
||||
*
|
||||
* We count how many times we loop here to make sure we service
|
||||
* all drives in the hwgroup without looping for ever
|
||||
*/
|
||||
if (drive->blocked && !blk_pm_request(rq) && !(rq->flags & REQ_PREEMPT)) {
|
||||
drive = drive->next ? drive->next : hwgroup->drive;
|
||||
if (loops++ < 4 && !blk_queue_plugged(drive->queue))
|
||||
goto again;
|
||||
/* We clear busy, there should be no pending ATA command at this point. */
|
||||
hwgroup->busy = 0;
|
||||
break;
|
||||
|
|
|
@ -98,7 +98,7 @@ static struct hpsb_address_ops arm_ops = {
|
|||
|
||||
static void queue_complete_cb(struct pending_request *req);
|
||||
|
||||
static struct pending_request *__alloc_pending_request(unsigned int __nocast flags)
|
||||
static struct pending_request *__alloc_pending_request(gfp_t flags)
|
||||
{
|
||||
struct pending_request *req;
|
||||
|
||||
|
|
|
@ -783,7 +783,7 @@ struct ib_mad_send_buf * ib_create_send_mad(struct ib_mad_agent *mad_agent,
|
|||
u32 remote_qpn, u16 pkey_index,
|
||||
struct ib_ah *ah, int rmpp_active,
|
||||
int hdr_len, int data_len,
|
||||
unsigned int __nocast gfp_mask)
|
||||
gfp_t gfp_mask)
|
||||
{
|
||||
struct ib_mad_agent_private *mad_agent_priv;
|
||||
struct ib_mad_send_buf *send_buf;
|
||||
|
|
|
@ -574,7 +574,7 @@ static void ib_sa_path_rec_release(struct ib_sa_query *sa_query)
|
|||
int ib_sa_path_rec_get(struct ib_device *device, u8 port_num,
|
||||
struct ib_sa_path_rec *rec,
|
||||
ib_sa_comp_mask comp_mask,
|
||||
int timeout_ms, unsigned int __nocast gfp_mask,
|
||||
int timeout_ms, gfp_t gfp_mask,
|
||||
void (*callback)(int status,
|
||||
struct ib_sa_path_rec *resp,
|
||||
void *context),
|
||||
|
@ -676,7 +676,7 @@ static void ib_sa_service_rec_release(struct ib_sa_query *sa_query)
|
|||
int ib_sa_service_rec_query(struct ib_device *device, u8 port_num, u8 method,
|
||||
struct ib_sa_service_rec *rec,
|
||||
ib_sa_comp_mask comp_mask,
|
||||
int timeout_ms, unsigned int __nocast gfp_mask,
|
||||
int timeout_ms, gfp_t gfp_mask,
|
||||
void (*callback)(int status,
|
||||
struct ib_sa_service_rec *resp,
|
||||
void *context),
|
||||
|
@ -759,7 +759,7 @@ int ib_sa_mcmember_rec_query(struct ib_device *device, u8 port_num,
|
|||
u8 method,
|
||||
struct ib_sa_mcmember_rec *rec,
|
||||
ib_sa_comp_mask comp_mask,
|
||||
int timeout_ms, unsigned int __nocast gfp_mask,
|
||||
int timeout_ms, gfp_t gfp_mask,
|
||||
void (*callback)(int status,
|
||||
struct ib_sa_mcmember_rec *resp,
|
||||
void *context),
|
||||
|
|
|
@ -503,6 +503,25 @@ err_free_aux:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void mthca_free_icms(struct mthca_dev *mdev)
|
||||
{
|
||||
u8 status;
|
||||
|
||||
mthca_free_icm_table(mdev, mdev->mcg_table.table);
|
||||
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
||||
mthca_free_icm_table(mdev, mdev->srq_table.table);
|
||||
mthca_free_icm_table(mdev, mdev->cq_table.table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
|
||||
mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
|
||||
mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
|
||||
mthca_unmap_eq_icm(mdev);
|
||||
|
||||
mthca_UNMAP_ICM_AUX(mdev, &status);
|
||||
mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
|
||||
}
|
||||
|
||||
static int __devinit mthca_init_arbel(struct mthca_dev *mdev)
|
||||
{
|
||||
struct mthca_dev_lim dev_lim;
|
||||
|
@ -580,18 +599,7 @@ static int __devinit mthca_init_arbel(struct mthca_dev *mdev)
|
|||
return 0;
|
||||
|
||||
err_free_icm:
|
||||
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
||||
mthca_free_icm_table(mdev, mdev->srq_table.table);
|
||||
mthca_free_icm_table(mdev, mdev->cq_table.table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
|
||||
mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
|
||||
mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
|
||||
mthca_unmap_eq_icm(mdev);
|
||||
|
||||
mthca_UNMAP_ICM_AUX(mdev, &status);
|
||||
mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
|
||||
mthca_free_icms(mdev);
|
||||
|
||||
err_stop_fw:
|
||||
mthca_UNMAP_FA(mdev, &status);
|
||||
|
@ -611,18 +619,7 @@ static void mthca_close_hca(struct mthca_dev *mdev)
|
|||
mthca_CLOSE_HCA(mdev, 0, &status);
|
||||
|
||||
if (mthca_is_memfree(mdev)) {
|
||||
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
||||
mthca_free_icm_table(mdev, mdev->srq_table.table);
|
||||
mthca_free_icm_table(mdev, mdev->cq_table.table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
|
||||
mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
|
||||
mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
|
||||
mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
|
||||
mthca_unmap_eq_icm(mdev);
|
||||
|
||||
mthca_UNMAP_ICM_AUX(mdev, &status);
|
||||
mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
|
||||
mthca_free_icms(mdev);
|
||||
|
||||
mthca_UNMAP_FA(mdev, &status);
|
||||
mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
|
||||
|
|
|
@ -474,7 +474,7 @@ err:
|
|||
spin_unlock(&priv->lock);
|
||||
}
|
||||
|
||||
static void path_lookup(struct sk_buff *skb, struct net_device *dev)
|
||||
static void ipoib_path_lookup(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct ipoib_dev_priv *priv = netdev_priv(skb->dev);
|
||||
|
||||
|
@ -569,7 +569,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
if (skb->dst && skb->dst->neighbour) {
|
||||
if (unlikely(!*to_ipoib_neigh(skb->dst->neighbour))) {
|
||||
path_lookup(skb, dev);
|
||||
ipoib_path_lookup(skb, dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ static kmem_cache_t *_crypt_io_pool;
|
|||
/*
|
||||
* Mempool alloc and free functions for the page
|
||||
*/
|
||||
static void *mempool_alloc_page(unsigned int __nocast gfp_mask, void *data)
|
||||
static void *mempool_alloc_page(gfp_t gfp_mask, void *data)
|
||||
{
|
||||
return alloc_page(gfp_mask);
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ struct io {
|
|||
static unsigned _num_ios;
|
||||
static mempool_t *_io_pool;
|
||||
|
||||
static void *alloc_io(unsigned int __nocast gfp_mask, void *pool_data)
|
||||
static void *alloc_io(gfp_t gfp_mask, void *pool_data)
|
||||
{
|
||||
return kmalloc(sizeof(struct io), gfp_mask);
|
||||
}
|
||||
|
|
|
@ -122,7 +122,7 @@ static inline sector_t region_to_sector(struct region_hash *rh, region_t region)
|
|||
/* FIXME move this */
|
||||
static void queue_bio(struct mirror_set *ms, struct bio *bio, int rw);
|
||||
|
||||
static void *region_alloc(unsigned int __nocast gfp_mask, void *pool_data)
|
||||
static void *region_alloc(gfp_t gfp_mask, void *pool_data)
|
||||
{
|
||||
return kmalloc(sizeof(struct region), gfp_mask);
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
static mdk_personality_t multipath_personality;
|
||||
|
||||
|
||||
static void *mp_pool_alloc(unsigned int __nocast gfp_flags, void *data)
|
||||
static void *mp_pool_alloc(gfp_t gfp_flags, void *data)
|
||||
{
|
||||
struct multipath_bh *mpb;
|
||||
mpb = kmalloc(sizeof(*mpb), gfp_flags);
|
||||
|
|
|
@ -52,7 +52,7 @@ static mdk_personality_t raid1_personality;
|
|||
static void unplug_slaves(mddev_t *mddev);
|
||||
|
||||
|
||||
static void * r1bio_pool_alloc(unsigned int __nocast gfp_flags, void *data)
|
||||
static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data)
|
||||
{
|
||||
struct pool_info *pi = data;
|
||||
r1bio_t *r1_bio;
|
||||
|
@ -79,7 +79,7 @@ static void r1bio_pool_free(void *r1_bio, void *data)
|
|||
#define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
|
||||
#define RESYNC_WINDOW (2048*1024)
|
||||
|
||||
static void * r1buf_pool_alloc(unsigned int __nocast gfp_flags, void *data)
|
||||
static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)
|
||||
{
|
||||
struct pool_info *pi = data;
|
||||
struct page *page;
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
|
||||
static void unplug_slaves(mddev_t *mddev);
|
||||
|
||||
static void * r10bio_pool_alloc(unsigned int __nocast gfp_flags, void *data)
|
||||
static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
|
||||
{
|
||||
conf_t *conf = data;
|
||||
r10bio_t *r10_bio;
|
||||
|
@ -81,7 +81,7 @@ static void r10bio_pool_free(void *r10_bio, void *data)
|
|||
* one for write (we recover only one drive per r10buf)
|
||||
*
|
||||
*/
|
||||
static void * r10buf_pool_alloc(unsigned int __nocast gfp_flags, void *data)
|
||||
static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
|
||||
{
|
||||
conf_t *conf = data;
|
||||
struct page *page;
|
||||
|
|
|
@ -457,6 +457,17 @@ static int ucb1x00_detect_irq(struct ucb1x00 *ucb)
|
|||
return probe_irq_off(mask);
|
||||
}
|
||||
|
||||
static void ucb1x00_release(struct class_device *dev)
|
||||
{
|
||||
struct ucb1x00 *ucb = classdev_to_ucb1x00(dev);
|
||||
kfree(ucb);
|
||||
}
|
||||
|
||||
static struct class ucb1x00_class = {
|
||||
.name = "ucb1x00",
|
||||
.release = ucb1x00_release,
|
||||
};
|
||||
|
||||
static int ucb1x00_probe(struct mcp *mcp)
|
||||
{
|
||||
struct ucb1x00 *ucb;
|
||||
|
@ -546,17 +557,6 @@ static void ucb1x00_remove(struct mcp *mcp)
|
|||
class_device_unregister(&ucb->cdev);
|
||||
}
|
||||
|
||||
static void ucb1x00_release(struct class_device *dev)
|
||||
{
|
||||
struct ucb1x00 *ucb = classdev_to_ucb1x00(dev);
|
||||
kfree(ucb);
|
||||
}
|
||||
|
||||
static struct class ucb1x00_class = {
|
||||
.name = "ucb1x00",
|
||||
.release = ucb1x00_release,
|
||||
};
|
||||
|
||||
int ucb1x00_register_driver(struct ucb1x00_driver *drv)
|
||||
{
|
||||
struct ucb1x00 *ucb;
|
||||
|
@ -642,8 +642,6 @@ static void __exit ucb1x00_exit(void)
|
|||
module_init(ucb1x00_init);
|
||||
module_exit(ucb1x00_exit);
|
||||
|
||||
EXPORT_SYMBOL(ucb1x00_class);
|
||||
|
||||
EXPORT_SYMBOL(ucb1x00_io_set_dir);
|
||||
EXPORT_SYMBOL(ucb1x00_io_write);
|
||||
EXPORT_SYMBOL(ucb1x00_io_read);
|
||||
|
|
|
@ -106,8 +106,6 @@ struct ucb1x00_irq {
|
|||
void (*fn)(int, void *);
|
||||
};
|
||||
|
||||
extern struct class ucb1x00_class;
|
||||
|
||||
struct ucb1x00 {
|
||||
spinlock_t lock;
|
||||
struct mcp *mcp;
|
||||
|
|
|
@ -1655,7 +1655,7 @@ config LAN_SAA9730
|
|||
|
||||
config NET_POCKET
|
||||
bool "Pocket and portable adapters"
|
||||
depends on NET_ETHERNET && ISA
|
||||
depends on NET_ETHERNET && PARPORT
|
||||
---help---
|
||||
Cute little network (Ethernet) devices which attach to the parallel
|
||||
port ("pocket adapters"), commonly used with laptops. If you have
|
||||
|
@ -1679,7 +1679,7 @@ config NET_POCKET
|
|||
|
||||
config ATP
|
||||
tristate "AT-LAN-TEC/RealTek pocket adapter support"
|
||||
depends on NET_POCKET && ISA && X86
|
||||
depends on NET_POCKET && PARPORT && X86
|
||||
select CRC32
|
||||
---help---
|
||||
This is a network (Ethernet) device which attaches to your parallel
|
||||
|
@ -1694,7 +1694,7 @@ config ATP
|
|||
|
||||
config DE600
|
||||
tristate "D-Link DE600 pocket adapter support"
|
||||
depends on NET_POCKET && ISA
|
||||
depends on NET_POCKET && PARPORT
|
||||
---help---
|
||||
This is a network (Ethernet) device which attaches to your parallel
|
||||
port. Read <file:Documentation/networking/DLINK.txt> as well as the
|
||||
|
@ -1709,7 +1709,7 @@ config DE600
|
|||
|
||||
config DE620
|
||||
tristate "D-Link DE620 pocket adapter support"
|
||||
depends on NET_POCKET && ISA
|
||||
depends on NET_POCKET && PARPORT
|
||||
---help---
|
||||
This is a network (Ethernet) device which attaches to your parallel
|
||||
port. Read <file:Documentation/networking/DLINK.txt> as well as the
|
||||
|
|
|
@ -487,6 +487,8 @@
|
|||
* * Added xmit_hash_policy_layer34()
|
||||
* - Modified by Jay Vosburgh <fubar@us.ibm.com> to also support mode 4.
|
||||
* Set version to 2.6.3.
|
||||
* 2005/09/26 - Jay Vosburgh <fubar@us.ibm.com>
|
||||
* - Removed backwards compatibility for old ifenslaves. Version 2.6.4.
|
||||
*/
|
||||
|
||||
//#define BONDING_DEBUG 1
|
||||
|
@ -595,14 +597,7 @@ static int arp_ip_count = 0;
|
|||
static int bond_mode = BOND_MODE_ROUNDROBIN;
|
||||
static int xmit_hashtype= BOND_XMIT_POLICY_LAYER2;
|
||||
static int lacp_fast = 0;
|
||||
static int app_abi_ver = 0;
|
||||
static int orig_app_abi_ver = -1; /* This is used to save the first ABI version
|
||||
* we receive from the application. Once set,
|
||||
* it won't be changed, and the module will
|
||||
* refuse to enslave/release interfaces if the
|
||||
* command comes from an application using
|
||||
* another ABI version.
|
||||
*/
|
||||
|
||||
struct bond_parm_tbl {
|
||||
char *modename;
|
||||
int mode;
|
||||
|
@ -1294,12 +1289,13 @@ static void bond_mc_list_destroy(struct bonding *bond)
|
|||
/*
|
||||
* Copy all the Multicast addresses from src to the bonding device dst
|
||||
*/
|
||||
static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond, int gpf_flag)
|
||||
static int bond_mc_list_copy(struct dev_mc_list *mc_list, struct bonding *bond,
|
||||
gfp_t gfp_flag)
|
||||
{
|
||||
struct dev_mc_list *dmi, *new_dmi;
|
||||
|
||||
for (dmi = mc_list; dmi; dmi = dmi->next) {
|
||||
new_dmi = kmalloc(sizeof(struct dev_mc_list), gpf_flag);
|
||||
new_dmi = kmalloc(sizeof(struct dev_mc_list), gfp_flag);
|
||||
|
||||
if (!new_dmi) {
|
||||
/* FIXME: Potential memory leak !!! */
|
||||
|
@ -1702,51 +1698,29 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
|
|||
}
|
||||
}
|
||||
|
||||
if (app_abi_ver >= 1) {
|
||||
/* The application is using an ABI, which requires the
|
||||
* slave interface to be closed.
|
||||
*/
|
||||
if ((slave_dev->flags & IFF_UP)) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: %s is up\n",
|
||||
slave_dev->name);
|
||||
res = -EPERM;
|
||||
goto err_undo_flags;
|
||||
}
|
||||
/*
|
||||
* Old ifenslave binaries are no longer supported. These can
|
||||
* be identified with moderate accurary by the state of the slave:
|
||||
* the current ifenslave will set the interface down prior to
|
||||
* enslaving it; the old ifenslave will not.
|
||||
*/
|
||||
if ((slave_dev->flags & IFF_UP)) {
|
||||
printk(KERN_ERR DRV_NAME ": %s is up. "
|
||||
"This may be due to an out of date ifenslave.\n",
|
||||
slave_dev->name);
|
||||
res = -EPERM;
|
||||
goto err_undo_flags;
|
||||
}
|
||||
|
||||
if (slave_dev->set_mac_address == NULL) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: The slave device you specified does "
|
||||
"not support setting the MAC address.\n");
|
||||
printk(KERN_ERR
|
||||
"Your kernel likely does not support slave "
|
||||
"devices.\n");
|
||||
if (slave_dev->set_mac_address == NULL) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: The slave device you specified does "
|
||||
"not support setting the MAC address.\n");
|
||||
printk(KERN_ERR
|
||||
"Your kernel likely does not support slave devices.\n");
|
||||
|
||||
res = -EOPNOTSUPP;
|
||||
goto err_undo_flags;
|
||||
}
|
||||
} else {
|
||||
/* The application is not using an ABI, which requires the
|
||||
* slave interface to be open.
|
||||
*/
|
||||
if (!(slave_dev->flags & IFF_UP)) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: %s is not running\n",
|
||||
slave_dev->name);
|
||||
res = -EINVAL;
|
||||
goto err_undo_flags;
|
||||
}
|
||||
|
||||
if ((bond->params.mode == BOND_MODE_8023AD) ||
|
||||
(bond->params.mode == BOND_MODE_TLB) ||
|
||||
(bond->params.mode == BOND_MODE_ALB)) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: to use %s mode, you must upgrade "
|
||||
"ifenslave.\n",
|
||||
bond_mode_name(bond->params.mode));
|
||||
res = -EOPNOTSUPP;
|
||||
goto err_undo_flags;
|
||||
}
|
||||
res = -EOPNOTSUPP;
|
||||
goto err_undo_flags;
|
||||
}
|
||||
|
||||
new_slave = kmalloc(sizeof(struct slave), GFP_KERNEL);
|
||||
|
@ -1762,41 +1736,36 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
|
|||
*/
|
||||
new_slave->original_flags = slave_dev->flags;
|
||||
|
||||
if (app_abi_ver >= 1) {
|
||||
/* save slave's original ("permanent") mac address for
|
||||
* modes that needs it, and for restoring it upon release,
|
||||
* and then set it to the master's address
|
||||
*/
|
||||
memcpy(new_slave->perm_hwaddr, slave_dev->dev_addr, ETH_ALEN);
|
||||
/*
|
||||
* Save slave's original ("permanent") mac address for modes
|
||||
* that need it, and for restoring it upon release, and then
|
||||
* set it to the master's address
|
||||
*/
|
||||
memcpy(new_slave->perm_hwaddr, slave_dev->dev_addr, ETH_ALEN);
|
||||
|
||||
/* set slave to master's mac address
|
||||
* The application already set the master's
|
||||
* mac address to that of the first slave
|
||||
*/
|
||||
memcpy(addr.sa_data, bond_dev->dev_addr, bond_dev->addr_len);
|
||||
addr.sa_family = slave_dev->type;
|
||||
res = dev_set_mac_address(slave_dev, &addr);
|
||||
if (res) {
|
||||
dprintk("Error %d calling set_mac_address\n", res);
|
||||
goto err_free;
|
||||
}
|
||||
/*
|
||||
* Set slave to master's mac address. The application already
|
||||
* set the master's mac address to that of the first slave
|
||||
*/
|
||||
memcpy(addr.sa_data, bond_dev->dev_addr, bond_dev->addr_len);
|
||||
addr.sa_family = slave_dev->type;
|
||||
res = dev_set_mac_address(slave_dev, &addr);
|
||||
if (res) {
|
||||
dprintk("Error %d calling set_mac_address\n", res);
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
/* open the slave since the application closed it */
|
||||
res = dev_open(slave_dev);
|
||||
if (res) {
|
||||
dprintk("Openning slave %s failed\n", slave_dev->name);
|
||||
goto err_restore_mac;
|
||||
}
|
||||
/* open the slave since the application closed it */
|
||||
res = dev_open(slave_dev);
|
||||
if (res) {
|
||||
dprintk("Openning slave %s failed\n", slave_dev->name);
|
||||
goto err_restore_mac;
|
||||
}
|
||||
|
||||
res = netdev_set_master(slave_dev, bond_dev);
|
||||
if (res) {
|
||||
dprintk("Error %d calling netdev_set_master\n", res);
|
||||
if (app_abi_ver < 1) {
|
||||
goto err_free;
|
||||
} else {
|
||||
goto err_close;
|
||||
}
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
new_slave->dev = slave_dev;
|
||||
|
@ -1997,39 +1966,6 @@ static int bond_enslave(struct net_device *bond_dev, struct net_device *slave_de
|
|||
|
||||
write_unlock_bh(&bond->lock);
|
||||
|
||||
if (app_abi_ver < 1) {
|
||||
/*
|
||||
* !!! This is to support old versions of ifenslave.
|
||||
* We can remove this in 2.5 because our ifenslave takes
|
||||
* care of this for us.
|
||||
* We check to see if the master has a mac address yet.
|
||||
* If not, we'll give it the mac address of our slave device.
|
||||
*/
|
||||
int ndx = 0;
|
||||
|
||||
for (ndx = 0; ndx < bond_dev->addr_len; ndx++) {
|
||||
dprintk("Checking ndx=%d of bond_dev->dev_addr\n",
|
||||
ndx);
|
||||
if (bond_dev->dev_addr[ndx] != 0) {
|
||||
dprintk("Found non-zero byte at ndx=%d\n",
|
||||
ndx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ndx == bond_dev->addr_len) {
|
||||
/*
|
||||
* We got all the way through the address and it was
|
||||
* all 0's.
|
||||
*/
|
||||
dprintk("%s doesn't have a MAC address yet. \n",
|
||||
bond_dev->name);
|
||||
dprintk("Going to give assign it from %s.\n",
|
||||
slave_dev->name);
|
||||
bond_sethwaddr(bond_dev, slave_dev);
|
||||
}
|
||||
}
|
||||
|
||||
printk(KERN_INFO DRV_NAME
|
||||
": %s: enslaving %s as a%s interface with a%s link.\n",
|
||||
bond_dev->name, slave_dev->name,
|
||||
|
@ -2227,12 +2163,10 @@ static int bond_release(struct net_device *bond_dev, struct net_device *slave_de
|
|||
/* close slave before restoring its mac address */
|
||||
dev_close(slave_dev);
|
||||
|
||||
if (app_abi_ver >= 1) {
|
||||
/* restore original ("permanent") mac address */
|
||||
memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);
|
||||
addr.sa_family = slave_dev->type;
|
||||
dev_set_mac_address(slave_dev, &addr);
|
||||
}
|
||||
/* restore original ("permanent") mac address */
|
||||
memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);
|
||||
addr.sa_family = slave_dev->type;
|
||||
dev_set_mac_address(slave_dev, &addr);
|
||||
|
||||
/* restore the original state of the
|
||||
* IFF_NOARP flag that might have been
|
||||
|
@ -2320,12 +2254,10 @@ static int bond_release_all(struct net_device *bond_dev)
|
|||
/* close slave before restoring its mac address */
|
||||
dev_close(slave_dev);
|
||||
|
||||
if (app_abi_ver >= 1) {
|
||||
/* restore original ("permanent") mac address*/
|
||||
memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);
|
||||
addr.sa_family = slave_dev->type;
|
||||
dev_set_mac_address(slave_dev, &addr);
|
||||
}
|
||||
/* restore original ("permanent") mac address*/
|
||||
memcpy(addr.sa_data, slave->perm_hwaddr, ETH_ALEN);
|
||||
addr.sa_family = slave_dev->type;
|
||||
dev_set_mac_address(slave_dev, &addr);
|
||||
|
||||
/* restore the original state of the IFF_NOARP flag that might have
|
||||
* been set by bond_set_slave_inactive_flags()
|
||||
|
@ -2423,57 +2355,6 @@ static int bond_ioctl_change_active(struct net_device *bond_dev, struct net_devi
|
|||
return res;
|
||||
}
|
||||
|
||||
static int bond_ethtool_ioctl(struct net_device *bond_dev, struct ifreq *ifr)
|
||||
{
|
||||
struct ethtool_drvinfo info;
|
||||
void __user *addr = ifr->ifr_data;
|
||||
uint32_t cmd;
|
||||
|
||||
if (get_user(cmd, (uint32_t __user *)addr)) {
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case ETHTOOL_GDRVINFO:
|
||||
if (copy_from_user(&info, addr, sizeof(info))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (strcmp(info.driver, "ifenslave") == 0) {
|
||||
int new_abi_ver;
|
||||
char *endptr;
|
||||
|
||||
new_abi_ver = simple_strtoul(info.fw_version,
|
||||
&endptr, 0);
|
||||
if (*endptr) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: got invalid ABI "
|
||||
"version from application\n");
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (orig_app_abi_ver == -1) {
|
||||
orig_app_abi_ver = new_abi_ver;
|
||||
}
|
||||
|
||||
app_abi_ver = new_abi_ver;
|
||||
}
|
||||
|
||||
strncpy(info.driver, DRV_NAME, 32);
|
||||
strncpy(info.version, DRV_VERSION, 32);
|
||||
snprintf(info.fw_version, 32, "%d", BOND_ABI_VERSION);
|
||||
|
||||
if (copy_to_user(addr, &info, sizeof(info))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int bond_info_query(struct net_device *bond_dev, struct ifbond *info)
|
||||
{
|
||||
struct bonding *bond = bond_dev->priv;
|
||||
|
@ -3442,16 +3323,11 @@ static void bond_info_show_slave(struct seq_file *seq, const struct slave *slave
|
|||
seq_printf(seq, "Link Failure Count: %d\n",
|
||||
slave->link_failure_count);
|
||||
|
||||
if (app_abi_ver >= 1) {
|
||||
seq_printf(seq,
|
||||
"Permanent HW addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
slave->perm_hwaddr[0],
|
||||
slave->perm_hwaddr[1],
|
||||
slave->perm_hwaddr[2],
|
||||
slave->perm_hwaddr[3],
|
||||
slave->perm_hwaddr[4],
|
||||
slave->perm_hwaddr[5]);
|
||||
}
|
||||
seq_printf(seq,
|
||||
"Permanent HW addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
slave->perm_hwaddr[0], slave->perm_hwaddr[1],
|
||||
slave->perm_hwaddr[2], slave->perm_hwaddr[3],
|
||||
slave->perm_hwaddr[4], slave->perm_hwaddr[5]);
|
||||
|
||||
if (bond->params.mode == BOND_MODE_8023AD) {
|
||||
const struct aggregator *agg
|
||||
|
@ -4010,15 +3886,12 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
|
|||
struct ifslave k_sinfo;
|
||||
struct ifslave __user *u_sinfo = NULL;
|
||||
struct mii_ioctl_data *mii = NULL;
|
||||
int prev_abi_ver = orig_app_abi_ver;
|
||||
int res = 0;
|
||||
|
||||
dprintk("bond_ioctl: master=%s, cmd=%d\n",
|
||||
bond_dev->name, cmd);
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCETHTOOL:
|
||||
return bond_ethtool_ioctl(bond_dev, ifr);
|
||||
case SIOCGMIIPHY:
|
||||
mii = if_mii(ifr);
|
||||
if (!mii) {
|
||||
|
@ -4090,21 +3963,6 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
|
|||
return -EPERM;
|
||||
}
|
||||
|
||||
if (orig_app_abi_ver == -1) {
|
||||
/* no orig_app_abi_ver was provided yet, so we'll use the
|
||||
* current one from now on, even if it's 0
|
||||
*/
|
||||
orig_app_abi_ver = app_abi_ver;
|
||||
|
||||
} else if (orig_app_abi_ver != app_abi_ver) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Error: already using ifenslave ABI version %d; to "
|
||||
"upgrade ifenslave to version %d, you must first "
|
||||
"reload bonding.\n",
|
||||
orig_app_abi_ver, app_abi_ver);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
slave_dev = dev_get_by_name(ifr->ifr_slave);
|
||||
|
||||
dprintk("slave_dev=%p: \n", slave_dev);
|
||||
|
@ -4137,14 +3995,6 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
|
|||
dev_put(slave_dev);
|
||||
}
|
||||
|
||||
if (res < 0) {
|
||||
/* The ioctl failed, so there's no point in changing the
|
||||
* orig_app_abi_ver. We'll restore it's value just in case
|
||||
* we've changed it earlier in this function.
|
||||
*/
|
||||
orig_app_abi_ver = prev_abi_ver;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -4578,9 +4428,18 @@ static inline void bond_set_mode_ops(struct bonding *bond, int mode)
|
|||
}
|
||||
}
|
||||
|
||||
static void bond_ethtool_get_drvinfo(struct net_device *bond_dev,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
{
|
||||
strncpy(drvinfo->driver, DRV_NAME, 32);
|
||||
strncpy(drvinfo->version, DRV_VERSION, 32);
|
||||
snprintf(drvinfo->fw_version, 32, "%d", BOND_ABI_VERSION);
|
||||
}
|
||||
|
||||
static struct ethtool_ops bond_ethtool_ops = {
|
||||
.get_tx_csum = ethtool_op_get_tx_csum,
|
||||
.get_sg = ethtool_op_get_sg,
|
||||
.get_drvinfo = bond_ethtool_get_drvinfo,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -40,8 +40,8 @@
|
|||
#include "bond_3ad.h"
|
||||
#include "bond_alb.h"
|
||||
|
||||
#define DRV_VERSION "2.6.3"
|
||||
#define DRV_RELDATE "June 8, 2005"
|
||||
#define DRV_VERSION "2.6.4"
|
||||
#define DRV_RELDATE "September 26, 2005"
|
||||
#define DRV_NAME "bonding"
|
||||
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
|
||||
|
||||
|
|
|
@ -1875,6 +1875,9 @@ static int emac_init_device(struct ocp_device *ocpdev, struct ibm_ocp_mal *mal)
|
|||
rc = -ENODEV;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* Disable any PHY features not supported by the platform */
|
||||
ep->phy_mii.def->features &= ~emacdata->phy_feat_exc;
|
||||
|
||||
/* Setup initial PHY config & startup aneg */
|
||||
if (ep->phy_mii.def->ops->init)
|
||||
|
@ -1882,6 +1885,34 @@ static int emac_init_device(struct ocp_device *ocpdev, struct ibm_ocp_mal *mal)
|
|||
netif_carrier_off(ndev);
|
||||
if (ep->phy_mii.def->features & SUPPORTED_Autoneg)
|
||||
ep->want_autoneg = 1;
|
||||
else {
|
||||
ep->want_autoneg = 0;
|
||||
|
||||
/* Select highest supported speed/duplex */
|
||||
if (ep->phy_mii.def->features & SUPPORTED_1000baseT_Full) {
|
||||
ep->phy_mii.speed = SPEED_1000;
|
||||
ep->phy_mii.duplex = DUPLEX_FULL;
|
||||
} else if (ep->phy_mii.def->features &
|
||||
SUPPORTED_1000baseT_Half) {
|
||||
ep->phy_mii.speed = SPEED_1000;
|
||||
ep->phy_mii.duplex = DUPLEX_HALF;
|
||||
} else if (ep->phy_mii.def->features &
|
||||
SUPPORTED_100baseT_Full) {
|
||||
ep->phy_mii.speed = SPEED_100;
|
||||
ep->phy_mii.duplex = DUPLEX_FULL;
|
||||
} else if (ep->phy_mii.def->features &
|
||||
SUPPORTED_100baseT_Half) {
|
||||
ep->phy_mii.speed = SPEED_100;
|
||||
ep->phy_mii.duplex = DUPLEX_HALF;
|
||||
} else if (ep->phy_mii.def->features &
|
||||
SUPPORTED_10baseT_Full) {
|
||||
ep->phy_mii.speed = SPEED_10;
|
||||
ep->phy_mii.duplex = DUPLEX_FULL;
|
||||
} else {
|
||||
ep->phy_mii.speed = SPEED_10;
|
||||
ep->phy_mii.duplex = DUPLEX_HALF;
|
||||
}
|
||||
}
|
||||
emac_start_link(ep, NULL);
|
||||
|
||||
/* read the MAC Address */
|
||||
|
|
|
@ -584,7 +584,7 @@ static inline int ns83820_add_rx_skb(struct ns83820 *dev, struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int rx_refill(struct net_device *ndev, int gfp)
|
||||
static inline int rx_refill(struct net_device *ndev, gfp_t gfp)
|
||||
{
|
||||
struct ns83820 *dev = PRIV(ndev);
|
||||
unsigned i;
|
||||
|
|
|
@ -1832,7 +1832,7 @@ static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
|
|||
{
|
||||
struct dev_mc_list *mc_addr;
|
||||
|
||||
for (mc_addr = addrs; mc_addr && --count > 0; mc_addr = mc_addr->next) {
|
||||
for (mc_addr = addrs; mc_addr && count-- > 0; mc_addr = mc_addr->next) {
|
||||
u_int position = ether_crc(6, mc_addr->dmi_addr);
|
||||
#ifndef final_version /* Verify multicast address. */
|
||||
if ((mc_addr->dmi_addr[0] & 1) == 0)
|
||||
|
|
|
@ -2837,21 +2837,29 @@ static void skge_netpoll(struct net_device *dev)
|
|||
static int skge_set_mac_address(struct net_device *dev, void *p)
|
||||
{
|
||||
struct skge_port *skge = netdev_priv(dev);
|
||||
struct sockaddr *addr = p;
|
||||
int err = 0;
|
||||
struct skge_hw *hw = skge->hw;
|
||||
unsigned port = skge->port;
|
||||
const struct sockaddr *addr = p;
|
||||
|
||||
if (!is_valid_ether_addr(addr->sa_data))
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
skge_down(dev);
|
||||
spin_lock_bh(&hw->phy_lock);
|
||||
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
|
||||
memcpy_toio(skge->hw->regs + B2_MAC_1 + skge->port*8,
|
||||
memcpy_toio(hw->regs + B2_MAC_1 + port*8,
|
||||
dev->dev_addr, ETH_ALEN);
|
||||
memcpy_toio(skge->hw->regs + B2_MAC_2 + skge->port*8,
|
||||
memcpy_toio(hw->regs + B2_MAC_2 + port*8,
|
||||
dev->dev_addr, ETH_ALEN);
|
||||
if (dev->flags & IFF_UP)
|
||||
err = skge_up(dev);
|
||||
return err;
|
||||
|
||||
if (hw->chip_id == CHIP_ID_GENESIS)
|
||||
xm_outaddr(hw, port, XM_SA, dev->dev_addr);
|
||||
else {
|
||||
gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr);
|
||||
gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr);
|
||||
}
|
||||
spin_unlock_bh(&hw->phy_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct {
|
||||
|
|
|
@ -133,14 +133,18 @@
|
|||
- finally added firmware (GPL'ed by Adaptec)
|
||||
- removed compatibility code for 2.2.x
|
||||
|
||||
LK1.4.2.1 (Ion Badulescu)
|
||||
- fixed 32/64 bit issues on i386 + CONFIG_HIGHMEM
|
||||
- added 32-bit padding to outgoing skb's, removed previous workaround
|
||||
|
||||
TODO: - fix forced speed/duplexing code (broken a long time ago, when
|
||||
somebody converted the driver to use the generic MII code)
|
||||
- fix VLAN support
|
||||
*/
|
||||
|
||||
#define DRV_NAME "starfire"
|
||||
#define DRV_VERSION "1.03+LK1.4.2"
|
||||
#define DRV_RELDATE "January 19, 2005"
|
||||
#define DRV_VERSION "1.03+LK1.4.2.1"
|
||||
#define DRV_RELDATE "October 3, 2005"
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/version.h>
|
||||
|
@ -165,6 +169,14 @@ TODO: - fix forced speed/duplexing code (broken a long time ago, when
|
|||
* of length 1. If and when this is fixed, the #define below can be removed.
|
||||
*/
|
||||
#define HAS_BROKEN_FIRMWARE
|
||||
|
||||
/*
|
||||
* If using the broken firmware, data must be padded to the next 32-bit boundary.
|
||||
*/
|
||||
#ifdef HAS_BROKEN_FIRMWARE
|
||||
#define PADDING_MASK 3
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define this if using the driver with the zero-copy patch
|
||||
*/
|
||||
|
@ -257,9 +269,10 @@ static int full_duplex[MAX_UNITS] = {0, };
|
|||
* This SUCKS.
|
||||
* We need a much better method to determine if dma_addr_t is 64-bit.
|
||||
*/
|
||||
#if (defined(__i386__) && defined(CONFIG_HIGHMEM) && (LINUX_VERSION_CODE > 0x20500 || defined(CONFIG_HIGHMEM64G))) || defined(__x86_64__) || defined (__ia64__) || defined(__mips64__) || (defined(__mips__) && defined(CONFIG_HIGHMEM) && defined(CONFIG_64BIT_PHYS_ADDR))
|
||||
#if (defined(__i386__) && defined(CONFIG_HIGHMEM64G)) || defined(__x86_64__) || defined (__ia64__) || defined(__mips64__) || (defined(__mips__) && defined(CONFIG_HIGHMEM) && defined(CONFIG_64BIT_PHYS_ADDR))
|
||||
/* 64-bit dma_addr_t */
|
||||
#define ADDR_64BITS /* This chip uses 64 bit addresses. */
|
||||
#define netdrv_addr_t u64
|
||||
#define cpu_to_dma(x) cpu_to_le64(x)
|
||||
#define dma_to_cpu(x) le64_to_cpu(x)
|
||||
#define RX_DESC_Q_ADDR_SIZE RxDescQAddr64bit
|
||||
|
@ -268,6 +281,7 @@ static int full_duplex[MAX_UNITS] = {0, };
|
|||
#define TX_COMPL_Q_ADDR_SIZE TxComplQAddr64bit
|
||||
#define RX_DESC_ADDR_SIZE RxDescAddr64bit
|
||||
#else /* 32-bit dma_addr_t */
|
||||
#define netdrv_addr_t u32
|
||||
#define cpu_to_dma(x) cpu_to_le32(x)
|
||||
#define dma_to_cpu(x) le32_to_cpu(x)
|
||||
#define RX_DESC_Q_ADDR_SIZE RxDescQAddr32bit
|
||||
|
@ -1333,21 +1347,10 @@ static int start_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
|
||||
#if defined(ZEROCOPY) && defined(HAS_BROKEN_FIRMWARE)
|
||||
{
|
||||
int has_bad_length = 0;
|
||||
|
||||
if (skb_first_frag_len(skb) == 1)
|
||||
has_bad_length = 1;
|
||||
else {
|
||||
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
|
||||
if (skb_shinfo(skb)->frags[i].size == 1) {
|
||||
has_bad_length = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_bad_length)
|
||||
skb_checksum_help(skb, 0);
|
||||
if (skb->ip_summed == CHECKSUM_HW) {
|
||||
skb = skb_padto(skb, (skb->len + PADDING_MASK) & ~PADDING_MASK);
|
||||
if (skb == NULL)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
#endif /* ZEROCOPY && HAS_BROKEN_FIRMWARE */
|
||||
|
||||
|
@ -2127,13 +2130,12 @@ static int __init starfire_init (void)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ADDR_64BITS
|
||||
/* we can do this test only at run-time... sigh */
|
||||
if (sizeof(dma_addr_t) == sizeof(u64)) {
|
||||
printk("This driver has not been ported to this 64-bit architecture yet\n");
|
||||
if (sizeof(dma_addr_t) != sizeof(netdrv_addr_t)) {
|
||||
printk("This driver has dma_addr_t issues, please send email to maintainer\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif /* not ADDR_64BITS */
|
||||
|
||||
return pci_module_init (&starfire_driver);
|
||||
}
|
||||
|
||||
|
|
|
@ -1035,7 +1035,8 @@ struct gem {
|
|||
|
||||
#define ALIGNED_RX_SKB_ADDR(addr) \
|
||||
((((unsigned long)(addr) + (64UL - 1UL)) & ~(64UL - 1UL)) - (unsigned long)(addr))
|
||||
static __inline__ struct sk_buff *gem_alloc_skb(int size, int gfp_flags)
|
||||
static __inline__ struct sk_buff *gem_alloc_skb(int size,
|
||||
gfp_t gfp_flags)
|
||||
{
|
||||
struct sk_buff *skb = alloc_skb(size + 64, gfp_flags);
|
||||
|
||||
|
|
|
@ -531,7 +531,6 @@ static int __devinit ibmtr_probe1(struct net_device *dev, int PIOaddr)
|
|||
if (!time_after(jiffies, timeout)) continue;
|
||||
DPRINTK( "Hardware timeout during initialization.\n");
|
||||
iounmap(t_mmio);
|
||||
kfree(ti);
|
||||
return -ENODEV;
|
||||
}
|
||||
ti->sram_phys =
|
||||
|
@ -645,7 +644,6 @@ static int __devinit ibmtr_probe1(struct net_device *dev, int PIOaddr)
|
|||
DPRINTK("Unknown shared ram paging info %01X\n",
|
||||
ti->shared_ram_paging);
|
||||
iounmap(t_mmio);
|
||||
kfree(ti);
|
||||
return -ENODEV;
|
||||
break;
|
||||
} /*end switch shared_ram_paging */
|
||||
|
@ -675,7 +673,6 @@ static int __devinit ibmtr_probe1(struct net_device *dev, int PIOaddr)
|
|||
"driver limit (%05x), adapter not started.\n",
|
||||
chk_base, ibmtr_mem_base + IBMTR_SHARED_RAM_SIZE);
|
||||
iounmap(t_mmio);
|
||||
kfree(ti);
|
||||
return -ENODEV;
|
||||
} else { /* seems cool, record what we have figured out */
|
||||
ti->sram_base = new_base >> 12;
|
||||
|
@ -690,7 +687,6 @@ static int __devinit ibmtr_probe1(struct net_device *dev, int PIOaddr)
|
|||
DPRINTK("Could not grab irq %d. Halting Token Ring driver.\n",
|
||||
irq);
|
||||
iounmap(t_mmio);
|
||||
kfree(ti);
|
||||
return -ENODEV;
|
||||
}
|
||||
/*?? Now, allocate some of the PIO PORTs for this driver.. */
|
||||
|
@ -699,7 +695,6 @@ static int __devinit ibmtr_probe1(struct net_device *dev, int PIOaddr)
|
|||
DPRINTK("Could not grab PIO range. Halting driver.\n");
|
||||
free_irq(dev->irq, dev);
|
||||
iounmap(t_mmio);
|
||||
kfree(ti);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue