Merge branch 'master' of /home/src/linux-2.6/
This commit is contained in:
commit
044a500e46
26
CREDITS
26
CREDITS
|
@ -2211,6 +2211,15 @@ D: OV511 driver
|
|||
S: (address available on request)
|
||||
S: USA
|
||||
|
||||
N: Ian McDonald
|
||||
E: iam4@cs.waikato.ac.nz
|
||||
E: imcdnzl@gmail.com
|
||||
W: http://wand.net.nz/~iam4
|
||||
W: http://imcdnzl.blogspot.com
|
||||
D: DCCP, CCID3
|
||||
S: Hamilton
|
||||
S: New Zealand
|
||||
|
||||
N: Patrick McHardy
|
||||
E: kaber@trash.net
|
||||
P: 1024D/12155E80 B128 7DE6 FF0A C2B2 48BE AB4C C9D4 964E 1215 5E80
|
||||
|
@ -2246,19 +2255,12 @@ S: D-90453 Nuernberg
|
|||
S: Germany
|
||||
|
||||
N: Arnaldo Carvalho de Melo
|
||||
E: acme@conectiva.com.br
|
||||
E: acme@kernel.org
|
||||
E: acme@gnu.org
|
||||
W: http://bazar2.conectiva.com.br/~acme
|
||||
W: http://advogato.org/person/acme
|
||||
E: acme@mandriva.com
|
||||
E: acme@ghostprotocols.net
|
||||
W: http://oops.ghostprotocols.net:81/blog/
|
||||
P: 1024D/9224DF01 D5DF E3BB E3C8 BCBB F8AD 841A B6AB 4681 9224 DF01
|
||||
D: wanrouter hacking
|
||||
D: misc Makefile, Config.in, drivers and network stacks fixes
|
||||
D: IPX & LLC network stacks maintainer
|
||||
D: Cyclom 2X synchronous card driver
|
||||
D: wl3501 PCMCIA wireless card driver
|
||||
D: i18n for minicom, net-tools, util-linux, fetchmail, etc
|
||||
S: Conectiva S.A.
|
||||
D: IPX, LLC, DCCP, cyc2x, wl3501_cs, net/ hacks
|
||||
S: Mandriva
|
||||
S: R. Tocantins, 89 - Cristo Rei
|
||||
S: 80050-430 - Curitiba - Paraná
|
||||
S: Brazil
|
||||
|
|
|
@ -410,7 +410,26 @@ Kernel messages do not have to be terminated with a period.
|
|||
Printing numbers in parentheses (%d) adds no value and should be avoided.
|
||||
|
||||
|
||||
Chapter 13: References
|
||||
Chapter 13: Allocating memory
|
||||
|
||||
The kernel provides the following general purpose memory allocators:
|
||||
kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API
|
||||
documentation for further information about them.
|
||||
|
||||
The preferred form for passing a size of a struct is the following:
|
||||
|
||||
p = kmalloc(sizeof(*p), ...);
|
||||
|
||||
The alternative form where struct name is spelled out hurts readability and
|
||||
introduces an opportunity for a bug when the pointer variable type is changed
|
||||
but the corresponding sizeof that is passed to a memory allocator is not.
|
||||
|
||||
Casting the return value which is a void pointer is redundant. The conversion
|
||||
from void pointer to any other pointer type is guaranteed by the C programming
|
||||
language.
|
||||
|
||||
|
||||
Chapter 14: References
|
||||
|
||||
The C Programming Language, Second Edition
|
||||
by Brian W. Kernighan and Dennis M. Ritchie.
|
||||
|
|
|
@ -13,6 +13,8 @@ the BIOS on Dell servers (starting from servers sold since 1999), desktops
|
|||
and notebooks (starting from those sold in 2005).
|
||||
Please go to http://support.dell.com register and you can find info on
|
||||
OpenManage and Dell Update packages (DUP).
|
||||
Libsmbios can also be used to update BIOS on Dell systems go to
|
||||
http://linux.dell.com/libsmbios/ for details.
|
||||
|
||||
Dell_RBU driver supports BIOS update using the monilothic image and packetized
|
||||
image methods. In case of moniolithic the driver allocates a contiguous chunk
|
||||
|
@ -22,8 +24,8 @@ would place each packet in contiguous physical memory. The driver also
|
|||
maintains a link list of packets for reading them back.
|
||||
If the dell_rbu driver is unloaded all the allocated memory is freed.
|
||||
|
||||
The rbu driver needs to have an application which will inform the BIOS to
|
||||
enable the update in the next system reboot.
|
||||
The rbu driver needs to have an application (as mentioned above)which will
|
||||
inform the BIOS to enable the update in the next system reboot.
|
||||
|
||||
The user should not unload the rbu driver after downloading the BIOS image
|
||||
or updating.
|
||||
|
@ -42,9 +44,11 @@ In case of packet mechanism the single memory can be broken in smaller chuks
|
|||
of contiguous memory and the BIOS image is scattered in these packets.
|
||||
|
||||
By default the driver uses monolithic memory for the update type. This can be
|
||||
changed to contiguous during the driver load time by specifying the load
|
||||
changed to packets during the driver load time by specifying the load
|
||||
parameter image_type=packet. This can also be changed later as below
|
||||
echo packet > /sys/devices/platform/dell_rbu/image_type
|
||||
Also echoing either mono ,packet or init in to image_type will free up the
|
||||
memory allocated by the driver.
|
||||
|
||||
Do the steps below to download the BIOS image.
|
||||
1) echo 1 > /sys/class/firmware/dell_rbu/loading
|
||||
|
@ -53,9 +57,13 @@ Do the steps below to download the BIOS image.
|
|||
|
||||
The /sys/class/firmware/dell_rbu/ entries will remain till the following is
|
||||
done.
|
||||
echo -1 > /sys/class/firmware/dell_rbu/loading
|
||||
|
||||
echo -1 > /sys/class/firmware/dell_rbu/loading.
|
||||
Until this step is completed the drivr cannot be unloaded.
|
||||
If an user by accident executes steps 1 and 3 above without executing step 2;
|
||||
it will make the /sys/class/firmware/dell_rbu/ entries to disappear.
|
||||
The entries can be recreated by doing the following
|
||||
echo init > /sys/devices/platform/dell_rbu/image_type
|
||||
NOTE: echoing init in image_type does not change it original value.
|
||||
|
||||
Also the driver provides /sys/devices/platform/dell_rbu/data readonly file to
|
||||
read back the image downloaded. This is useful in case of packet update
|
||||
|
|
|
@ -15,7 +15,7 @@ retrieve the data as it becomes available.
|
|||
|
||||
The format of the data logged into the channel buffers is completely
|
||||
up to the relayfs client; relayfs does however provide hooks which
|
||||
allow clients to impose some stucture on the buffer data. Nor does
|
||||
allow clients to impose some structure on the buffer data. Nor does
|
||||
relayfs implement any form of data filtering - this also is left to
|
||||
the client. The purpose is to keep relayfs as simple as possible.
|
||||
|
||||
|
|
|
@ -0,0 +1,194 @@
|
|||
An ad-hoc collection of notes on IA64 MCA and INIT processing. Feel
|
||||
free to update it with notes about any area that is not clear.
|
||||
|
||||
---
|
||||
|
||||
MCA/INIT are completely asynchronous. They can occur at any time, when
|
||||
the OS is in any state. Including when one of the cpus is already
|
||||
holding a spinlock. Trying to get any lock from MCA/INIT state is
|
||||
asking for deadlock. Also the state of structures that are protected
|
||||
by locks is indeterminate, including linked lists.
|
||||
|
||||
---
|
||||
|
||||
The complicated ia64 MCA process. All of this is mandated by Intel's
|
||||
specification for ia64 SAL, error recovery and and unwind, it is not as
|
||||
if we have a choice here.
|
||||
|
||||
* MCA occurs on one cpu, usually due to a double bit memory error.
|
||||
This is the monarch cpu.
|
||||
|
||||
* SAL sends an MCA rendezvous interrupt (which is a normal interrupt)
|
||||
to all the other cpus, the slaves.
|
||||
|
||||
* Slave cpus that receive the MCA interrupt call down into SAL, they
|
||||
end up spinning disabled while the MCA is being serviced.
|
||||
|
||||
* If any slave cpu was already spinning disabled when the MCA occurred
|
||||
then it cannot service the MCA interrupt. SAL waits ~20 seconds then
|
||||
sends an unmaskable INIT event to the slave cpus that have not
|
||||
already rendezvoused.
|
||||
|
||||
* Because MCA/INIT can be delivered at any time, including when the cpu
|
||||
is down in PAL in physical mode, the registers at the time of the
|
||||
event are _completely_ undefined. In particular the MCA/INIT
|
||||
handlers cannot rely on the thread pointer, PAL physical mode can
|
||||
(and does) modify TP. It is allowed to do that as long as it resets
|
||||
TP on return. However MCA/INIT events expose us to these PAL
|
||||
internal TP changes. Hence curr_task().
|
||||
|
||||
* If an MCA/INIT event occurs while the kernel was running (not user
|
||||
space) and the kernel has called PAL then the MCA/INIT handler cannot
|
||||
assume that the kernel stack is in a fit state to be used. Mainly
|
||||
because PAL may or may not maintain the stack pointer internally.
|
||||
Because the MCA/INIT handlers cannot trust the kernel stack, they
|
||||
have to use their own, per-cpu stacks. The MCA/INIT stacks are
|
||||
preformatted with just enough task state to let the relevant handlers
|
||||
do their job.
|
||||
|
||||
* Unlike most other architectures, the ia64 struct task is embedded in
|
||||
the kernel stack[1]. So switching to a new kernel stack means that
|
||||
we switch to a new task as well. Because various bits of the kernel
|
||||
assume that current points into the struct task, switching to a new
|
||||
stack also means a new value for current.
|
||||
|
||||
* Once all slaves have rendezvoused and are spinning disabled, the
|
||||
monarch is entered. The monarch now tries to diagnose the problem
|
||||
and decide if it can recover or not.
|
||||
|
||||
* Part of the monarch's job is to look at the state of all the other
|
||||
tasks. The only way to do that on ia64 is to call the unwinder,
|
||||
as mandated by Intel.
|
||||
|
||||
* The starting point for the unwind depends on whether a task is
|
||||
running or not. That is, whether it is on a cpu or is blocked. The
|
||||
monarch has to determine whether or not a task is on a cpu before it
|
||||
knows how to start unwinding it. The tasks that received an MCA or
|
||||
INIT event are no longer running, they have been converted to blocked
|
||||
tasks. But (and its a big but), the cpus that received the MCA
|
||||
rendezvous interrupt are still running on their normal kernel stacks!
|
||||
|
||||
* To distinguish between these two cases, the monarch must know which
|
||||
tasks are on a cpu and which are not. Hence each slave cpu that
|
||||
switches to an MCA/INIT stack, registers its new stack using
|
||||
set_curr_task(), so the monarch can tell that the _original_ task is
|
||||
no longer running on that cpu. That gives us a decent chance of
|
||||
getting a valid backtrace of the _original_ task.
|
||||
|
||||
* MCA/INIT can be nested, to a depth of 2 on any cpu. In the case of a
|
||||
nested error, we want diagnostics on the MCA/INIT handler that
|
||||
failed, not on the task that was originally running. Again this
|
||||
requires set_curr_task() so the MCA/INIT handlers can register their
|
||||
own stack as running on that cpu. Then a recursive error gets a
|
||||
trace of the failing handler's "task".
|
||||
|
||||
[1] My (Keith Owens) original design called for ia64 to separate its
|
||||
struct task and the kernel stacks. Then the MCA/INIT data would be
|
||||
chained stacks like i386 interrupt stacks. But that required
|
||||
radical surgery on the rest of ia64, plus extra hard wired TLB
|
||||
entries with its associated performance degradation. David
|
||||
Mosberger vetoed that approach. Which meant that separate kernel
|
||||
stacks meant separate "tasks" for the MCA/INIT handlers.
|
||||
|
||||
---
|
||||
|
||||
INIT is less complicated than MCA. Pressing the nmi button or using
|
||||
the equivalent command on the management console sends INIT to all
|
||||
cpus. SAL picks one one of the cpus as the monarch and the rest are
|
||||
slaves. All the OS INIT handlers are entered at approximately the same
|
||||
time. The OS monarch prints the state of all tasks and returns, after
|
||||
which the slaves return and the system resumes.
|
||||
|
||||
At least that is what is supposed to happen. Alas there are broken
|
||||
versions of SAL out there. Some drive all the cpus as monarchs. Some
|
||||
drive them all as slaves. Some drive one cpu as monarch, wait for that
|
||||
cpu to return from the OS then drive the rest as slaves. Some versions
|
||||
of SAL cannot even cope with returning from the OS, they spin inside
|
||||
SAL on resume. The OS INIT code has workarounds for some of these
|
||||
broken SAL symptoms, but some simply cannot be fixed from the OS side.
|
||||
|
||||
---
|
||||
|
||||
The scheduler hooks used by ia64 (curr_task, set_curr_task) are layer
|
||||
violations. Unfortunately MCA/INIT start off as massive layer
|
||||
violations (can occur at _any_ time) and they build from there.
|
||||
|
||||
At least ia64 makes an attempt at recovering from hardware errors, but
|
||||
it is a difficult problem because of the asynchronous nature of these
|
||||
errors. When processing an unmaskable interrupt we sometimes need
|
||||
special code to cope with our inability to take any locks.
|
||||
|
||||
---
|
||||
|
||||
How is ia64 MCA/INIT different from x86 NMI?
|
||||
|
||||
* x86 NMI typically gets delivered to one cpu. MCA/INIT gets sent to
|
||||
all cpus.
|
||||
|
||||
* x86 NMI cannot be nested. MCA/INIT can be nested, to a depth of 2
|
||||
per cpu.
|
||||
|
||||
* x86 has a separate struct task which points to one of multiple kernel
|
||||
stacks. ia64 has the struct task embedded in the single kernel
|
||||
stack, so switching stack means switching task.
|
||||
|
||||
* x86 does not call the BIOS so the NMI handler does not have to worry
|
||||
about any registers having changed. MCA/INIT can occur while the cpu
|
||||
is in PAL in physical mode, with undefined registers and an undefined
|
||||
kernel stack.
|
||||
|
||||
* i386 backtrace is not very sensitive to whether a process is running
|
||||
or not. ia64 unwind is very, very sensitive to whether a process is
|
||||
running or not.
|
||||
|
||||
---
|
||||
|
||||
What happens when MCA/INIT is delivered what a cpu is running user
|
||||
space code?
|
||||
|
||||
The user mode registers are stored in the RSE area of the MCA/INIT on
|
||||
entry to the OS and are restored from there on return to SAL, so user
|
||||
mode registers are preserved across a recoverable MCA/INIT. Since the
|
||||
OS has no idea what unwind data is available for the user space stack,
|
||||
MCA/INIT never tries to backtrace user space. Which means that the OS
|
||||
does not bother making the user space process look like a blocked task,
|
||||
i.e. the OS does not copy pt_regs and switch_stack to the user space
|
||||
stack. Also the OS has no idea how big the user space RSE and memory
|
||||
stacks are, which makes it too risky to copy the saved state to a user
|
||||
mode stack.
|
||||
|
||||
---
|
||||
|
||||
How do we get a backtrace on the tasks that were running when MCA/INIT
|
||||
was delivered?
|
||||
|
||||
mca.c:::ia64_mca_modify_original_stack(). That identifies and
|
||||
verifies the original kernel stack, copies the dirty registers from
|
||||
the MCA/INIT stack's RSE to the original stack's RSE, copies the
|
||||
skeleton struct pt_regs and switch_stack to the original stack, fills
|
||||
in the skeleton structures from the PAL minstate area and updates the
|
||||
original stack's thread.ksp. That makes the original stack look
|
||||
exactly like any other blocked task, i.e. it now appears to be
|
||||
sleeping. To get a backtrace, just start with thread.ksp for the
|
||||
original task and unwind like any other sleeping task.
|
||||
|
||||
---
|
||||
|
||||
How do we identify the tasks that were running when MCA/INIT was
|
||||
delivered?
|
||||
|
||||
If the previous task has been verified and converted to a blocked
|
||||
state, then sos->prev_task on the MCA/INIT stack is updated to point to
|
||||
the previous task. You can look at that field in dumps or debuggers.
|
||||
To help distinguish between the handler and the original tasks,
|
||||
handlers have _TIF_MCA_INIT set in thread_info.flags.
|
||||
|
||||
The sos data is always in the MCA/INIT handler stack, at offset
|
||||
MCA_SOS_OFFSET. You can get that value from mca_asm.h or calculate it
|
||||
as KERNEL_STACK_SIZE - sizeof(struct pt_regs) - sizeof(struct
|
||||
ia64_sal_os_state), with 16 byte alignment for all structures.
|
||||
|
||||
Also the comm field of the MCA/INIT task is modified to include the pid
|
||||
of the original task, for humans to use. For example, a comm field of
|
||||
'MCA 12159' means that pid 12159 was running when the MCA was
|
||||
delivered.
|
13
MAINTAINERS
13
MAINTAINERS
|
@ -686,6 +686,13 @@ P: Guennadi Liakhovetski
|
|||
M: g.liakhovetski@gmx.de
|
||||
S: Maintained
|
||||
|
||||
DCCP PROTOCOL
|
||||
P: Arnaldo Carvalho de Melo
|
||||
M: acme@mandriva.com
|
||||
L: dccp@vger.kernel.org
|
||||
W: http://www.wlug.org.nz/DCCP
|
||||
S: Maintained
|
||||
|
||||
DECnet NETWORK LAYER
|
||||
P: Patrick Caulfield
|
||||
M: patrick@tykepenguin.com
|
||||
|
@ -2271,12 +2278,6 @@ M: R.E.Wolff@BitWizard.nl
|
|||
L: linux-kernel@vger.kernel.org ?
|
||||
S: Supported
|
||||
|
||||
SPX NETWORK LAYER
|
||||
P: Jay Schulist
|
||||
M: jschlst@samba.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
SRM (Alpha) environment access
|
||||
P: Jan-Benedict Glaw
|
||||
M: jbglaw@lug-owl.de
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/namei.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/vfs.h>
|
||||
#include <linux/rcupdate.h>
|
||||
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -975,6 +976,7 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
|||
long timeout;
|
||||
int ret = -EINVAL;
|
||||
struct fdtable *fdt;
|
||||
int max_fdset;
|
||||
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
if (tvp) {
|
||||
|
@ -996,8 +998,11 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
|||
}
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
fdt = files_fdtable(current->files);
|
||||
if (n < 0 || n > fdt->max_fdset)
|
||||
max_fdset = fdt->max_fdset;
|
||||
rcu_read_unlock();
|
||||
if (n < 0 || n > max_fdset)
|
||||
goto out_nofds;
|
||||
|
||||
/*
|
||||
|
|
|
@ -551,7 +551,7 @@ struct locomo_save_data {
|
|||
u16 LCM_SPIMD;
|
||||
};
|
||||
|
||||
static int locomo_suspend(struct device *dev, u32 pm_message_t, u32 level)
|
||||
static int locomo_suspend(struct device *dev, pm_message_t state, u32 level)
|
||||
{
|
||||
struct locomo *lchip = dev_get_drvdata(dev);
|
||||
struct locomo_save_data *save;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:41:21 2005
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:51:52 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -135,7 +135,6 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
|
@ -178,6 +177,68 @@ CONFIG_BINFMT_ELF=y
|
|||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# 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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -248,6 +309,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -334,72 +396,8 @@ CONFIG_IOSCHED_CFQ=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -509,6 +507,8 @@ CONFIG_DLCI_MAX=8
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -635,7 +635,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
|
@ -649,11 +649,28 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
CONFIG_I2C_SENSOR=y
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -679,30 +696,15 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -770,6 +772,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -812,8 +815,7 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:01 2005
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:01 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -136,7 +136,6 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
|
@ -179,6 +178,68 @@ CONFIG_BINFMT_ELF=y
|
|||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# 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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -249,6 +310,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -335,72 +397,8 @@ CONFIG_IOSCHED_CFQ=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -510,6 +508,8 @@ CONFIG_DLCI_MAX=8
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -636,7 +636,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
|
@ -650,11 +650,28 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
CONFIG_I2C_SENSOR=y
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -680,30 +697,15 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -771,6 +773,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -813,8 +816,7 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:08 2005
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:10 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -136,7 +136,6 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
|
@ -179,6 +178,68 @@ CONFIG_BINFMT_ELF=y
|
|||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# 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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -249,6 +310,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -335,72 +397,8 @@ CONFIG_IOSCHED_CFQ=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -511,6 +509,8 @@ CONFIG_DLCI_MAX=8
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -637,7 +637,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
|
@ -651,11 +651,28 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
CONFIG_I2C_SENSOR=y
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -681,30 +698,15 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -772,6 +774,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -814,8 +817,7 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:20 2005
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:23 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -136,7 +136,6 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
|
@ -179,6 +178,68 @@ CONFIG_BINFMT_ELF=y
|
|||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# 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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -249,6 +310,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -335,72 +397,8 @@ CONFIG_IOSCHED_CFQ=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -510,6 +508,8 @@ CONFIG_DLCI_MAX=8
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -636,7 +636,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
|
@ -650,11 +650,28 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
CONFIG_I2C_SENSOR=y
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -680,30 +697,15 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -771,6 +773,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -813,8 +816,7 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc2
|
||||
# Thu Jul 7 16:49:13 2005
|
||||
# Linux kernel version: 2.6.13
|
||||
# Wed Sep 14 10:52:16 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -136,7 +136,6 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
|
@ -179,6 +178,68 @@ CONFIG_BINFMT_ELF=y
|
|||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# 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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -249,6 +310,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
CONFIG_MTD_IXP2000=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PCI is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -335,72 +397,8 @@ CONFIG_IOSCHED_CFQ=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
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=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP 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_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER 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
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -511,6 +509,8 @@ CONFIG_DLCI_MAX=8
|
|||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -637,7 +637,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
CONFIG_I2C_IXP2000=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
|
@ -651,11 +651,28 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
CONFIG_I2C_SENSOR=y
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
CONFIG_I2C_SENSOR=y
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
|
@ -681,30 +698,15 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# 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
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -772,6 +774,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -814,8 +817,7 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
|
|
@ -178,7 +178,7 @@ int __down_trylock(struct semaphore * sem)
|
|||
* registers (r0 to r3 and lr), but not ip, as we use it as a return
|
||||
* value in some cases..
|
||||
*/
|
||||
asm(" .section .sched.text,\"ax\" \n\
|
||||
asm(" .section .sched.text,\"ax\",%progbits \n\
|
||||
.align 5 \n\
|
||||
.globl __down_failed \n\
|
||||
__down_failed: \n\
|
||||
|
|
|
@ -123,6 +123,7 @@ static void __init ixdp425_init(void)
|
|||
platform_add_devices(ixdp425_devices, ARRAY_SIZE(ixdp425_devices));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_IXDP465
|
||||
MACHINE_START(IXDP425, "Intel IXDP425 Development Platform")
|
||||
/* Maintainer: MontaVista Software, Inc. */
|
||||
.phys_ram = PHYS_OFFSET,
|
||||
|
@ -134,7 +135,9 @@ MACHINE_START(IXDP425, "Intel IXDP425 Development Platform")
|
|||
.boot_params = 0x0100,
|
||||
.init_machine = ixdp425_init,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_IXDP465
|
||||
MACHINE_START(IXDP465, "Intel IXDP465 Development Platform")
|
||||
/* Maintainer: MontaVista Software, Inc. */
|
||||
.phys_ram = PHYS_OFFSET,
|
||||
|
@ -146,7 +149,9 @@ MACHINE_START(IXDP465, "Intel IXDP465 Development Platform")
|
|||
.boot_params = 0x0100,
|
||||
.init_machine = ixdp425_init,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_PRPMC1100
|
||||
MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform")
|
||||
/* Maintainer: MontaVista Software, Inc. */
|
||||
.phys_ram = PHYS_OFFSET,
|
||||
|
@ -158,6 +163,7 @@ MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform")
|
|||
.boot_params = 0x0100,
|
||||
.init_machine = ixdp425_init,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Avila is functionally equivalent to IXDP425 except that it adds
|
||||
|
|
|
@ -198,13 +198,10 @@ static void corgi_mci_setpower(struct device *dev, unsigned int vdd)
|
|||
{
|
||||
struct pxamci_platform_data* p_d = dev->platform_data;
|
||||
|
||||
if (( 1 << vdd) & p_d->ocr_mask) {
|
||||
printk(KERN_DEBUG "%s: on\n", __FUNCTION__);
|
||||
if (( 1 << vdd) & p_d->ocr_mask)
|
||||
GPSR1 = GPIO_bit(CORGI_GPIO_SD_PWR);
|
||||
} else {
|
||||
printk(KERN_DEBUG "%s: off\n", __FUNCTION__);
|
||||
else
|
||||
GPCR1 = GPIO_bit(CORGI_GPIO_SD_PWR);
|
||||
}
|
||||
}
|
||||
|
||||
static int corgi_mci_get_ro(struct device *dev)
|
||||
|
@ -259,6 +256,16 @@ static struct platform_device *devices[] __initdata = {
|
|||
|
||||
static void __init corgi_init(void)
|
||||
{
|
||||
/* setup sleep mode values */
|
||||
PWER = 0x00000002;
|
||||
PFER = 0x00000000;
|
||||
PRER = 0x00000002;
|
||||
PGSR0 = 0x0158C000;
|
||||
PGSR1 = 0x00FF0080;
|
||||
PGSR2 = 0x0001C004;
|
||||
/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
|
||||
PCFR |= PCFR_OPDE;
|
||||
|
||||
corgi_ssp_set_machinfo(&corgi_ssp_machinfo);
|
||||
|
||||
pxa_gpio_mode(CORGI_GPIO_USB_PULLUP | GPIO_OUT);
|
||||
|
@ -285,42 +292,14 @@ static void __init fixup_corgi(struct machine_desc *desc,
|
|||
mi->bank[0].size = (64*1024*1024);
|
||||
}
|
||||
|
||||
static void __init corgi_init_irq(void)
|
||||
{
|
||||
pxa_init_irq();
|
||||
}
|
||||
|
||||
static struct map_desc corgi_io_desc[] __initdata = {
|
||||
/* virtual physical length */
|
||||
/* { 0xf1000000, 0x08000000, 0x01000000, MT_DEVICE },*/ /* LCDC (readable for Qt driver) */
|
||||
/* { 0xef700000, 0x10800000, 0x00001000, MT_DEVICE },*/ /* SCOOP */
|
||||
{ 0xef800000, 0x00000000, 0x00800000, MT_DEVICE }, /* Boot Flash */
|
||||
};
|
||||
|
||||
static void __init corgi_map_io(void)
|
||||
{
|
||||
pxa_map_io();
|
||||
iotable_init(corgi_io_desc,ARRAY_SIZE(corgi_io_desc));
|
||||
|
||||
/* setup sleep mode values */
|
||||
PWER = 0x00000002;
|
||||
PFER = 0x00000000;
|
||||
PRER = 0x00000002;
|
||||
PGSR0 = 0x0158C000;
|
||||
PGSR1 = 0x00FF0080;
|
||||
PGSR2 = 0x0001C004;
|
||||
/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
|
||||
PCFR |= PCFR_OPDE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MACH_CORGI
|
||||
MACHINE_START(CORGI, "SHARP Corgi")
|
||||
.phys_ram = 0xa0000000,
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.fixup = fixup_corgi,
|
||||
.map_io = corgi_map_io,
|
||||
.init_irq = corgi_init_irq,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa_init_irq,
|
||||
.init_machine = corgi_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
@ -332,8 +311,8 @@ MACHINE_START(SHEPHERD, "SHARP Shepherd")
|
|||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.fixup = fixup_corgi,
|
||||
.map_io = corgi_map_io,
|
||||
.init_irq = corgi_init_irq,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa_init_irq,
|
||||
.init_machine = corgi_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
@ -345,8 +324,8 @@ MACHINE_START(HUSKY, "SHARP Husky")
|
|||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.fixup = fixup_corgi,
|
||||
.map_io = corgi_map_io,
|
||||
.init_irq = corgi_init_irq,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa_init_irq,
|
||||
.init_machine = corgi_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
#include <asm/arch/irq.h>
|
||||
#include <asm/arch/mmc.h>
|
||||
#include <asm/arch/udc.h>
|
||||
#include <asm/arch/poodle.h>
|
||||
#include <asm/arch/pxafb.h>
|
||||
|
||||
|
@ -93,6 +95,83 @@ static struct platform_device locomo_device = {
|
|||
.resource = locomo_resources,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* MMC/SD Device
|
||||
*
|
||||
* The card detect interrupt isn't debounced so we delay it by 250ms
|
||||
* to give the card a chance to fully insert/eject.
|
||||
*/
|
||||
static struct pxamci_platform_data poodle_mci_platform_data;
|
||||
|
||||
static int poodle_mci_init(struct device *dev, irqreturn_t (*poodle_detect_int)(int, void *, struct pt_regs *), void *data)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* setup GPIO for PXA25x MMC controller */
|
||||
pxa_gpio_mode(GPIO6_MMCCLK_MD);
|
||||
pxa_gpio_mode(GPIO8_MMCCS0_MD);
|
||||
pxa_gpio_mode(POODLE_GPIO_nSD_DETECT | GPIO_IN);
|
||||
pxa_gpio_mode(POODLE_GPIO_SD_PWR | GPIO_OUT);
|
||||
|
||||
poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250);
|
||||
|
||||
err = request_irq(POODLE_IRQ_GPIO_nSD_DETECT, poodle_detect_int, SA_INTERRUPT,
|
||||
"MMC card detect", data);
|
||||
if (err) {
|
||||
printk(KERN_ERR "poodle_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
set_irq_type(POODLE_IRQ_GPIO_nSD_DETECT, IRQT_BOTHEDGE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void poodle_mci_setpower(struct device *dev, unsigned int vdd)
|
||||
{
|
||||
struct pxamci_platform_data* p_d = dev->platform_data;
|
||||
|
||||
if (( 1 << vdd) & p_d->ocr_mask)
|
||||
GPSR1 = GPIO_bit(POODLE_GPIO_SD_PWR);
|
||||
else
|
||||
GPCR1 = GPIO_bit(POODLE_GPIO_SD_PWR);
|
||||
}
|
||||
|
||||
static void poodle_mci_exit(struct device *dev, void *data)
|
||||
{
|
||||
free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data);
|
||||
}
|
||||
|
||||
static struct pxamci_platform_data poodle_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||
.init = poodle_mci_init,
|
||||
.setpower = poodle_mci_setpower,
|
||||
.exit = poodle_mci_exit,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* USB Device Controller
|
||||
*/
|
||||
static void poodle_udc_command(int cmd)
|
||||
{
|
||||
switch(cmd) {
|
||||
case PXA2XX_UDC_CMD_CONNECT:
|
||||
GPSR(POODLE_GPIO_USB_PULLUP) = GPIO_bit(POODLE_GPIO_USB_PULLUP);
|
||||
break;
|
||||
case PXA2XX_UDC_CMD_DISCONNECT:
|
||||
GPCR(POODLE_GPIO_USB_PULLUP) = GPIO_bit(POODLE_GPIO_USB_PULLUP);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct pxa2xx_udc_mach_info udc_info __initdata = {
|
||||
/* no connect GPIO; poodle can't tell connection status */
|
||||
.udc_command = poodle_udc_command,
|
||||
};
|
||||
|
||||
|
||||
/* PXAFB device */
|
||||
static struct pxafb_mach_info poodle_fb_info __initdata = {
|
||||
.pixclock = 144700,
|
||||
|
@ -126,6 +205,15 @@ static void __init poodle_init(void)
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
/* setup sleep mode values */
|
||||
PWER = 0x00000002;
|
||||
PFER = 0x00000000;
|
||||
PRER = 0x00000002;
|
||||
PGSR0 = 0x00008000;
|
||||
PGSR1 = 0x003F0202;
|
||||
PGSR2 = 0x0001C000;
|
||||
PCFR |= PCFR_OPDE;
|
||||
|
||||
/* cpu initialize */
|
||||
/* Pgsr Register */
|
||||
PGSR0 = 0x0146dd80;
|
||||
|
@ -155,6 +243,9 @@ static void __init poodle_init(void)
|
|||
GPSR2 = 0x00000000;
|
||||
|
||||
set_pxa_fb_info(&poodle_fb_info);
|
||||
pxa_gpio_mode(POODLE_GPIO_USB_PULLUP | GPIO_OUT);
|
||||
pxa_set_udc_info(&udc_info);
|
||||
pxa_set_mci_info(&poodle_mci_platform_data);
|
||||
|
||||
scoop_num = 1;
|
||||
scoop_devs = &poodle_pcmcia_scoop[0];
|
||||
|
@ -171,32 +262,12 @@ static void __init fixup_poodle(struct machine_desc *desc,
|
|||
sharpsl_save_param();
|
||||
}
|
||||
|
||||
static struct map_desc poodle_io_desc[] __initdata = {
|
||||
/* virtual physical length */
|
||||
{ 0xef800000, 0x00000000, 0x00800000, MT_DEVICE }, /* Boot Flash */
|
||||
};
|
||||
|
||||
static void __init poodle_map_io(void)
|
||||
{
|
||||
pxa_map_io();
|
||||
iotable_init(poodle_io_desc, ARRAY_SIZE(poodle_io_desc));
|
||||
|
||||
/* setup sleep mode values */
|
||||
PWER = 0x00000002;
|
||||
PFER = 0x00000000;
|
||||
PRER = 0x00000002;
|
||||
PGSR0 = 0x00008000;
|
||||
PGSR1 = 0x003F0202;
|
||||
PGSR2 = 0x0001C000;
|
||||
PCFR |= PCFR_OPDE;
|
||||
}
|
||||
|
||||
MACHINE_START(POODLE, "SHARP Poodle")
|
||||
.phys_ram = 0xa0000000,
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.fixup = fixup_poodle,
|
||||
.map_io = poodle_map_io,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa_init_irq,
|
||||
.timer = &pxa_timer,
|
||||
.init_machine = poodle_init,
|
||||
|
|
|
@ -111,12 +111,11 @@ static struct mtd_partition collie_partitions[] = {
|
|||
|
||||
static void collie_set_vpp(int vpp)
|
||||
{
|
||||
write_scoop_reg(SCOOP_GPCR, read_scoop_reg(SCOOP_GPCR) | COLLIE_SCP_VPEN);
|
||||
if (vpp) {
|
||||
write_scoop_reg(SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) | COLLIE_SCP_VPEN);
|
||||
} else {
|
||||
write_scoop_reg(SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) & ~COLLIE_SCP_VPEN);
|
||||
}
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR, read_scoop_reg(SCOOP_GPCR) | COLLIE_SCP_VPEN);
|
||||
if (vpp)
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) | COLLIE_SCP_VPEN);
|
||||
else
|
||||
write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(SCOOP_GPWR) & ~COLLIE_SCP_VPEN);
|
||||
}
|
||||
|
||||
static struct flash_platform_data collie_flash_data = {
|
||||
|
|
|
@ -39,3 +39,6 @@ extern void sa11x0_set_ssp_data(struct sa11x0_ssp_plat_ops *ops);
|
|||
|
||||
struct irda_platform_data;
|
||||
void sa11x0_set_irda_data(struct irda_platform_data *irda);
|
||||
|
||||
struct mcp_plat_data;
|
||||
void sa11x0_set_mcp_data(struct mcp_plat_data *data);
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* Bright Star Engineering Inc.
|
||||
*
|
||||
* code for readng parameters from the
|
||||
* parameter blocks of the boot block
|
||||
* flash memory
|
||||
*
|
||||
*/
|
||||
|
||||
static int strcmp(const char *s1, const char *s2)
|
||||
{
|
||||
while (*s1 != '\0' && *s1 == *s2)
|
||||
{
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
|
||||
return (*(unsigned char *) s1) - (*(unsigned char *) s2);
|
||||
}
|
||||
|
||||
struct pblk_t {
|
||||
char type;
|
||||
unsigned short size;
|
||||
};
|
||||
|
||||
static char *bse_getflashparam(char *name) {
|
||||
unsigned int esize;
|
||||
char *q,*r;
|
||||
unsigned char *p,*e;
|
||||
struct pblk_t *thepb = (struct pblk_t *) 0x00004000;
|
||||
struct pblk_t *altpb = (struct pblk_t *) 0x00006000;
|
||||
if (thepb->type&1) {
|
||||
if (altpb->type&1) {
|
||||
/* no valid param block */
|
||||
return (char*)0;
|
||||
} else {
|
||||
/* altpb is valid */
|
||||
struct pblk_t *tmp;
|
||||
tmp = thepb;
|
||||
thepb = altpb;
|
||||
altpb = tmp;
|
||||
}
|
||||
}
|
||||
p = (char*)thepb + sizeof(struct pblk_t);
|
||||
e = p + thepb->size;
|
||||
while (p < e) {
|
||||
q = p;
|
||||
esize = *p;
|
||||
if (esize == 0xFF) break;
|
||||
if (esize == 0) break;
|
||||
if (esize > 127) {
|
||||
esize = (esize&0x7F)<<8 | p[1];
|
||||
q++;
|
||||
}
|
||||
q++;
|
||||
r=q;
|
||||
if (*r && ((name == 0) || (!strcmp(name,r)))) {
|
||||
while (*q++) ;
|
||||
return q;
|
||||
}
|
||||
p+=esize;
|
||||
}
|
||||
return (char*)0;
|
||||
}
|
||||
|
||||
void bse_setup(void) {
|
||||
/* extract the linux cmdline from flash */
|
||||
char *name=bse_getflashparam("linuxboot");
|
||||
char *x = (char *)0xc0000100;
|
||||
if (name) {
|
||||
while (*name) *x++=*name++;
|
||||
}
|
||||
*x=0;
|
||||
}
|
|
@ -899,7 +899,7 @@ int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
|
|||
if ((err = iosapic_init(phys_addr, gsi_base)))
|
||||
return err;
|
||||
|
||||
#if CONFIG_ACPI_NUMA
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
acpi_map_iosapic(handle, 0, NULL, NULL);
|
||||
#endif /* CONFIG_ACPI_NUMA */
|
||||
|
||||
|
|
|
@ -491,7 +491,7 @@ GLOBAL_ENTRY(prefetch_stack)
|
|||
;;
|
||||
lfetch.fault [r16], 128
|
||||
br.ret.sptk.many rp
|
||||
END(prefetch_switch_stack)
|
||||
END(prefetch_stack)
|
||||
|
||||
GLOBAL_ENTRY(execve)
|
||||
mov r15=__NR_execve // put syscall number in place
|
||||
|
|
|
@ -84,23 +84,23 @@ mca_page_isolate(unsigned long paddr)
|
|||
struct page *p;
|
||||
|
||||
/* whether physical address is valid or not */
|
||||
if ( !ia64_phys_addr_valid(paddr) )
|
||||
if (!ia64_phys_addr_valid(paddr))
|
||||
return ISOLATE_NG;
|
||||
|
||||
/* convert physical address to physical page number */
|
||||
p = pfn_to_page(paddr>>PAGE_SHIFT);
|
||||
|
||||
/* check whether a page number have been already registered or not */
|
||||
for( i = 0; i < num_page_isolate; i++ )
|
||||
if( page_isolate[i] == p )
|
||||
for (i = 0; i < num_page_isolate; i++)
|
||||
if (page_isolate[i] == p)
|
||||
return ISOLATE_OK; /* already listed */
|
||||
|
||||
/* limitation check */
|
||||
if( num_page_isolate == MAX_PAGE_ISOLATE )
|
||||
if (num_page_isolate == MAX_PAGE_ISOLATE)
|
||||
return ISOLATE_NG;
|
||||
|
||||
/* kick pages having attribute 'SLAB' or 'Reserved' */
|
||||
if( PageSlab(p) || PageReserved(p) )
|
||||
if (PageSlab(p) || PageReserved(p))
|
||||
return ISOLATE_NG;
|
||||
|
||||
/* add attribute 'Reserved' and register the page */
|
||||
|
@ -139,10 +139,10 @@ mca_handler_bh(unsigned long paddr)
|
|||
* @peidx: pointer to index of processor error section
|
||||
*/
|
||||
|
||||
static void
|
||||
static void
|
||||
mca_make_peidx(sal_log_processor_info_t *slpi, peidx_table_t *peidx)
|
||||
{
|
||||
/*
|
||||
/*
|
||||
* calculate the start address of
|
||||
* "struct cpuid_info" and "sal_processor_static_info_t".
|
||||
*/
|
||||
|
@ -164,7 +164,7 @@ mca_make_peidx(sal_log_processor_info_t *slpi, peidx_table_t *peidx)
|
|||
}
|
||||
|
||||
/**
|
||||
* mca_make_slidx - Make index of SAL error record
|
||||
* mca_make_slidx - Make index of SAL error record
|
||||
* @buffer: pointer to SAL error record
|
||||
* @slidx: pointer to index of SAL error record
|
||||
*
|
||||
|
@ -172,12 +172,12 @@ mca_make_peidx(sal_log_processor_info_t *slpi, peidx_table_t *peidx)
|
|||
* 1 if record has platform error / 0 if not
|
||||
*/
|
||||
#define LOG_INDEX_ADD_SECT_PTR(sect, ptr) \
|
||||
{ slidx_list_t *hl = &slidx_pool.buffer[slidx_pool.cur_idx]; \
|
||||
hl->hdr = ptr; \
|
||||
list_add(&hl->list, &(sect)); \
|
||||
slidx_pool.cur_idx = (slidx_pool.cur_idx + 1)%slidx_pool.max_idx; }
|
||||
{slidx_list_t *hl = &slidx_pool.buffer[slidx_pool.cur_idx]; \
|
||||
hl->hdr = ptr; \
|
||||
list_add(&hl->list, &(sect)); \
|
||||
slidx_pool.cur_idx = (slidx_pool.cur_idx + 1)%slidx_pool.max_idx; }
|
||||
|
||||
static int
|
||||
static int
|
||||
mca_make_slidx(void *buffer, slidx_table_t *slidx)
|
||||
{
|
||||
int platform_err = 0;
|
||||
|
@ -214,28 +214,36 @@ mca_make_slidx(void *buffer, slidx_table_t *slidx)
|
|||
sp = (sal_log_section_hdr_t *)((char*)buffer + ercd_pos);
|
||||
if (!efi_guidcmp(sp->guid, SAL_PROC_DEV_ERR_SECT_GUID)) {
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->proc_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_MEM_DEV_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->mem_dev_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_SEL_DEV_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_SEL_DEV_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->sel_dev_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_PCI_BUS_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_PCI_BUS_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->pci_bus_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->smbios_dev_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_PCI_COMP_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_PCI_COMP_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->pci_comp_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_SPECIFIC_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->plat_specific_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_HOST_CTLR_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_HOST_CTLR_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->host_ctlr_err, sp);
|
||||
} else if (!efi_guidcmp(sp->guid, SAL_PLAT_BUS_ERR_SECT_GUID)) {
|
||||
} else if (!efi_guidcmp(sp->guid,
|
||||
SAL_PLAT_BUS_ERR_SECT_GUID)) {
|
||||
platform_err = 1;
|
||||
LOG_INDEX_ADD_SECT_PTR(slidx->plat_bus_err, sp);
|
||||
} else {
|
||||
|
@ -253,15 +261,16 @@ mca_make_slidx(void *buffer, slidx_table_t *slidx)
|
|||
* Return value:
|
||||
* 0 on Success / -ENOMEM on Failure
|
||||
*/
|
||||
static int
|
||||
static int
|
||||
init_record_index_pools(void)
|
||||
{
|
||||
int i;
|
||||
int rec_max_size; /* Maximum size of SAL error records */
|
||||
int sect_min_size; /* Minimum size of SAL error sections */
|
||||
/* minimum size table of each section */
|
||||
static int sal_log_sect_min_sizes[] = {
|
||||
sizeof(sal_log_processor_info_t) + sizeof(sal_processor_static_info_t),
|
||||
static int sal_log_sect_min_sizes[] = {
|
||||
sizeof(sal_log_processor_info_t)
|
||||
+ sizeof(sal_processor_static_info_t),
|
||||
sizeof(sal_log_mem_dev_err_info_t),
|
||||
sizeof(sal_log_sel_dev_err_info_t),
|
||||
sizeof(sal_log_pci_bus_err_info_t),
|
||||
|
@ -294,7 +303,8 @@ init_record_index_pools(void)
|
|||
|
||||
/* - 3 - */
|
||||
slidx_pool.max_idx = (rec_max_size/sect_min_size) * 2 + 1;
|
||||
slidx_pool.buffer = (slidx_list_t *) kmalloc(slidx_pool.max_idx * sizeof(slidx_list_t), GFP_KERNEL);
|
||||
slidx_pool.buffer = (slidx_list_t *)
|
||||
kmalloc(slidx_pool.max_idx * sizeof(slidx_list_t), GFP_KERNEL);
|
||||
|
||||
return slidx_pool.buffer ? 0 : -ENOMEM;
|
||||
}
|
||||
|
@ -308,6 +318,7 @@ init_record_index_pools(void)
|
|||
* is_mca_global - Check whether this MCA is global or not
|
||||
* @peidx: pointer of index of processor error section
|
||||
* @pbci: pointer to pal_bus_check_info_t
|
||||
* @sos: pointer to hand off struct between SAL and OS
|
||||
*
|
||||
* Return value:
|
||||
* MCA_IS_LOCAL / MCA_IS_GLOBAL
|
||||
|
@ -317,11 +328,12 @@ static mca_type_t
|
|||
is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
||||
struct ia64_sal_os_state *sos)
|
||||
{
|
||||
pal_processor_state_info_t *psp = (pal_processor_state_info_t*)peidx_psp(peidx);
|
||||
pal_processor_state_info_t *psp =
|
||||
(pal_processor_state_info_t*)peidx_psp(peidx);
|
||||
|
||||
/*
|
||||
/*
|
||||
* PAL can request a rendezvous, if the MCA has a global scope.
|
||||
* If "rz_always" flag is set, SAL requests MCA rendezvous
|
||||
* If "rz_always" flag is set, SAL requests MCA rendezvous
|
||||
* in spite of global MCA.
|
||||
* Therefore it is local MCA when rendezvous has not been requested.
|
||||
* Failed to rendezvous, the system must be down.
|
||||
|
@ -381,13 +393,15 @@ is_mca_global(peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
|||
* @slidx: pointer of index of SAL error record
|
||||
* @peidx: pointer of index of processor error section
|
||||
* @pbci: pointer of pal_bus_check_info
|
||||
* @sos: pointer to hand off struct between SAL and OS
|
||||
*
|
||||
* Return value:
|
||||
* 1 on Success / 0 on Failure
|
||||
*/
|
||||
|
||||
static int
|
||||
recover_from_read_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
||||
recover_from_read_error(slidx_table_t *slidx,
|
||||
peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
||||
struct ia64_sal_os_state *sos)
|
||||
{
|
||||
sal_log_mod_error_info_t *smei;
|
||||
|
@ -453,24 +467,28 @@ recover_from_read_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_chec
|
|||
* @slidx: pointer of index of SAL error record
|
||||
* @peidx: pointer of index of processor error section
|
||||
* @pbci: pointer of pal_bus_check_info
|
||||
* @sos: pointer to hand off struct between SAL and OS
|
||||
*
|
||||
* Return value:
|
||||
* 1 on Success / 0 on Failure
|
||||
*/
|
||||
|
||||
static int
|
||||
recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
||||
recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx,
|
||||
pal_bus_check_info_t *pbci,
|
||||
struct ia64_sal_os_state *sos)
|
||||
{
|
||||
int status = 0;
|
||||
pal_processor_state_info_t *psp = (pal_processor_state_info_t*)peidx_psp(peidx);
|
||||
pal_processor_state_info_t *psp =
|
||||
(pal_processor_state_info_t*)peidx_psp(peidx);
|
||||
|
||||
if (psp->bc && pbci->eb && pbci->bsi == 0) {
|
||||
switch(pbci->type) {
|
||||
case 1: /* partial read */
|
||||
case 3: /* full line(cpu) read */
|
||||
case 9: /* I/O space read */
|
||||
status = recover_from_read_error(slidx, peidx, pbci, sos);
|
||||
status = recover_from_read_error(slidx, peidx, pbci,
|
||||
sos);
|
||||
break;
|
||||
case 0: /* unknown */
|
||||
case 2: /* partial write */
|
||||
|
@ -481,7 +499,8 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_
|
|||
case 8: /* write coalescing transactions */
|
||||
case 10: /* I/O space write */
|
||||
case 11: /* inter-processor interrupt message(IPI) */
|
||||
case 12: /* interrupt acknowledge or external task priority cycle */
|
||||
case 12: /* interrupt acknowledge or
|
||||
external task priority cycle */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -496,6 +515,7 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_
|
|||
* @slidx: pointer of index of SAL error record
|
||||
* @peidx: pointer of index of processor error section
|
||||
* @pbci: pointer of pal_bus_check_info
|
||||
* @sos: pointer to hand off struct between SAL and OS
|
||||
*
|
||||
* Return value:
|
||||
* 1 on Success / 0 on Failure
|
||||
|
@ -509,15 +529,17 @@ recover_from_platform_error(slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_
|
|||
*/
|
||||
|
||||
static int
|
||||
recover_from_processor_error(int platform, slidx_table_t *slidx, peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
||||
recover_from_processor_error(int platform, slidx_table_t *slidx,
|
||||
peidx_table_t *peidx, pal_bus_check_info_t *pbci,
|
||||
struct ia64_sal_os_state *sos)
|
||||
{
|
||||
pal_processor_state_info_t *psp = (pal_processor_state_info_t*)peidx_psp(peidx);
|
||||
pal_processor_state_info_t *psp =
|
||||
(pal_processor_state_info_t*)peidx_psp(peidx);
|
||||
|
||||
/*
|
||||
/*
|
||||
* We cannot recover errors with other than bus_check.
|
||||
*/
|
||||
if (psp->cc || psp->rc || psp->uc)
|
||||
if (psp->cc || psp->rc || psp->uc)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
@ -546,10 +568,10 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, peidx_table_t *
|
|||
* (e.g. a load from poisoned memory)
|
||||
* This means "there are some platform errors".
|
||||
*/
|
||||
if (platform)
|
||||
if (platform)
|
||||
return recover_from_platform_error(slidx, peidx, pbci, sos);
|
||||
/*
|
||||
* On account of strange SAL error record, we cannot recover.
|
||||
/*
|
||||
* On account of strange SAL error record, we cannot recover.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
@ -557,14 +579,14 @@ recover_from_processor_error(int platform, slidx_table_t *slidx, peidx_table_t *
|
|||
/**
|
||||
* mca_try_to_recover - Try to recover from MCA
|
||||
* @rec: pointer to a SAL error record
|
||||
* @sos: pointer to hand off struct between SAL and OS
|
||||
*
|
||||
* Return value:
|
||||
* 1 on Success / 0 on Failure
|
||||
*/
|
||||
|
||||
static int
|
||||
mca_try_to_recover(void *rec,
|
||||
struct ia64_sal_os_state *sos)
|
||||
mca_try_to_recover(void *rec, struct ia64_sal_os_state *sos)
|
||||
{
|
||||
int platform_err;
|
||||
int n_proc_err;
|
||||
|
@ -588,7 +610,8 @@ mca_try_to_recover(void *rec,
|
|||
}
|
||||
|
||||
/* Make index of processor error section */
|
||||
mca_make_peidx((sal_log_processor_info_t*)slidx_first_entry(&slidx.proc_err)->hdr, &peidx);
|
||||
mca_make_peidx((sal_log_processor_info_t*)
|
||||
slidx_first_entry(&slidx.proc_err)->hdr, &peidx);
|
||||
|
||||
/* Extract Processor BUS_CHECK[0] */
|
||||
*((u64*)&pbci) = peidx_check_info(&peidx, bus_check, 0);
|
||||
|
@ -598,7 +621,8 @@ mca_try_to_recover(void *rec,
|
|||
return 0;
|
||||
|
||||
/* Try to recover a processor error */
|
||||
return recover_from_processor_error(platform_err, &slidx, &peidx, &pbci, sos);
|
||||
return recover_from_processor_error(platform_err, &slidx, &peidx,
|
||||
&pbci, sos);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -611,7 +635,7 @@ int __init mca_external_handler_init(void)
|
|||
return -ENOMEM;
|
||||
|
||||
/* register external mca handlers */
|
||||
if (ia64_reg_MCA_extension(mca_try_to_recover)){
|
||||
if (ia64_reg_MCA_extension(mca_try_to_recover)) {
|
||||
printk(KERN_ERR "ia64_reg_MCA_extension failed.\n");
|
||||
kfree(slidx_pool.buffer);
|
||||
return -EFAULT;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Copyright (C) Hidetoshi Seto (seto.hidetoshi@jp.fujitsu.com)
|
||||
*/
|
||||
/*
|
||||
* Processor error section:
|
||||
* Processor error section:
|
||||
*
|
||||
* +-sal_log_processor_info_t *info-------------+
|
||||
* | sal_log_section_hdr_t header; |
|
||||
|
|
|
@ -13,45 +13,45 @@
|
|||
#include <asm/ptrace.h>
|
||||
|
||||
GLOBAL_ENTRY(mca_handler_bhhook)
|
||||
invala // clear RSE ?
|
||||
;; //
|
||||
cover //
|
||||
;; //
|
||||
clrrrb //
|
||||
invala // clear RSE ?
|
||||
;;
|
||||
cover
|
||||
;;
|
||||
clrrrb
|
||||
;;
|
||||
alloc r16=ar.pfs,0,2,1,0 // make a new frame
|
||||
alloc r16=ar.pfs,0,2,1,0 // make a new frame
|
||||
;;
|
||||
mov ar.rsc=0
|
||||
mov ar.rsc=0
|
||||
;;
|
||||
mov r13=IA64_KR(CURRENT) // current task pointer
|
||||
mov r13=IA64_KR(CURRENT) // current task pointer
|
||||
;;
|
||||
mov r2=r13
|
||||
mov r2=r13
|
||||
;;
|
||||
addl r22=IA64_RBS_OFFSET,r2
|
||||
addl r22=IA64_RBS_OFFSET,r2
|
||||
;;
|
||||
mov ar.bspstore=r22
|
||||
mov ar.bspstore=r22
|
||||
;;
|
||||
addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
|
||||
addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2
|
||||
;;
|
||||
adds r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
|
||||
adds r2=IA64_TASK_THREAD_ON_USTACK_OFFSET,r13
|
||||
;;
|
||||
st1 [r2]=r0 // clear current->thread.on_ustack flag
|
||||
mov loc0=r16
|
||||
movl loc1=mca_handler_bh // recovery C function
|
||||
st1 [r2]=r0 // clear current->thread.on_ustack flag
|
||||
mov loc0=r16
|
||||
movl loc1=mca_handler_bh // recovery C function
|
||||
;;
|
||||
mov out0=r8 // poisoned address
|
||||
mov b6=loc1
|
||||
mov out0=r8 // poisoned address
|
||||
mov b6=loc1
|
||||
;;
|
||||
mov loc1=rp
|
||||
mov loc1=rp
|
||||
;;
|
||||
ssm psr.i
|
||||
ssm psr.i
|
||||
;;
|
||||
br.call.sptk.many rp=b6 // does not return ...
|
||||
br.call.sptk.many rp=b6 // does not return ...
|
||||
;;
|
||||
mov ar.pfs=loc0
|
||||
mov rp=loc1
|
||||
mov ar.pfs=loc0
|
||||
mov rp=loc1
|
||||
;;
|
||||
mov r8=r0
|
||||
mov r8=r0
|
||||
br.ret.sptk.many rp
|
||||
;;
|
||||
END(mca_handler_bhhook)
|
||||
|
|
|
@ -574,7 +574,7 @@ pfm_protect_ctx_ctxsw(pfm_context_t *x)
|
|||
return 0UL;
|
||||
}
|
||||
|
||||
static inline unsigned long
|
||||
static inline void
|
||||
pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f)
|
||||
{
|
||||
spin_unlock(&(x)->ctx_lock);
|
||||
|
@ -2218,12 +2218,13 @@ static void
|
|||
pfm_free_fd(int fd, struct file *file)
|
||||
{
|
||||
struct files_struct *files = current->files;
|
||||
struct fdtable *fdt = files_fdtable(files);
|
||||
struct fdtable *fdt;
|
||||
|
||||
/*
|
||||
* there ie no fd_uninstall(), so we do it here
|
||||
*/
|
||||
spin_lock(&files->file_lock);
|
||||
fdt = files_fdtable(files);
|
||||
rcu_assign_pointer(fdt->fd[fd], NULL);
|
||||
spin_unlock(&files->file_lock);
|
||||
|
||||
|
|
|
@ -34,7 +34,8 @@ ifeq ($(CONFIG_40x),y)
|
|||
obj-$(CONFIG_PCI) += indirect_pci.o pci_auto.o ppc405_pci.o
|
||||
endif
|
||||
endif
|
||||
obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o $(wdt-mpc8xx-y)
|
||||
obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o $(wdt-mpc8xx-y) \
|
||||
ppc_sys.o mpc8xx_devices.o mpc8xx_sys.o
|
||||
ifeq ($(CONFIG_8xx),y)
|
||||
obj-$(CONFIG_PCI) += qspan_pci.o i8259.o
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,224 @@
|
|||
/*
|
||||
* arch/ppc/syslib/mpc8xx_devices.c
|
||||
*
|
||||
* MPC8xx Device descriptions
|
||||
*
|
||||
* Maintainer: Kumar Gala <kumar.gala@freescale.com>
|
||||
*
|
||||
* Copyright 2005 MontaVista Software, Inc. by Vitaly Bordug<vbordug@ru.mvista.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/mii.h>
|
||||
#include <asm/commproc.h>
|
||||
#include <asm/mpc8xx.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/ppc_sys.h>
|
||||
|
||||
/* We use offsets for IORESOURCE_MEM to do not set dependences at compile time.
|
||||
* They will get fixed up by mach_mpc8xx_fixup
|
||||
*/
|
||||
|
||||
struct platform_device ppc_sys_platform_devices[] = {
|
||||
[MPC8xx_CPM_FEC1] = {
|
||||
.name = "fsl-cpm-fec",
|
||||
.id = 1,
|
||||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xe00,
|
||||
.end = 0xe88,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_FEC1,
|
||||
.end = MPC8xx_INT_FEC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_FEC2] = {
|
||||
.name = "fsl-cpm-fec",
|
||||
.id = 2,
|
||||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0x1e00,
|
||||
.end = 0x1e88,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_FEC2,
|
||||
.end = MPC8xx_INT_FEC2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_SCC1] = {
|
||||
.name = "fsl-cpm-scc",
|
||||
.id = 1,
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xa00,
|
||||
.end = 0xa18,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "pram",
|
||||
.start = 0x3c00,
|
||||
.end = 0x3c80,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_SCC1,
|
||||
.end = MPC8xx_INT_SCC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_SCC2] = {
|
||||
.name = "fsl-cpm-scc",
|
||||
.id = 2,
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xa20,
|
||||
.end = 0xa38,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "pram",
|
||||
.start = 0x3d00,
|
||||
.end = 0x3d80,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_SCC2,
|
||||
.end = MPC8xx_INT_SCC2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_SCC3] = {
|
||||
.name = "fsl-cpm-scc",
|
||||
.id = 3,
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xa40,
|
||||
.end = 0xa58,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "pram",
|
||||
.start = 0x3e00,
|
||||
.end = 0x3e80,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_SCC3,
|
||||
.end = MPC8xx_INT_SCC3,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_SCC4] = {
|
||||
.name = "fsl-cpm-scc",
|
||||
.id = 4,
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xa60,
|
||||
.end = 0xa78,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "pram",
|
||||
.start = 0x3f00,
|
||||
.end = 0x3f80,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_SCC4,
|
||||
.end = MPC8xx_INT_SCC4,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_SMC1] = {
|
||||
.name = "fsl-cpm-smc",
|
||||
.id = 1,
|
||||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xa82,
|
||||
.end = 0xa91,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_SMC1,
|
||||
.end = MPC8xx_INT_SMC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
[MPC8xx_CPM_SMC2] = {
|
||||
.name = "fsl-cpm-smc",
|
||||
.id = 2,
|
||||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "regs",
|
||||
.start = 0xa92,
|
||||
.end = 0xaa1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "interrupt",
|
||||
.start = MPC8xx_INT_SMC2,
|
||||
.end = MPC8xx_INT_SMC2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static int __init mach_mpc8xx_fixup(struct platform_device *pdev)
|
||||
{
|
||||
ppc_sys_fixup_mem_resource (pdev, IMAP_ADDR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init mach_mpc8xx_init(void)
|
||||
{
|
||||
ppc_sys_device_fixup = mach_mpc8xx_fixup;
|
||||
return 0;
|
||||
}
|
||||
|
||||
postcore_initcall(mach_mpc8xx_init);
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* arch/ppc/platforms/mpc8xx_sys.c
|
||||
*
|
||||
* MPC8xx System descriptions
|
||||
*
|
||||
* Maintainer: Kumar Gala <kumar.gala@freescale.com>
|
||||
*
|
||||
* Copyright 2005 MontaVista Software, Inc. by Vitaly Bordug <vbordug@ru.mvista.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <asm/ppc_sys.h>
|
||||
|
||||
struct ppc_sys_spec *cur_ppc_sys_spec;
|
||||
struct ppc_sys_spec ppc_sys_specs[] = {
|
||||
{
|
||||
.ppc_sys_name = "MPC86X",
|
||||
.mask = 0xFFFFFFFF,
|
||||
.value = 0x00000000,
|
||||
.num_devices = 2,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
MPC8xx_CPM_FEC1,
|
||||
MPC8xx_CPM_SCC1,
|
||||
MPC8xx_CPM_SCC2,
|
||||
MPC8xx_CPM_SCC3,
|
||||
MPC8xx_CPM_SCC4,
|
||||
MPC8xx_CPM_SMC1,
|
||||
MPC8xx_CPM_SMC2,
|
||||
},
|
||||
},
|
||||
{
|
||||
.ppc_sys_name = "MPC885",
|
||||
.mask = 0xFFFFFFFF,
|
||||
.value = 0x00000000,
|
||||
.num_devices = 3,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
MPC8xx_CPM_FEC1,
|
||||
MPC8xx_CPM_FEC2,
|
||||
MPC8xx_CPM_SCC1,
|
||||
MPC8xx_CPM_SCC2,
|
||||
MPC8xx_CPM_SCC3,
|
||||
MPC8xx_CPM_SCC4,
|
||||
MPC8xx_CPM_SMC1,
|
||||
MPC8xx_CPM_SMC2,
|
||||
},
|
||||
},
|
||||
{ /* default match */
|
||||
.ppc_sys_name = "",
|
||||
.mask = 0x00000000,
|
||||
.value = 0x00000000,
|
||||
},
|
||||
};
|
|
@ -575,7 +575,7 @@ static void openpic2_cached_disable_irq(u_int irq)
|
|||
* we need something better to deal with that... Maybe switch to S1 for
|
||||
* cpufreq changes
|
||||
*/
|
||||
int openpic2_suspend(struct sys_device *sysdev, u32 state)
|
||||
int openpic2_suspend(struct sys_device *sysdev, pm_message_t state)
|
||||
{
|
||||
int i;
|
||||
unsigned long flags;
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/kdebug.h>
|
||||
#include <asm/siginfo.h>
|
||||
|
||||
/*
|
||||
* Check whether the instruction at regs->nip is a store using
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc4
|
||||
# Fri Jul 29 14:49:30 2005
|
||||
# Linux kernel version: 2.6.14-rc1
|
||||
# Wed Sep 14 16:46:19 2005
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
|
@ -21,6 +21,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
|
@ -33,6 +34,7 @@ CONFIG_KOBJECT_UEVENT=y
|
|||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
|
@ -94,6 +96,7 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
|
||||
#
|
||||
# I/O subsystem configuration
|
||||
|
@ -151,8 +154,8 @@ CONFIG_IP_FIB_HASH=y
|
|||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
CONFIG_IP_TCPDIAG_IPV6=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_IPV6=y
|
||||
|
@ -164,6 +167,11 @@ CONFIG_IPV6=y
|
|||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
|
@ -217,9 +225,11 @@ CONFIG_NET_CLS_POLICE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
# CONFIG_PCMCIA is not set
|
||||
|
||||
#
|
||||
|
@ -233,6 +243,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
|
|||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
|
@ -260,6 +271,7 @@ CONFIG_SCSI_LOGGING=y
|
|||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
|
@ -280,7 +292,6 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
|
@ -383,6 +394,10 @@ CONFIG_BONDING=m
|
|||
CONFIG_EQUALIZER=m
|
||||
CONFIG_TUN=m
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
|
@ -453,10 +468,6 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
|
@ -465,6 +476,7 @@ CONFIG_INOTIFY=y
|
|||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -485,11 +497,10 @@ CONFIG_DNOTIFY=y
|
|||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -533,6 +544,7 @@ CONFIG_SUNRPC=y
|
|||
# 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
|
||||
|
@ -572,6 +584,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
|
@ -626,5 +639,6 @@ CONFIG_CRYPTO=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=m
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
|
|
|
@ -6,7 +6,7 @@ EXTRA_AFLAGS := -traditional
|
|||
|
||||
obj-y := bitmap.o traps.o time.o process.o \
|
||||
setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
|
||||
semaphore.o s390_ext.o debug.o profile.o irq.o
|
||||
semaphore.o s390_ext.o debug.o profile.o irq.o reipl_diag.o
|
||||
|
||||
extra-$(CONFIG_ARCH_S390_31) += head.o
|
||||
extra-$(CONFIG_ARCH_S390X) += head64.o
|
||||
|
|
|
@ -108,7 +108,7 @@ STACK_SIZE = 1 << STACK_SHIFT
|
|||
bl BASED(0f)
|
||||
l %r14,BASED(.Lcleanup_critical)
|
||||
basr %r14,%r14
|
||||
tm 0(%r12),0x01 # retest problem state after cleanup
|
||||
tm 1(%r12),0x01 # retest problem state after cleanup
|
||||
bnz BASED(1f)
|
||||
0: l %r14,__LC_ASYNC_STACK # are we already on the async stack ?
|
||||
slr %r14,%r15
|
||||
|
|
|
@ -101,7 +101,7 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
|
|||
clc \psworg+8(8),BASED(.Lcritical_start)
|
||||
jl 0f
|
||||
brasl %r14,cleanup_critical
|
||||
tm 0(%r12),0x01 # retest problem state after cleanup
|
||||
tm 1(%r12),0x01 # retest problem state after cleanup
|
||||
jnz 1f
|
||||
0: lg %r14,__LC_ASYNC_STACK # are we already on the async. stack ?
|
||||
slgr %r14,%r15
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* This file contains the implementation of the
|
||||
* Linux re-IPL support
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2005
|
||||
*
|
||||
* Author(s): Volker Sameske (sameske@de.ibm.com)
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
static unsigned int reipl_diag_rc1;
|
||||
static unsigned int reipl_diag_rc2;
|
||||
|
||||
/*
|
||||
* re-IPL the system using the last used IPL parameters
|
||||
*/
|
||||
void reipl_diag(void)
|
||||
{
|
||||
asm volatile (
|
||||
" la %%r4,0\n"
|
||||
" la %%r5,0\n"
|
||||
" diag %%r4,%2,0x308\n"
|
||||
"0:\n"
|
||||
" st %%r4,%0\n"
|
||||
" st %%r5,%1\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
#ifdef __s390x__
|
||||
" .align 8\n"
|
||||
" .quad 0b, 0b\n"
|
||||
#else
|
||||
" .align 4\n"
|
||||
" .long 0b, 0b\n"
|
||||
#endif
|
||||
".previous\n"
|
||||
: "=m" (reipl_diag_rc1), "=m" (reipl_diag_rc2)
|
||||
: "d" (3) : "cc", "4", "5" );
|
||||
}
|
|
@ -261,8 +261,11 @@ void (*_machine_power_off)(void) = machine_power_off_smp;
|
|||
* Reboot, halt and power_off routines for non SMP.
|
||||
*/
|
||||
extern void reipl(unsigned long devno);
|
||||
extern void reipl_diag(void);
|
||||
static void do_machine_restart_nonsmp(char * __unused)
|
||||
{
|
||||
reipl_diag();
|
||||
|
||||
if (MACHINE_IS_VM)
|
||||
cpcmd ("IPL", NULL, 0);
|
||||
else
|
||||
|
@ -634,6 +637,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||
struct cpuinfo_S390 *cpuinfo;
|
||||
unsigned long n = (unsigned long) v - 1;
|
||||
|
||||
preempt_disable();
|
||||
if (!n) {
|
||||
seq_printf(m, "vendor_id : IBM/S390\n"
|
||||
"# processors : %i\n"
|
||||
|
@ -658,6 +662,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||
cpuinfo->cpu_id.ident,
|
||||
cpuinfo->cpu_id.machine);
|
||||
}
|
||||
preempt_enable();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@ extern char vmhalt_cmd[];
|
|||
extern char vmpoff_cmd[];
|
||||
|
||||
extern void reipl(unsigned long devno);
|
||||
extern void reipl_diag(void);
|
||||
|
||||
static void smp_ext_bitcall(int, ec_bit_sig);
|
||||
static void smp_ext_bitcall_others(ec_bit_sig);
|
||||
|
@ -283,6 +284,8 @@ static void do_machine_restart(void * __unused)
|
|||
* interrupted by an external interrupt and s390irq
|
||||
* locks are always held disabled).
|
||||
*/
|
||||
reipl_diag();
|
||||
|
||||
if (MACHINE_IS_VM)
|
||||
cpcmd ("IPL", NULL, 0, NULL);
|
||||
else
|
||||
|
|
|
@ -42,3 +42,7 @@ config ARCH_HAS_SC_SIGNALS
|
|||
config ARCH_REUSE_HOST_VSYSCALL_AREA
|
||||
bool
|
||||
default y
|
||||
|
||||
config X86_CMPXCHG
|
||||
bool
|
||||
default y
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/inet.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <sys/time.h>
|
||||
|
@ -55,7 +54,7 @@ static int mcast_open(void *data)
|
|||
struct mcast_data *pri = data;
|
||||
struct sockaddr_in *sin = pri->mcast_addr;
|
||||
struct ip_mreq mreq;
|
||||
int fd = -EINVAL, yes = 1, err = -EINVAL;;
|
||||
int fd, yes = 1, err = 0;
|
||||
|
||||
|
||||
if ((sin->sin_addr.s_addr == 0) || (sin->sin_port == 0))
|
||||
|
@ -66,13 +65,14 @@ static int mcast_open(void *data)
|
|||
if (fd < 0){
|
||||
printk("mcast_open : data socket failed, errno = %d\n",
|
||||
errno);
|
||||
fd = -errno;
|
||||
err = -errno;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
|
||||
printk("mcast_open: SO_REUSEADDR failed, errno = %d\n",
|
||||
errno);
|
||||
err = -errno;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
|
@ -81,6 +81,7 @@ static int mcast_open(void *data)
|
|||
sizeof(pri->ttl)) < 0) {
|
||||
printk("mcast_open: IP_MULTICAST_TTL failed, error = %d\n",
|
||||
errno);
|
||||
err = -errno;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
|
@ -88,12 +89,14 @@ static int mcast_open(void *data)
|
|||
if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)) < 0) {
|
||||
printk("mcast_open: IP_MULTICAST_LOOP failed, error = %d\n",
|
||||
errno);
|
||||
err = -errno;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
/* bind socket to mcast address */
|
||||
if (bind(fd, (struct sockaddr *) sin, sizeof(*sin)) < 0) {
|
||||
printk("mcast_open : data bind failed, errno = %d\n", errno);
|
||||
err = -errno;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
|
@ -108,14 +111,15 @@ static int mcast_open(void *data)
|
|||
"interface on the host.\n");
|
||||
printk("eth0 should be configured in order to use the "
|
||||
"multicast transport.\n");
|
||||
err = -errno;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
out:
|
||||
return fd;
|
||||
|
||||
out_close:
|
||||
os_close_file(fd);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "os.h"
|
||||
#include "umid.h"
|
||||
#include "irq_kern.h"
|
||||
#include "choose-mode.h"
|
||||
|
||||
static int do_unlink_socket(struct notifier_block *notifier,
|
||||
unsigned long what, void *data)
|
||||
|
@ -276,6 +277,7 @@ void mconsole_proc(struct mc_request *req)
|
|||
go - continue the UML after a 'stop' \n\
|
||||
log <string> - make UML enter <string> into the kernel log\n\
|
||||
proc <file> - returns the contents of the UML's /proc/<file>\n\
|
||||
stack <pid> - returns the stack of the specified pid\n\
|
||||
"
|
||||
|
||||
void mconsole_help(struct mc_request *req)
|
||||
|
@ -479,6 +481,56 @@ void mconsole_sysrq(struct mc_request *req)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Mconsole stack trace
|
||||
* Added by Allan Graves, Jeff Dike
|
||||
* Dumps a stacks registers to the linux console.
|
||||
* Usage stack <pid>.
|
||||
*/
|
||||
void do_stack(struct mc_request *req)
|
||||
{
|
||||
char *ptr = req->request.data;
|
||||
int pid_requested= -1;
|
||||
struct task_struct *from = NULL;
|
||||
struct task_struct *to = NULL;
|
||||
|
||||
/* Would be nice:
|
||||
* 1) Send showregs output to mconsole.
|
||||
* 2) Add a way to stack dump all pids.
|
||||
*/
|
||||
|
||||
ptr += strlen("stack");
|
||||
while(isspace(*ptr)) ptr++;
|
||||
|
||||
/* Should really check for multiple pids or reject bad args here */
|
||||
/* What do the arguments in mconsole_reply mean? */
|
||||
if(sscanf(ptr, "%d", &pid_requested) == 0){
|
||||
mconsole_reply(req, "Please specify a pid", 1, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
from = current;
|
||||
to = find_task_by_pid(pid_requested);
|
||||
|
||||
if((to == NULL) || (pid_requested == 0)) {
|
||||
mconsole_reply(req, "Couldn't find that pid", 1, 0);
|
||||
return;
|
||||
}
|
||||
to->thread.saved_task = current;
|
||||
|
||||
switch_to(from, to, from);
|
||||
mconsole_reply(req, "Stack Dumped to console and message log", 0, 0);
|
||||
}
|
||||
|
||||
void mconsole_stack(struct mc_request *req)
|
||||
{
|
||||
/* This command doesn't work in TT mode, so let's check and then
|
||||
* get out of here
|
||||
*/
|
||||
CHOOSE_MODE(mconsole_reply(req, "Sorry, this doesn't work in TT mode",
|
||||
1, 0),
|
||||
do_stack(req));
|
||||
}
|
||||
|
||||
/* Changed by mconsole_setup, which is __setup, and called before SMP is
|
||||
* active.
|
||||
*/
|
||||
|
|
|
@ -30,6 +30,7 @@ static struct mconsole_command commands[] = {
|
|||
{ "go", mconsole_go, MCONSOLE_INTR },
|
||||
{ "log", mconsole_log, MCONSOLE_INTR },
|
||||
{ "proc", mconsole_proc, MCONSOLE_PROC },
|
||||
{ "stack", mconsole_stack, MCONSOLE_INTR },
|
||||
};
|
||||
|
||||
/* Initialized in mconsole_init, which is an initcall */
|
||||
|
@ -172,9 +173,9 @@ int mconsole_notify(char *sock_name, int type, const void *data, int len)
|
|||
if(notify_sock < 0){
|
||||
notify_sock = socket(PF_UNIX, SOCK_DGRAM, 0);
|
||||
if(notify_sock < 0){
|
||||
printk("mconsole_notify - socket failed, errno = %d\n",
|
||||
errno);
|
||||
err = -errno;
|
||||
printk("mconsole_notify - socket failed, errno = %d\n",
|
||||
err);
|
||||
}
|
||||
}
|
||||
unlock_notify();
|
||||
|
@ -197,8 +198,8 @@ int mconsole_notify(char *sock_name, int type, const void *data, int len)
|
|||
n = sendto(notify_sock, &packet, len, 0, (struct sockaddr *) &target,
|
||||
sizeof(target));
|
||||
if(n < 0){
|
||||
printk("mconsole_notify - sendto failed, errno = %d\n", errno);
|
||||
err = -errno;
|
||||
printk("mconsole_notify - sendto failed, errno = %d\n", errno);
|
||||
}
|
||||
return(err);
|
||||
}
|
||||
|
|
|
@ -43,8 +43,9 @@ static int pts_open(int input, int output, int primary, void *d,
|
|||
|
||||
fd = get_pty();
|
||||
if(fd < 0){
|
||||
err = -errno;
|
||||
printk("open_pts : Failed to open pts\n");
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
if(data->raw){
|
||||
CATCH_EINTR(err = tcgetattr(fd, &data->tt));
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/param.h>
|
||||
#include "asm/types.h"
|
||||
#include "user_util.h"
|
||||
#include "kern_util.h"
|
||||
#include "user.h"
|
||||
#include "ubd_user.h"
|
||||
#include "os.h"
|
||||
#include "cow.h"
|
||||
|
||||
#include <endian.h>
|
||||
#include <byteswap.h>
|
||||
|
||||
void ignore_sigwinch_sig(void)
|
||||
{
|
||||
signal(SIGWINCH, SIG_IGN);
|
||||
}
|
||||
|
||||
int start_io_thread(unsigned long sp, int *fd_out)
|
||||
{
|
||||
int pid, fds[2], err;
|
||||
|
||||
err = os_pipe(fds, 1, 1);
|
||||
if(err < 0){
|
||||
printk("start_io_thread - os_pipe failed, err = %d\n", -err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
kernel_fd = fds[0];
|
||||
*fd_out = fds[1];
|
||||
|
||||
pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD,
|
||||
NULL);
|
||||
if(pid < 0){
|
||||
printk("start_io_thread - clone failed : errno = %d\n", errno);
|
||||
err = -errno;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
return(pid);
|
||||
|
||||
out_close:
|
||||
os_close_file(fds[0]);
|
||||
os_close_file(fds[1]);
|
||||
kernel_fd = -1;
|
||||
*fd_out = -1;
|
||||
out:
|
||||
return(err);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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:
|
||||
*/
|
|
@ -110,13 +110,15 @@ int xterm_open(int input, int output, int primary, void *d,
|
|||
|
||||
fd = mkstemp(file);
|
||||
if(fd < 0){
|
||||
err = -errno;
|
||||
printk("xterm_open : mkstemp failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
|
||||
if(unlink(file)){
|
||||
err = -errno;
|
||||
printk("xterm_open : unlink failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
os_close_file(fd);
|
||||
|
||||
|
|
|
@ -81,6 +81,7 @@ extern void mconsole_stop(struct mc_request *req);
|
|||
extern void mconsole_go(struct mc_request *req);
|
||||
extern void mconsole_log(struct mc_request *req);
|
||||
extern void mconsole_proc(struct mc_request *req);
|
||||
extern void mconsole_stack(struct mc_request *req);
|
||||
|
||||
extern int mconsole_get_request(int fd, struct mc_request *req);
|
||||
extern int mconsole_notify(char *sock_name, int type, const void *data,
|
||||
|
|
|
@ -51,7 +51,6 @@ extern unsigned long task_size;
|
|||
|
||||
extern void check_devanon(void);
|
||||
extern int init_mem_user(void);
|
||||
extern int create_mem_file(unsigned long len);
|
||||
extern void setup_memory(void *entry);
|
||||
extern unsigned long find_iomem(char *driver, unsigned long *len_out);
|
||||
extern int init_maps(unsigned long physmem, unsigned long iomem,
|
||||
|
@ -64,20 +63,6 @@ extern unsigned long phys_offset(unsigned long phys);
|
|||
extern void unmap_physmem(void);
|
||||
extern void map_memory(unsigned long virt, unsigned long phys,
|
||||
unsigned long len, int r, int w, int x);
|
||||
extern int protect_memory(unsigned long addr, unsigned long len,
|
||||
int r, int w, int x, int must_succeed);
|
||||
extern unsigned long get_kmem_end(void);
|
||||
extern void check_tmpexec(void);
|
||||
|
||||
#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:
|
||||
*/
|
||||
|
|
|
@ -157,6 +157,9 @@ extern int os_lock_file(int fd, int excl);
|
|||
extern void os_early_checks(void);
|
||||
extern int can_do_skas(void);
|
||||
|
||||
/* mem.c */
|
||||
extern int create_mem_file(unsigned long len);
|
||||
|
||||
/* process.c */
|
||||
extern unsigned long os_process_pc(int pid);
|
||||
extern int os_process_parent(int pid);
|
||||
|
@ -181,6 +184,8 @@ extern unsigned long long os_usecs(void);
|
|||
/* tt.c
|
||||
* for tt mode only (will be deleted in future...)
|
||||
*/
|
||||
extern int protect_memory(unsigned long addr, unsigned long len,
|
||||
int r, int w, int x, int must_succeed);
|
||||
extern void forward_pending_sigio(int target);
|
||||
extern int start_fork_tramp(void *arg, unsigned long temp_stack,
|
||||
int clone_flags, int (*tramp)(void *));
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#
|
||||
#
|
||||
# Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
# Licensed under the GPL
|
||||
#
|
||||
|
@ -7,11 +7,11 @@ extra-y := vmlinux.lds
|
|||
clean-files :=
|
||||
|
||||
obj-y = config.o exec_kern.o exitcode.o \
|
||||
helper.o init_task.o irq.o irq_user.o ksyms.o main.o mem.o mem_user.o \
|
||||
physmem.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \
|
||||
sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o sysrq.o \
|
||||
tempfile.o time.o time_kern.o tlb.o trap_kern.o trap_user.o \
|
||||
uaccess_user.o um_arch.o umid.o user_util.o
|
||||
helper.o init_task.o irq.o irq_user.o ksyms.o main.o mem.o physmem.o \
|
||||
process_kern.o ptrace.o reboot.o resource.o sigio_user.o sigio_kern.o \
|
||||
signal_kern.o signal_user.o smp.o syscall_kern.o sysrq.o time.o \
|
||||
time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o \
|
||||
umid.o user_util.o
|
||||
|
||||
obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
|
||||
obj-$(CONFIG_GPROF) += gprof_syms.o
|
||||
|
@ -24,8 +24,8 @@ obj-$(CONFIG_MODE_SKAS) += skas/
|
|||
|
||||
user-objs-$(CONFIG_TTY_LOG) += tty_log.o
|
||||
|
||||
USER_OBJS := $(user-objs-y) config.o helper.o main.o tempfile.o time.o \
|
||||
tty_log.o umid.o user_util.o
|
||||
USER_OBJS := $(user-objs-y) config.o helper.o main.o time.o tty_log.o umid.o \
|
||||
user_util.o
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
|
||||
|
|
|
@ -85,8 +85,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
|
|||
data.fd = fds[1];
|
||||
pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data);
|
||||
if(pid < 0){
|
||||
printk("run_helper : clone failed, errno = %d\n", errno);
|
||||
ret = -errno;
|
||||
printk("run_helper : clone failed, errno = %d\n", errno);
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
|
@ -122,7 +122,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
|||
unsigned long *stack_out, int stack_order)
|
||||
{
|
||||
unsigned long stack, sp;
|
||||
int pid, status;
|
||||
int pid, status, err;
|
||||
|
||||
stack = alloc_stack(stack_order, um_in_interrupt());
|
||||
if(stack == 0) return(-ENOMEM);
|
||||
|
@ -130,16 +130,18 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
|
|||
sp = stack + (page_size() << stack_order) - sizeof(void *);
|
||||
pid = clone(proc, (void *) sp, flags | SIGCHLD, arg);
|
||||
if(pid < 0){
|
||||
err = -errno;
|
||||
printk("run_helper_thread : clone failed, errno = %d\n",
|
||||
errno);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
if(stack_out == NULL){
|
||||
CATCH_EINTR(pid = waitpid(pid, &status, 0));
|
||||
if(pid < 0){
|
||||
err = -errno;
|
||||
printk("run_helper_thread - wait failed, errno = %d\n",
|
||||
errno);
|
||||
pid = -errno;
|
||||
pid = err;
|
||||
}
|
||||
if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
|
||||
printk("run_helper_thread - thread returned status "
|
||||
|
@ -156,8 +158,8 @@ int helper_wait(int pid)
|
|||
|
||||
CATCH_EINTR(ret = waitpid(pid, NULL, WNOHANG));
|
||||
if(ret < 0){
|
||||
ret = -errno;
|
||||
printk("helper_wait : waitpid failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "asm/pgtable.h"
|
||||
#include "user_util.h"
|
||||
#include "mem_user.h"
|
||||
#include "os.h"
|
||||
|
||||
static struct fs_struct init_fs = INIT_FS;
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
@ -45,8 +46,8 @@ __attribute__((__section__(".data.init_task"))) =
|
|||
|
||||
void unprotect_stack(unsigned long stack)
|
||||
{
|
||||
protect_memory(stack, (1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE,
|
||||
1, 1, 0, 1);
|
||||
os_protect_memory((void *) stack, (1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE,
|
||||
1, 1, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
@ -19,6 +19,10 @@
|
|||
#include "mem_user.h"
|
||||
#include "uml_uaccess.h"
|
||||
#include "os.h"
|
||||
#include "linux/types.h"
|
||||
#include "linux/string.h"
|
||||
#include "init.h"
|
||||
#include "kern_constants.h"
|
||||
|
||||
extern char __binary_start;
|
||||
|
||||
|
@ -368,6 +372,16 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
|
|||
return pte;
|
||||
}
|
||||
|
||||
struct iomem_region *iomem_regions = NULL;
|
||||
int iomem_size = 0;
|
||||
|
||||
extern int parse_iomem(char *str, int *add) __init;
|
||||
|
||||
__uml_setup("iomem=", parse_iomem,
|
||||
"iomem=<name>,<file>\n"
|
||||
" Configure <file> as an IO memory region named <name>.\n\n"
|
||||
);
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
|
|
|
@ -1,273 +0,0 @@
|
|||
/*
|
||||
* arch/um/kernel/mem_user.c
|
||||
*
|
||||
* BRIEF MODULE DESCRIPTION
|
||||
* user side memory routines for supporting IO memory inside user mode linux
|
||||
*
|
||||
* Copyright (C) 2001 RidgeRun, Inc.
|
||||
* Author: RidgeRun, Inc.
|
||||
* Greg Lonnon glonnon@ridgerun.com or info@ridgerun.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include "kern_util.h"
|
||||
#include "user.h"
|
||||
#include "user_util.h"
|
||||
#include "mem_user.h"
|
||||
#include "init.h"
|
||||
#include "os.h"
|
||||
#include "tempfile.h"
|
||||
#include "kern_constants.h"
|
||||
|
||||
#define TEMPNAME_TEMPLATE "vm_file-XXXXXX"
|
||||
|
||||
static int create_tmp_file(unsigned long len)
|
||||
{
|
||||
int fd, err;
|
||||
char zero;
|
||||
|
||||
fd = make_tempfile(TEMPNAME_TEMPLATE, NULL, 1);
|
||||
if(fd < 0) {
|
||||
os_print_error(fd, "make_tempfile");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
err = os_mode_fd(fd, 0777);
|
||||
if(err < 0){
|
||||
os_print_error(err, "os_mode_fd");
|
||||
exit(1);
|
||||
}
|
||||
err = os_seek_file(fd, len);
|
||||
if(err < 0){
|
||||
os_print_error(err, "os_seek_file");
|
||||
exit(1);
|
||||
}
|
||||
zero = 0;
|
||||
err = os_write_file(fd, &zero, 1);
|
||||
if(err != 1){
|
||||
os_print_error(err, "os_write_file");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return(fd);
|
||||
}
|
||||
|
||||
void check_tmpexec(void)
|
||||
{
|
||||
void *addr;
|
||||
int err, fd = create_tmp_file(UM_KERN_PAGE_SIZE);
|
||||
|
||||
addr = mmap(NULL, UM_KERN_PAGE_SIZE,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0);
|
||||
printf("Checking PROT_EXEC mmap in /tmp...");
|
||||
fflush(stdout);
|
||||
if(addr == MAP_FAILED){
|
||||
err = errno;
|
||||
perror("failed");
|
||||
if(err == EPERM)
|
||||
printf("/tmp must be not mounted noexec\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("OK\n");
|
||||
munmap(addr, UM_KERN_PAGE_SIZE);
|
||||
|
||||
os_close_file(fd);
|
||||
}
|
||||
|
||||
static int have_devanon = 0;
|
||||
|
||||
void check_devanon(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
printk("Checking for /dev/anon on the host...");
|
||||
fd = open("/dev/anon", O_RDWR);
|
||||
if(fd < 0){
|
||||
printk("Not available (open failed with errno %d)\n", errno);
|
||||
return;
|
||||
}
|
||||
|
||||
printk("OK\n");
|
||||
have_devanon = 1;
|
||||
}
|
||||
|
||||
static int create_anon_file(unsigned long len)
|
||||
{
|
||||
void *addr;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/anon", O_RDWR);
|
||||
if(fd < 0) {
|
||||
os_print_error(fd, "opening /dev/anon");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||
if(addr == MAP_FAILED){
|
||||
perror("mapping physmem file");
|
||||
exit(1);
|
||||
}
|
||||
munmap(addr, len);
|
||||
|
||||
return(fd);
|
||||
}
|
||||
|
||||
int create_mem_file(unsigned long len)
|
||||
{
|
||||
int err, fd;
|
||||
|
||||
if(have_devanon)
|
||||
fd = create_anon_file(len);
|
||||
else fd = create_tmp_file(len);
|
||||
|
||||
err = os_set_exec_close(fd, 1);
|
||||
if(err < 0)
|
||||
os_print_error(err, "exec_close");
|
||||
return(fd);
|
||||
}
|
||||
|
||||
struct iomem_region *iomem_regions = NULL;
|
||||
int iomem_size = 0;
|
||||
|
||||
static int __init parse_iomem(char *str, int *add)
|
||||
{
|
||||
struct iomem_region *new;
|
||||
struct uml_stat buf;
|
||||
char *file, *driver;
|
||||
int fd, err, size;
|
||||
|
||||
driver = str;
|
||||
file = strchr(str,',');
|
||||
if(file == NULL){
|
||||
printf("parse_iomem : failed to parse iomem\n");
|
||||
goto out;
|
||||
}
|
||||
*file = '\0';
|
||||
file++;
|
||||
fd = os_open_file(file, of_rdwr(OPENFLAGS()), 0);
|
||||
if(fd < 0){
|
||||
os_print_error(fd, "parse_iomem - Couldn't open io file");
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = os_stat_fd(fd, &buf);
|
||||
if(err < 0){
|
||||
os_print_error(err, "parse_iomem - cannot stat_fd file");
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
new = malloc(sizeof(*new));
|
||||
if(new == NULL){
|
||||
perror("Couldn't allocate iomem_region struct");
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
size = (buf.ust_size + UM_KERN_PAGE_SIZE) & ~(UM_KERN_PAGE_SIZE - 1);
|
||||
|
||||
*new = ((struct iomem_region) { .next = iomem_regions,
|
||||
.driver = driver,
|
||||
.fd = fd,
|
||||
.size = size,
|
||||
.phys = 0,
|
||||
.virt = 0 });
|
||||
iomem_regions = new;
|
||||
iomem_size += new->size + UM_KERN_PAGE_SIZE;
|
||||
|
||||
return(0);
|
||||
out_close:
|
||||
os_close_file(fd);
|
||||
out:
|
||||
return(1);
|
||||
}
|
||||
|
||||
__uml_setup("iomem=", parse_iomem,
|
||||
"iomem=<name>,<file>\n"
|
||||
" Configure <file> as an IO memory region named <name>.\n\n"
|
||||
);
|
||||
|
||||
int protect_memory(unsigned long addr, unsigned long len, int r, int w, int x,
|
||||
int must_succeed)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = os_protect_memory((void *) addr, len, r, w, x);
|
||||
if(err < 0){
|
||||
if(must_succeed)
|
||||
panic("protect failed, err = %d", -err);
|
||||
else return(err);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Debugging facility for dumping stuff out to the host, avoiding the timing
|
||||
* problems that come with printf and breakpoints.
|
||||
* Enable in case of emergency.
|
||||
*/
|
||||
|
||||
int logging = 1;
|
||||
int logging_fd = -1;
|
||||
|
||||
int logging_line = 0;
|
||||
char logging_buf[512];
|
||||
|
||||
void log(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
struct timeval tv;
|
||||
struct openflags flags;
|
||||
|
||||
if(logging == 0) return;
|
||||
if(logging_fd < 0){
|
||||
flags = of_create(of_trunc(of_rdwr(OPENFLAGS())));
|
||||
logging_fd = os_open_file("log", flags, 0644);
|
||||
}
|
||||
gettimeofday(&tv, NULL);
|
||||
sprintf(logging_buf, "%d\t %u.%u ", logging_line++, tv.tv_sec,
|
||||
tv.tv_usec);
|
||||
va_start(ap, fmt);
|
||||
vsprintf(&logging_buf[strlen(logging_buf)], fmt, ap);
|
||||
va_end(ap);
|
||||
write(logging_fd, logging_buf, strlen(logging_buf));
|
||||
}
|
||||
#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:
|
||||
*/
|
|
@ -113,8 +113,23 @@ void set_current(void *t)
|
|||
|
||||
void *_switch_to(void *prev, void *next, void *last)
|
||||
{
|
||||
return(CHOOSE_MODE(switch_to_tt(prev, next),
|
||||
switch_to_skas(prev, next)));
|
||||
struct task_struct *from = prev;
|
||||
struct task_struct *to= next;
|
||||
|
||||
to->thread.prev_sched = from;
|
||||
set_current(to);
|
||||
|
||||
do {
|
||||
current->thread.saved_task = NULL ;
|
||||
CHOOSE_MODE_PROC(switch_to_tt, switch_to_skas, prev, next);
|
||||
if(current->thread.saved_task)
|
||||
show_regs(&(current->thread.regs));
|
||||
next= current->thread.saved_task;
|
||||
prev= current;
|
||||
} while(current->thread.saved_task);
|
||||
|
||||
return(current->thread.prev_sched);
|
||||
|
||||
}
|
||||
|
||||
void interrupt_end(void)
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "asm/ptrace.h"
|
||||
|
||||
extern void flush_thread_skas(void);
|
||||
extern void *switch_to_skas(void *prev, void *next);
|
||||
extern void switch_to_skas(void *prev, void *next);
|
||||
extern void start_thread_skas(struct pt_regs *regs, unsigned long eip,
|
||||
unsigned long esp);
|
||||
extern int copy_thread_skas(int nr, unsigned long clone_flags,
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "proc_mm.h"
|
||||
#include "registers.h"
|
||||
|
||||
void *switch_to_skas(void *prev, void *next)
|
||||
void switch_to_skas(void *prev, void *next)
|
||||
{
|
||||
struct task_struct *from, *to;
|
||||
|
||||
|
@ -35,16 +35,11 @@ void *switch_to_skas(void *prev, void *next)
|
|||
if(current->pid == 0)
|
||||
switch_timers(0);
|
||||
|
||||
to->thread.prev_sched = from;
|
||||
set_current(to);
|
||||
|
||||
switch_threads(&from->thread.mode.skas.switch_buf,
|
||||
to->thread.mode.skas.switch_buf);
|
||||
|
||||
if(current->pid == 0)
|
||||
switch_timers(1);
|
||||
|
||||
return(current->thread.prev_sched);
|
||||
}
|
||||
|
||||
extern void schedule_tail(struct task_struct *prev);
|
||||
|
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/param.h>
|
||||
#include "init.h"
|
||||
|
||||
/* Modified from create_mem_file and start_debugger */
|
||||
static char *tempdir = NULL;
|
||||
|
||||
static void __init find_tempdir(void)
|
||||
{
|
||||
char *dirs[] = { "TMP", "TEMP", "TMPDIR", NULL };
|
||||
int i;
|
||||
char *dir = NULL;
|
||||
|
||||
if(tempdir != NULL) return; /* We've already been called */
|
||||
for(i = 0; dirs[i]; i++){
|
||||
dir = getenv(dirs[i]);
|
||||
if((dir != NULL) && (*dir != '\0'))
|
||||
break;
|
||||
}
|
||||
if((dir == NULL) || (*dir == '\0'))
|
||||
dir = "/tmp";
|
||||
|
||||
tempdir = malloc(strlen(dir) + 2);
|
||||
if(tempdir == NULL){
|
||||
fprintf(stderr, "Failed to malloc tempdir, "
|
||||
"errno = %d\n", errno);
|
||||
return;
|
||||
}
|
||||
strcpy(tempdir, dir);
|
||||
strcat(tempdir, "/");
|
||||
}
|
||||
|
||||
int make_tempfile(const char *template, char **out_tempname, int do_unlink)
|
||||
{
|
||||
char tempname[MAXPATHLEN];
|
||||
int fd;
|
||||
|
||||
find_tempdir();
|
||||
if (*template != '/')
|
||||
strcpy(tempname, tempdir);
|
||||
else
|
||||
*tempname = 0;
|
||||
strcat(tempname, template);
|
||||
fd = mkstemp(tempname);
|
||||
if(fd < 0){
|
||||
fprintf(stderr, "open - cannot create %s: %s\n", tempname,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if(do_unlink && (unlink(tempname) < 0)){
|
||||
perror("unlink");
|
||||
return -1;
|
||||
}
|
||||
if(out_tempname){
|
||||
*out_tempname = strdup(tempname);
|
||||
if(*out_tempname == NULL){
|
||||
perror("strdup");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return(fd);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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:
|
||||
*/
|
|
@ -307,7 +307,7 @@ int flush_tlb_kernel_range_common(unsigned long start, unsigned long end)
|
|||
}
|
||||
else if(pte_newprot(*pte)){
|
||||
updated = 1;
|
||||
protect_memory(addr, PAGE_SIZE, 1, 1, 1, 1);
|
||||
os_protect_memory((void *) addr, PAGE_SIZE, 1, 1, 1);
|
||||
}
|
||||
addr += PAGE_SIZE;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "asm/ptrace.h"
|
||||
#include "asm/uaccess.h"
|
||||
|
||||
extern void *switch_to_tt(void *prev, void *next);
|
||||
extern void switch_to_tt(void *prev, void *next);
|
||||
extern void flush_thread_tt(void);
|
||||
extern void start_thread_tt(struct pt_regs *regs, unsigned long eip,
|
||||
unsigned long esp);
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "tt.h"
|
||||
#include "mem_user.h"
|
||||
#include "user_util.h"
|
||||
#include "os.h"
|
||||
|
||||
void remap_data(void *segment_start, void *segment_end, int w)
|
||||
{
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "init.h"
|
||||
#include "tt.h"
|
||||
|
||||
void *switch_to_tt(void *prev, void *next, void *last)
|
||||
int switch_to_tt(void *prev, void *next, void *last)
|
||||
{
|
||||
struct task_struct *from, *to, *prev_sched;
|
||||
unsigned long flags;
|
||||
|
@ -36,8 +36,6 @@ void *switch_to_tt(void *prev, void *next, void *last)
|
|||
from = prev;
|
||||
to = next;
|
||||
|
||||
to->thread.prev_sched = from;
|
||||
|
||||
cpu = from->thread_info->cpu;
|
||||
if(cpu == 0)
|
||||
forward_interrupts(to->thread.mode.tt.extern_pid);
|
||||
|
@ -53,7 +51,6 @@ void *switch_to_tt(void *prev, void *next, void *last)
|
|||
forward_pending_sigio(to->thread.mode.tt.extern_pid);
|
||||
|
||||
c = 0;
|
||||
set_current(to);
|
||||
|
||||
err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c));
|
||||
if(err != sizeof(c))
|
||||
|
@ -85,8 +82,6 @@ void *switch_to_tt(void *prev, void *next, void *last)
|
|||
|
||||
flush_tlb_all();
|
||||
local_irq_restore(flags);
|
||||
|
||||
return(current->thread.prev_sched);
|
||||
}
|
||||
|
||||
void release_thread_tt(struct task_struct *task)
|
||||
|
|
|
@ -361,11 +361,6 @@ int linux_main(int argc, char **argv)
|
|||
uml_start = CHOOSE_MODE_PROC(set_task_sizes_tt, set_task_sizes_skas, 0,
|
||||
&host_task_size, &task_size);
|
||||
|
||||
/* Need to check this early because mmapping happens before the
|
||||
* kernel is running.
|
||||
*/
|
||||
check_tmpexec();
|
||||
|
||||
brk_start = (unsigned long) sbrk(0);
|
||||
CHOOSE_MODE_PROC(before_mem_tt, before_mem_skas, brk_start);
|
||||
/* Increase physical memory size for exec-shield users
|
||||
|
|
|
@ -109,18 +109,14 @@ int raw(int fd)
|
|||
int err;
|
||||
|
||||
CATCH_EINTR(err = tcgetattr(fd, &tt));
|
||||
if (err < 0) {
|
||||
printk("tcgetattr failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(err < 0)
|
||||
return -errno;
|
||||
|
||||
cfmakeraw(&tt);
|
||||
|
||||
CATCH_EINTR(err = tcsetattr(fd, TCSADRAIN, &tt));
|
||||
if (err < 0) {
|
||||
printk("tcsetattr failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(err < 0)
|
||||
return -errno;
|
||||
|
||||
/* XXX tcsetattr could have applied only some changes
|
||||
* (and cfmakeraw() is a set of changes) */
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
# Licensed under the GPL
|
||||
#
|
||||
|
||||
obj-y = aio.o elf_aux.o file.o process.o signal.o start_up.o time.o tt.o \
|
||||
tty.o user_syms.o drivers/ sys-$(SUBARCH)/
|
||||
obj-y = aio.o elf_aux.o file.o mem.o process.o signal.o start_up.o time.o \
|
||||
tt.o tty.o user_syms.o drivers/ sys-$(SUBARCH)/
|
||||
|
||||
USER_OBJS := aio.o elf_aux.o file.o process.o signal.o start_up.o time.o tt.o \
|
||||
tty.o
|
||||
USER_OBJS := aio.o elf_aux.o file.o mem.o process.o signal.o start_up.o \
|
||||
time.o tt.o tty.o
|
||||
|
||||
elf_aux.o: $(ARCH_DIR)/kernel-offsets.h
|
||||
CFLAGS_elf_aux.o += -I$(objtree)/arch/um
|
||||
|
|
|
@ -117,6 +117,8 @@ static int do_aio(aio_context_t ctx, struct aio_context *aio)
|
|||
err = io_submit(ctx, 1, &iocbp);
|
||||
if(err > 0)
|
||||
err = 0;
|
||||
else
|
||||
err = -errno;
|
||||
|
||||
out:
|
||||
return err;
|
||||
|
@ -142,7 +144,7 @@ static int aio_thread(void *arg)
|
|||
"errno = %d\n", errno);
|
||||
}
|
||||
else {
|
||||
aio = (struct aio_context *) event.data;
|
||||
aio = (struct aio_context *) (long) event.data;
|
||||
if(update_aio(aio, event.res)){
|
||||
do_aio(ctx, aio);
|
||||
continue;
|
||||
|
@ -313,15 +315,16 @@ static int init_aio_26(void)
|
|||
int err;
|
||||
|
||||
if(io_setup(256, &ctx)){
|
||||
err = -errno;
|
||||
printk("aio_thread failed to initialize context, err = %d\n",
|
||||
errno);
|
||||
return -errno;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = run_helper_thread(aio_thread, NULL,
|
||||
CLONE_FILES | CLONE_VM | SIGCHLD, &stack, 0);
|
||||
if(err < 0)
|
||||
return -errno;
|
||||
return err;
|
||||
|
||||
aio_pid = err;
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
|
|||
struct msghdr msg;
|
||||
struct cmsghdr *cmsg;
|
||||
struct iovec iov;
|
||||
int pid, n;
|
||||
int pid, n, err;
|
||||
|
||||
sprintf(version_buf, "%d", UML_NET_VERSION);
|
||||
|
||||
|
@ -105,9 +105,10 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
|
|||
n = recvmsg(me, &msg, 0);
|
||||
*used_out = n;
|
||||
if(n < 0){
|
||||
err = -errno;
|
||||
printk("tuntap_open_tramp : recvmsg failed - errno = %d\n",
|
||||
errno);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
|
||||
|
@ -147,9 +148,10 @@ static int tuntap_open(void *data)
|
|||
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
|
||||
strlcpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name));
|
||||
if(ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0){
|
||||
err = -errno;
|
||||
printk("TUNSETIFF failed, errno = %d\n", errno);
|
||||
os_close_file(pri->fd);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -54,7 +54,8 @@ __init void scan_elf_aux( char **envp)
|
|||
* a_un, so we have to use a_val, which is
|
||||
* all that's left.
|
||||
*/
|
||||
elf_aux_platform = (char *) auxv->a_un.a_val;
|
||||
elf_aux_platform =
|
||||
(char *) (long) auxv->a_un.a_val;
|
||||
break;
|
||||
case AT_PAGESZ:
|
||||
page_size = auxv->a_un.a_val;
|
||||
|
|
|
@ -119,15 +119,11 @@ int os_window_size(int fd, int *rows, int *cols)
|
|||
|
||||
int os_new_tty_pgrp(int fd, int pid)
|
||||
{
|
||||
if(ioctl(fd, TIOCSCTTY, 0) < 0){
|
||||
printk("TIOCSCTTY failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(ioctl(fd, TIOCSCTTY, 0) < 0)
|
||||
return -errno;
|
||||
|
||||
if(tcsetpgrp(fd, pid) < 0){
|
||||
printk("tcsetpgrp failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(tcsetpgrp(fd, pid) < 0)
|
||||
return -errno;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
@ -146,18 +142,12 @@ int os_set_slip(int fd)
|
|||
int disc, sencap;
|
||||
|
||||
disc = N_SLIP;
|
||||
if(ioctl(fd, TIOCSETD, &disc) < 0){
|
||||
printk("Failed to set slip line discipline - "
|
||||
"errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(ioctl(fd, TIOCSETD, &disc) < 0)
|
||||
return -errno;
|
||||
|
||||
sencap = 0;
|
||||
if(ioctl(fd, SIOCSIFENCAP, &sencap) < 0){
|
||||
printk("Failed to set slip encapsulation - "
|
||||
"errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(ioctl(fd, SIOCSIFENCAP, &sencap) < 0)
|
||||
return -errno;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
@ -180,22 +170,15 @@ int os_sigio_async(int master, int slave)
|
|||
int flags;
|
||||
|
||||
flags = fcntl(master, F_GETFL);
|
||||
if(flags < 0) {
|
||||
printk("fcntl F_GETFL failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(flags < 0)
|
||||
return errno;
|
||||
|
||||
if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
|
||||
(fcntl(master, F_SETOWN, os_getpid()) < 0)){
|
||||
printk("fcntl F_SETFL or F_SETOWN failed, errno = %d\n",
|
||||
errno);
|
||||
return(-errno);
|
||||
}
|
||||
(fcntl(master, F_SETOWN, os_getpid()) < 0))
|
||||
return -errno;
|
||||
|
||||
if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0)){
|
||||
printk("fcntl F_SETFL failed, errno = %d\n", errno);
|
||||
return(-errno);
|
||||
}
|
||||
if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0))
|
||||
return -errno;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
@ -255,7 +238,7 @@ int os_file_mode(char *file, struct openflags *mode_out)
|
|||
|
||||
int os_open_file(char *file, struct openflags flags, int mode)
|
||||
{
|
||||
int fd, f = 0;
|
||||
int fd, err, f = 0;
|
||||
|
||||
if(flags.r && flags.w) f = O_RDWR;
|
||||
else if(flags.r) f = O_RDONLY;
|
||||
|
@ -272,8 +255,9 @@ int os_open_file(char *file, struct openflags flags, int mode)
|
|||
return(-errno);
|
||||
|
||||
if(flags.cl && fcntl(fd, F_SETFD, 1)){
|
||||
err = -errno;
|
||||
os_close_file(fd);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
|
||||
return(fd);
|
||||
|
@ -383,9 +367,9 @@ int os_file_size(char *file, unsigned long long *size_out)
|
|||
return(fd);
|
||||
}
|
||||
if(ioctl(fd, BLKGETSIZE, &blocks) < 0){
|
||||
err = -errno;
|
||||
printk("Couldn't get the block size of \"%s\", "
|
||||
"errno = %d\n", file, errno);
|
||||
err = -errno;
|
||||
os_close_file(fd);
|
||||
return(err);
|
||||
}
|
||||
|
@ -473,11 +457,14 @@ int os_pipe(int *fds, int stream, int close_on_exec)
|
|||
|
||||
int os_set_fd_async(int fd, int owner)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* XXX This should do F_GETFL first */
|
||||
if(fcntl(fd, F_SETFL, O_ASYNC | O_NONBLOCK) < 0){
|
||||
err = -errno;
|
||||
printk("os_set_fd_async : failed to set O_ASYNC and "
|
||||
"O_NONBLOCK on fd # %d, errno = %d\n", fd, errno);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
#ifdef notdef
|
||||
if(fcntl(fd, F_SETFD, 1) < 0){
|
||||
|
@ -488,10 +475,11 @@ int os_set_fd_async(int fd, int owner)
|
|||
|
||||
if((fcntl(fd, F_SETSIG, SIGIO) < 0) ||
|
||||
(fcntl(fd, F_SETOWN, owner) < 0)){
|
||||
err = -errno;
|
||||
printk("os_set_fd_async : Failed to fcntl F_SETOWN "
|
||||
"(or F_SETSIG) fd %d to pid %d, errno = %d\n", fd,
|
||||
owner, errno);
|
||||
return(-errno);
|
||||
return err;
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
@ -516,11 +504,9 @@ int os_set_fd_block(int fd, int blocking)
|
|||
if(blocking) flags &= ~O_NONBLOCK;
|
||||
else flags |= O_NONBLOCK;
|
||||
|
||||
if(fcntl(fd, F_SETFL, flags) < 0){
|
||||
printk("Failed to change blocking on fd # %d, errno = %d\n",
|
||||
fd, errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(fcntl(fd, F_SETFL, flags) < 0)
|
||||
return -errno;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
@ -609,11 +595,8 @@ int os_create_unix_socket(char *file, int len, int close_on_exec)
|
|||
int sock, err;
|
||||
|
||||
sock = socket(PF_UNIX, SOCK_DGRAM, 0);
|
||||
if (sock < 0){
|
||||
printk("create_unix_socket - socket failed, errno = %d\n",
|
||||
errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(sock < 0)
|
||||
return -errno;
|
||||
|
||||
if(close_on_exec) {
|
||||
err = os_set_exec_close(sock, 1);
|
||||
|
@ -628,11 +611,8 @@ int os_create_unix_socket(char *file, int len, int close_on_exec)
|
|||
snprintf(addr.sun_path, len, "%s", file);
|
||||
|
||||
err = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
|
||||
if (err < 0){
|
||||
printk("create_listening_socket at '%s' - bind failed, "
|
||||
"errno = %d\n", file, errno);
|
||||
return(-errno);
|
||||
}
|
||||
if(err < 0)
|
||||
return -errno;
|
||||
|
||||
return(sock);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,161 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include "kern_util.h"
|
||||
#include "user.h"
|
||||
#include "user_util.h"
|
||||
#include "mem_user.h"
|
||||
#include "init.h"
|
||||
#include "os.h"
|
||||
#include "tempfile.h"
|
||||
#include "kern_constants.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
static char *tempdir = NULL;
|
||||
|
||||
static void __init find_tempdir(void)
|
||||
{
|
||||
char *dirs[] = { "TMP", "TEMP", "TMPDIR", NULL };
|
||||
int i;
|
||||
char *dir = NULL;
|
||||
|
||||
if(tempdir != NULL) return; /* We've already been called */
|
||||
for(i = 0; dirs[i]; i++){
|
||||
dir = getenv(dirs[i]);
|
||||
if((dir != NULL) && (*dir != '\0'))
|
||||
break;
|
||||
}
|
||||
if((dir == NULL) || (*dir == '\0'))
|
||||
dir = "/tmp";
|
||||
|
||||
tempdir = malloc(strlen(dir) + 2);
|
||||
if(tempdir == NULL){
|
||||
fprintf(stderr, "Failed to malloc tempdir, "
|
||||
"errno = %d\n", errno);
|
||||
return;
|
||||
}
|
||||
strcpy(tempdir, dir);
|
||||
strcat(tempdir, "/");
|
||||
}
|
||||
|
||||
/*
|
||||
* This proc still used in tt-mode
|
||||
* (file: kernel/tt/ptproxy/proxy.c, proc: start_debugger).
|
||||
* So it isn't 'static' yet.
|
||||
*/
|
||||
int make_tempfile(const char *template, char **out_tempname, int do_unlink)
|
||||
{
|
||||
char tempname[MAXPATHLEN];
|
||||
int fd;
|
||||
|
||||
find_tempdir();
|
||||
if (*template != '/')
|
||||
strcpy(tempname, tempdir);
|
||||
else
|
||||
*tempname = 0;
|
||||
strcat(tempname, template);
|
||||
fd = mkstemp(tempname);
|
||||
if(fd < 0){
|
||||
fprintf(stderr, "open - cannot create %s: %s\n", tempname,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if(do_unlink && (unlink(tempname) < 0)){
|
||||
perror("unlink");
|
||||
return -1;
|
||||
}
|
||||
if(out_tempname){
|
||||
*out_tempname = strdup(tempname);
|
||||
if(*out_tempname == NULL){
|
||||
perror("strdup");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return(fd);
|
||||
}
|
||||
|
||||
#define TEMPNAME_TEMPLATE "vm_file-XXXXXX"
|
||||
|
||||
/*
|
||||
* This proc is used in start_up.c
|
||||
* So it isn't 'static'.
|
||||
*/
|
||||
int create_tmp_file(unsigned long len)
|
||||
{
|
||||
int fd, err;
|
||||
char zero;
|
||||
|
||||
fd = make_tempfile(TEMPNAME_TEMPLATE, NULL, 1);
|
||||
if(fd < 0) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
err = fchmod(fd, 0777);
|
||||
if(err < 0){
|
||||
perror("os_mode_fd");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (lseek64(fd, len, SEEK_SET) < 0) {
|
||||
perror("os_seek_file");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
zero = 0;
|
||||
|
||||
err = os_write_file(fd, &zero, 1);
|
||||
if(err != 1){
|
||||
errno = -err;
|
||||
perror("os_write_file");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return(fd);
|
||||
}
|
||||
|
||||
static int create_anon_file(unsigned long len)
|
||||
{
|
||||
void *addr;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/anon", O_RDWR);
|
||||
if(fd < 0) {
|
||||
perror("opening /dev/anon");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
|
||||
if(addr == MAP_FAILED){
|
||||
perror("mapping physmem file");
|
||||
exit(1);
|
||||
}
|
||||
munmap(addr, len);
|
||||
|
||||
return(fd);
|
||||
}
|
||||
|
||||
extern int have_devanon;
|
||||
|
||||
int create_mem_file(unsigned long len)
|
||||
{
|
||||
int err, fd;
|
||||
|
||||
if(have_devanon)
|
||||
fd = create_anon_file(len);
|
||||
else fd = create_tmp_file(len);
|
||||
|
||||
err = os_set_exec_close(fd, 1);
|
||||
if(err < 0){
|
||||
errno = -err;
|
||||
perror("exec_close");
|
||||
}
|
||||
return(fd);
|
||||
}
|
|
@ -4,18 +4,22 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <sched.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <setjmp.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mman.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/page.h>
|
||||
#include <sys/types.h>
|
||||
#include "user_util.h"
|
||||
#include "kern_util.h"
|
||||
#include "user.h"
|
||||
|
@ -25,6 +29,7 @@
|
|||
#include "sysdep/sigcontext.h"
|
||||
#include "irq_user.h"
|
||||
#include "ptrace_user.h"
|
||||
#include "mem_user.h"
|
||||
#include "time_user.h"
|
||||
#include "init.h"
|
||||
#include "os.h"
|
||||
|
@ -32,6 +37,8 @@
|
|||
#include "choose-mode.h"
|
||||
#include "mode.h"
|
||||
#include "tempfile.h"
|
||||
#include "kern_constants.h"
|
||||
|
||||
#ifdef UML_CONFIG_MODE_SKAS
|
||||
#include "skas.h"
|
||||
#include "skas_ptrace.h"
|
||||
|
@ -276,9 +283,38 @@ static void __init check_ptrace(void)
|
|||
check_sysemu();
|
||||
}
|
||||
|
||||
extern int create_tmp_file(unsigned long len);
|
||||
|
||||
static void check_tmpexec(void)
|
||||
{
|
||||
void *addr;
|
||||
int err, fd = create_tmp_file(UM_KERN_PAGE_SIZE);
|
||||
|
||||
addr = mmap(NULL, UM_KERN_PAGE_SIZE,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0);
|
||||
printf("Checking PROT_EXEC mmap in /tmp...");
|
||||
fflush(stdout);
|
||||
if(addr == MAP_FAILED){
|
||||
err = errno;
|
||||
perror("failed");
|
||||
if(err == EPERM)
|
||||
printf("/tmp must be not mounted noexec\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("OK\n");
|
||||
munmap(addr, UM_KERN_PAGE_SIZE);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
void os_early_checks(void)
|
||||
{
|
||||
check_ptrace();
|
||||
|
||||
/* Need to check this early because mmapping happens before the
|
||||
* kernel is running.
|
||||
*/
|
||||
check_tmpexec();
|
||||
}
|
||||
|
||||
static int __init noprocmm_cmd_param(char *str, int* add)
|
||||
|
@ -357,3 +393,72 @@ int can_do_skas(void)
|
|||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
int have_devanon = 0;
|
||||
|
||||
void check_devanon(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
printk("Checking for /dev/anon on the host...");
|
||||
fd = open("/dev/anon", O_RDWR);
|
||||
if(fd < 0){
|
||||
printk("Not available (open failed with errno %d)\n", errno);
|
||||
return;
|
||||
}
|
||||
|
||||
printk("OK\n");
|
||||
have_devanon = 1;
|
||||
}
|
||||
|
||||
int __init parse_iomem(char *str, int *add)
|
||||
{
|
||||
struct iomem_region *new;
|
||||
struct uml_stat buf;
|
||||
char *file, *driver;
|
||||
int fd, err, size;
|
||||
|
||||
driver = str;
|
||||
file = strchr(str,',');
|
||||
if(file == NULL){
|
||||
printf("parse_iomem : failed to parse iomem\n");
|
||||
goto out;
|
||||
}
|
||||
*file = '\0';
|
||||
file++;
|
||||
fd = os_open_file(file, of_rdwr(OPENFLAGS()), 0);
|
||||
if(fd < 0){
|
||||
os_print_error(fd, "parse_iomem - Couldn't open io file");
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = os_stat_fd(fd, &buf);
|
||||
if(err < 0){
|
||||
os_print_error(err, "parse_iomem - cannot stat_fd file");
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
new = malloc(sizeof(*new));
|
||||
if(new == NULL){
|
||||
perror("Couldn't allocate iomem_region struct");
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
size = (buf.ust_size + UM_KERN_PAGE_SIZE) & ~(UM_KERN_PAGE_SIZE - 1);
|
||||
|
||||
*new = ((struct iomem_region) { .next = iomem_regions,
|
||||
.driver = driver,
|
||||
.fd = fd,
|
||||
.size = size,
|
||||
.phys = 0,
|
||||
.virt = 0 });
|
||||
iomem_regions = new;
|
||||
iomem_size += new->size + UM_KERN_PAGE_SIZE;
|
||||
|
||||
return(0);
|
||||
out_close:
|
||||
os_close_file(fd);
|
||||
out:
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,20 @@
|
|||
#include "mode.h"
|
||||
#include "tempfile.h"
|
||||
|
||||
int protect_memory(unsigned long addr, unsigned long len, int r, int w, int x,
|
||||
int must_succeed)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = os_protect_memory((void *) addr, len, r, w, x);
|
||||
if(err < 0){
|
||||
if(must_succeed)
|
||||
panic("protect failed, err = %d", -err);
|
||||
else return(err);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
*-------------------------
|
||||
* only for tt mode (will be deleted in future...)
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/e820.h>
|
||||
#include <asm/proto.h>
|
||||
|
|
|
@ -831,11 +831,26 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
|
|||
#endif
|
||||
}
|
||||
|
||||
#define HWCR 0xc0010015
|
||||
|
||||
static int __init init_amd(struct cpuinfo_x86 *c)
|
||||
{
|
||||
int r;
|
||||
int level;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned long value;
|
||||
|
||||
// Disable TLB flush filter by setting HWCR.FFDIS:
|
||||
// bit 6 of msr C001_0015
|
||||
//
|
||||
// Errata 63 for SH-B3 steppings
|
||||
// Errata 122 for all(?) steppings
|
||||
rdmsrl(HWCR, value);
|
||||
value |= 1 << 6;
|
||||
wrmsrl(HWCR, value);
|
||||
#endif
|
||||
|
||||
/* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
|
||||
3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
|
||||
clear_bit(0*32+31, &c->x86_capability);
|
||||
|
|
|
@ -750,6 +750,14 @@ static int pf_ready(void)
|
|||
|
||||
static struct request_queue *pf_queue;
|
||||
|
||||
static void pf_end_request(int uptodate)
|
||||
{
|
||||
if (pf_req) {
|
||||
end_request(pf_req, uptodate);
|
||||
pf_req = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void do_pf_request(request_queue_t * q)
|
||||
{
|
||||
if (pf_busy)
|
||||
|
@ -765,7 +773,7 @@ repeat:
|
|||
pf_count = pf_req->current_nr_sectors;
|
||||
|
||||
if (pf_block + pf_count > get_capacity(pf_req->rq_disk)) {
|
||||
end_request(pf_req, 0);
|
||||
pf_end_request(0);
|
||||
goto repeat;
|
||||
}
|
||||
|
||||
|
@ -780,7 +788,7 @@ repeat:
|
|||
pi_do_claimed(pf_current->pi, do_pf_write);
|
||||
else {
|
||||
pf_busy = 0;
|
||||
end_request(pf_req, 0);
|
||||
pf_end_request(0);
|
||||
goto repeat;
|
||||
}
|
||||
}
|
||||
|
@ -798,9 +806,11 @@ static int pf_next_buf(void)
|
|||
if (!pf_count)
|
||||
return 1;
|
||||
spin_lock_irqsave(&pf_spin_lock, saved_flags);
|
||||
end_request(pf_req, 1);
|
||||
pf_count = pf_req->current_nr_sectors;
|
||||
pf_buf = pf_req->buffer;
|
||||
pf_end_request(1);
|
||||
if (pf_req) {
|
||||
pf_count = pf_req->current_nr_sectors;
|
||||
pf_buf = pf_req->buffer;
|
||||
}
|
||||
spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
|
||||
return 1;
|
||||
}
|
||||
|
@ -810,7 +820,7 @@ static inline void next_request(int success)
|
|||
unsigned long saved_flags;
|
||||
|
||||
spin_lock_irqsave(&pf_spin_lock, saved_flags);
|
||||
end_request(pf_req, success);
|
||||
pf_end_request(success);
|
||||
pf_busy = 0;
|
||||
do_pf_request(pf_queue);
|
||||
spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
|
||||
|
|
|
@ -168,6 +168,7 @@ static int verify_command(struct file *file, unsigned char *cmd)
|
|||
safe_for_write(WRITE_VERIFY_12),
|
||||
safe_for_write(WRITE_16),
|
||||
safe_for_write(WRITE_LONG),
|
||||
safe_for_write(WRITE_LONG_2),
|
||||
safe_for_write(ERASE),
|
||||
safe_for_write(GPCMD_MODE_SELECT_10),
|
||||
safe_for_write(MODE_SELECT),
|
||||
|
|
|
@ -252,7 +252,7 @@ hp_zx1_configure (void)
|
|||
readl(hp->ioc_regs+HP_ZX1_PDIR_BASE);
|
||||
writel(hp->io_tlb_ps, hp->ioc_regs+HP_ZX1_TCNFG);
|
||||
readl(hp->ioc_regs+HP_ZX1_TCNFG);
|
||||
writel(~(HP_ZX1_IOVA_SIZE-1), hp->ioc_regs+HP_ZX1_IMASK);
|
||||
writel((unsigned int)(~(HP_ZX1_IOVA_SIZE-1)), hp->ioc_regs+HP_ZX1_IMASK);
|
||||
readl(hp->ioc_regs+HP_ZX1_IMASK);
|
||||
writel(hp->iova_base|1, hp->ioc_regs+HP_ZX1_IBASE);
|
||||
readl(hp->ioc_regs+HP_ZX1_IBASE);
|
||||
|
|
|
@ -534,7 +534,7 @@ static void shutdown(struct channel *ch)
|
|||
|
||||
unsigned long flags;
|
||||
struct tty_struct *tty;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
|
||||
if (!(ch->asyncflags & ASYNC_INITIALIZED))
|
||||
return;
|
||||
|
@ -618,7 +618,7 @@ static int pc_write(struct tty_struct * tty,
|
|||
struct channel *ch;
|
||||
unsigned long flags;
|
||||
int remain;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
pc_write is primarily called directly by the kernel routine
|
||||
|
@ -685,7 +685,7 @@ static int pc_write(struct tty_struct * tty,
|
|||
------------------------------------------------------------------- */
|
||||
|
||||
dataLen = min(bytesAvailable, dataLen);
|
||||
memcpy(ch->txptr + head, buf, dataLen);
|
||||
memcpy_toio(ch->txptr + head, buf, dataLen);
|
||||
buf += dataLen;
|
||||
head += dataLen;
|
||||
amountCopied += dataLen;
|
||||
|
@ -726,7 +726,7 @@ static int pc_write_room(struct tty_struct *tty)
|
|||
struct channel *ch;
|
||||
unsigned long flags;
|
||||
unsigned int head, tail;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
|
||||
remain = 0;
|
||||
|
||||
|
@ -773,7 +773,7 @@ static int pc_chars_in_buffer(struct tty_struct *tty)
|
|||
int remain;
|
||||
unsigned long flags;
|
||||
struct channel *ch;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
|
||||
/* ---------------------------------------------------------
|
||||
verifyChannel returns the channel from the tty struct
|
||||
|
@ -830,7 +830,7 @@ static void pc_flush_buffer(struct tty_struct *tty)
|
|||
unsigned int tail;
|
||||
unsigned long flags;
|
||||
struct channel *ch;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
/* ---------------------------------------------------------
|
||||
verifyChannel returns the channel from the tty struct
|
||||
if it is valid. This serves as a sanity check.
|
||||
|
@ -976,7 +976,7 @@ static int pc_open(struct tty_struct *tty, struct file * filp)
|
|||
struct channel *ch;
|
||||
unsigned long flags;
|
||||
int line, retval, boardnum;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
unsigned int head;
|
||||
|
||||
line = tty->index;
|
||||
|
@ -1041,7 +1041,7 @@ static int pc_open(struct tty_struct *tty, struct file * filp)
|
|||
ch->statusflags = 0;
|
||||
|
||||
/* Save boards current modem status */
|
||||
ch->imodem = bc->mstat;
|
||||
ch->imodem = readb(&bc->mstat);
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
Set receive head and tail ptrs to each other. This indicates
|
||||
|
@ -1399,10 +1399,10 @@ static void post_fep_init(unsigned int crd)
|
|||
{ /* Begin post_fep_init */
|
||||
|
||||
int i;
|
||||
unsigned char *memaddr;
|
||||
struct global_data *gd;
|
||||
void __iomem *memaddr;
|
||||
struct global_data __iomem *gd;
|
||||
struct board_info *bd;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
struct channel *ch;
|
||||
int shrinkmem = 0, lowwater ;
|
||||
|
||||
|
@ -1461,7 +1461,7 @@ static void post_fep_init(unsigned int crd)
|
|||
8 and 64 of these structures.
|
||||
-------------------------------------------------------------------- */
|
||||
|
||||
bc = (struct board_chan *)(memaddr + CHANSTRUCT);
|
||||
bc = memaddr + CHANSTRUCT;
|
||||
|
||||
/* -------------------------------------------------------------------
|
||||
The below assignment will set gd to point at the BEGINING of
|
||||
|
@ -1470,7 +1470,7 @@ static void post_fep_init(unsigned int crd)
|
|||
pointer begins at 0xd10.
|
||||
---------------------------------------------------------------------- */
|
||||
|
||||
gd = (struct global_data *)(memaddr + GLOBAL);
|
||||
gd = memaddr + GLOBAL;
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
XEPORTS (address 0xc22) points at the number of channels the
|
||||
|
@ -1493,6 +1493,7 @@ static void post_fep_init(unsigned int crd)
|
|||
|
||||
for (i = 0; i < bd->numports; i++, ch++, bc++) { /* Begin for each port */
|
||||
unsigned long flags;
|
||||
u16 tseg, rseg;
|
||||
|
||||
ch->brdchan = bc;
|
||||
ch->mailbox = gd;
|
||||
|
@ -1553,50 +1554,53 @@ static void post_fep_init(unsigned int crd)
|
|||
shrinkmem = 0;
|
||||
}
|
||||
|
||||
tseg = readw(&bc->tseg);
|
||||
rseg = readw(&bc->rseg);
|
||||
|
||||
switch (bd->type) {
|
||||
|
||||
case PCIXEM:
|
||||
case PCIXRJ:
|
||||
case PCIXR:
|
||||
/* Cover all the 2MEG cards */
|
||||
ch->txptr = memaddr + (((bc->tseg) << 4) & 0x1fffff);
|
||||
ch->rxptr = memaddr + (((bc->rseg) << 4) & 0x1fffff);
|
||||
ch->txwin = FEPWIN | ((bc->tseg) >> 11);
|
||||
ch->rxwin = FEPWIN | ((bc->rseg) >> 11);
|
||||
ch->txptr = memaddr + ((tseg << 4) & 0x1fffff);
|
||||
ch->rxptr = memaddr + ((rseg << 4) & 0x1fffff);
|
||||
ch->txwin = FEPWIN | (tseg >> 11);
|
||||
ch->rxwin = FEPWIN | (rseg >> 11);
|
||||
break;
|
||||
|
||||
case PCXEM:
|
||||
case EISAXEM:
|
||||
/* Cover all the 32K windowed cards */
|
||||
/* Mask equal to window size - 1 */
|
||||
ch->txptr = memaddr + (((bc->tseg) << 4) & 0x7fff);
|
||||
ch->rxptr = memaddr + (((bc->rseg) << 4) & 0x7fff);
|
||||
ch->txwin = FEPWIN | ((bc->tseg) >> 11);
|
||||
ch->rxwin = FEPWIN | ((bc->rseg) >> 11);
|
||||
ch->txptr = memaddr + ((tseg << 4) & 0x7fff);
|
||||
ch->rxptr = memaddr + ((rseg << 4) & 0x7fff);
|
||||
ch->txwin = FEPWIN | (tseg >> 11);
|
||||
ch->rxwin = FEPWIN | (rseg >> 11);
|
||||
break;
|
||||
|
||||
case PCXEVE:
|
||||
case PCXE:
|
||||
ch->txptr = memaddr + (((bc->tseg - bd->memory_seg) << 4) & 0x1fff);
|
||||
ch->txwin = FEPWIN | ((bc->tseg - bd->memory_seg) >> 9);
|
||||
ch->rxptr = memaddr + (((bc->rseg - bd->memory_seg) << 4) & 0x1fff);
|
||||
ch->rxwin = FEPWIN | ((bc->rseg - bd->memory_seg) >>9 );
|
||||
ch->txptr = memaddr + (((tseg - bd->memory_seg) << 4) & 0x1fff);
|
||||
ch->txwin = FEPWIN | ((tseg - bd->memory_seg) >> 9);
|
||||
ch->rxptr = memaddr + (((rseg - bd->memory_seg) << 4) & 0x1fff);
|
||||
ch->rxwin = FEPWIN | ((rseg - bd->memory_seg) >>9 );
|
||||
break;
|
||||
|
||||
case PCXI:
|
||||
case PC64XE:
|
||||
ch->txptr = memaddr + ((bc->tseg - bd->memory_seg) << 4);
|
||||
ch->rxptr = memaddr + ((bc->rseg - bd->memory_seg) << 4);
|
||||
ch->txptr = memaddr + ((tseg - bd->memory_seg) << 4);
|
||||
ch->rxptr = memaddr + ((rseg - bd->memory_seg) << 4);
|
||||
ch->txwin = ch->rxwin = 0;
|
||||
break;
|
||||
|
||||
} /* End switch bd->type */
|
||||
|
||||
ch->txbufhead = 0;
|
||||
ch->txbufsize = bc->tmax + 1;
|
||||
ch->txbufsize = readw(&bc->tmax) + 1;
|
||||
|
||||
ch->rxbufhead = 0;
|
||||
ch->rxbufsize = bc->rmax + 1;
|
||||
ch->rxbufsize = readw(&bc->rmax) + 1;
|
||||
|
||||
lowwater = ch->txbufsize >= 2000 ? 1024 : (ch->txbufsize / 2);
|
||||
|
||||
|
@ -1718,11 +1722,11 @@ static void epcapoll(unsigned long ignored)
|
|||
static void doevent(int crd)
|
||||
{ /* Begin doevent */
|
||||
|
||||
void *eventbuf;
|
||||
void __iomem *eventbuf;
|
||||
struct channel *ch, *chan0;
|
||||
static struct tty_struct *tty;
|
||||
struct board_info *bd;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
unsigned int tail, head;
|
||||
int event, channel;
|
||||
int mstat, lstat;
|
||||
|
@ -1817,7 +1821,7 @@ static void doevent(int crd)
|
|||
static void fepcmd(struct channel *ch, int cmd, int word_or_byte,
|
||||
int byte2, int ncmds, int bytecmd)
|
||||
{ /* Begin fepcmd */
|
||||
unchar *memaddr;
|
||||
unchar __iomem *memaddr;
|
||||
unsigned int head, cmdTail, cmdStart, cmdMax;
|
||||
long count;
|
||||
int n;
|
||||
|
@ -2000,7 +2004,7 @@ static void epcaparam(struct tty_struct *tty, struct channel *ch)
|
|||
|
||||
unsigned int cmdHead;
|
||||
struct termios *ts;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
unsigned mval, hflow, cflag, iflag;
|
||||
|
||||
bc = ch->brdchan;
|
||||
|
@ -2010,7 +2014,7 @@ static void epcaparam(struct tty_struct *tty, struct channel *ch)
|
|||
ts = tty->termios;
|
||||
if ((ts->c_cflag & CBAUD) == 0) { /* Begin CBAUD detected */
|
||||
cmdHead = readw(&bc->rin);
|
||||
bc->rout = cmdHead;
|
||||
writew(cmdHead, &bc->rout);
|
||||
cmdHead = readw(&bc->tin);
|
||||
/* Changing baud in mid-stream transmission can be wonderful */
|
||||
/* ---------------------------------------------------------------
|
||||
|
@ -2116,7 +2120,7 @@ static void receive_data(struct channel *ch)
|
|||
unchar *rptr;
|
||||
struct termios *ts = NULL;
|
||||
struct tty_struct *tty;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
int dataToRead, wrapgap, bytesAvailable;
|
||||
unsigned int tail, head;
|
||||
unsigned int wrapmask;
|
||||
|
@ -2154,7 +2158,7 @@ static void receive_data(struct channel *ch)
|
|||
--------------------------------------------------------------------- */
|
||||
|
||||
if (!tty || !ts || !(ts->c_cflag & CREAD)) {
|
||||
bc->rout = head;
|
||||
writew(head, &bc->rout);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2270,7 +2274,7 @@ static int info_ioctl(struct tty_struct *tty, struct file * file,
|
|||
static int pc_tiocmget(struct tty_struct *tty, struct file *file)
|
||||
{
|
||||
struct channel *ch = (struct channel *) tty->driver_data;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
unsigned int mstat, mflag = 0;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -2351,7 +2355,7 @@ static int pc_ioctl(struct tty_struct *tty, struct file * file,
|
|||
unsigned long flags;
|
||||
unsigned int mflag, mstat;
|
||||
unsigned char startc, stopc;
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
struct channel *ch = (struct channel *) tty->driver_data;
|
||||
void __user *argp = (void __user *)arg;
|
||||
|
||||
|
@ -2633,7 +2637,7 @@ static void pc_start(struct tty_struct *tty)
|
|||
spin_lock_irqsave(&epca_lock, flags);
|
||||
/* Just in case output was resumed because of a change in Digi-flow */
|
||||
if (ch->statusflags & TXSTOPPED) { /* Begin transmit resume requested */
|
||||
struct board_chan *bc;
|
||||
struct board_chan __iomem *bc;
|
||||
globalwinon(ch);
|
||||
bc = ch->brdchan;
|
||||
if (ch->statusflags & LOWWAIT)
|
||||
|
@ -2727,7 +2731,7 @@ void digi_send_break(struct channel *ch, int msec)
|
|||
static void setup_empty_event(struct tty_struct *tty, struct channel *ch)
|
||||
{ /* Begin setup_empty_event */
|
||||
|
||||
struct board_chan *bc = ch->brdchan;
|
||||
struct board_chan __iomem *bc = ch->brdchan;
|
||||
|
||||
globalwinon(ch);
|
||||
ch->statusflags |= EMPTYWAIT;
|
||||
|
|
|
@ -128,17 +128,17 @@ struct channel
|
|||
unsigned long c_cflag;
|
||||
unsigned long c_lflag;
|
||||
unsigned long c_oflag;
|
||||
unsigned char *txptr;
|
||||
unsigned char *rxptr;
|
||||
unsigned char __iomem *txptr;
|
||||
unsigned char __iomem *rxptr;
|
||||
unsigned char *tmp_buf;
|
||||
struct board_info *board;
|
||||
struct board_chan *brdchan;
|
||||
struct board_chan __iomem *brdchan;
|
||||
struct digi_struct digiext;
|
||||
struct tty_struct *tty;
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
struct work_struct tqueue;
|
||||
struct global_data *mailbox;
|
||||
struct global_data __iomem *mailbox;
|
||||
};
|
||||
|
||||
struct board_info
|
||||
|
@ -149,8 +149,8 @@ struct board_info
|
|||
unsigned short numports;
|
||||
unsigned long port;
|
||||
unsigned long membase;
|
||||
unsigned char __iomem *re_map_port;
|
||||
unsigned char *re_map_membase;
|
||||
void __iomem *re_map_port;
|
||||
void __iomem *re_map_membase;
|
||||
unsigned long memory_seg;
|
||||
void ( * memwinon ) (struct board_info *, unsigned int) ;
|
||||
void ( * memwinoff ) (struct board_info *, unsigned int) ;
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
MODULE_AUTHOR("Abhay Salunke <abhay_salunke@dell.com>");
|
||||
MODULE_DESCRIPTION("Driver for updating BIOS image on DELL systems");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION("1.0");
|
||||
MODULE_VERSION("2.0");
|
||||
|
||||
#define BIOS_SCAN_LIMIT 0xffffffff
|
||||
#define MAX_IMAGE_LENGTH 16
|
||||
|
@ -65,10 +65,11 @@ static struct _rbu_data {
|
|||
unsigned long packet_write_count;
|
||||
unsigned long num_packets;
|
||||
unsigned long packetsize;
|
||||
int entry_created;
|
||||
} rbu_data;
|
||||
|
||||
static char image_type[MAX_IMAGE_LENGTH] = "mono";
|
||||
module_param_string(image_type, image_type, sizeof(image_type), 0);
|
||||
static char image_type[MAX_IMAGE_LENGTH + 1] = "mono";
|
||||
module_param_string(image_type, image_type, sizeof (image_type), 0);
|
||||
MODULE_PARM_DESC(image_type, "BIOS image type. choose- mono or packet");
|
||||
|
||||
struct packet_data {
|
||||
|
@ -114,7 +115,7 @@ static int fill_last_packet(void *data, size_t length)
|
|||
|
||||
if ((rbu_data.packet_write_count + length) > rbu_data.packetsize) {
|
||||
pr_debug("dell_rbu:%s: packet size data "
|
||||
"overrun\n", __FUNCTION__);
|
||||
"overrun\n", __FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -146,12 +147,14 @@ static int create_packet(size_t length)
|
|||
pr_debug("create_packet: packetsize not specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
spin_unlock(&rbu_data.lock);
|
||||
newpacket = kmalloc(sizeof (struct packet_data), GFP_KERNEL);
|
||||
spin_lock(&rbu_data.lock);
|
||||
|
||||
newpacket = kmalloc(sizeof(struct packet_data), GFP_KERNEL);
|
||||
if (!newpacket) {
|
||||
printk(KERN_WARNING
|
||||
"dell_rbu:%s: failed to allocate new "
|
||||
"packet\n", __FUNCTION__);
|
||||
"dell_rbu:%s: failed to allocate new "
|
||||
"packet\n", __FUNCTION__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -160,15 +163,17 @@ static int create_packet(size_t length)
|
|||
* there is no upper limit on memory
|
||||
* address for packetized mechanism
|
||||
*/
|
||||
newpacket->data = (unsigned char *)__get_free_pages(GFP_KERNEL,
|
||||
ordernum);
|
||||
spin_unlock(&rbu_data.lock);
|
||||
newpacket->data = (unsigned char *) __get_free_pages(GFP_KERNEL,
|
||||
ordernum);
|
||||
spin_lock(&rbu_data.lock);
|
||||
|
||||
pr_debug("create_packet: newpacket %p\n", newpacket->data);
|
||||
|
||||
if (!newpacket->data) {
|
||||
printk(KERN_WARNING
|
||||
"dell_rbu:%s: failed to allocate new "
|
||||
"packet\n", __FUNCTION__);
|
||||
"dell_rbu:%s: failed to allocate new "
|
||||
"packet\n", __FUNCTION__);
|
||||
kfree(newpacket);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -204,9 +209,8 @@ static int packetize_data(void *data, size_t length)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
do_packet_read(char *data, struct list_head *ptemp_list,
|
||||
int length, int bytes_read, int *list_read_count)
|
||||
static int do_packet_read(char *data, struct list_head *ptemp_list,
|
||||
int length, int bytes_read, int *list_read_count)
|
||||
{
|
||||
void *ptemp_buf;
|
||||
struct packet_data *newpacket = NULL;
|
||||
|
@ -239,7 +243,7 @@ do_packet_read(char *data, struct list_head *ptemp_list,
|
|||
return bytes_copied;
|
||||
}
|
||||
|
||||
static int packet_read_list(char *data, size_t * pread_length)
|
||||
static int packet_read_list(char *data, size_t *pread_length)
|
||||
{
|
||||
struct list_head *ptemp_list;
|
||||
int temp_count = 0;
|
||||
|
@ -258,8 +262,7 @@ static int packet_read_list(char *data, size_t * pread_length)
|
|||
ptemp_list = (&packet_data_head.list)->next;
|
||||
while (!list_empty(ptemp_list)) {
|
||||
bytes_copied = do_packet_read(pdest, ptemp_list,
|
||||
remaining_bytes, bytes_read,
|
||||
&temp_count);
|
||||
remaining_bytes, bytes_read, &temp_count);
|
||||
remaining_bytes -= bytes_copied;
|
||||
bytes_read += bytes_copied;
|
||||
pdest += bytes_copied;
|
||||
|
@ -287,7 +290,7 @@ static void packet_empty_list(void)
|
|||
ptemp_list = (&packet_data_head.list)->next;
|
||||
while (!list_empty(ptemp_list)) {
|
||||
newpacket =
|
||||
list_entry(ptemp_list, struct packet_data, list);
|
||||
list_entry(ptemp_list, struct packet_data, list);
|
||||
pnext_list = ptemp_list->next;
|
||||
list_del(ptemp_list);
|
||||
ptemp_list = pnext_list;
|
||||
|
@ -296,8 +299,8 @@ static void packet_empty_list(void)
|
|||
* to make sure there are no stale RBU packets left in memory
|
||||
*/
|
||||
memset(newpacket->data, 0, rbu_data.packetsize);
|
||||
free_pages((unsigned long)newpacket->data,
|
||||
newpacket->ordernum);
|
||||
free_pages((unsigned long) newpacket->data,
|
||||
newpacket->ordernum);
|
||||
kfree(newpacket);
|
||||
}
|
||||
rbu_data.packet_write_count = 0;
|
||||
|
@ -319,14 +322,13 @@ static void img_update_free(void)
|
|||
* BIOS image copied in memory.
|
||||
*/
|
||||
memset(rbu_data.image_update_buffer, 0,
|
||||
rbu_data.image_update_buffer_size);
|
||||
rbu_data.image_update_buffer_size);
|
||||
if (rbu_data.dma_alloc == 1)
|
||||
dma_free_coherent(NULL, rbu_data.bios_image_size,
|
||||
rbu_data.image_update_buffer,
|
||||
dell_rbu_dmaaddr);
|
||||
rbu_data.image_update_buffer, dell_rbu_dmaaddr);
|
||||
else
|
||||
free_pages((unsigned long)rbu_data.image_update_buffer,
|
||||
rbu_data.image_update_ordernum);
|
||||
free_pages((unsigned long) rbu_data.image_update_buffer,
|
||||
rbu_data.image_update_ordernum);
|
||||
|
||||
/*
|
||||
* Re-initialize the rbu_data variables after a free
|
||||
|
@ -366,7 +368,7 @@ static int img_update_realloc(unsigned long size)
|
|||
*/
|
||||
if ((size != 0) && (rbu_data.image_update_buffer == NULL)) {
|
||||
printk(KERN_ERR "dell_rbu:%s: corruption "
|
||||
"check failed\n", __FUNCTION__);
|
||||
"check failed\n", __FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
/*
|
||||
|
@ -385,17 +387,16 @@ static int img_update_realloc(unsigned long size)
|
|||
|
||||
ordernum = get_order(size);
|
||||
image_update_buffer =
|
||||
(unsigned char *)__get_free_pages(GFP_KERNEL, ordernum);
|
||||
(unsigned char *) __get_free_pages(GFP_KERNEL, ordernum);
|
||||
|
||||
img_buf_phys_addr =
|
||||
(unsigned long)virt_to_phys(image_update_buffer);
|
||||
(unsigned long) virt_to_phys(image_update_buffer);
|
||||
|
||||
if (img_buf_phys_addr > BIOS_SCAN_LIMIT) {
|
||||
free_pages((unsigned long)image_update_buffer, ordernum);
|
||||
free_pages((unsigned long) image_update_buffer, ordernum);
|
||||
ordernum = -1;
|
||||
image_update_buffer = dma_alloc_coherent(NULL, size,
|
||||
&dell_rbu_dmaaddr,
|
||||
GFP_KERNEL);
|
||||
&dell_rbu_dmaaddr, GFP_KERNEL);
|
||||
dma_alloc = 1;
|
||||
}
|
||||
|
||||
|
@ -405,13 +406,13 @@ static int img_update_realloc(unsigned long size)
|
|||
rbu_data.image_update_buffer = image_update_buffer;
|
||||
rbu_data.image_update_buffer_size = size;
|
||||
rbu_data.bios_image_size =
|
||||
rbu_data.image_update_buffer_size;
|
||||
rbu_data.image_update_buffer_size;
|
||||
rbu_data.image_update_ordernum = ordernum;
|
||||
rbu_data.dma_alloc = dma_alloc;
|
||||
rc = 0;
|
||||
} else {
|
||||
pr_debug("Not enough memory for image update:"
|
||||
"size = %ld\n", size);
|
||||
"size = %ld\n", size);
|
||||
rc = -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -438,7 +439,7 @@ static ssize_t read_packet_data(char *buffer, loff_t pos, size_t count)
|
|||
if (pos > imagesize) {
|
||||
retval = 0;
|
||||
printk(KERN_WARNING "dell_rbu:read_packet_data: "
|
||||
"data underrun\n");
|
||||
"data underrun\n");
|
||||
goto read_rbu_data_exit;
|
||||
}
|
||||
|
||||
|
@ -468,11 +469,11 @@ static ssize_t read_rbu_mono_data(char *buffer, loff_t pos, size_t count)
|
|||
|
||||
/* check to see if we have something to return */
|
||||
if ((rbu_data.image_update_buffer == NULL) ||
|
||||
(rbu_data.bios_image_size == 0)) {
|
||||
(rbu_data.bios_image_size == 0)) {
|
||||
pr_debug("read_rbu_data_mono: image_update_buffer %p ,"
|
||||
"bios_image_size %lu\n",
|
||||
rbu_data.image_update_buffer,
|
||||
rbu_data.bios_image_size);
|
||||
"bios_image_size %lu\n",
|
||||
rbu_data.image_update_buffer,
|
||||
rbu_data.bios_image_size);
|
||||
ret_count = -ENOMEM;
|
||||
goto read_rbu_data_exit;
|
||||
}
|
||||
|
@ -497,8 +498,8 @@ static ssize_t read_rbu_mono_data(char *buffer, loff_t pos, size_t count)
|
|||
return ret_count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
read_rbu_data(struct kobject *kobj, char *buffer, loff_t pos, size_t count)
|
||||
static ssize_t read_rbu_data(struct kobject *kobj, char *buffer,
|
||||
loff_t pos, size_t count)
|
||||
{
|
||||
ssize_t ret_count = 0;
|
||||
|
||||
|
@ -515,62 +516,20 @@ read_rbu_data(struct kobject *kobj, char *buffer, loff_t pos, size_t count)
|
|||
return ret_count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
read_rbu_image_type(struct kobject *kobj, char *buffer, loff_t pos,
|
||||
size_t count)
|
||||
{
|
||||
int size = 0;
|
||||
if (!pos)
|
||||
size = sprintf(buffer, "%s\n", image_type);
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
write_rbu_image_type(struct kobject *kobj, char *buffer, loff_t pos,
|
||||
size_t count)
|
||||
{
|
||||
int rc = count;
|
||||
spin_lock(&rbu_data.lock);
|
||||
|
||||
if (strlen(buffer) < MAX_IMAGE_LENGTH)
|
||||
sscanf(buffer, "%s", image_type);
|
||||
else
|
||||
printk(KERN_WARNING "dell_rbu: image_type is invalid"
|
||||
"max chars = %d, \n incoming str--%s-- \n",
|
||||
MAX_IMAGE_LENGTH, buffer);
|
||||
|
||||
/* we must free all previous allocations */
|
||||
packet_empty_list();
|
||||
img_update_free();
|
||||
|
||||
spin_unlock(&rbu_data.lock);
|
||||
return rc;
|
||||
|
||||
}
|
||||
|
||||
static struct bin_attribute rbu_data_attr = {
|
||||
.attr = {.name = "data",.owner = THIS_MODULE,.mode = 0444},
|
||||
.read = read_rbu_data,
|
||||
};
|
||||
|
||||
static struct bin_attribute rbu_image_type_attr = {
|
||||
.attr = {.name = "image_type",.owner = THIS_MODULE,.mode = 0644},
|
||||
.read = read_rbu_image_type,
|
||||
.write = write_rbu_image_type,
|
||||
};
|
||||
|
||||
static void callbackfn_rbu(const struct firmware *fw, void *context)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!fw || !fw->size)
|
||||
if (!fw || !fw->size) {
|
||||
rbu_data.entry_created = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&rbu_data.lock);
|
||||
if (!strcmp(image_type, "mono")) {
|
||||
if (!img_update_realloc(fw->size))
|
||||
memcpy(rbu_data.image_update_buffer,
|
||||
fw->data, fw->size);
|
||||
fw->data, fw->size);
|
||||
} else if (!strcmp(image_type, "packet")) {
|
||||
if (!rbu_data.packetsize)
|
||||
rbu_data.packetsize = fw->size;
|
||||
|
@ -584,14 +543,103 @@ static void callbackfn_rbu(const struct firmware *fw, void *context)
|
|||
spin_unlock(&rbu_data.lock);
|
||||
|
||||
rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG,
|
||||
"dell_rbu", &rbu_device->dev,
|
||||
&context, callbackfn_rbu);
|
||||
"dell_rbu", &rbu_device->dev, &context, callbackfn_rbu);
|
||||
if (rc)
|
||||
printk(KERN_ERR
|
||||
"dell_rbu:%s request_firmware_nowait failed"
|
||||
" %d\n", __FUNCTION__, rc);
|
||||
"dell_rbu:%s request_firmware_nowait failed"
|
||||
" %d\n", __FUNCTION__, rc);
|
||||
else
|
||||
rbu_data.entry_created = 1;
|
||||
}
|
||||
|
||||
static ssize_t read_rbu_image_type(struct kobject *kobj, char *buffer,
|
||||
loff_t pos, size_t count)
|
||||
{
|
||||
int size = 0;
|
||||
if (!pos)
|
||||
size = sprintf(buffer, "%s\n", image_type);
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t write_rbu_image_type(struct kobject *kobj, char *buffer,
|
||||
loff_t pos, size_t count)
|
||||
{
|
||||
int rc = count;
|
||||
int req_firm_rc = 0;
|
||||
int i;
|
||||
spin_lock(&rbu_data.lock);
|
||||
/*
|
||||
* Find the first newline or space
|
||||
*/
|
||||
for (i = 0; i < count; ++i)
|
||||
if (buffer[i] == '\n' || buffer[i] == ' ') {
|
||||
buffer[i] = '\0';
|
||||
break;
|
||||
}
|
||||
if (i == count)
|
||||
buffer[count] = '\0';
|
||||
|
||||
if (strstr(buffer, "mono"))
|
||||
strcpy(image_type, "mono");
|
||||
else if (strstr(buffer, "packet"))
|
||||
strcpy(image_type, "packet");
|
||||
else if (strstr(buffer, "init")) {
|
||||
/*
|
||||
* If due to the user error the driver gets in a bad
|
||||
* state where even though it is loaded , the
|
||||
* /sys/class/firmware/dell_rbu entries are missing.
|
||||
* to cover this situation the user can recreate entries
|
||||
* by writing init to image_type.
|
||||
*/
|
||||
if (!rbu_data.entry_created) {
|
||||
spin_unlock(&rbu_data.lock);
|
||||
req_firm_rc = request_firmware_nowait(THIS_MODULE,
|
||||
FW_ACTION_NOHOTPLUG, "dell_rbu",
|
||||
&rbu_device->dev, &context,
|
||||
callbackfn_rbu);
|
||||
if (req_firm_rc) {
|
||||
printk(KERN_ERR
|
||||
"dell_rbu:%s request_firmware_nowait"
|
||||
" failed %d\n", __FUNCTION__, rc);
|
||||
rc = -EIO;
|
||||
} else
|
||||
rbu_data.entry_created = 1;
|
||||
|
||||
spin_lock(&rbu_data.lock);
|
||||
}
|
||||
} else {
|
||||
printk(KERN_WARNING "dell_rbu: image_type is invalid\n");
|
||||
spin_unlock(&rbu_data.lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* we must free all previous allocations */
|
||||
packet_empty_list();
|
||||
img_update_free();
|
||||
spin_unlock(&rbu_data.lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct bin_attribute rbu_data_attr = {
|
||||
.attr = {
|
||||
.name = "data",
|
||||
.owner = THIS_MODULE,
|
||||
.mode = 0444,
|
||||
},
|
||||
.read = read_rbu_data,
|
||||
};
|
||||
|
||||
static struct bin_attribute rbu_image_type_attr = {
|
||||
.attr = {
|
||||
.name = "image_type",
|
||||
.owner = THIS_MODULE,
|
||||
.mode = 0644,
|
||||
},
|
||||
.read = read_rbu_image_type,
|
||||
.write = write_rbu_image_type,
|
||||
};
|
||||
|
||||
static int __init dcdrbu_init(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
@ -599,11 +647,11 @@ static int __init dcdrbu_init(void)
|
|||
|
||||
init_packet_head();
|
||||
rbu_device =
|
||||
platform_device_register_simple("dell_rbu", -1, NULL, 0);
|
||||
platform_device_register_simple("dell_rbu", -1, NULL, 0);
|
||||
if (!rbu_device) {
|
||||
printk(KERN_ERR
|
||||
"dell_rbu:%s:platform_device_register_simple "
|
||||
"failed\n", __FUNCTION__);
|
||||
"dell_rbu:%s:platform_device_register_simple "
|
||||
"failed\n", __FUNCTION__);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -611,11 +659,12 @@ static int __init dcdrbu_init(void)
|
|||
sysfs_create_bin_file(&rbu_device->dev.kobj, &rbu_image_type_attr);
|
||||
|
||||
rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOHOTPLUG,
|
||||
"dell_rbu", &rbu_device->dev,
|
||||
&context, callbackfn_rbu);
|
||||
"dell_rbu", &rbu_device->dev, &context, callbackfn_rbu);
|
||||
if (rc)
|
||||
printk(KERN_ERR "dell_rbu:%s:request_firmware_nowait"
|
||||
" failed %d\n", __FUNCTION__, rc);
|
||||
" failed %d\n", __FUNCTION__, rc);
|
||||
else
|
||||
rbu_data.entry_created = 1;
|
||||
|
||||
return rc;
|
||||
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
* Copyright (C) 2005 Jesper Juhl <jesper.juhl@gmail.com>
|
||||
*
|
||||
* The HardDisk Active Protection System (hdaps) is present in the IBM ThinkPad
|
||||
* T41, T42, T43, R51, and X40, at least. It provides a basic two-axis
|
||||
* accelerometer and other data, such as the device's temperature.
|
||||
* T41, T42, T43, R50, R50p, R51, and X40, at least. It provides a basic
|
||||
* two-axis accelerometer and other data, such as the device's temperature.
|
||||
*
|
||||
* Based on the document by Mark A. Smith available at
|
||||
* This driver is based on the document by Mark A. Smith available at
|
||||
* http://www.almaden.ibm.com/cs/people/marksmith/tpaps.html and a lot of trial
|
||||
* and error.
|
||||
*
|
||||
|
@ -36,12 +36,7 @@
|
|||
#include <asm/io.h>
|
||||
|
||||
#define HDAPS_LOW_PORT 0x1600 /* first port used by hdaps */
|
||||
#define HDAPS_NR_PORTS 0x30 /* 0x1600 - 0x162f */
|
||||
|
||||
#define STATE_FRESH 0x50 /* accelerometer data is fresh */
|
||||
|
||||
#define REFRESH_ASYNC 0x00 /* do asynchronous refresh */
|
||||
#define REFRESH_SYNC 0x01 /* do synchronous refresh */
|
||||
#define HDAPS_NR_PORTS 0x30 /* number of ports: 0x1600 - 0x162f */
|
||||
|
||||
#define HDAPS_PORT_STATE 0x1611 /* device state */
|
||||
#define HDAPS_PORT_YPOS 0x1612 /* y-axis position */
|
||||
|
@ -53,7 +48,7 @@
|
|||
#define HDAPS_PORT_UNKNOWN 0x161c /* what is this? */
|
||||
#define HDAPS_PORT_KMACT 0x161d /* keyboard or mouse activity */
|
||||
|
||||
#define HDAPS_READ_MASK 0xff /* some reads have the low 8 bits set */
|
||||
#define STATE_FRESH 0x50 /* accelerometer data is fresh */
|
||||
|
||||
#define KEYBD_MASK 0x20 /* set if keyboard activity */
|
||||
#define MOUSE_MASK 0x40 /* set if mouse activity */
|
||||
|
@ -63,12 +58,11 @@
|
|||
#define INIT_TIMEOUT_MSECS 4000 /* wait up to 4s for device init ... */
|
||||
#define INIT_WAIT_MSECS 200 /* ... in 200ms increments */
|
||||
|
||||
static struct platform_device *pdev;
|
||||
static struct input_dev hdaps_idev;
|
||||
#define HDAPS_POLL_PERIOD (HZ/20) /* poll for input every 1/20s */
|
||||
#define HDAPS_INPUT_FUZZ 4 /* input event threshold */
|
||||
|
||||
static struct timer_list hdaps_timer;
|
||||
static unsigned int hdaps_mousedev_threshold = 4;
|
||||
static unsigned long hdaps_poll_ms = 50;
|
||||
static unsigned int hdaps_mousedev;
|
||||
static struct platform_device *pdev;
|
||||
static unsigned int hdaps_invert;
|
||||
static u8 km_activity;
|
||||
static int rest_x;
|
||||
|
@ -81,14 +75,14 @@ static DECLARE_MUTEX(hdaps_sem);
|
|||
*/
|
||||
static inline u8 __get_latch(u16 port)
|
||||
{
|
||||
return inb(port) & HDAPS_READ_MASK;
|
||||
return inb(port) & 0xff;
|
||||
}
|
||||
|
||||
/*
|
||||
* __check_latch - Check a port latch for a given value. Callers must hold
|
||||
* hdaps_sem. Returns zero if the port contains the given value.
|
||||
* __check_latch - Check a port latch for a given value. Returns zero if the
|
||||
* port contains the given value. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static inline unsigned int __check_latch(u16 port, u8 val)
|
||||
static inline int __check_latch(u16 port, u8 val)
|
||||
{
|
||||
if (__get_latch(port) == val)
|
||||
return 0;
|
||||
|
@ -99,7 +93,7 @@ static inline unsigned int __check_latch(u16 port, u8 val)
|
|||
* __wait_latch - Wait up to 100us for a port latch to get a certain value,
|
||||
* returning zero if the value is obtained. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static unsigned int __wait_latch(u16 port, u8 val)
|
||||
static int __wait_latch(u16 port, u8 val)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
|
@ -109,59 +103,42 @@ static unsigned int __wait_latch(u16 port, u8 val)
|
|||
udelay(5);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/*
|
||||
* __device_refresh - Request a refresh from the accelerometer.
|
||||
*
|
||||
* If sync is REFRESH_SYNC, we perform a synchronous refresh and will wait.
|
||||
* Returns zero if successful and nonzero on error.
|
||||
*
|
||||
* If sync is REFRESH_ASYNC, we merely kick off a new refresh if the device is
|
||||
* not up-to-date. Always returns zero.
|
||||
*
|
||||
* Callers must hold hdaps_sem.
|
||||
* __device_refresh - request a refresh from the accelerometer. Does not wait
|
||||
* for refresh to complete. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static int __device_refresh(unsigned int sync)
|
||||
static void __device_refresh(void)
|
||||
{
|
||||
u8 state;
|
||||
|
||||
udelay(100);
|
||||
|
||||
state = inb(0x1604);
|
||||
if (state == STATE_FRESH)
|
||||
return 0;
|
||||
|
||||
outb(0x11, 0x1610);
|
||||
outb(0x01, 0x161f);
|
||||
if (sync == REFRESH_ASYNC)
|
||||
return 0;
|
||||
udelay(200);
|
||||
if (inb(0x1604) != STATE_FRESH) {
|
||||
outb(0x11, 0x1610);
|
||||
outb(0x01, 0x161f);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* __device_refresh_sync - request a synchronous refresh from the
|
||||
* accelerometer. We wait for the refresh to complete. Returns zero if
|
||||
* successful and nonzero on error. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static int __device_refresh_sync(void)
|
||||
{
|
||||
__device_refresh();
|
||||
return __wait_latch(0x1604, STATE_FRESH);
|
||||
}
|
||||
|
||||
/*
|
||||
* __device_complete - Indicate to the accelerometer that we are done reading
|
||||
* __device_complete - indicate to the accelerometer that we are done reading
|
||||
* data, and then initiate an async refresh. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static inline void __device_complete(void)
|
||||
{
|
||||
inb(0x161f);
|
||||
inb(0x1604);
|
||||
__device_refresh(REFRESH_ASYNC);
|
||||
}
|
||||
|
||||
static int __hdaps_readb_one(unsigned int port, u8 *val)
|
||||
{
|
||||
/* do a sync refresh -- we need to be sure that we read fresh data */
|
||||
if (__device_refresh(REFRESH_SYNC))
|
||||
return -EIO;
|
||||
|
||||
*val = inb(port);
|
||||
__device_complete();
|
||||
|
||||
return 0;
|
||||
__device_refresh();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -174,17 +151,26 @@ static int hdaps_readb_one(unsigned int port, u8 *val)
|
|||
int ret;
|
||||
|
||||
down(&hdaps_sem);
|
||||
ret = __hdaps_readb_one(port, val);
|
||||
up(&hdaps_sem);
|
||||
|
||||
/* do a sync refresh -- we need to be sure that we read fresh data */
|
||||
ret = __device_refresh_sync();
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
*val = inb(port);
|
||||
__device_complete();
|
||||
|
||||
out:
|
||||
up(&hdaps_sem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* __hdaps_read_pair - internal lockless helper for hdaps_read_pair(). */
|
||||
static int __hdaps_read_pair(unsigned int port1, unsigned int port2,
|
||||
int *x, int *y)
|
||||
{
|
||||
/* do a sync refresh -- we need to be sure that we read fresh data */
|
||||
if (__device_refresh(REFRESH_SYNC))
|
||||
if (__device_refresh_sync())
|
||||
return -EIO;
|
||||
|
||||
*y = inw(port2);
|
||||
|
@ -217,11 +203,13 @@ static int hdaps_read_pair(unsigned int port1, unsigned int port2,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* initialize the accelerometer */
|
||||
/*
|
||||
* hdaps_device_init - initialize the accelerometer. Returns zero on success
|
||||
* and negative error code on failure. Can sleep.
|
||||
*/
|
||||
static int hdaps_device_init(void)
|
||||
{
|
||||
unsigned int total_msecs = INIT_TIMEOUT_MSECS;
|
||||
int ret = -ENXIO;
|
||||
int total, ret = -ENXIO;
|
||||
|
||||
down(&hdaps_sem);
|
||||
|
||||
|
@ -231,8 +219,10 @@ static int hdaps_device_init(void)
|
|||
goto out;
|
||||
|
||||
/*
|
||||
* The 0x03 value appears to only work on some thinkpads, such as the
|
||||
* T42p. Others return 0x01.
|
||||
* Most ThinkPads return 0x01.
|
||||
*
|
||||
* Others--namely the R50p, T41p, and T42p--return 0x03. These laptops
|
||||
* have "inverted" axises.
|
||||
*
|
||||
* The 0x02 value occurs when the chip has been previously initialized.
|
||||
*/
|
||||
|
@ -267,24 +257,23 @@ static int hdaps_device_init(void)
|
|||
outb(0x01, 0x161f);
|
||||
if (__wait_latch(0x161f, 0x00))
|
||||
goto out;
|
||||
if (__device_refresh(REFRESH_SYNC))
|
||||
if (__device_refresh_sync())
|
||||
goto out;
|
||||
if (__wait_latch(0x1611, 0x00))
|
||||
goto out;
|
||||
|
||||
/* we have done our dance, now let's wait for the applause */
|
||||
while (total_msecs > 0) {
|
||||
u8 ignored;
|
||||
for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
|
||||
int x, y;
|
||||
|
||||
/* a read of the device helps push it into action */
|
||||
__hdaps_readb_one(HDAPS_PORT_UNKNOWN, &ignored);
|
||||
__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y);
|
||||
if (!__wait_latch(0x1611, 0x02)) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
msleep(INIT_WAIT_MSECS);
|
||||
total_msecs -= INIT_WAIT_MSECS;
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -293,96 +282,6 @@ out:
|
|||
}
|
||||
|
||||
|
||||
/* Input class stuff */
|
||||
|
||||
/*
|
||||
* hdaps_calibrate - Zero out our "resting" values. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static void hdaps_calibrate(void)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y))
|
||||
return;
|
||||
|
||||
rest_x = x;
|
||||
rest_y = y;
|
||||
}
|
||||
|
||||
static void hdaps_mousedev_poll(unsigned long unused)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
/* Cannot sleep. Try nonblockingly. If we fail, try again later. */
|
||||
if (down_trylock(&hdaps_sem)) {
|
||||
mod_timer(&hdaps_timer,jiffies+msecs_to_jiffies(hdaps_poll_ms));
|
||||
return;
|
||||
}
|
||||
|
||||
if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y))
|
||||
goto out;
|
||||
|
||||
x -= rest_x;
|
||||
y -= rest_y;
|
||||
if (abs(x) > hdaps_mousedev_threshold)
|
||||
input_report_rel(&hdaps_idev, REL_X, x);
|
||||
if (abs(y) > hdaps_mousedev_threshold)
|
||||
input_report_rel(&hdaps_idev, REL_Y, y);
|
||||
input_sync(&hdaps_idev);
|
||||
|
||||
mod_timer(&hdaps_timer, jiffies + msecs_to_jiffies(hdaps_poll_ms));
|
||||
|
||||
out:
|
||||
up(&hdaps_sem);
|
||||
}
|
||||
|
||||
/*
|
||||
* hdaps_mousedev_enable - enable the input class device. Can sleep.
|
||||
*/
|
||||
static void hdaps_mousedev_enable(void)
|
||||
{
|
||||
down(&hdaps_sem);
|
||||
|
||||
/* calibrate the device before enabling */
|
||||
hdaps_calibrate();
|
||||
|
||||
/* initialize the input class */
|
||||
init_input_dev(&hdaps_idev);
|
||||
hdaps_idev.dev = &pdev->dev;
|
||||
hdaps_idev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
|
||||
hdaps_idev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
|
||||
hdaps_idev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT);
|
||||
input_register_device(&hdaps_idev);
|
||||
|
||||
/* start up our timer */
|
||||
init_timer(&hdaps_timer);
|
||||
hdaps_timer.function = hdaps_mousedev_poll;
|
||||
hdaps_timer.expires = jiffies + msecs_to_jiffies(hdaps_poll_ms);
|
||||
add_timer(&hdaps_timer);
|
||||
|
||||
hdaps_mousedev = 1;
|
||||
|
||||
up(&hdaps_sem);
|
||||
|
||||
printk(KERN_INFO "hdaps: input device enabled.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* hdaps_mousedev_disable - disable the input class device. Caller must hold
|
||||
* hdaps_sem.
|
||||
*/
|
||||
static void hdaps_mousedev_disable(void)
|
||||
{
|
||||
down(&hdaps_sem);
|
||||
if (hdaps_mousedev) {
|
||||
hdaps_mousedev = 0;
|
||||
del_timer_sync(&hdaps_timer);
|
||||
input_unregister_device(&hdaps_idev);
|
||||
}
|
||||
up(&hdaps_sem);
|
||||
}
|
||||
|
||||
|
||||
/* Device model stuff */
|
||||
|
||||
static int hdaps_probe(struct device *dev)
|
||||
|
@ -412,6 +311,49 @@ static struct device_driver hdaps_driver = {
|
|||
.resume = hdaps_resume
|
||||
};
|
||||
|
||||
/* Input class stuff */
|
||||
|
||||
static struct input_dev hdaps_idev = {
|
||||
.name = "hdaps",
|
||||
.evbit = { BIT(EV_ABS) },
|
||||
.absbit = { BIT(ABS_X) | BIT(ABS_Y) },
|
||||
.absmin = { [ABS_X] = -256, [ABS_Y] = -256 },
|
||||
.absmax = { [ABS_X] = 256, [ABS_Y] = 256 },
|
||||
.absfuzz = { [ABS_X] = HDAPS_INPUT_FUZZ, [ABS_Y] = HDAPS_INPUT_FUZZ },
|
||||
.absflat = { [ABS_X] = HDAPS_INPUT_FUZZ, [ABS_Y] = HDAPS_INPUT_FUZZ },
|
||||
};
|
||||
|
||||
/*
|
||||
* hdaps_calibrate - Set our "resting" values. Callers must hold hdaps_sem.
|
||||
*/
|
||||
static void hdaps_calibrate(void)
|
||||
{
|
||||
__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &rest_x, &rest_y);
|
||||
}
|
||||
|
||||
static void hdaps_mousedev_poll(unsigned long unused)
|
||||
{
|
||||
int x, y;
|
||||
|
||||
/* Cannot sleep. Try nonblockingly. If we fail, try again later. */
|
||||
if (down_trylock(&hdaps_sem)) {
|
||||
mod_timer(&hdaps_timer,jiffies + HDAPS_POLL_PERIOD);
|
||||
return;
|
||||
}
|
||||
|
||||
if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y))
|
||||
goto out;
|
||||
|
||||
input_report_abs(&hdaps_idev, ABS_X, x - rest_x);
|
||||
input_report_abs(&hdaps_idev, ABS_Y, y - rest_y);
|
||||
input_sync(&hdaps_idev);
|
||||
|
||||
mod_timer(&hdaps_timer, jiffies + HDAPS_POLL_PERIOD);
|
||||
|
||||
out:
|
||||
up(&hdaps_sem);
|
||||
}
|
||||
|
||||
|
||||
/* Sysfs Files */
|
||||
|
||||
|
@ -517,69 +459,6 @@ static ssize_t hdaps_invert_store(struct device *dev,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t hdaps_mousedev_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", hdaps_mousedev);
|
||||
}
|
||||
|
||||
static ssize_t hdaps_mousedev_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int enable;
|
||||
|
||||
if (sscanf(buf, "%d", &enable) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (enable == 1)
|
||||
hdaps_mousedev_enable();
|
||||
else if (enable == 0)
|
||||
hdaps_mousedev_disable();
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t hdaps_poll_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%lu\n", hdaps_poll_ms);
|
||||
}
|
||||
|
||||
static ssize_t hdaps_poll_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int poll;
|
||||
|
||||
if (sscanf(buf, "%u", &poll) != 1 || poll == 0)
|
||||
return -EINVAL;
|
||||
hdaps_poll_ms = poll;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t hdaps_threshold_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", hdaps_mousedev_threshold);
|
||||
}
|
||||
|
||||
static ssize_t hdaps_threshold_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int threshold;
|
||||
|
||||
if (sscanf(buf, "%u", &threshold) != 1 || threshold == 0)
|
||||
return -EINVAL;
|
||||
hdaps_mousedev_threshold = threshold;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(position, 0444, hdaps_position_show, NULL);
|
||||
static DEVICE_ATTR(variance, 0444, hdaps_variance_show, NULL);
|
||||
static DEVICE_ATTR(temp1, 0444, hdaps_temp1_show, NULL);
|
||||
|
@ -588,10 +467,6 @@ static DEVICE_ATTR(keyboard_activity, 0444, hdaps_keyboard_activity_show, NULL);
|
|||
static DEVICE_ATTR(mouse_activity, 0444, hdaps_mouse_activity_show, NULL);
|
||||
static DEVICE_ATTR(calibrate, 0644, hdaps_calibrate_show,hdaps_calibrate_store);
|
||||
static DEVICE_ATTR(invert, 0644, hdaps_invert_show, hdaps_invert_store);
|
||||
static DEVICE_ATTR(mousedev, 0644, hdaps_mousedev_show, hdaps_mousedev_store);
|
||||
static DEVICE_ATTR(mousedev_poll_ms, 0644, hdaps_poll_show, hdaps_poll_store);
|
||||
static DEVICE_ATTR(mousedev_threshold, 0644, hdaps_threshold_show,
|
||||
hdaps_threshold_store);
|
||||
|
||||
static struct attribute *hdaps_attributes[] = {
|
||||
&dev_attr_position.attr,
|
||||
|
@ -601,9 +476,6 @@ static struct attribute *hdaps_attributes[] = {
|
|||
&dev_attr_keyboard_activity.attr,
|
||||
&dev_attr_mouse_activity.attr,
|
||||
&dev_attr_calibrate.attr,
|
||||
&dev_attr_mousedev.attr,
|
||||
&dev_attr_mousedev_threshold.attr,
|
||||
&dev_attr_mousedev_poll_ms.attr,
|
||||
&dev_attr_invert.attr,
|
||||
NULL,
|
||||
};
|
||||
|
@ -619,7 +491,7 @@ static struct attribute_group hdaps_attribute_group = {
|
|||
* XXX: We should be able to return nonzero and halt the detection process.
|
||||
* But there is a bug in dmi_check_system() where a nonzero return from the
|
||||
* first match will result in a return of failure from dmi_check_system().
|
||||
* I fixed this; the patch is in 2.6-mm. Once in Linus's tree we can make
|
||||
* I fixed this; the patch is 2.6-git. Once in a released tree, we can make
|
||||
* hdaps_dmi_match_invert() return hdaps_dmi_match(), which in turn returns 1.
|
||||
*/
|
||||
static int hdaps_dmi_match(struct dmi_system_id *id)
|
||||
|
@ -668,6 +540,7 @@ static int __init hdaps_init(void)
|
|||
HDAPS_DMI_MATCH_NORMAL("ThinkPad T42"),
|
||||
HDAPS_DMI_MATCH_NORMAL("ThinkPad T43"),
|
||||
HDAPS_DMI_MATCH_NORMAL("ThinkPad X40"),
|
||||
HDAPS_DMI_MATCH_NORMAL("ThinkPad X41 Tablet"),
|
||||
{ .ident = NULL }
|
||||
};
|
||||
|
||||
|
@ -696,8 +569,18 @@ static int __init hdaps_init(void)
|
|||
if (ret)
|
||||
goto out_device;
|
||||
|
||||
if (hdaps_mousedev)
|
||||
hdaps_mousedev_enable();
|
||||
/* initial calibrate for the input device */
|
||||
hdaps_calibrate();
|
||||
|
||||
/* initialize the input class */
|
||||
hdaps_idev.dev = &pdev->dev;
|
||||
input_register_device(&hdaps_idev);
|
||||
|
||||
/* start up our timer for the input device */
|
||||
init_timer(&hdaps_timer);
|
||||
hdaps_timer.function = hdaps_mousedev_poll;
|
||||
hdaps_timer.expires = jiffies + HDAPS_POLL_PERIOD;
|
||||
add_timer(&hdaps_timer);
|
||||
|
||||
printk(KERN_INFO "hdaps: driver successfully loaded.\n");
|
||||
return 0;
|
||||
|
@ -715,8 +598,8 @@ out:
|
|||
|
||||
static void __exit hdaps_exit(void)
|
||||
{
|
||||
hdaps_mousedev_disable();
|
||||
|
||||
del_timer_sync(&hdaps_timer);
|
||||
input_unregister_device(&hdaps_idev);
|
||||
sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group);
|
||||
platform_device_unregister(pdev);
|
||||
driver_unregister(&hdaps_driver);
|
||||
|
@ -728,9 +611,6 @@ static void __exit hdaps_exit(void)
|
|||
module_init(hdaps_init);
|
||||
module_exit(hdaps_exit);
|
||||
|
||||
module_param_named(mousedev, hdaps_mousedev, bool, 0);
|
||||
MODULE_PARM_DESC(mousedev, "enable the input class device");
|
||||
|
||||
module_param_named(invert, hdaps_invert, bool, 0);
|
||||
MODULE_PARM_DESC(invert, "invert data along each axis");
|
||||
|
||||
|
|
|
@ -500,6 +500,7 @@ static int ide_diag_taskfile(ide_drive_t *drive, ide_task_t *args, unsigned long
|
|||
}
|
||||
|
||||
rq.special = args;
|
||||
args->rq = &rq;
|
||||
return ide_do_drive_cmd(drive, &rq, ide_wait);
|
||||
}
|
||||
|
||||
|
|
|
@ -61,6 +61,7 @@ static const PCI_ENTRY id_list[] =
|
|||
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_E,"Digi International", "Digi DataFire Micro V (Europe)"},
|
||||
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A,"Digi International", "Digi DataFire Micro V IOM2 (North America)"},
|
||||
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_A,"Digi International", "Digi DataFire Micro V (North America)"},
|
||||
{PCI_VENDOR_ID_SITECOM, PCI_DEVICE_ID_SITECOM_DC105V2, "Sitecom Europe", "DC-105 ISDN PCI"},
|
||||
{0, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
|
|
|
@ -466,10 +466,10 @@ void st5481_stop(struct st5481_adapter *adapter);
|
|||
#define __debug_variable st5481_debug
|
||||
#include "hisax_debug.h"
|
||||
|
||||
#ifdef CONFIG_HISAX_DEBUG
|
||||
|
||||
extern int st5481_debug;
|
||||
|
||||
#ifdef CONFIG_HISAX_DEBUG
|
||||
|
||||
#define DBG_ISO_PACKET(level,urb) \
|
||||
if (level & __debug_variable) dump_iso_packet(__FUNCTION__,urb)
|
||||
|
||||
|
|
|
@ -172,14 +172,18 @@ static void usb_b_out_complete(struct urb *urb, struct pt_regs *regs)
|
|||
test_and_clear_bit(buf_nr, &b_out->busy);
|
||||
|
||||
if (unlikely(urb->status < 0)) {
|
||||
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
|
||||
WARN("urb status %d",urb->status);
|
||||
if (b_out->busy == 0) {
|
||||
st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL);
|
||||
}
|
||||
} else {
|
||||
DBG(1,"urb killed");
|
||||
return; // Give up
|
||||
switch (urb->status) {
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
case -ECONNRESET:
|
||||
DBG(4,"urb killed status %d", urb->status);
|
||||
return; // Give up
|
||||
default:
|
||||
WARN("urb status %d",urb->status);
|
||||
if (b_out->busy == 0) {
|
||||
st5481_usb_pipe_reset(adapter, (bcs->channel+1)*2 | USB_DIR_OUT, NULL, NULL);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,7 +209,9 @@ static void st5481B_mode(struct st5481_bcs *bcs, int mode)
|
|||
bcs->mode = mode;
|
||||
|
||||
// Cancel all USB transfers on this B channel
|
||||
b_out->urb[0]->transfer_flags |= URB_ASYNC_UNLINK;
|
||||
usb_unlink_urb(b_out->urb[0]);
|
||||
b_out->urb[1]->transfer_flags |= URB_ASYNC_UNLINK;
|
||||
usb_unlink_urb(b_out->urb[1]);
|
||||
b_out->busy = 0;
|
||||
|
||||
|
|
|
@ -382,16 +382,20 @@ static void usb_d_out_complete(struct urb *urb, struct pt_regs *regs)
|
|||
test_and_clear_bit(buf_nr, &d_out->busy);
|
||||
|
||||
if (unlikely(urb->status < 0)) {
|
||||
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
|
||||
WARN("urb status %d",urb->status);
|
||||
if (d_out->busy == 0) {
|
||||
st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
DBG(1,"urb killed");
|
||||
return; // Give up
|
||||
switch (urb->status) {
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
case -ECONNRESET:
|
||||
DBG(1,"urb killed status %d", urb->status);
|
||||
break;
|
||||
default:
|
||||
WARN("urb status %d",urb->status);
|
||||
if (d_out->busy == 0) {
|
||||
st5481_usb_pipe_reset(adapter, EP_D_OUT | USB_DIR_OUT, fifo_reseted, adapter);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return; // Give up
|
||||
}
|
||||
|
||||
FsmEvent(&adapter->d_out.fsm, EV_DOUT_COMPLETE, (void *) buf_nr);
|
||||
|
@ -709,14 +713,14 @@ int st5481_setup_d(struct st5481_adapter *adapter)
|
|||
|
||||
adapter->l1m.fsm = &l1fsm;
|
||||
adapter->l1m.state = ST_L1_F3;
|
||||
adapter->l1m.debug = 1;
|
||||
adapter->l1m.debug = st5481_debug & 0x100;
|
||||
adapter->l1m.userdata = adapter;
|
||||
adapter->l1m.printdebug = l1m_debug;
|
||||
FsmInitTimer(&adapter->l1m, &adapter->timer);
|
||||
|
||||
adapter->d_out.fsm.fsm = &dout_fsm;
|
||||
adapter->d_out.fsm.state = ST_DOUT_NONE;
|
||||
adapter->d_out.fsm.debug = 1;
|
||||
adapter->d_out.fsm.debug = st5481_debug & 0x100;
|
||||
adapter->d_out.fsm.userdata = adapter;
|
||||
adapter->d_out.fsm.printdebug = dout_debug;
|
||||
|
||||
|
|
|
@ -43,10 +43,10 @@ static int number_of_leds = 2; /* 2 LEDs on the adpater default */
|
|||
module_param(number_of_leds, int, 0);
|
||||
|
||||
#ifdef CONFIG_HISAX_DEBUG
|
||||
static int debug = 0x1;
|
||||
static int debug = 0;
|
||||
module_param(debug, int, 0);
|
||||
int st5481_debug;
|
||||
#endif
|
||||
int st5481_debug;
|
||||
|
||||
static LIST_HEAD(adapter_list);
|
||||
|
||||
|
|
|
@ -132,11 +132,15 @@ static void usb_ctrl_complete(struct urb *urb, struct pt_regs *regs)
|
|||
struct ctrl_msg *ctrl_msg;
|
||||
|
||||
if (unlikely(urb->status < 0)) {
|
||||
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
|
||||
WARN("urb status %d",urb->status);
|
||||
} else {
|
||||
DBG(1,"urb killed");
|
||||
return; // Give up
|
||||
switch (urb->status) {
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
case -ECONNRESET:
|
||||
DBG(1,"urb killed status %d", urb->status);
|
||||
return; // Give up
|
||||
default:
|
||||
WARN("urb status %d",urb->status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -184,22 +188,22 @@ static void usb_int_complete(struct urb *urb, struct pt_regs *regs)
|
|||
int status;
|
||||
|
||||
switch (urb->status) {
|
||||
case 0:
|
||||
/* success */
|
||||
break;
|
||||
case -ECONNRESET:
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
/* this urb is terminated, clean up */
|
||||
DBG(1, "urb shutting down with status: %d", urb->status);
|
||||
return;
|
||||
default:
|
||||
WARN("nonzero urb status received: %d", urb->status);
|
||||
goto exit;
|
||||
case 0:
|
||||
/* success */
|
||||
break;
|
||||
case -ECONNRESET:
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
/* this urb is terminated, clean up */
|
||||
DBG(2, "urb shutting down with status: %d", urb->status);
|
||||
return;
|
||||
default:
|
||||
WARN("nonzero urb status received: %d", urb->status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
||||
DBG_PACKET(1, data, INT_PKT_SIZE);
|
||||
DBG_PACKET(2, data, INT_PKT_SIZE);
|
||||
|
||||
if (urb->actual_length == 0) {
|
||||
goto exit;
|
||||
|
@ -250,7 +254,7 @@ int st5481_setup_usb(struct st5481_adapter *adapter)
|
|||
struct urb *urb;
|
||||
u8 *buf;
|
||||
|
||||
DBG(1,"");
|
||||
DBG(2,"");
|
||||
|
||||
if ((status = usb_reset_configuration (dev)) < 0) {
|
||||
WARN("reset_configuration failed,status=%d",status);
|
||||
|
@ -330,15 +334,17 @@ void st5481_release_usb(struct st5481_adapter *adapter)
|
|||
DBG(1,"");
|
||||
|
||||
// Stop and free Control and Interrupt URBs
|
||||
usb_unlink_urb(ctrl->urb);
|
||||
usb_kill_urb(ctrl->urb);
|
||||
if (ctrl->urb->transfer_buffer)
|
||||
kfree(ctrl->urb->transfer_buffer);
|
||||
usb_free_urb(ctrl->urb);
|
||||
ctrl->urb = NULL;
|
||||
|
||||
usb_unlink_urb(intr->urb);
|
||||
usb_kill_urb(intr->urb);
|
||||
if (intr->urb->transfer_buffer)
|
||||
kfree(intr->urb->transfer_buffer);
|
||||
usb_free_urb(intr->urb);
|
||||
ctrl->urb = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -406,6 +412,7 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev,
|
|||
spin_lock_init(&urb->lock);
|
||||
urb->dev=dev;
|
||||
urb->pipe=pipe;
|
||||
urb->interval = 1;
|
||||
urb->transfer_buffer=buf;
|
||||
urb->number_of_packets = num_packets;
|
||||
urb->transfer_buffer_length=num_packets*packet_size;
|
||||
|
@ -452,7 +459,9 @@ st5481_setup_isocpipes(struct urb* urb[2], struct usb_device *dev,
|
|||
if (urb[j]) {
|
||||
if (urb[j]->transfer_buffer)
|
||||
kfree(urb[j]->transfer_buffer);
|
||||
urb[j]->transfer_buffer = NULL;
|
||||
usb_free_urb(urb[j]);
|
||||
urb[j] = NULL;
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
|
@ -463,10 +472,11 @@ void st5481_release_isocpipes(struct urb* urb[2])
|
|||
int j;
|
||||
|
||||
for (j = 0; j < 2; j++) {
|
||||
usb_unlink_urb(urb[j]);
|
||||
usb_kill_urb(urb[j]);
|
||||
if (urb[j]->transfer_buffer)
|
||||
kfree(urb[j]->transfer_buffer);
|
||||
usb_free_urb(urb[j]);
|
||||
urb[j] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -485,11 +495,15 @@ static void usb_in_complete(struct urb *urb, struct pt_regs *regs)
|
|||
int len, count, status;
|
||||
|
||||
if (unlikely(urb->status < 0)) {
|
||||
if (urb->status != -ENOENT && urb->status != -ESHUTDOWN) {
|
||||
WARN("urb status %d",urb->status);
|
||||
} else {
|
||||
DBG(1,"urb killed");
|
||||
return; // Give up
|
||||
switch (urb->status) {
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
case -ECONNRESET:
|
||||
DBG(1,"urb killed status %d", urb->status);
|
||||
return; // Give up
|
||||
default:
|
||||
WARN("urb status %d",urb->status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -631,7 +645,9 @@ void st5481_in_mode(struct st5481_in *in, int mode)
|
|||
|
||||
in->mode = mode;
|
||||
|
||||
in->urb[0]->transfer_flags |= URB_ASYNC_UNLINK;
|
||||
usb_unlink_urb(in->urb[0]);
|
||||
in->urb[1]->transfer_flags |= URB_ASYNC_UNLINK;
|
||||
usb_unlink_urb(in->urb[1]);
|
||||
|
||||
if (in->mode != L1_MODE_NULL) {
|
||||
|
|
|
@ -69,9 +69,13 @@ extern const char raid6_empty_zero_page[PAGE_SIZE];
|
|||
#define __init
|
||||
#define __exit
|
||||
#define __attribute_const__ __attribute__((const))
|
||||
#define noinline __attribute__((noinline))
|
||||
|
||||
#define preempt_enable()
|
||||
#define preempt_disable()
|
||||
#define cpu_has_feature(x) 1
|
||||
#define enable_kernel_altivec()
|
||||
#define disable_kernel_altivec()
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "raid6.h"
|
||||
#ifndef __KERNEL__
|
||||
#include <sys/mman.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
struct raid6_calls raid6_call;
|
||||
|
|
|
@ -27,16 +27,20 @@
|
|||
#ifdef CONFIG_ALTIVEC
|
||||
|
||||
#include <altivec.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/cputable.h>
|
||||
#ifdef __KERNEL__
|
||||
# include <asm/system.h>
|
||||
# include <asm/cputable.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is the C data type to use
|
||||
* This is the C data type to use. We use a vector of
|
||||
* signed char so vec_cmpgt() will generate the right
|
||||
* instruction.
|
||||
*/
|
||||
|
||||
typedef vector unsigned char unative_t;
|
||||
typedef vector signed char unative_t;
|
||||
|
||||
#define NBYTES(x) ((vector unsigned char) {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x})
|
||||
#define NBYTES(x) ((vector signed char) {x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x})
|
||||
#define NSIZE sizeof(unative_t)
|
||||
|
||||
/*
|
||||
|
@ -108,7 +112,11 @@ int raid6_have_altivec(void);
|
|||
int raid6_have_altivec(void)
|
||||
{
|
||||
/* This assumes either all CPUs have Altivec or none does */
|
||||
# ifdef __KERNEL__
|
||||
return cpu_has_feature(CPU_FTR_ALTIVEC);
|
||||
# else
|
||||
return 1;
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ OPTFLAGS = -O2 # Adjust as desired
|
|||
CFLAGS = -I.. -g $(OPTFLAGS)
|
||||
LD = ld
|
||||
PERL = perl
|
||||
AR = ar
|
||||
RANLIB = ranlib
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
@ -18,18 +20,33 @@ PERL = perl
|
|||
%.uc: ../%.uc
|
||||
cp -f $< $@
|
||||
|
||||
all: raid6.o raid6test
|
||||
all: raid6.a raid6test
|
||||
|
||||
raid6.o: raid6int1.o raid6int2.o raid6int4.o raid6int8.o raid6int16.o \
|
||||
raid6.a: raid6int1.o raid6int2.o raid6int4.o raid6int8.o raid6int16.o \
|
||||
raid6int32.o \
|
||||
raid6mmx.o raid6sse1.o raid6sse2.o \
|
||||
raid6altivec1.o raid6altivec2.o raid6altivec4.o raid6altivec8.o \
|
||||
raid6recov.o raid6algos.o \
|
||||
raid6tables.o
|
||||
$(LD) -r -o $@ $^
|
||||
rm -f $@
|
||||
$(AR) cq $@ $^
|
||||
$(RANLIB) $@
|
||||
|
||||
raid6test: raid6.o test.c
|
||||
raid6test: test.c raid6.a
|
||||
$(CC) $(CFLAGS) -o raid6test $^
|
||||
|
||||
raid6altivec1.c: raid6altivec.uc ../unroll.pl
|
||||
$(PERL) ../unroll.pl 1 < raid6altivec.uc > $@
|
||||
|
||||
raid6altivec2.c: raid6altivec.uc ../unroll.pl
|
||||
$(PERL) ../unroll.pl 2 < raid6altivec.uc > $@
|
||||
|
||||
raid6altivec4.c: raid6altivec.uc ../unroll.pl
|
||||
$(PERL) ../unroll.pl 4 < raid6altivec.uc > $@
|
||||
|
||||
raid6altivec8.c: raid6altivec.uc ../unroll.pl
|
||||
$(PERL) ../unroll.pl 8 < raid6altivec.uc > $@
|
||||
|
||||
raid6int1.c: raid6int.uc ../unroll.pl
|
||||
$(PERL) ../unroll.pl 1 < raid6int.uc > $@
|
||||
|
||||
|
@ -52,7 +69,7 @@ raid6tables.c: mktables
|
|||
./mktables > raid6tables.c
|
||||
|
||||
clean:
|
||||
rm -f *.o mktables mktables.c raid6int.uc raid6*.c raid6test
|
||||
rm -f *.o *.a mktables mktables.c raid6int.uc raid6*.c raid6test
|
||||
|
||||
spotless: clean
|
||||
rm -f *~
|
||||
|
|
|
@ -82,7 +82,7 @@ int __init init_sharpsl(void)
|
|||
} else if (machine_is_tosa()) {
|
||||
sharpsl_partitions[0].size=0x006a0000;
|
||||
sharpsl_partitions[0].offset=0x00160000;
|
||||
} else if (machine_is_spitz()) {
|
||||
} else if (machine_is_spitz() || machine_is_akita() || machine_is_borzoi()) {
|
||||
sharpsl_partitions[0].size=0x006b0000;
|
||||
sharpsl_partitions[0].offset=0x00140000;
|
||||
} else {
|
||||
|
|
|
@ -221,10 +221,16 @@ sharpsl_nand_init(void)
|
|||
sharpsl_partition_info[1].size=25 * 1024 * 1024;
|
||||
} else if (machine_is_husky()) {
|
||||
sharpsl_partition_info[1].size=53 * 1024 * 1024;
|
||||
}
|
||||
} else if (machine_is_spitz()) {
|
||||
sharpsl_partition_info[1].size=5 * 1024 * 1024;
|
||||
} else if (machine_is_akita()) {
|
||||
sharpsl_partition_info[1].size=58 * 1024 * 1024;
|
||||
} else if (machine_is_borzoi()) {
|
||||
sharpsl_partition_info[1].size=32 * 1024 * 1024;
|
||||
}
|
||||
}
|
||||
|
||||
if (machine_is_husky()) {
|
||||
if (machine_is_husky() || machine_is_borzoi()) {
|
||||
/* Need to use small eraseblock size for backward compatibility */
|
||||
sharpsl_mtd->flags |= MTD_NO_VIRTBLOCKS;
|
||||
}
|
||||
|
|
|
@ -353,8 +353,6 @@ struct cp_private {
|
|||
|
||||
struct net_device_stats net_stats;
|
||||
struct cp_extra_stats cp_stats;
|
||||
struct cp_dma_stats *nic_stats;
|
||||
dma_addr_t nic_stats_dma;
|
||||
|
||||
unsigned rx_tail ____cacheline_aligned;
|
||||
struct cp_desc *rx_ring;
|
||||
|
@ -1143,10 +1141,6 @@ static int cp_alloc_rings (struct cp_private *cp)
|
|||
cp->rx_ring = mem;
|
||||
cp->tx_ring = &cp->rx_ring[CP_RX_RING_SIZE];
|
||||
|
||||
mem += (CP_RING_BYTES - CP_STATS_SIZE);
|
||||
cp->nic_stats = mem;
|
||||
cp->nic_stats_dma = cp->ring_dma + (CP_RING_BYTES - CP_STATS_SIZE);
|
||||
|
||||
return cp_init_rings(cp);
|
||||
}
|
||||
|
||||
|
@ -1187,7 +1181,6 @@ static void cp_free_rings (struct cp_private *cp)
|
|||
pci_free_consistent(cp->pdev, CP_RING_BYTES, cp->rx_ring, cp->ring_dma);
|
||||
cp->rx_ring = NULL;
|
||||
cp->tx_ring = NULL;
|
||||
cp->nic_stats = NULL;
|
||||
}
|
||||
|
||||
static int cp_open (struct net_device *dev)
|
||||
|
@ -1516,13 +1509,17 @@ static void cp_get_ethtool_stats (struct net_device *dev,
|
|||
struct ethtool_stats *estats, u64 *tmp_stats)
|
||||
{
|
||||
struct cp_private *cp = netdev_priv(dev);
|
||||
struct cp_dma_stats *nic_stats;
|
||||
dma_addr_t dma;
|
||||
int i;
|
||||
|
||||
memset(cp->nic_stats, 0, sizeof(struct cp_dma_stats));
|
||||
nic_stats = pci_alloc_consistent(cp->pdev, sizeof(*nic_stats), &dma);
|
||||
if (!nic_stats)
|
||||
return;
|
||||
|
||||
/* begin NIC statistics dump */
|
||||
cpw32(StatsAddr + 4, (cp->nic_stats_dma >> 16) >> 16);
|
||||
cpw32(StatsAddr, (cp->nic_stats_dma & 0xffffffff) | DumpStats);
|
||||
cpw32(StatsAddr + 4, (u64)dma >> 32);
|
||||
cpw32(StatsAddr, ((u64)dma & DMA_32BIT_MASK) | DumpStats);
|
||||
cpr32(StatsAddr);
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
|
@ -1532,24 +1529,27 @@ static void cp_get_ethtool_stats (struct net_device *dev,
|
|||
}
|
||||
cpw32(StatsAddr, 0);
|
||||
cpw32(StatsAddr + 4, 0);
|
||||
cpr32(StatsAddr);
|
||||
|
||||
i = 0;
|
||||
tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_ok);
|
||||
tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok);
|
||||
tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_err);
|
||||
tmp_stats[i++] = le32_to_cpu(cp->nic_stats->rx_err);
|
||||
tmp_stats[i++] = le16_to_cpu(cp->nic_stats->rx_fifo);
|
||||
tmp_stats[i++] = le16_to_cpu(cp->nic_stats->frame_align);
|
||||
tmp_stats[i++] = le32_to_cpu(cp->nic_stats->tx_ok_1col);
|
||||
tmp_stats[i++] = le32_to_cpu(cp->nic_stats->tx_ok_mcol);
|
||||
tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok_phys);
|
||||
tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok_bcast);
|
||||
tmp_stats[i++] = le32_to_cpu(cp->nic_stats->rx_ok_mcast);
|
||||
tmp_stats[i++] = le16_to_cpu(cp->nic_stats->tx_abort);
|
||||
tmp_stats[i++] = le16_to_cpu(cp->nic_stats->tx_underrun);
|
||||
tmp_stats[i++] = le64_to_cpu(nic_stats->tx_ok);
|
||||
tmp_stats[i++] = le64_to_cpu(nic_stats->rx_ok);
|
||||
tmp_stats[i++] = le64_to_cpu(nic_stats->tx_err);
|
||||
tmp_stats[i++] = le32_to_cpu(nic_stats->rx_err);
|
||||
tmp_stats[i++] = le16_to_cpu(nic_stats->rx_fifo);
|
||||
tmp_stats[i++] = le16_to_cpu(nic_stats->frame_align);
|
||||
tmp_stats[i++] = le32_to_cpu(nic_stats->tx_ok_1col);
|
||||
tmp_stats[i++] = le32_to_cpu(nic_stats->tx_ok_mcol);
|
||||
tmp_stats[i++] = le64_to_cpu(nic_stats->rx_ok_phys);
|
||||
tmp_stats[i++] = le64_to_cpu(nic_stats->rx_ok_bcast);
|
||||
tmp_stats[i++] = le32_to_cpu(nic_stats->rx_ok_mcast);
|
||||
tmp_stats[i++] = le16_to_cpu(nic_stats->tx_abort);
|
||||
tmp_stats[i++] = le16_to_cpu(nic_stats->tx_underrun);
|
||||
tmp_stats[i++] = cp->cp_stats.rx_frags;
|
||||
if (i != CP_NUM_STATS)
|
||||
BUG();
|
||||
|
||||
pci_free_consistent(cp->pdev, sizeof(*nic_stats), nic_stats, dma);
|
||||
}
|
||||
|
||||
static struct ethtool_ops cp_ethtool_ops = {
|
||||
|
|
|
@ -2879,6 +2879,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
|
|||
* This target is not on a VLAN
|
||||
*/
|
||||
if (rt->u.dst.dev == bond->dev) {
|
||||
ip_rt_put(rt);
|
||||
dprintk("basa: rtdev == bond->dev: arp_send\n");
|
||||
bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
|
||||
bond->master_ip, 0);
|
||||
|
@ -2898,6 +2899,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
|
|||
}
|
||||
|
||||
if (vlan_id) {
|
||||
ip_rt_put(rt);
|
||||
bond_arp_send(slave->dev, ARPOP_REQUEST, targets[i],
|
||||
vlan->vlan_ip, vlan_id);
|
||||
continue;
|
||||
|
@ -2909,6 +2911,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
|
|||
bond->dev->name, NIPQUAD(fl.fl4_dst),
|
||||
rt->u.dst.dev ? rt->u.dst.dev->name : "NULL");
|
||||
}
|
||||
ip_rt_put(rt);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5036,6 +5039,14 @@ static int __init bonding_init(void)
|
|||
return 0;
|
||||
|
||||
out_err:
|
||||
/*
|
||||
* rtnl_unlock() will run netdev_run_todo(), putting the
|
||||
* thus-far-registered bonding devices into a state which
|
||||
* unregigister_netdevice() will accept
|
||||
*/
|
||||
rtnl_unlock();
|
||||
rtnl_lock();
|
||||
|
||||
/* free and unregister all bonds that were successfully added */
|
||||
bond_free_all();
|
||||
|
||||
|
|
|
@ -1817,6 +1817,10 @@ spider_net_setup_phy(struct spider_net_card *card)
|
|||
/* LEDs active in both modes, autosense prio = fiber */
|
||||
spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0x945f);
|
||||
|
||||
/* switch off fibre autoneg */
|
||||
spider_net_write_phy(card->netdev, 1, MII_NCONFIG, 0xfc01);
|
||||
spider_net_write_phy(card->netdev, 1, 0x0b, 0x0004);
|
||||
|
||||
phy->def->ops->read_link(phy);
|
||||
pr_info("Found %s with %i Mbps, %s-duplex.\n", phy->def->name,
|
||||
phy->speed, phy->duplex==1 ? "Full" : "Half");
|
||||
|
|
|
@ -67,8 +67,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.39"
|
||||
#define DRV_MODULE_RELDATE "September 5, 2005"
|
||||
#define DRV_MODULE_VERSION "3.40"
|
||||
#define DRV_MODULE_RELDATE "September 15, 2005"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
|
@ -3442,31 +3442,47 @@ static void tg3_tx_timeout(struct net_device *dev)
|
|||
schedule_work(&tp->reset_task);
|
||||
}
|
||||
|
||||
/* Test for DMA buffers crossing any 4GB boundaries: 4G, 8G, etc */
|
||||
static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
|
||||
{
|
||||
u32 base = (u32) mapping & 0xffffffff;
|
||||
|
||||
return ((base > 0xffffdcc0) &&
|
||||
(base + len + 8 < base));
|
||||
}
|
||||
|
||||
static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32);
|
||||
|
||||
static int tigon3_4gb_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
|
||||
u32 guilty_entry, int guilty_len,
|
||||
u32 last_plus_one, u32 *start, u32 mss)
|
||||
u32 last_plus_one, u32 *start,
|
||||
u32 base_flags, u32 mss)
|
||||
{
|
||||
struct sk_buff *new_skb = skb_copy(skb, GFP_ATOMIC);
|
||||
dma_addr_t new_addr;
|
||||
dma_addr_t new_addr = 0;
|
||||
u32 entry = *start;
|
||||
int i;
|
||||
int i, ret = 0;
|
||||
|
||||
if (!new_skb) {
|
||||
dev_kfree_skb(skb);
|
||||
return -1;
|
||||
ret = -1;
|
||||
} else {
|
||||
/* New SKB is guaranteed to be linear. */
|
||||
entry = *start;
|
||||
new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
/* Make sure new skb does not cross any 4G boundaries.
|
||||
* Drop the packet if it does.
|
||||
*/
|
||||
if (tg3_4g_overflow_test(new_addr, new_skb->len)) {
|
||||
ret = -1;
|
||||
dev_kfree_skb(new_skb);
|
||||
new_skb = NULL;
|
||||
} else {
|
||||
tg3_set_txd(tp, entry, new_addr, new_skb->len,
|
||||
base_flags, 1 | (mss << 1));
|
||||
*start = NEXT_TX(entry);
|
||||
}
|
||||
}
|
||||
|
||||
/* New SKB is guaranteed to be linear. */
|
||||
entry = *start;
|
||||
new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
tg3_set_txd(tp, entry, new_addr, new_skb->len,
|
||||
(skb->ip_summed == CHECKSUM_HW) ?
|
||||
TXD_FLAG_TCPUDP_CSUM : 0, 1 | (mss << 1));
|
||||
*start = NEXT_TX(entry);
|
||||
|
||||
/* Now clean up the sw ring entries. */
|
||||
i = 0;
|
||||
while (entry != last_plus_one) {
|
||||
|
@ -3491,7 +3507,7 @@ static int tigon3_4gb_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
|
|||
|
||||
dev_kfree_skb(skb);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void tg3_set_txd(struct tg3 *tp, int entry,
|
||||
|
@ -3517,19 +3533,10 @@ static void tg3_set_txd(struct tg3 *tp, int entry,
|
|||
txd->vlan_tag = vlan_tag << TXD_VLAN_TAG_SHIFT;
|
||||
}
|
||||
|
||||
static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
|
||||
{
|
||||
u32 base = (u32) mapping & 0xffffffff;
|
||||
|
||||
return ((base > 0xffffdcc0) &&
|
||||
(base + len + 8 < base));
|
||||
}
|
||||
|
||||
static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
dma_addr_t mapping;
|
||||
unsigned int i;
|
||||
u32 len, entry, base_flags, mss;
|
||||
int would_hit_hwbug;
|
||||
|
||||
|
@ -3624,7 +3631,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
would_hit_hwbug = 0;
|
||||
|
||||
if (tg3_4g_overflow_test(mapping, len))
|
||||
would_hit_hwbug = entry + 1;
|
||||
would_hit_hwbug = 1;
|
||||
|
||||
tg3_set_txd(tp, entry, mapping, len, base_flags,
|
||||
(skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
|
||||
|
@ -3648,12 +3655,8 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
tp->tx_buffers[entry].skb = NULL;
|
||||
pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
|
||||
|
||||
if (tg3_4g_overflow_test(mapping, len)) {
|
||||
/* Only one should match. */
|
||||
if (would_hit_hwbug)
|
||||
BUG();
|
||||
would_hit_hwbug = entry + 1;
|
||||
}
|
||||
if (tg3_4g_overflow_test(mapping, len))
|
||||
would_hit_hwbug = 1;
|
||||
|
||||
if (tp->tg3_flags2 & TG3_FLG2_HW_TSO)
|
||||
tg3_set_txd(tp, entry, mapping, len,
|
||||
|
@ -3669,34 +3672,15 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (would_hit_hwbug) {
|
||||
u32 last_plus_one = entry;
|
||||
u32 start;
|
||||
unsigned int len = 0;
|
||||
|
||||
would_hit_hwbug -= 1;
|
||||
entry = entry - 1 - skb_shinfo(skb)->nr_frags;
|
||||
entry &= (TG3_TX_RING_SIZE - 1);
|
||||
start = entry;
|
||||
i = 0;
|
||||
while (entry != last_plus_one) {
|
||||
if (i == 0)
|
||||
len = skb_headlen(skb);
|
||||
else
|
||||
len = skb_shinfo(skb)->frags[i-1].size;
|
||||
|
||||
if (entry == would_hit_hwbug)
|
||||
break;
|
||||
|
||||
i++;
|
||||
entry = NEXT_TX(entry);
|
||||
|
||||
}
|
||||
start = entry - 1 - skb_shinfo(skb)->nr_frags;
|
||||
start &= (TG3_TX_RING_SIZE - 1);
|
||||
|
||||
/* If the workaround fails due to memory/mapping
|
||||
* failure, silently drop this packet.
|
||||
*/
|
||||
if (tigon3_4gb_hwbug_workaround(tp, skb,
|
||||
entry, len,
|
||||
last_plus_one,
|
||||
&start, mss))
|
||||
if (tigon3_4gb_hwbug_workaround(tp, skb, last_plus_one,
|
||||
&start, base_flags, mss))
|
||||
goto out_unlock;
|
||||
|
||||
entry = start;
|
||||
|
@ -9271,6 +9255,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
|||
static struct pci_device_id write_reorder_chipsets[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD,
|
||||
PCI_DEVICE_ID_AMD_FE_GATE_700C) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD,
|
||||
PCI_DEVICE_ID_AMD_K8_NB) },
|
||||
{ },
|
||||
};
|
||||
u32 misc_ctrl_reg;
|
||||
|
@ -9285,7 +9271,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
|||
tp->tg3_flags2 |= TG3_FLG2_SUN_570X;
|
||||
#endif
|
||||
|
||||
/* If we have an AMD 762 chipset, write
|
||||
/* If we have an AMD 762 or K8 chipset, write
|
||||
* reordering to the mailbox registers done by the host
|
||||
* controller can cause major troubles. We read back from
|
||||
* every mailbox register write to force the writes to be
|
||||
|
@ -9532,7 +9518,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
|||
tp->write32_rx_mbox = tg3_write_indirect_mbox;
|
||||
|
||||
iounmap(tp->regs);
|
||||
tp->regs = 0;
|
||||
tp->regs = NULL;
|
||||
|
||||
pci_read_config_word(tp->pdev, PCI_COMMAND, &pci_cmd);
|
||||
pci_cmd &= ~PCI_COMMAND_MEMORY;
|
||||
|
@ -10680,7 +10666,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
|||
err_out_iounmap:
|
||||
if (tp->regs) {
|
||||
iounmap(tp->regs);
|
||||
tp->regs = 0;
|
||||
tp->regs = NULL;
|
||||
}
|
||||
|
||||
err_out_free_dev:
|
||||
|
@ -10705,7 +10691,7 @@ static void __devexit tg3_remove_one(struct pci_dev *pdev)
|
|||
unregister_netdev(dev);
|
||||
if (tp->regs) {
|
||||
iounmap(tp->regs);
|
||||
tp->regs = 0;
|
||||
tp->regs = NULL;
|
||||
}
|
||||
free_netdev(dev);
|
||||
pci_release_regions(pdev);
|
||||
|
|
|
@ -558,7 +558,7 @@ static int configure_device (struct pci_func *func)
|
|||
pci_bus_write_config_byte (ibmphp_pci_bus, devfn, PCI_CACHE_LINE_SIZE, CACHE);
|
||||
pci_bus_write_config_byte (ibmphp_pci_bus, devfn, PCI_LATENCY_TIMER, LATENCY);
|
||||
|
||||
pci_bus_write_config_word (ibmphp_pci_bus, devfn, PCI_ROM_ADDRESS, 0x00L);
|
||||
pci_bus_write_config_dword (ibmphp_pci_bus, devfn, PCI_ROM_ADDRESS, 0x00L);
|
||||
pci_bus_write_config_word (ibmphp_pci_bus, devfn, PCI_COMMAND, DEVICEENABLE);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2526,7 +2526,6 @@ configure_new_function(struct controller *ctrl, struct pci_func *func,
|
|||
int cloop;
|
||||
u8 temp_byte;
|
||||
u8 class_code;
|
||||
u16 temp_word;
|
||||
u32 rc;
|
||||
u32 temp_register;
|
||||
u32 base;
|
||||
|
@ -2682,8 +2681,7 @@ configure_new_function(struct controller *ctrl, struct pci_func *func,
|
|||
} /* End of base register loop */
|
||||
|
||||
/* disable ROM base Address */
|
||||
temp_word = 0x00L;
|
||||
rc = pci_bus_write_config_word (pci_bus, devfn, PCI_ROM_ADDRESS, temp_word);
|
||||
rc = pci_bus_write_config_dword (pci_bus, devfn, PCI_ROM_ADDRESS, 0x00);
|
||||
|
||||
/* Set HP parameters (Cache Line Size, Latency Timer) */
|
||||
rc = pciehprm_set_hpp(ctrl, func, PCI_HEADER_TYPE_NORMAL);
|
||||
|
|
|
@ -2824,8 +2824,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f
|
|||
}
|
||||
#endif
|
||||
/* Disable ROM base Address */
|
||||
temp_word = 0x00L;
|
||||
rc = pci_bus_write_config_word (pci_bus, devfn, PCI_ROM_ADDRESS, temp_word);
|
||||
rc = pci_bus_write_config_dword (pci_bus, devfn, PCI_ROM_ADDRESS, 0x00);
|
||||
|
||||
/* Set HP parameters (Cache Line Size, Latency Timer) */
|
||||
rc = shpchprm_set_hpp(ctrl, func, PCI_HEADER_TYPE_NORMAL);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue