Merge branch 'linus' into core/rcu
Conflicts: include/linux/rculist.h kernel/rcupreempt.c Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
0c81b2a144
371 changed files with 11116 additions and 1564 deletions
12
.gitignore
vendored
12
.gitignore
vendored
|
@ -3,6 +3,10 @@
|
|||
# subdirectories here. Add them in the ".gitignore" file
|
||||
# in that subdirectory instead.
|
||||
#
|
||||
# NOTE! Please use 'git-ls-files -i --exclude-standard'
|
||||
# command after changing this file, to see if there are
|
||||
# any tracked files which get ignored after the change.
|
||||
#
|
||||
# Normal rules
|
||||
#
|
||||
.*
|
||||
|
@ -18,19 +22,21 @@
|
|||
*.lst
|
||||
*.symtypes
|
||||
*.order
|
||||
*.elf
|
||||
*.bin
|
||||
*.gz
|
||||
|
||||
#
|
||||
# Top-level generic files
|
||||
#
|
||||
tags
|
||||
TAGS
|
||||
vmlinux*
|
||||
!vmlinux.lds.S
|
||||
!vmlinux.lds.h
|
||||
vmlinux
|
||||
System.map
|
||||
Module.markers
|
||||
Module.symvers
|
||||
!.gitignore
|
||||
!.mailmap
|
||||
|
||||
#
|
||||
# Generated include files
|
||||
|
|
5
CREDITS
5
CREDITS
|
@ -2611,8 +2611,9 @@ S: Perth, Western Australia
|
|||
S: Australia
|
||||
|
||||
N: Miguel Ojeda Sandonis
|
||||
E: maxextreme@gmail.com
|
||||
W: http://maxextreme.googlepages.com/
|
||||
E: miguel.ojeda.sandonis@gmail.com
|
||||
W: http://miguelojeda.es
|
||||
W: http://jair.lab.fi.uva.es/~migojed/
|
||||
D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
|
||||
D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
||||
S: C/ Mieses 20, 9-B
|
||||
|
|
|
@ -24,6 +24,8 @@ There are three different groups of fields in the struct taskstats:
|
|||
|
||||
4) Per-task and per-thread context switch count statistics
|
||||
|
||||
5) Time accounting for SMT machines
|
||||
|
||||
Future extension should add fields to the end of the taskstats struct, and
|
||||
should not change the relative position of each field within the struct.
|
||||
|
||||
|
@ -164,4 +166,8 @@ struct taskstats {
|
|||
__u64 nvcsw; /* Context voluntary switch counter */
|
||||
__u64 nivcsw; /* Context involuntary switch counter */
|
||||
|
||||
5) Time accounting for SMT machines
|
||||
__u64 ac_utimescaled; /* utime scaled on frequency etc */
|
||||
__u64 ac_stimescaled; /* stime scaled on frequency etc */
|
||||
__u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
===================================
|
||||
|
||||
License: GPLv2
|
||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
Author & Maintainer: Miguel Ojeda Sandonis
|
||||
Date: 2006-10-27
|
||||
|
||||
|
||||
|
@ -22,7 +22,7 @@ Date: 2006-10-27
|
|||
1. DRIVER INFORMATION
|
||||
---------------------
|
||||
|
||||
This driver support one cfag12864b display at time.
|
||||
This driver supports a cfag12864b LCD.
|
||||
|
||||
|
||||
---------------------
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* Description: cfag12864b LCD userspace example program
|
||||
* License: GPLv2
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
==========================================
|
||||
|
||||
License: GPLv2
|
||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
Author & Maintainer: Miguel Ojeda Sandonis
|
||||
Date: 2006-10-27
|
||||
|
||||
|
||||
|
@ -21,7 +21,7 @@ Date: 2006-10-27
|
|||
1. DRIVER INFORMATION
|
||||
---------------------
|
||||
|
||||
This driver support the ks0108 LCD controller.
|
||||
This driver supports the ks0108 LCD controller.
|
||||
|
||||
|
||||
---------------------
|
||||
|
|
|
@ -390,6 +390,10 @@ If you have several tasks to attach, you have to do it one after another:
|
|||
...
|
||||
# /bin/echo PIDn > tasks
|
||||
|
||||
You can attach the current shell task by echoing 0:
|
||||
|
||||
# echo 0 > tasks
|
||||
|
||||
3. Kernel API
|
||||
=============
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ either an integer or * for all. Access is a composition of r
|
|||
The root device cgroup starts with rwm to 'all'. A child device
|
||||
cgroup gets a copy of the parent. Administrators can then remove
|
||||
devices from the whitelist or add new entries. A child cgroup can
|
||||
never receive a device access which is denied its parent. However
|
||||
never receive a device access which is denied by its parent. However
|
||||
when a device access is removed from a parent it will not also be
|
||||
removed from the child(ren).
|
||||
|
||||
|
@ -29,7 +29,11 @@ allows cgroup 1 to read and mknod the device usually known as
|
|||
|
||||
echo a > /cgroups/1/devices.deny
|
||||
|
||||
will remove the default 'a *:* mrw' entry.
|
||||
will remove the default 'a *:* rwm' entry. Doing
|
||||
|
||||
echo a > /cgroups/1/devices.allow
|
||||
|
||||
will add the 'a *:* rwm' entry to the whitelist.
|
||||
|
||||
3. Security
|
||||
|
||||
|
|
|
@ -154,13 +154,15 @@ browsing and modifying the cpusets presently known to the kernel. No
|
|||
new system calls are added for cpusets - all support for querying and
|
||||
modifying cpusets is via this cpuset file system.
|
||||
|
||||
The /proc/<pid>/status file for each task has two added lines,
|
||||
The /proc/<pid>/status file for each task has four added lines,
|
||||
displaying the tasks cpus_allowed (on which CPUs it may be scheduled)
|
||||
and mems_allowed (on which Memory Nodes it may obtain memory),
|
||||
in the format seen in the following example:
|
||||
in the two formats seen in the following example:
|
||||
|
||||
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
|
||||
Cpus_allowed_list: 0-127
|
||||
Mems_allowed: ffffffff,ffffffff
|
||||
Mems_allowed_list: 0-63
|
||||
|
||||
Each cpuset is represented by a directory in the cgroup file system
|
||||
containing (on top of the standard cgroup files) the following
|
||||
|
@ -544,6 +546,9 @@ otherwise initial value -1 that indicates the cpuset has no request.
|
|||
( 4 : search nodes in a chunk of node [on NUMA system] )
|
||||
( 5 : search system wide [on NUMA system] )
|
||||
|
||||
The system default is architecture dependent. The system default
|
||||
can be changed using the relax_domain_level= boot parameter.
|
||||
|
||||
This file is per-cpuset and affect the sched domain where the cpuset
|
||||
belongs to. Therefore if the flag 'sched_load_balance' of a cpuset
|
||||
is disabled, then 'sched_relax_domain_level' have no effect since
|
||||
|
|
|
@ -312,3 +312,12 @@ When: 2.6.26
|
|||
Why: Implementation became generic; users should now include
|
||||
linux/semaphore.h instead.
|
||||
Who: Matthew Wilcox <willy@linux.intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: CONFIG_THERMAL_HWMON
|
||||
When: January 2009
|
||||
Why: This option was introduced just to allow older lm-sensors userspace
|
||||
to keep working over the upgrade to 2.6.26. At the scheduled time of
|
||||
removal fixed lm-sensors (2.x or 3.x) should be readily available.
|
||||
Who: Rene Herman <rene.herman@gmail.com>
|
||||
|
|
1353
Documentation/ftrace.txt
Normal file
1353
Documentation/ftrace.txt
Normal file
File diff suppressed because it is too large
Load diff
|
@ -25,12 +25,23 @@ routines, and should be zero-initialized except for fields with data you
|
|||
provide. A client structure holds device-specific information like the
|
||||
driver model device node, and its I2C address.
|
||||
|
||||
/* iff driver uses driver model ("new style") binding model: */
|
||||
|
||||
static struct i2c_device_id foo_idtable[] = {
|
||||
{ "foo", my_id_for_foo },
|
||||
{ "bar", my_id_for_bar },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(i2c, foo_idtable);
|
||||
|
||||
static struct i2c_driver foo_driver = {
|
||||
.driver = {
|
||||
.name = "foo",
|
||||
},
|
||||
|
||||
/* iff driver uses driver model ("new style") binding model: */
|
||||
.id_table = foo_ids,
|
||||
.probe = foo_probe,
|
||||
.remove = foo_remove,
|
||||
|
||||
|
@ -173,10 +184,9 @@ handle may be used during foo_probe(). If foo_probe() reports success
|
|||
(zero not a negative status code) it may save the handle and use it until
|
||||
foo_remove() returns. That binding model is used by most Linux drivers.
|
||||
|
||||
Drivers match devices when i2c_client.driver_name and the driver name are
|
||||
the same; this approach is used in several other busses that don't have
|
||||
device typing support in the hardware. The driver and module name should
|
||||
match, so hotplug/coldplug mechanisms will modprobe the driver.
|
||||
The probe function is called when an entry in the id_table name field
|
||||
matches the device's name. It is passed the entry that was matched so
|
||||
the driver knows which one in the table matched.
|
||||
|
||||
|
||||
Device Creation (Standard driver model)
|
||||
|
|
|
@ -295,7 +295,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
when initialising the APIC and IO-APIC components.
|
||||
|
||||
apm= [APM] Advanced Power Management
|
||||
See header of arch/i386/kernel/apm.c.
|
||||
See header of arch/x86/kernel/apm_32.c.
|
||||
|
||||
arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
|
||||
Format: <io>,<irq>,<nodeID>
|
||||
|
@ -638,7 +638,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
elanfreq= [X86-32]
|
||||
See comment before function elanfreq_setup() in
|
||||
arch/i386/kernel/cpu/cpufreq/elanfreq.c.
|
||||
arch/x86/kernel/cpu/cpufreq/elanfreq.c.
|
||||
|
||||
elevator= [IOSCHED]
|
||||
Format: {"anticipatory" | "cfq" | "deadline" | "noop"}
|
||||
|
@ -1679,6 +1679,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
Format: <reboot_mode>[,<reboot_mode2>[,...]]
|
||||
See arch/*/kernel/reboot.c or arch/*/kernel/process.c
|
||||
|
||||
relax_domain_level=
|
||||
[KNL, SMP] Set scheduler's default relax_domain_level.
|
||||
See Documentation/cpusets.txt.
|
||||
|
||||
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
||||
|
||||
reservetop= [X86-32]
|
||||
|
|
|
@ -81,23 +81,23 @@ inet_peer_minttl - INTEGER
|
|||
Minimum time-to-live of entries. Should be enough to cover fragment
|
||||
time-to-live on the reassembling side. This minimum time-to-live is
|
||||
guaranteed if the pool size is less than inet_peer_threshold.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_maxttl - INTEGER
|
||||
Maximum time-to-live of entries. Unused entries will expire after
|
||||
this period of time if there is no memory pressure on the pool (i.e.
|
||||
when the number of entries in the pool is very small).
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_gc_mintime - INTEGER
|
||||
Minimum interval between garbage collection passes. This interval is
|
||||
in effect under high memory pressure on the pool.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_gc_maxtime - INTEGER
|
||||
Minimum interval between garbage collection passes. This interval is
|
||||
in effect under low (or absent) memory pressure on the pool.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
TCP variables:
|
||||
|
||||
|
@ -794,10 +794,6 @@ tag - INTEGER
|
|||
Allows you to write a number, which can be used as required.
|
||||
Default value is 0.
|
||||
|
||||
(1) Jiffie: internal timeunit for the kernel. On the i386 1/100s, on the
|
||||
Alpha 1/1024s. See the HZ define in /usr/include/asm/param.h for the exact
|
||||
value on your system.
|
||||
|
||||
Alexey Kuznetsov.
|
||||
kuznet@ms2.inr.ac.ru
|
||||
|
||||
|
|
|
@ -83,9 +83,9 @@ Valid range: Limited by memory on system
|
|||
Default: 30
|
||||
|
||||
e. intr_type
|
||||
Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X)
|
||||
Valid range: 1-3
|
||||
Default: 1
|
||||
Specifies interrupt type. Possible values 0(INTA), 2(MSI-X)
|
||||
Valid values: 0, 2
|
||||
Default: 2
|
||||
|
||||
5. Performance suggestions
|
||||
General:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
0 -> Unknown board (au0828)
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200]
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008]
|
||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Slabinfo: Tool to get reports about slabs
|
||||
*
|
||||
* (C) 2007 sgi, Christoph Lameter <clameter@sgi.com>
|
||||
* (C) 2007 sgi, Christoph Lameter
|
||||
*
|
||||
* Compile by:
|
||||
*
|
||||
|
@ -99,7 +99,7 @@ void fatal(const char *x, ...)
|
|||
|
||||
void usage(void)
|
||||
{
|
||||
printf("slabinfo 5/7/2007. (c) 2007 sgi. clameter@sgi.com\n\n"
|
||||
printf("slabinfo 5/7/2007. (c) 2007 sgi.\n\n"
|
||||
"slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n"
|
||||
"-a|--aliases Show aliases\n"
|
||||
"-A|--activity Most active slabs first\n"
|
||||
|
|
|
@ -266,4 +266,4 @@ of other objects.
|
|||
|
||||
slub_debug=FZ,dentry
|
||||
|
||||
Christoph Lameter, <clameter@sgi.com>, May 30, 2007
|
||||
Christoph Lameter, May 30, 2007
|
||||
|
|
85
MAINTAINERS
85
MAINTAINERS
|
@ -763,9 +763,10 @@ S: Maintained
|
|||
|
||||
AUXILIARY DISPLAY DRIVERS
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
AVR32 ARCHITECTURE
|
||||
|
@ -1055,16 +1056,18 @@ S: Supported
|
|||
|
||||
CFAG12864B LCD DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
CFG80211 and NL80211
|
||||
|
@ -1420,6 +1423,14 @@ M: kristen.c.accardi@intel.com
|
|||
L: linux-acpi@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
DOCUMENTATION (/Documentation directory)
|
||||
P: Michael Kerrisk
|
||||
M: mtk.manpages@gmail.com
|
||||
P: Randy Dunlap
|
||||
M: rdunlap@xenotime.net
|
||||
L: linux-doc@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DOUBLETALK DRIVER
|
||||
P: James R. Van Zandt
|
||||
M: jrv@vanzandt.mv.com
|
||||
|
@ -1626,13 +1637,13 @@ S: Maintained
|
|||
|
||||
EXT3 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
EXT4 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -2428,9 +2439,10 @@ S: Maintained
|
|||
|
||||
KS0108 LCD CONTROLLER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
LAPB module
|
||||
|
@ -2474,9 +2486,11 @@ M: James.Bottomley@HansenPartnership.com
|
|||
W: http://www.hansenpartnership.com/voyager
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC
|
||||
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
||||
P: Paul Mackerras
|
||||
M: paulus@samba.org
|
||||
P: Benjamin Herrenschmidt
|
||||
M: benh@kernel.crashing.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
|
||||
|
@ -2516,13 +2530,6 @@ W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex
|
|||
L: linuxppc-dev@ozlabs.org
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC BOOT CODE
|
||||
P: Tom Rini
|
||||
M: trini@kernel.crashing.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED PPC8XX
|
||||
P: Vitaly Bordug
|
||||
M: vitb@kernel.crashing.org
|
||||
|
@ -2551,17 +2558,6 @@ P: Arnaldo Carvalho de Melo
|
|||
M: acme@ghostprotocols.net
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR 64BIT POWERPC
|
||||
P: Paul Mackerras
|
||||
M: paulus@samba.org
|
||||
M: paulus@au.ibm.com
|
||||
P: Anton Blanchard
|
||||
M: anton@samba.org
|
||||
M: anton@au.ibm.com
|
||||
W: http://www.penguinppc.org/ppc64/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Supported
|
||||
|
||||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||
P: Chris Wright
|
||||
M: chrisw@sous-sol.org
|
||||
|
@ -2680,8 +2676,8 @@ S: Supported
|
|||
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
||||
P: Michael Kerrisk
|
||||
M: mtk.manpages@gmail.com
|
||||
W: ftp://ftp.kernel.org/pub/linux/docs/manpages
|
||||
S: Maintained
|
||||
W: http://www.kernel.org/doc/man-pages
|
||||
S: Supported
|
||||
|
||||
MARVELL LIBERTAS WIRELESS DRIVER
|
||||
P: Dan Williams
|
||||
|
@ -2814,6 +2810,12 @@ W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
|||
W: http://0pointer.de/lennart/tchibo.html
|
||||
S: Maintained
|
||||
|
||||
MULTIFUNCTION DEVICES (MFD)
|
||||
P: Samuel Ortiz
|
||||
M: sameo@openedhand.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
||||
P: Pierre Ossman
|
||||
M: drzeus-mmc@drzeus.cx
|
||||
|
@ -3195,8 +3197,8 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
|
||||
PER-TASK DELAY ACCOUNTING
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -3688,7 +3690,7 @@ S: Maintained
|
|||
|
||||
SLAB ALLOCATOR
|
||||
P: Christoph Lameter
|
||||
M: clameter@sgi.com
|
||||
M: cl@linux-foundation.org
|
||||
P: Pekka Enberg
|
||||
M: penberg@cs.helsinki.fi
|
||||
P: Matt Mackall
|
||||
|
@ -3898,8 +3900,8 @@ M: hch@infradead.org
|
|||
S: Maintained
|
||||
|
||||
TASKSTATS STATISTICS INTERFACE
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -3995,7 +3997,8 @@ W: http://www.buzzard.org.uk/toshiba/
|
|||
S: Maintained
|
||||
|
||||
TPM DEVICE DRIVER
|
||||
P: Kylene Hall
|
||||
P: Debora Velarde
|
||||
P: Rajiv Andrade
|
||||
M: tpmdd-devel@lists.sourceforge.net
|
||||
W: http://tpmdd.sourceforge.net
|
||||
P: Marcel Selhorst
|
||||
|
@ -4314,6 +4317,14 @@ L: netdev@vger.kernel.org
|
|||
W: http://www.linux-usb.org/usbnet
|
||||
S: Maintained
|
||||
|
||||
USB VIDEO CLASS
|
||||
P: Laurent Pinchart
|
||||
M: laurent.pinchart@skynet.be
|
||||
L: linx-uvc-devel@berlios.de
|
||||
L: video4linux-list@redhat.com
|
||||
W: http://linux-uvc.berlios.de
|
||||
S: Maintained
|
||||
|
||||
USB W996[87]CF DRIVER
|
||||
P: Luca Risolia
|
||||
M: luca.risolia@studio.unibo.it
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION = -rc8
|
||||
EXTRAVERSION = -rc9
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -25,6 +25,13 @@ SECTIONS
|
|||
} :kernel
|
||||
_etext = .; /* End of text section */
|
||||
|
||||
NOTES :kernel :note
|
||||
.dummy : {
|
||||
*(.dummy)
|
||||
} :kernel
|
||||
|
||||
RODATA
|
||||
|
||||
/* Exception table */
|
||||
. = ALIGN(16);
|
||||
__ex_table : {
|
||||
|
@ -33,13 +40,6 @@ SECTIONS
|
|||
__stop___ex_table = .;
|
||||
}
|
||||
|
||||
NOTES :kernel :note
|
||||
.dummy : {
|
||||
*(.dummy)
|
||||
} :kernel
|
||||
|
||||
RODATA
|
||||
|
||||
/* Will be freed after init */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
/* Init code and data */
|
||||
|
|
|
@ -650,7 +650,8 @@ EXPORT_SYMBOL(dma_map_sg);
|
|||
EXPORT_SYMBOL(dma_unmap_sg);
|
||||
EXPORT_SYMBOL(dma_sync_single_for_cpu);
|
||||
EXPORT_SYMBOL(dma_sync_single_for_device);
|
||||
EXPORT_SYMBOL(dma_sync_sg);
|
||||
EXPORT_SYMBOL(dma_sync_sg_for_cpu);
|
||||
EXPORT_SYMBOL(dma_sync_sg_for_device);
|
||||
EXPORT_SYMBOL(dmabounce_register_dev);
|
||||
EXPORT_SYMBOL(dmabounce_unregister_dev);
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#define GPMC_STATUS 0x54
|
||||
#define GPMC_PREFETCH_CONFIG1 0x1e0
|
||||
#define GPMC_PREFETCH_CONFIG2 0x1e4
|
||||
#define GPMC_PREFETCH_CONTROL 0x1e8
|
||||
#define GPMC_PREFETCH_CONTROL 0x1ec
|
||||
#define GPMC_PREFETCH_STATUS 0x1f0
|
||||
#define GPMC_ECC_CONFIG 0x1f4
|
||||
#define GPMC_ECC_CONTROL 0x1f8
|
||||
|
|
|
@ -74,6 +74,8 @@ static DEFINE_SPINLOCK(boot_lock);
|
|||
|
||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
{
|
||||
trace_hardirqs_off();
|
||||
|
||||
/*
|
||||
* the primary core may have used a "cross call" soft interrupt
|
||||
* to get this processor out of WFI in the BootMonitor - make
|
||||
|
|
|
@ -501,8 +501,6 @@ static inline void omap_enable_channel_irq(int lch)
|
|||
|
||||
/* Enable some nice interrupts. */
|
||||
OMAP_DMA_CICR_REG(lch) = dma_chan[lch].enabled_irqs;
|
||||
|
||||
dma_chan[lch].flags |= OMAP_DMA_ACTIVE;
|
||||
}
|
||||
|
||||
static void omap_disable_channel_irq(int lch)
|
||||
|
|
|
@ -254,7 +254,8 @@ close_cplbtab(struct cplb_tab *table)
|
|||
}
|
||||
|
||||
/* helper function */
|
||||
static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
||||
static void __init
|
||||
__fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
||||
{
|
||||
if (cplb_data[i].psize) {
|
||||
fill_cplbtab(t,
|
||||
|
@ -291,7 +292,8 @@ static void __fill_code_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_en
|
|||
}
|
||||
}
|
||||
|
||||
static void __fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
||||
static void __init
|
||||
__fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
|
||||
{
|
||||
if (cplb_data[i].psize) {
|
||||
fill_cplbtab(t,
|
||||
|
|
|
@ -60,9 +60,14 @@ static struct irq_chip bad_chip = {
|
|||
};
|
||||
|
||||
static struct irq_desc bad_irq_desc = {
|
||||
.status = IRQ_DISABLED,
|
||||
.chip = &bad_chip,
|
||||
.handle_irq = handle_bad_irq,
|
||||
.depth = 1,
|
||||
.lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock),
|
||||
#ifdef CONFIG_SMP
|
||||
.affinity = CPU_MASK_ALL
|
||||
#endif
|
||||
};
|
||||
|
||||
int show_interrupts(struct seq_file *p, void *v)
|
||||
|
|
|
@ -547,7 +547,8 @@ setup_arch (char **cmdline_p)
|
|||
# ifdef CONFIG_ACPI_NUMA
|
||||
acpi_numa_init();
|
||||
per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ?
|
||||
32 : cpus_weight(early_cpu_possible_map)), additional_cpus);
|
||||
32 : cpus_weight(early_cpu_possible_map)),
|
||||
additional_cpus > 0 ? additional_cpus : 0);
|
||||
# endif
|
||||
#else
|
||||
# ifdef CONFIG_SMP
|
||||
|
|
|
@ -117,6 +117,7 @@ void account_system_vtime(struct task_struct *tsk)
|
|||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(account_system_vtime);
|
||||
|
||||
/*
|
||||
* Called from the timer interrupt handler to charge accumulated user time
|
||||
|
|
|
@ -1006,7 +1006,7 @@ config BOOT_ELF32
|
|||
config MIPS_L1_CACHE_SHIFT
|
||||
int
|
||||
default "4" if MACH_DECSTATION
|
||||
default "7" if SGI_IP27 || SGI_IP28 || SNI_RM
|
||||
default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM
|
||||
default "4" if PMC_MSP4200_EVAL
|
||||
default "5"
|
||||
|
||||
|
|
|
@ -161,6 +161,9 @@ void __init txx9_tmr_init(unsigned long baseaddr)
|
|||
struct txx9_tmr_reg __iomem *tmrptr;
|
||||
|
||||
tmrptr = ioremap(baseaddr, sizeof(struct txx9_tmr_reg));
|
||||
/* Start once to make CounterResetEnable effective */
|
||||
__raw_writel(TXx9_TMTCR_CRE | TXx9_TMTCR_TCE, &tmrptr->tcr);
|
||||
/* Stop and reset the counter */
|
||||
__raw_writel(TXx9_TMTCR_CRE, &tmrptr->tcr);
|
||||
__raw_writel(0, &tmrptr->tisr);
|
||||
__raw_writel(0xffffffff, &tmrptr->cpra);
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
static unsigned long icache_size, dcache_size; /* Size in bytes */
|
||||
static unsigned long icache_lsize, dcache_lsize; /* Size in bytes */
|
||||
|
||||
unsigned long __init r3k_cache_size(unsigned long ca_flags)
|
||||
unsigned long __cpuinit r3k_cache_size(unsigned long ca_flags)
|
||||
{
|
||||
unsigned long flags, status, dummy, size;
|
||||
volatile unsigned long *p;
|
||||
|
@ -61,7 +61,7 @@ unsigned long __init r3k_cache_size(unsigned long ca_flags)
|
|||
return size * sizeof(*p);
|
||||
}
|
||||
|
||||
unsigned long __init r3k_cache_lsize(unsigned long ca_flags)
|
||||
unsigned long __cpuinit r3k_cache_lsize(unsigned long ca_flags)
|
||||
{
|
||||
unsigned long flags, status, lsize, i;
|
||||
volatile unsigned long *p;
|
||||
|
@ -90,7 +90,7 @@ unsigned long __init r3k_cache_lsize(unsigned long ca_flags)
|
|||
return lsize * sizeof(*p);
|
||||
}
|
||||
|
||||
static void __init r3k_probe_cache(void)
|
||||
static void __cpuinit r3k_probe_cache(void)
|
||||
{
|
||||
dcache_size = r3k_cache_size(ST0_ISC);
|
||||
if (dcache_size)
|
||||
|
|
|
@ -235,13 +235,12 @@ static void __cpuinit set_prefetch_parameters(void)
|
|||
}
|
||||
/*
|
||||
* Too much unrolling will overflow the available space in
|
||||
* clear_space_array / copy_page_array. 8 words sounds generous,
|
||||
* but a R4000 with 128 byte L2 line length can exceed even that.
|
||||
* clear_space_array / copy_page_array.
|
||||
*/
|
||||
half_clear_loop_size = min(8 * clear_word_size,
|
||||
half_clear_loop_size = min(16 * clear_word_size,
|
||||
max(cache_line_size >> 1,
|
||||
4 * clear_word_size));
|
||||
half_copy_loop_size = min(8 * copy_word_size,
|
||||
half_copy_loop_size = min(16 * copy_word_size,
|
||||
max(cache_line_size >> 1,
|
||||
4 * copy_word_size));
|
||||
}
|
||||
|
@ -263,7 +262,8 @@ static inline void __cpuinit build_clear_pref(u32 **buf, int off)
|
|||
if (pref_bias_clear_store) {
|
||||
uasm_i_pref(buf, pref_dst_mode, pref_bias_clear_store + off,
|
||||
A0);
|
||||
} else if (cpu_has_cache_cdex_s) {
|
||||
} else if (cache_line_size == (half_clear_loop_size << 1)) {
|
||||
if (cpu_has_cache_cdex_s) {
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0);
|
||||
} else if (cpu_has_cache_cdex_p) {
|
||||
if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) {
|
||||
|
@ -279,6 +279,7 @@ static inline void __cpuinit build_clear_pref(u32 **buf, int off)
|
|||
uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __cpuinit build_clear_page(void)
|
||||
{
|
||||
|
@ -403,7 +404,8 @@ static inline void build_copy_store_pref(u32 **buf, int off)
|
|||
if (pref_bias_copy_store) {
|
||||
uasm_i_pref(buf, pref_dst_mode, pref_bias_copy_store + off,
|
||||
A0);
|
||||
} else if (cpu_has_cache_cdex_s) {
|
||||
} else if (cache_line_size == (half_copy_loop_size << 1)) {
|
||||
if (cpu_has_cache_cdex_s) {
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0);
|
||||
} else if (cpu_has_cache_cdex_p) {
|
||||
if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) {
|
||||
|
@ -419,6 +421,7 @@ static inline void build_copy_store_pref(u32 **buf, int off)
|
|||
uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __cpuinit build_copy_page(void)
|
||||
{
|
||||
|
|
|
@ -86,7 +86,7 @@ static void rm7k_sc_inv(unsigned long addr, unsigned long size)
|
|||
/*
|
||||
* This function is executed in uncached address space.
|
||||
*/
|
||||
static __init void __rm7k_sc_enable(void)
|
||||
static __cpuinit void __rm7k_sc_enable(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -107,7 +107,7 @@ static __init void __rm7k_sc_enable(void)
|
|||
}
|
||||
}
|
||||
|
||||
static __init void rm7k_sc_enable(void)
|
||||
static __cpuinit void rm7k_sc_enable(void)
|
||||
{
|
||||
if (read_c0_config() & RM7K_CONF_SE)
|
||||
return;
|
||||
|
|
|
@ -425,6 +425,11 @@ static void ip32_irq0(void)
|
|||
BUILD_BUG_ON(MACEISA_SERIAL2_RDMAOR_IRQ - MACEISA_AUDIO_SW_IRQ != 31);
|
||||
|
||||
crime_int = crime->istat & crime_mask;
|
||||
|
||||
/* crime sometime delivers spurious interrupts, ignore them */
|
||||
if (unlikely(crime_int == 0))
|
||||
return;
|
||||
|
||||
irq = MACE_VID_IN1_IRQ + __ffs(crime_int);
|
||||
|
||||
if (crime_int & CRIME_MACEISA_INT_MASK) {
|
||||
|
|
|
@ -10,8 +10,11 @@
|
|||
*/
|
||||
#include <linux/module.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
|
||||
EXPORT_SYMBOL(change_bit);
|
||||
EXPORT_SYMBOL(test_and_change_bit);
|
||||
|
||||
|
@ -31,7 +34,9 @@ extern u64 __ashrdi3(u64, unsigned);
|
|||
extern u64 __ashldi3(u64, unsigned);
|
||||
extern u64 __lshrdi3(u64, unsigned);
|
||||
extern s64 __negdi2(s64);
|
||||
extern int __ucmpdi2(u64, u64);
|
||||
EXPORT_SYMBOL(__ashrdi3);
|
||||
EXPORT_SYMBOL(__ashldi3);
|
||||
EXPORT_SYMBOL(__lshrdi3);
|
||||
EXPORT_SYMBOL(__negdi2);
|
||||
EXPORT_SYMBOL(__ucmpdi2);
|
||||
|
|
|
@ -153,6 +153,7 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
|
|||
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0,
|
||||
NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
|
||||
/*
|
||||
* free current thread data structures etc..
|
||||
|
|
|
@ -4,4 +4,4 @@
|
|||
|
||||
lib-y = delay.o usercopy.o checksum.o bitops.o memcpy.o memmove.o memset.o
|
||||
lib-y += do_csum.o
|
||||
lib-y += __ashldi3.o __ashrdi3.o __lshrdi3.o negdi2.o
|
||||
lib-y += __ashldi3.o __ashrdi3.o __lshrdi3.o negdi2.o __ucmpdi2.o
|
||||
|
|
43
arch/mn10300/lib/__ucmpdi2.S
Normal file
43
arch/mn10300/lib/__ucmpdi2.S
Normal file
|
@ -0,0 +1,43 @@
|
|||
/* __ucmpdi2.S: 64-bit unsigned compare
|
||||
*
|
||||
* Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
|
||||
.text
|
||||
.p2align 4
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# int __ucmpdi2(unsigned long long a [D0:D1],
|
||||
# unsigned long long b [(SP,12),(SP,16)])
|
||||
#
|
||||
# - returns 0, 1, or 2 as a <, =, > b respectively.
|
||||
#
|
||||
###############################################################################
|
||||
.globl __ucmpdi2
|
||||
.type __ucmpdi2,@function
|
||||
__ucmpdi2:
|
||||
mov (12,sp),a0 # b.lsw
|
||||
mov (16,sp),a1 # b.msw
|
||||
|
||||
sub a0,d0
|
||||
subc a1,d1 # may clear Z, never sets it
|
||||
bne __ucmpdi2_differ # a.msw != b.msw
|
||||
mov +1,d0
|
||||
rets
|
||||
|
||||
__ucmpdi2_differ:
|
||||
# C flag is set if LE, clear if GE
|
||||
subc d0,d0 # -1 if LE, 0 if GE
|
||||
add +1,d0 # 0 if LE, 1 if GE
|
||||
add d0,d0 # 0 if LE, 2 if GE
|
||||
rets
|
||||
|
||||
.size __ucmpdi2, .-__ucmpdi2
|
|
@ -273,7 +273,8 @@ endif
|
|||
initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
|
||||
initrd-y := $(patsubst zImage%, zImage.initrd%, \
|
||||
$(patsubst dtbImage%, dtbImage.initrd%, \
|
||||
$(patsubst treeImage%, treeImage.initrd%, $(image-y))))
|
||||
$(patsubst simpleImage%, simpleImage.initrd%, \
|
||||
$(patsubst treeImage%, treeImage.initrd%, $(image-y)))))
|
||||
initrd-y := $(filter-out $(image-y), $(initrd-y))
|
||||
targets += $(image-y) $(initrd-y)
|
||||
|
||||
|
|
|
@ -33,13 +33,14 @@ static struct legacy_serial_info {
|
|||
phys_addr_t taddr;
|
||||
} legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS];
|
||||
|
||||
static struct __initdata of_device_id parents[] = {
|
||||
static struct __initdata of_device_id legacy_serial_parents[] = {
|
||||
{.type = "soc",},
|
||||
{.type = "tsi-bridge",},
|
||||
{.type = "opb", },
|
||||
{.compatible = "ibm,opb",},
|
||||
{.compatible = "simple-bus",},
|
||||
{.compatible = "wrs,epld-localbus",},
|
||||
{},
|
||||
};
|
||||
|
||||
static unsigned int legacy_serial_count;
|
||||
|
@ -136,6 +137,11 @@ static int __init add_legacy_soc_port(struct device_node *np,
|
|||
if (of_get_property(np, "clock-frequency", NULL) == NULL)
|
||||
return -1;
|
||||
|
||||
/* if reg-shift or offset, don't try to use it */
|
||||
if ((of_get_property(np, "reg-shift", NULL) != NULL) ||
|
||||
(of_get_property(np, "reg-offset", NULL) != NULL))
|
||||
return -1;
|
||||
|
||||
/* if rtas uses this device, don't try to use it as well */
|
||||
if (of_get_property(np, "used-by-rtas", NULL) != NULL)
|
||||
return -1;
|
||||
|
@ -322,7 +328,7 @@ void __init find_legacy_serial_ports(void)
|
|||
struct device_node *parent = of_get_parent(np);
|
||||
if (!parent)
|
||||
continue;
|
||||
if (of_match_node(parents, parent) != NULL) {
|
||||
if (of_match_node(legacy_serial_parents, parent) != NULL) {
|
||||
index = add_legacy_soc_port(np, np);
|
||||
if (index >= 0 && np == stdout)
|
||||
legacy_serial_console = index;
|
||||
|
|
|
@ -76,6 +76,8 @@ struct of_device* of_platform_device_create(struct device_node *np,
|
|||
return NULL;
|
||||
|
||||
dev->dma_mask = 0xffffffffUL;
|
||||
dev->dev.coherent_dma_mask = DMA_32BIT_MASK;
|
||||
|
||||
dev->dev.bus = &of_platform_bus_type;
|
||||
|
||||
/* We do not fill the DMA ops for platform devices by default.
|
||||
|
|
|
@ -14,6 +14,7 @@ static struct mpc52xx_sdma __iomem *bes;
|
|||
static struct mpc52xx_xlb __iomem *xlb;
|
||||
static struct mpc52xx_gpio __iomem *gps;
|
||||
static struct mpc52xx_gpio_wkup __iomem *gpw;
|
||||
static void __iomem *pci;
|
||||
static void __iomem *sram;
|
||||
static const int sram_size = 0x4000; /* 16 kBytes */
|
||||
static void __iomem *mbar;
|
||||
|
@ -50,6 +51,8 @@ static int lite5200_pm_prepare(void)
|
|||
{ .type = "builtin", .compatible = "mpc5200", }, /* efika */
|
||||
{}
|
||||
};
|
||||
u64 regaddr64 = 0;
|
||||
const u32 *regaddr_p;
|
||||
|
||||
/* deep sleep? let mpc52xx code handle that */
|
||||
if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
|
||||
|
@ -60,8 +63,12 @@ static int lite5200_pm_prepare(void)
|
|||
|
||||
/* map registers */
|
||||
np = of_find_matching_node(NULL, immr_ids);
|
||||
mbar = of_iomap(np, 0);
|
||||
regaddr_p = of_get_address(np, 0, NULL, NULL);
|
||||
if (regaddr_p)
|
||||
regaddr64 = of_translate_address(np, regaddr_p);
|
||||
of_node_put(np);
|
||||
|
||||
mbar = ioremap((u32) regaddr64, 0xC000);
|
||||
if (!mbar) {
|
||||
printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
|
||||
return -ENOSYS;
|
||||
|
@ -71,6 +78,7 @@ static int lite5200_pm_prepare(void)
|
|||
pic = mbar + 0x500;
|
||||
gps = mbar + 0xb00;
|
||||
gpw = mbar + 0xc00;
|
||||
pci = mbar + 0xd00;
|
||||
bes = mbar + 0x1200;
|
||||
xlb = mbar + 0x1f00;
|
||||
sram = mbar + 0x8000;
|
||||
|
@ -85,6 +93,7 @@ static struct mpc52xx_sdma sbes;
|
|||
static struct mpc52xx_xlb sxlb;
|
||||
static struct mpc52xx_gpio sgps;
|
||||
static struct mpc52xx_gpio_wkup sgpw;
|
||||
static char spci[0x200];
|
||||
|
||||
static void lite5200_save_regs(void)
|
||||
{
|
||||
|
@ -94,6 +103,7 @@ static void lite5200_save_regs(void)
|
|||
_memcpy_fromio(&sxlb, xlb, sizeof(*xlb));
|
||||
_memcpy_fromio(&sgps, gps, sizeof(*gps));
|
||||
_memcpy_fromio(&sgpw, gpw, sizeof(*gpw));
|
||||
_memcpy_fromio(spci, pci, 0x200);
|
||||
|
||||
_memcpy_fromio(saved_sram, sram, sram_size);
|
||||
}
|
||||
|
@ -103,6 +113,8 @@ static void lite5200_restore_regs(void)
|
|||
int i;
|
||||
_memcpy_toio(sram, saved_sram, sram_size);
|
||||
|
||||
/* PCI Configuration */
|
||||
_memcpy_toio(pci, spci, 0x200);
|
||||
|
||||
/*
|
||||
* GPIOs. Interrupt Master Enable has higher address then other
|
||||
|
|
|
@ -77,7 +77,6 @@ include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS)
|
|||
KERNEL_DEFINES = $(strip -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \
|
||||
-Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES))
|
||||
KBUILD_CFLAGS += $(KERNEL_DEFINES)
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-unit-at-a-time,)
|
||||
|
||||
PHONY += linux
|
||||
|
||||
|
|
|
@ -32,4 +32,11 @@ cflags-y += $(call cc-option,-mpreferred-stack-boundary=2)
|
|||
# an unresolved reference.
|
||||
cflags-y += -ffreestanding
|
||||
|
||||
# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
|
||||
# a lot more stack due to the lack of sharing of stacklots. Also, gcc
|
||||
# 4.3.0 needs -funit-at-a-time for extern inline functions.
|
||||
KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then \
|
||||
echo $(call cc-option,-fno-unit-at-a-time); \
|
||||
else echo $(call cc-option,-funit-at-a-time); fi ;)
|
||||
|
||||
KBUILD_CFLAGS += $(cflags-y)
|
||||
|
|
|
@ -21,3 +21,6 @@ HEADER_ARCH := x86
|
|||
|
||||
LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64
|
||||
LINK-y += -m64
|
||||
|
||||
# Do unit-at-a-time unconditionally on x86_64, following the host
|
||||
KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
|
||||
|
|
|
@ -966,8 +966,8 @@ config NUMA_EMU
|
|||
number of nodes. This is only useful for debugging.
|
||||
|
||||
config NODES_SHIFT
|
||||
int "Max num nodes shift(1-15)"
|
||||
range 1 15 if X86_64
|
||||
int "Max num nodes shift(1-9)"
|
||||
range 1 9 if X86_64
|
||||
default "6" if X86_64
|
||||
default "4" if X86_NUMAQ
|
||||
default "3"
|
||||
|
|
1
arch/x86/kernel/.gitignore
vendored
1
arch/x86/kernel/.gitignore
vendored
|
@ -1,2 +1,3 @@
|
|||
vsyscall.lds
|
||||
vsyscall_32.lds
|
||||
vmlinux.lds
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <asm/msr-index.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/processor-flags.h>
|
||||
|
||||
.code16
|
||||
.section ".header", "a"
|
||||
|
@ -24,6 +25,11 @@ pmode_gdt: .quad 0
|
|||
realmode_flags: .long 0
|
||||
real_magic: .long 0
|
||||
trampoline_segment: .word 0
|
||||
_pad1: .byte 0
|
||||
wakeup_jmp: .byte 0xea /* ljmpw */
|
||||
wakeup_jmp_off: .word 3f
|
||||
wakeup_jmp_seg: .word 0
|
||||
wakeup_gdt: .quad 0, 0, 0
|
||||
signature: .long 0x51ee1111
|
||||
|
||||
.text
|
||||
|
@ -34,11 +40,34 @@ _start:
|
|||
cli
|
||||
cld
|
||||
|
||||
/* Apparently some dimwit BIOS programmers don't know how to
|
||||
program a PM to RM transition, and we might end up here with
|
||||
junk in the data segment descriptor registers. The only way
|
||||
to repair that is to go into PM and fix it ourselves... */
|
||||
movw $16, %cx
|
||||
lgdtl %cs:wakeup_gdt
|
||||
movl %cr0, %eax
|
||||
orb $X86_CR0_PE, %al
|
||||
movl %eax, %cr0
|
||||
jmp 1f
|
||||
1: ljmpw $8, $2f
|
||||
2:
|
||||
movw %cx, %ds
|
||||
movw %cx, %es
|
||||
movw %cx, %ss
|
||||
movw %cx, %fs
|
||||
movw %cx, %gs
|
||||
|
||||
andb $~X86_CR0_PE, %al
|
||||
movl %eax, %cr0
|
||||
jmp wakeup_jmp
|
||||
3:
|
||||
/* Set up segments */
|
||||
movw %cs, %ax
|
||||
movw %ax, %ds
|
||||
movw %ax, %es
|
||||
movw %ax, %ss
|
||||
lidtl wakeup_idt
|
||||
|
||||
movl $wakeup_stack_end, %esp
|
||||
|
||||
|
@ -98,7 +127,14 @@ bogus_real_magic:
|
|||
jmp 1b
|
||||
|
||||
.data
|
||||
.balign 4
|
||||
.balign 8
|
||||
|
||||
/* This is the standard real-mode IDT */
|
||||
wakeup_idt:
|
||||
.word 0xffff /* limit */
|
||||
.long 0 /* address */
|
||||
.word 0
|
||||
|
||||
.globl HEAP, heap_end
|
||||
HEAP:
|
||||
.long wakeup_heap
|
||||
|
|
|
@ -24,6 +24,11 @@ struct wakeup_header {
|
|||
u32 realmode_flags;
|
||||
u32 real_magic;
|
||||
u16 trampoline_segment; /* segment with trampoline code, 64-bit only */
|
||||
u8 _pad1;
|
||||
u8 wakeup_jmp;
|
||||
u16 wakeup_jmp_off;
|
||||
u16 wakeup_jmp_seg;
|
||||
u64 wakeup_gdt[3];
|
||||
u32 signature; /* To check we have correct structure */
|
||||
} __attribute__((__packed__));
|
||||
|
||||
|
|
|
@ -50,6 +50,20 @@ int acpi_save_state_mem(void)
|
|||
|
||||
header->video_mode = saved_video_mode;
|
||||
|
||||
header->wakeup_jmp_seg = acpi_wakeup_address >> 4;
|
||||
/* GDT[0]: GDT self-pointer */
|
||||
header->wakeup_gdt[0] =
|
||||
(u64)(sizeof(header->wakeup_gdt) - 1) +
|
||||
((u64)(acpi_wakeup_address +
|
||||
((char *)&header->wakeup_gdt - (char *)acpi_realmode))
|
||||
<< 16);
|
||||
/* GDT[1]: real-mode-like code segment */
|
||||
header->wakeup_gdt[1] = (0x009bULL << 40) +
|
||||
((u64)acpi_wakeup_address << 16) + 0xffff;
|
||||
/* GDT[2]: real-mode-like data segment */
|
||||
header->wakeup_gdt[2] = (0x0093ULL << 40) +
|
||||
((u64)acpi_wakeup_address << 16) + 0xffff;
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
store_gdt((struct desc_ptr *)&header->pmode_gdt);
|
||||
|
||||
|
@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void)
|
|||
return;
|
||||
}
|
||||
|
||||
acpi_wakeup_address = acpi_realmode;
|
||||
acpi_wakeup_address = virt_to_phys((void *)acpi_realmode);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -49,13 +49,13 @@ void efi_call_phys_prelog(void)
|
|||
local_irq_save(efi_rt_eflags);
|
||||
|
||||
/*
|
||||
* If I don't have PSE, I should just duplicate two entries in page
|
||||
* directory. If I have PSE, I just need to duplicate one entry in
|
||||
* If I don't have PAE, I should just duplicate two entries in page
|
||||
* directory. If I have PAE, I just need to duplicate one entry in
|
||||
* page directory.
|
||||
*/
|
||||
cr4 = read_cr4();
|
||||
|
||||
if (cr4 & X86_CR4_PSE) {
|
||||
if (cr4 & X86_CR4_PAE) {
|
||||
efi_bak_pg_dir_pointer[0].pgd =
|
||||
swapper_pg_dir[pgd_index(0)].pgd;
|
||||
swapper_pg_dir[0].pgd =
|
||||
|
@ -93,7 +93,7 @@ void efi_call_phys_epilog(void)
|
|||
|
||||
cr4 = read_cr4();
|
||||
|
||||
if (cr4 & X86_CR4_PSE) {
|
||||
if (cr4 & X86_CR4_PAE) {
|
||||
swapper_pg_dir[pgd_index(0)].pgd =
|
||||
efi_bak_pg_dir_pointer[0].pgd;
|
||||
} else {
|
||||
|
|
|
@ -128,7 +128,7 @@ ident_complete:
|
|||
/* Fixup phys_base */
|
||||
addq %rbp, phys_base(%rip)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#ifdef CONFIG_X86_TRAMPOLINE
|
||||
addq %rbp, trampoline_level4_pgt + 0(%rip)
|
||||
addq %rbp, trampoline_level4_pgt + (511*8)(%rip)
|
||||
#endif
|
||||
|
|
|
@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
|
|||
int ret;
|
||||
|
||||
if (!cpu_has_fxsr)
|
||||
return -ENODEV;
|
||||
return -EIO;
|
||||
|
||||
ret = init_fpu(target);
|
||||
if (ret)
|
||||
|
@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
|
|||
int ret;
|
||||
|
||||
if (!cpu_has_fxsr)
|
||||
return -ENODEV;
|
||||
return -EIO;
|
||||
|
||||
ret = init_fpu(target);
|
||||
if (ret)
|
||||
|
|
|
@ -996,7 +996,6 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)
|
|||
#endif
|
||||
cpu_clear(cpu, cpu_callout_map); /* was set by do_boot_cpu() */
|
||||
cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */
|
||||
cpu_clear(cpu, cpu_possible_map);
|
||||
cpu_clear(cpu, cpu_present_map);
|
||||
per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID;
|
||||
}
|
||||
|
|
|
@ -135,7 +135,7 @@ static __init void *spp_getpage(void)
|
|||
return ptr;
|
||||
}
|
||||
|
||||
static void
|
||||
static __init void
|
||||
set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
|
@ -214,7 +214,7 @@ void __init cleanup_highmap(void)
|
|||
}
|
||||
|
||||
/* NOTE: this is meant to be run only at boot */
|
||||
void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
|
||||
void __init __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
|
||||
{
|
||||
unsigned long address = __fix_to_virt(idx);
|
||||
|
||||
|
@ -526,7 +526,8 @@ static void __init early_memtest(unsigned long start, unsigned long end)
|
|||
t_size = end - t_start;
|
||||
|
||||
printk(KERN_CONT "\n %016llx - %016llx pattern %d",
|
||||
t_start, t_start + t_size, pattern);
|
||||
(unsigned long long)t_start,
|
||||
(unsigned long long)t_start + t_size, pattern);
|
||||
|
||||
memtest(t_start, t_size, pattern);
|
||||
|
||||
|
|
|
@ -328,18 +328,18 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
|
|||
#endif
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "HP ProLiant DL360",
|
||||
.ident = "HP ProLiant DL385 G2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL360"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL385 G2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "HP ProLiant DL380",
|
||||
.ident = "HP ProLiant DL585 G2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
|
|
|
@ -185,7 +185,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
|
|||
if (val & _PAGE_PRESENT) {
|
||||
unsigned long mfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
||||
pteval_t flags = val & ~PTE_MASK;
|
||||
val = (mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
|
||||
val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
|
||||
}
|
||||
|
||||
return val;
|
||||
|
@ -196,7 +196,7 @@ static pteval_t pte_pfn_to_mfn(pteval_t val)
|
|||
if (val & _PAGE_PRESENT) {
|
||||
unsigned long pfn = (val & PTE_MASK) >> PAGE_SHIFT;
|
||||
pteval_t flags = val & ~PTE_MASK;
|
||||
val = (pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
|
||||
val = ((pteval_t)pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
|
||||
}
|
||||
|
||||
return val;
|
||||
|
|
|
@ -831,6 +831,8 @@ static void as_completed_request(struct request_queue *q, struct request *rq)
|
|||
}
|
||||
|
||||
if (ad->changed_batch && ad->nr_dispatched == 1) {
|
||||
ad->current_batch_expires = jiffies +
|
||||
ad->batch_expire[ad->batch_data_dir];
|
||||
kblockd_schedule_work(&ad->antic_work);
|
||||
ad->changed_batch = 0;
|
||||
|
||||
|
|
|
@ -117,6 +117,7 @@ static int chainiv_init(struct crypto_tfm *tfm)
|
|||
static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
|
||||
{
|
||||
int queued;
|
||||
int err = ctx->err;
|
||||
|
||||
if (!ctx->queue.qlen) {
|
||||
smp_mb__before_clear_bit();
|
||||
|
@ -131,7 +132,7 @@ static int async_chainiv_schedule_work(struct async_chainiv_ctx *ctx)
|
|||
BUG_ON(!queued);
|
||||
|
||||
out:
|
||||
return ctx->err;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int async_chainiv_postpone_request(struct skcipher_givcrypt_request *req)
|
||||
|
@ -227,6 +228,7 @@ static void async_chainiv_do_postponed(struct work_struct *work)
|
|||
postponed);
|
||||
struct skcipher_givcrypt_request *req;
|
||||
struct ablkcipher_request *subreq;
|
||||
int err;
|
||||
|
||||
/* Only handle one request at a time to avoid hogging keventd. */
|
||||
spin_lock_bh(&ctx->lock);
|
||||
|
@ -241,7 +243,11 @@ static void async_chainiv_do_postponed(struct work_struct *work)
|
|||
subreq = skcipher_givcrypt_reqctx(req);
|
||||
subreq->base.flags |= CRYPTO_TFM_REQ_MAY_SLEEP;
|
||||
|
||||
async_chainiv_givencrypt_tail(req);
|
||||
err = async_chainiv_givencrypt_tail(req);
|
||||
|
||||
local_bh_disable();
|
||||
skcipher_givcrypt_complete(req, err);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
static int async_chainiv_init(struct crypto_tfm *tfm)
|
||||
|
|
|
@ -586,12 +586,6 @@ static void test_cipher(char *algo, int enc,
|
|||
j = 0;
|
||||
for (i = 0; i < tcount; i++) {
|
||||
|
||||
data = kzalloc(template[i].ilen, GFP_KERNEL);
|
||||
if (!data)
|
||||
continue;
|
||||
|
||||
memcpy(data, template[i].input, template[i].ilen);
|
||||
|
||||
if (template[i].iv)
|
||||
memcpy(iv, template[i].iv, MAX_IVLEN);
|
||||
else
|
||||
|
@ -613,11 +607,9 @@ static void test_cipher(char *algo, int enc,
|
|||
printk("setkey() failed flags=%x\n",
|
||||
crypto_ablkcipher_get_flags(tfm));
|
||||
|
||||
if (!template[i].fail) {
|
||||
kfree(data);
|
||||
if (!template[i].fail)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
temp = 0;
|
||||
sg_init_table(sg, template[i].np);
|
||||
|
|
|
@ -377,6 +377,9 @@ static int __init bay_init(void)
|
|||
|
||||
INIT_LIST_HEAD(&drive_bays);
|
||||
|
||||
if (acpi_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
/* look for dockable drive bays */
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, find_bay, &bays, NULL);
|
||||
|
|
|
@ -917,6 +917,9 @@ static int __init dock_init(void)
|
|||
|
||||
dock_station = NULL;
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
/* look for a dock station */
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, find_dock, &num, NULL);
|
||||
|
|
|
@ -333,6 +333,9 @@ static int __init acpi_rtc_init(void)
|
|||
{
|
||||
struct device *dev = get_rtc_dev();
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
if (dev) {
|
||||
rtc_wake_setup();
|
||||
rtc_info.wake_on = rtc_wake_on;
|
||||
|
|
|
@ -36,9 +36,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
|||
if (!acpi_wakeup_address) {
|
||||
return -EFAULT;
|
||||
}
|
||||
acpi_set_firmware_waking_vector((acpi_physical_address)
|
||||
virt_to_phys((void *)
|
||||
acpi_wakeup_address));
|
||||
acpi_set_firmware_waking_vector(
|
||||
(acpi_physical_address)acpi_wakeup_address);
|
||||
|
||||
}
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
|
|
|
@ -315,8 +315,11 @@ acpi_system_write_alarm(struct file *file,
|
|||
cmos_bcd_write(day, acpi_gbl_FADT.day_alarm, rtc_control);
|
||||
if (acpi_gbl_FADT.month_alarm)
|
||||
cmos_bcd_write(mo, acpi_gbl_FADT.month_alarm, rtc_control);
|
||||
if (acpi_gbl_FADT.century)
|
||||
if (acpi_gbl_FADT.century) {
|
||||
if (adjust)
|
||||
yr += cmos_bcd_read(acpi_gbl_FADT.century, rtc_control) * 100;
|
||||
cmos_bcd_write(yr / 100, acpi_gbl_FADT.century, rtc_control);
|
||||
}
|
||||
/* enable the rtc alarm interrupt */
|
||||
rtc_control |= RTC_AIE;
|
||||
CMOS_WRITE(rtc_control, RTC_CONTROL);
|
||||
|
|
|
@ -1777,7 +1777,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||
struct ahci_host_priv *hpriv;
|
||||
unsigned int i, handled = 0;
|
||||
void __iomem *mmio;
|
||||
u32 irq_stat, irq_ack = 0;
|
||||
u32 irq_stat, irq_masked;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
|
@ -1786,16 +1786,17 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||
|
||||
/* sigh. 0xffffffff is a valid return from h/w */
|
||||
irq_stat = readl(mmio + HOST_IRQ_STAT);
|
||||
irq_stat &= hpriv->port_map;
|
||||
if (!irq_stat)
|
||||
return IRQ_NONE;
|
||||
|
||||
irq_masked = irq_stat & hpriv->port_map;
|
||||
|
||||
spin_lock(&host->lock);
|
||||
|
||||
for (i = 0; i < host->n_ports; i++) {
|
||||
struct ata_port *ap;
|
||||
|
||||
if (!(irq_stat & (1 << i)))
|
||||
if (!(irq_masked & (1 << i)))
|
||||
continue;
|
||||
|
||||
ap = host->ports[i];
|
||||
|
@ -1809,14 +1810,20 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||
"interrupt on disabled port %u\n", i);
|
||||
}
|
||||
|
||||
irq_ack |= (1 << i);
|
||||
}
|
||||
|
||||
if (irq_ack) {
|
||||
writel(irq_ack, mmio + HOST_IRQ_STAT);
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
/* HOST_IRQ_STAT behaves as level triggered latch meaning that
|
||||
* it should be cleared after all the port events are cleared;
|
||||
* otherwise, it will raise a spurious interrupt after each
|
||||
* valid one. Please read section 10.6.2 of ahci 1.1 for more
|
||||
* information.
|
||||
*
|
||||
* Also, use the unmasked value to clear interrupt as spurious
|
||||
* pending event on a dummy port might cause screaming IRQ.
|
||||
*/
|
||||
writel(irq_stat, mmio + HOST_IRQ_STAT);
|
||||
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
|
|
@ -1094,6 +1094,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
|
|||
int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
u8 status, int in_wq)
|
||||
{
|
||||
struct ata_eh_info *ehi = &ap->link.eh_info;
|
||||
unsigned long flags = 0;
|
||||
int poll_next;
|
||||
|
||||
|
@ -1125,9 +1126,12 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
|||
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||
/* device stops HSM for abort/error */
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
else {
|
||||
/* HSM violation. Let EH handle this */
|
||||
ata_ehi_push_desc(ehi,
|
||||
"ST_FIRST: !(DRQ|ERR|DF)");
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
}
|
||||
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1146,9 +1150,9 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
|||
* the CDB.
|
||||
*/
|
||||
if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
|
||||
ata_port_printk(ap, KERN_WARNING,
|
||||
ata_ehi_push_desc(ehi, "ST_FIRST: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X\n", status);
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1205,9 +1209,9 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
|||
* let the EH abort the command or reset the device.
|
||||
*/
|
||||
if (unlikely(status & (ATA_ERR | ATA_DF))) {
|
||||
ata_port_printk(ap, KERN_WARNING, "DRQ=1 with "
|
||||
"device error, dev_stat 0x%X\n",
|
||||
status);
|
||||
ata_ehi_push_desc(ehi, "ST-ATAPI: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1226,13 +1230,17 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
|||
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||
/* device stops HSM for abort/error */
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
else {
|
||||
/* HSM violation. Let EH handle this.
|
||||
* Phantom devices also trigger this
|
||||
* condition. Mark hint.
|
||||
*/
|
||||
ata_ehi_push_desc(ehi, "ST-ATA: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM |
|
||||
AC_ERR_NODEV_HINT;
|
||||
}
|
||||
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1257,8 +1265,12 @@ int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
|||
status = ata_wait_idle(ap);
|
||||
}
|
||||
|
||||
if (status & (ATA_BUSY | ATA_DRQ))
|
||||
if (status & (ATA_BUSY | ATA_DRQ)) {
|
||||
ata_ehi_push_desc(ehi, "ST-ATA: "
|
||||
"BUSY|DRQ persists on ERR|DF, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
}
|
||||
|
||||
/* ata_pio_sectors() might change the
|
||||
* state to HSM_ST_LAST. so, the state
|
||||
|
|
|
@ -1607,7 +1607,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
|||
* Much of the time, this could just work regardless.
|
||||
* So for now, just log the incident, and allow the attempt.
|
||||
*/
|
||||
if (limit_warnings && (qc->nbytes / qc->sect_size) > 1) {
|
||||
if (limit_warnings > 0 && (qc->nbytes / qc->sect_size) > 1) {
|
||||
--limit_warnings;
|
||||
ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
||||
": attempting PIO w/multiple DRQ: "
|
||||
|
|
|
@ -370,6 +370,7 @@ static const struct pci_device_id sil24_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 },
|
||||
{ PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x0244), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
|
||||
{ PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
|
||||
|
||||
|
|
|
@ -83,6 +83,7 @@ static struct ata_port_operations uli_ops = {
|
|||
.inherits = &ata_bmdma_port_ops,
|
||||
.scr_read = uli_scr_read,
|
||||
.scr_write = uli_scr_write,
|
||||
.hardreset = ATA_OP_NULL,
|
||||
};
|
||||
|
||||
static const struct ata_port_info uli_port_info = {
|
||||
|
|
|
@ -64,7 +64,7 @@ config KS0108_DELAY
|
|||
Amount of time the ks0108 should wait between each control write
|
||||
to the parallel port.
|
||||
|
||||
If your driver seems to miss random writings, increment this.
|
||||
If your LCD seems to miss random writings, increment this.
|
||||
|
||||
If you don't know what I'm talking about, ignore it.
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPLv2
|
||||
* Depends: ks0108
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -398,5 +398,5 @@ module_init(cfag12864b_init);
|
|||
module_exit(cfag12864b_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
|
||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>");
|
||||
MODULE_DESCRIPTION("cfag12864b LCD driver");
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPLv2
|
||||
* Depends: cfag12864b
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -186,5 +186,5 @@ module_init(cfag12864bfb_init);
|
|||
module_exit(cfag12864bfb_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
|
||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>");
|
||||
MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver");
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License: GPLv2
|
||||
* Depends: parport
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -173,6 +173,6 @@ module_init(ks0108_init);
|
|||
module_exit(ks0108_exit);
|
||||
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
|
||||
MODULE_AUTHOR("Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>");
|
||||
MODULE_DESCRIPTION("ks0108 LCD Controller driver");
|
||||
|
||||
|
|
|
@ -84,8 +84,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
|
|||
nid, K(i.totalram),
|
||||
nid, K(i.freeram),
|
||||
nid, K(i.totalram - i.freeram),
|
||||
nid, node_page_state(nid, NR_ACTIVE),
|
||||
nid, node_page_state(nid, NR_INACTIVE),
|
||||
nid, K(node_page_state(nid, NR_ACTIVE)),
|
||||
nid, K(node_page_state(nid, NR_INACTIVE)),
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
nid, K(i.totalhigh),
|
||||
nid, K(i.freehigh),
|
||||
|
|
|
@ -106,35 +106,34 @@ MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
|
|||
/* board_id = Subsystem Device ID & Vendor ID
|
||||
* product = Marketing Name for the board
|
||||
* access = Address of the struct of function pointers
|
||||
* nr_cmds = Number of commands supported by controller
|
||||
*/
|
||||
static struct board_type products[] = {
|
||||
{0x40700E11, "Smart Array 5300", &SA5_access, 512},
|
||||
{0x40800E11, "Smart Array 5i", &SA5B_access, 512},
|
||||
{0x40820E11, "Smart Array 532", &SA5B_access, 512},
|
||||
{0x40830E11, "Smart Array 5312", &SA5B_access, 512},
|
||||
{0x409A0E11, "Smart Array 641", &SA5_access, 512},
|
||||
{0x409B0E11, "Smart Array 642", &SA5_access, 512},
|
||||
{0x409C0E11, "Smart Array 6400", &SA5_access, 512},
|
||||
{0x409D0E11, "Smart Array 6400 EM", &SA5_access, 512},
|
||||
{0x40910E11, "Smart Array 6i", &SA5_access, 512},
|
||||
{0x3225103C, "Smart Array P600", &SA5_access, 512},
|
||||
{0x3223103C, "Smart Array P800", &SA5_access, 512},
|
||||
{0x3234103C, "Smart Array P400", &SA5_access, 512},
|
||||
{0x3235103C, "Smart Array P400i", &SA5_access, 512},
|
||||
{0x3211103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3212103C, "Smart Array E200", &SA5_access, 120},
|
||||
{0x3213103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3214103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3215103C, "Smart Array E200i", &SA5_access, 120},
|
||||
{0x3237103C, "Smart Array E500", &SA5_access, 512},
|
||||
{0x323D103C, "Smart Array P700m", &SA5_access, 512},
|
||||
{0x3241103C, "Smart Array P212", &SA5_access, 384},
|
||||
{0x3243103C, "Smart Array P410", &SA5_access, 384},
|
||||
{0x3245103C, "Smart Array P410i", &SA5_access, 384},
|
||||
{0x3247103C, "Smart Array P411", &SA5_access, 384},
|
||||
{0x3249103C, "Smart Array P812", &SA5_access, 384},
|
||||
{0xFFFF103C, "Unknown Smart Array", &SA5_access, 120},
|
||||
{0x40700E11, "Smart Array 5300", &SA5_access},
|
||||
{0x40800E11, "Smart Array 5i", &SA5B_access},
|
||||
{0x40820E11, "Smart Array 532", &SA5B_access},
|
||||
{0x40830E11, "Smart Array 5312", &SA5B_access},
|
||||
{0x409A0E11, "Smart Array 641", &SA5_access},
|
||||
{0x409B0E11, "Smart Array 642", &SA5_access},
|
||||
{0x409C0E11, "Smart Array 6400", &SA5_access},
|
||||
{0x409D0E11, "Smart Array 6400 EM", &SA5_access},
|
||||
{0x40910E11, "Smart Array 6i", &SA5_access},
|
||||
{0x3225103C, "Smart Array P600", &SA5_access},
|
||||
{0x3223103C, "Smart Array P800", &SA5_access},
|
||||
{0x3234103C, "Smart Array P400", &SA5_access},
|
||||
{0x3235103C, "Smart Array P400i", &SA5_access},
|
||||
{0x3211103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3212103C, "Smart Array E200", &SA5_access},
|
||||
{0x3213103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3214103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3215103C, "Smart Array E200i", &SA5_access},
|
||||
{0x3237103C, "Smart Array E500", &SA5_access},
|
||||
{0x323D103C, "Smart Array P700m", &SA5_access},
|
||||
{0x3241103C, "Smart Array P212", &SA5_access},
|
||||
{0x3243103C, "Smart Array P410", &SA5_access},
|
||||
{0x3245103C, "Smart Array P410i", &SA5_access},
|
||||
{0x3247103C, "Smart Array P411", &SA5_access},
|
||||
{0x3249103C, "Smart Array P812", &SA5_access},
|
||||
{0xFFFF103C, "Unknown Smart Array", &SA5_access},
|
||||
};
|
||||
|
||||
/* How long to wait (in milliseconds) for board to go into simple mode */
|
||||
|
@ -3086,11 +3085,20 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||
print_cfg_table(c->cfgtable);
|
||||
#endif /* CCISS_DEBUG */
|
||||
|
||||
/* Some controllers support Zero Memory Raid (ZMR).
|
||||
* When configured in ZMR mode the number of supported
|
||||
* commands drops to 64. So instead of just setting an
|
||||
* arbitrary value we make the driver a little smarter.
|
||||
* We read the config table to tell us how many commands
|
||||
* are supported on the controller then subtract 4 to
|
||||
* leave a little room for ioctl calls.
|
||||
*/
|
||||
c->max_commands = readl(&(c->cfgtable->CmdsOutMax));
|
||||
for (i = 0; i < ARRAY_SIZE(products); i++) {
|
||||
if (board_id == products[i].board_id) {
|
||||
c->product_name = products[i].product_name;
|
||||
c->access = *(products[i].access);
|
||||
c->nr_cmds = products[i].nr_cmds;
|
||||
c->nr_cmds = c->max_commands - 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -3110,7 +3118,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||
if (subsystem_vendor_id == PCI_VENDOR_ID_HP) {
|
||||
c->product_name = products[i-1].product_name;
|
||||
c->access = *(products[i-1].access);
|
||||
c->nr_cmds = products[i-1].nr_cmds;
|
||||
c->nr_cmds = c->max_commands - 4;
|
||||
printk(KERN_WARNING "cciss: This is an unknown "
|
||||
"Smart Array controller.\n"
|
||||
"cciss: Please update to the latest driver "
|
||||
|
@ -3546,6 +3554,10 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||
for (j = 0; j <= hba[i]->highest_lun; j++)
|
||||
add_disk(hba[i]->gendisk[j]);
|
||||
|
||||
/* we must register the controller even if no disks exist */
|
||||
if (hba[i]->highest_lun == -1)
|
||||
add_disk(hba[i]->gendisk[0]);
|
||||
|
||||
return 1;
|
||||
|
||||
clean4:
|
||||
|
|
|
@ -62,11 +62,11 @@ static void i915_vblank_tasklet(struct drm_device *dev)
|
|||
u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
|
||||
RING_LOCALS;
|
||||
|
||||
if (sarea_priv->front_tiled) {
|
||||
if (IS_I965G(dev) && sarea_priv->front_tiled) {
|
||||
cmd |= XY_SRC_COPY_BLT_DST_TILED;
|
||||
dst_pitch >>= 2;
|
||||
}
|
||||
if (sarea_priv->back_tiled) {
|
||||
if (IS_I965G(dev) && sarea_priv->back_tiled) {
|
||||
cmd |= XY_SRC_COPY_BLT_SRC_TILED;
|
||||
src_pitch >>= 2;
|
||||
}
|
||||
|
|
|
@ -3322,7 +3322,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
|
|||
msleep_interruptible(duration);
|
||||
tty->ops->break_ctl(tty, 0);
|
||||
tty_write_unlock(tty);
|
||||
if (!signal_pending(current))
|
||||
if (signal_pending(current))
|
||||
return -EINTR;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/connector.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <net/sock.h>
|
||||
|
||||
|
@ -403,6 +405,40 @@ static void cn_callback(void *data)
|
|||
mutex_unlock(¬ify_lock);
|
||||
}
|
||||
|
||||
static int cn_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct cn_queue_dev *dev = cdev.cbdev;
|
||||
struct cn_callback_entry *cbq;
|
||||
|
||||
seq_printf(m, "Name ID\n");
|
||||
|
||||
spin_lock_bh(&dev->queue_lock);
|
||||
|
||||
list_for_each_entry(cbq, &dev->queue_list, callback_entry) {
|
||||
seq_printf(m, "%-15s %u:%u\n",
|
||||
cbq->id.name,
|
||||
cbq->id.id.idx,
|
||||
cbq->id.id.val);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&dev->queue_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cn_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, cn_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations cn_file_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = cn_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release
|
||||
};
|
||||
|
||||
static int __devinit cn_init(void)
|
||||
{
|
||||
struct cn_dev *dev = &cdev;
|
||||
|
@ -434,6 +470,8 @@ static int __devinit cn_init(void)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -443,6 +481,8 @@ static void __devexit cn_fini(void)
|
|||
|
||||
cn_already_initialized = 0;
|
||||
|
||||
proc_net_remove(&init_net, "connector");
|
||||
|
||||
cn_del_callback(&dev->id);
|
||||
cn_queue_free_dev(dev->cbdev);
|
||||
netlink_kernel_release(dev->nls);
|
||||
|
|
|
@ -1051,7 +1051,8 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory,
|
|||
break;
|
||||
|
||||
case SBP2_CSR_LOGICAL_UNIT_DIRECTORY:
|
||||
if (sbp2_scan_logical_unit_dir(tgt, ci.p + value) < 0)
|
||||
/* Adjust for the increment in the iterator */
|
||||
if (sbp2_scan_logical_unit_dir(tgt, ci.p - 1 + value) < 0)
|
||||
return -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -28,12 +28,18 @@ config DEBUG_GPIO
|
|||
comment "I2C GPIO expanders:"
|
||||
|
||||
config GPIO_PCA953X
|
||||
tristate "PCA953x I/O ports"
|
||||
tristate "PCA953x, PCA955x, and MAX7310 I/O ports"
|
||||
depends on I2C
|
||||
help
|
||||
Say yes here to support the PCA9534 (8-bit), PCA9535 (16-bit),
|
||||
PCA9536 (4-bit), PCA9537 (4-bit), PCA9538 (8-bit), and PCA9539
|
||||
(16-bit) I/O ports. These parts are made by NXP and TI.
|
||||
Say yes here to provide access to several register-oriented
|
||||
SMBus I/O expanders, made mostly by NXP or TI. Compatible
|
||||
models include:
|
||||
|
||||
4 bits: pca9536, pca9537
|
||||
|
||||
8 bits: max7310, pca9534, pca9538, pca9554, pca9557
|
||||
|
||||
16 bits: pca9535, pca9539, pca9555
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called pca953x.
|
||||
|
|
|
@ -33,7 +33,7 @@ static const struct i2c_device_id pca953x_id[] = {
|
|||
{ "pca9554", 8, },
|
||||
{ "pca9555", 16, },
|
||||
{ "pca9557", 8, },
|
||||
/* REVISIT several pca955x parts should work here too */
|
||||
{ "max7310", 8, },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, pca953x_id);
|
||||
|
|
|
@ -516,17 +516,23 @@ static struct dmi_system_id __initdata hdaps_whitelist[] = {
|
|||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61"),
|
||||
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"),
|
||||
HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61p"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61s"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61"),
|
||||
HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61m"),
|
||||
HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61p"),
|
||||
{ .ident = NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -295,7 +295,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||
/* ack was not received... */
|
||||
|
||||
dev_dbg(i2c->dev, "ack was not received\n");
|
||||
s3c24xx_i2c_stop(i2c, -EREMOTEIO);
|
||||
s3c24xx_i2c_stop(i2c, -ENXIO);
|
||||
goto out_ack;
|
||||
}
|
||||
|
||||
|
@ -305,7 +305,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||
i2c->state = STATE_WRITE;
|
||||
|
||||
/* terminate the transfer if there is nothing to do
|
||||
* (used by the i2c probe to find devices */
|
||||
* as this is used by the i2c probe to find devices. */
|
||||
|
||||
if (is_lastmsg(i2c) && i2c->msg->len == 0) {
|
||||
s3c24xx_i2c_stop(i2c, 0);
|
||||
|
@ -323,7 +323,17 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||
* end of the message, and if so, work out what to do
|
||||
*/
|
||||
|
||||
if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) {
|
||||
if (iicstat & S3C2410_IICSTAT_LASTBIT) {
|
||||
dev_dbg(i2c->dev, "WRITE: No Ack\n");
|
||||
|
||||
s3c24xx_i2c_stop(i2c, -ECONNREFUSED);
|
||||
goto out_ack;
|
||||
}
|
||||
}
|
||||
|
||||
retry_write:
|
||||
|
||||
if (!is_msgend(i2c)) {
|
||||
byte = i2c->msg->buf[i2c->msg_ptr++];
|
||||
writeb(byte, i2c->regs + S3C2410_IICDS);
|
||||
|
@ -377,17 +387,6 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
|
|||
* going to do any more read/write
|
||||
*/
|
||||
|
||||
if (!(i2c->msg->flags & I2C_M_IGNORE_NAK) &&
|
||||
!(is_msglast(i2c) && is_lastmsg(i2c))) {
|
||||
|
||||
if (iicstat & S3C2410_IICSTAT_LASTBIT) {
|
||||
dev_dbg(i2c->dev, "READ: No Ack\n");
|
||||
|
||||
s3c24xx_i2c_stop(i2c, -ECONNREFUSED);
|
||||
goto out_ack;
|
||||
}
|
||||
}
|
||||
|
||||
byte = readb(i2c->regs + S3C2410_IICDS);
|
||||
i2c->msg->buf[i2c->msg_ptr++] = byte;
|
||||
|
||||
|
@ -949,3 +948,4 @@ MODULE_DESCRIPTION("S3C24XX I2C Bus driver");
|
|||
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:s3c2410-i2c");
|
||||
MODULE_ALIAS("platform:s3c2440-i2c");
|
||||
|
|
|
@ -823,6 +823,13 @@ config BLK_DEV_IDE_RAPIDE
|
|||
Say Y here if you want to support the Yellowstone RapIDE controller
|
||||
manufactured for use with Acorn computers.
|
||||
|
||||
config BLK_DEV_IDE_BAST
|
||||
tristate "Simtec BAST / Thorcom VR1000 IDE support"
|
||||
depends on ARM && (ARCH_BAST || MACH_VR1000)
|
||||
help
|
||||
Say Y here if you want to support the onboard IDE channels on the
|
||||
Simtec BAST or the Thorcom VR1000
|
||||
|
||||
config IDE_H8300
|
||||
tristate "H8300 IDE support"
|
||||
depends on H8300
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
|
||||
obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
|
||||
obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
|
||||
obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o
|
||||
obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o
|
||||
|
||||
ifeq ($(CONFIG_IDE_ARM), m)
|
||||
|
|
90
drivers/ide/arm/bast-ide.c
Normal file
90
drivers/ide/arm/bast-ide.c
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Copyright (c) 2003-2004 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/arch/map.h>
|
||||
#include <asm/arch/bast-map.h>
|
||||
#include <asm/arch/bast-irq.h>
|
||||
|
||||
#define DRV_NAME "bast-ide"
|
||||
|
||||
static int __init bastide_register(unsigned int base, unsigned int aux, int irq)
|
||||
{
|
||||
ide_hwif_t *hwif;
|
||||
hw_regs_t hw;
|
||||
int i;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
|
||||
base += BAST_IDE_CS;
|
||||
aux += BAST_IDE_CS;
|
||||
|
||||
for (i = 0; i <= 7; i++) {
|
||||
hw.io_ports_array[i] = (unsigned long)base;
|
||||
base += 0x20;
|
||||
}
|
||||
|
||||
hw.io_ports.ctl_addr = aux + (6 * 0x20);
|
||||
hw.irq = irq;
|
||||
hw.chipset = ide_generic;
|
||||
|
||||
hwif = ide_find_port();
|
||||
if (hwif == NULL)
|
||||
goto out;
|
||||
|
||||
i = hwif->index;
|
||||
|
||||
ide_init_port_data(hwif, i);
|
||||
ide_init_port_hw(hwif, &hw);
|
||||
hwif->port_ops = NULL;
|
||||
|
||||
idx[0] = i;
|
||||
|
||||
ide_device_add(idx, NULL);
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init bastide_init(void)
|
||||
{
|
||||
unsigned long base = BAST_VA_IDEPRI + BAST_IDE_CS;
|
||||
|
||||
/* we can treat the VR1000 and the BAST the same */
|
||||
|
||||
if (!(machine_is_bast() || machine_is_vr1000()))
|
||||
return 0;
|
||||
|
||||
printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n");
|
||||
|
||||
if (!request_mem_region(base, 0x400000, DRV_NAME)) {
|
||||
printk(KERN_ERR "%s: resources busy\n", DRV_NAME);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0);
|
||||
bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(bastide_init);
|
||||
|
||||
MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver");
|
|
@ -76,7 +76,7 @@ struct palm_bk3710_udmatiming {
|
|||
|
||||
#include "../ide-timing.h"
|
||||
|
||||
static long ide_palm_clk;
|
||||
static unsigned ideclk_period; /* in nanoseconds */
|
||||
|
||||
static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = {
|
||||
{160, 240}, /* UDMA Mode 0 */
|
||||
|
@ -86,8 +86,6 @@ static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = {
|
|||
{85, 60}, /* UDMA Mode 4 */
|
||||
};
|
||||
|
||||
static struct clk *ideclkp;
|
||||
|
||||
static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev,
|
||||
unsigned int mode)
|
||||
{
|
||||
|
@ -97,10 +95,10 @@ static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev,
|
|||
|
||||
/* DMA Data Setup */
|
||||
t0 = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].cycletime,
|
||||
ide_palm_clk) - 1;
|
||||
tenv = DIV_ROUND_UP(20, ide_palm_clk) - 1;
|
||||
ideclk_period) - 1;
|
||||
tenv = DIV_ROUND_UP(20, ideclk_period) - 1;
|
||||
trp = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].rptime,
|
||||
ide_palm_clk) - 1;
|
||||
ideclk_period) - 1;
|
||||
|
||||
/* udmatim Register */
|
||||
val16 = readw(base + BK3710_UDMATIM) & (dev ? 0xFF0F : 0xFFF0);
|
||||
|
@ -141,8 +139,8 @@ static void palm_bk3710_setdmamode(void __iomem *base, unsigned int dev,
|
|||
cycletime = max_t(int, t->cycle, min_cycle);
|
||||
|
||||
/* DMA Data Setup */
|
||||
t0 = DIV_ROUND_UP(cycletime, ide_palm_clk);
|
||||
td = DIV_ROUND_UP(t->active, ide_palm_clk);
|
||||
t0 = DIV_ROUND_UP(cycletime, ideclk_period);
|
||||
td = DIV_ROUND_UP(t->active, ideclk_period);
|
||||
tkw = t0 - td - 1;
|
||||
td -= 1;
|
||||
|
||||
|
@ -168,9 +166,9 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate,
|
|||
struct ide_timing *t;
|
||||
|
||||
/* PIO Data Setup */
|
||||
t0 = DIV_ROUND_UP(cycletime, ide_palm_clk);
|
||||
t0 = DIV_ROUND_UP(cycletime, ideclk_period);
|
||||
t2 = DIV_ROUND_UP(ide_timing_find_mode(XFER_PIO_0 + mode)->active,
|
||||
ide_palm_clk);
|
||||
ideclk_period);
|
||||
|
||||
t2i = t0 - t2 - 1;
|
||||
t2 -= 1;
|
||||
|
@ -192,8 +190,8 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate,
|
|||
|
||||
/* TASKFILE Setup */
|
||||
t = ide_timing_find_mode(XFER_PIO_0 + mode);
|
||||
t0 = DIV_ROUND_UP(t->cyc8b, ide_palm_clk);
|
||||
t2 = DIV_ROUND_UP(t->act8b, ide_palm_clk);
|
||||
t0 = DIV_ROUND_UP(t->cyc8b, ideclk_period);
|
||||
t2 = DIV_ROUND_UP(t->act8b, ideclk_period);
|
||||
|
||||
t2i = t0 - t2 - 1;
|
||||
t2 -= 1;
|
||||
|
@ -350,22 +348,22 @@ static const struct ide_port_info __devinitdata palm_bk3710_port_info = {
|
|||
|
||||
static int __devinit palm_bk3710_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk *clkp;
|
||||
struct clk *clk;
|
||||
struct resource *mem, *irq;
|
||||
ide_hwif_t *hwif;
|
||||
unsigned long base;
|
||||
unsigned long base, rate;
|
||||
int i;
|
||||
hw_regs_t hw;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
clkp = clk_get(NULL, "IDECLK");
|
||||
if (IS_ERR(clkp))
|
||||
clk = clk_get(NULL, "IDECLK");
|
||||
if (IS_ERR(clk))
|
||||
return -ENODEV;
|
||||
|
||||
ideclkp = clkp;
|
||||
clk_enable(ideclkp);
|
||||
ide_palm_clk = clk_get_rate(ideclkp)/100000;
|
||||
ide_palm_clk = (10000/ide_palm_clk) + 1;
|
||||
clk_enable(clk);
|
||||
rate = clk_get_rate(clk);
|
||||
ideclk_period = 1000000000UL / rate;
|
||||
|
||||
/* Register the IDE interface with Linux ATA Interface */
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
|
||||
|
|
|
@ -646,8 +646,6 @@ static int ide_register_port(ide_hwif_t *hwif)
|
|||
goto out;
|
||||
}
|
||||
|
||||
get_device(&hwif->gendev);
|
||||
|
||||
hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
|
||||
MKDEV(0, 0), hwif, hwif->name);
|
||||
if (IS_ERR(hwif->portdev)) {
|
||||
|
@ -1220,16 +1218,12 @@ static void drive_release_dev (struct device *dev)
|
|||
complete(&drive->gendev_rel_comp);
|
||||
}
|
||||
|
||||
#ifndef ide_default_irq
|
||||
#define ide_default_irq(irq) 0
|
||||
#endif
|
||||
|
||||
static int hwif_init(ide_hwif_t *hwif)
|
||||
{
|
||||
int old_irq;
|
||||
|
||||
if (!hwif->irq) {
|
||||
hwif->irq = ide_default_irq(hwif->io_ports.data_addr);
|
||||
hwif->irq = __ide_default_irq(hwif->io_ports.data_addr);
|
||||
if (!hwif->irq) {
|
||||
printk("%s: DISABLED, NO IRQ\n", hwif->name);
|
||||
return 0;
|
||||
|
@ -1259,7 +1253,7 @@ static int hwif_init(ide_hwif_t *hwif)
|
|||
* It failed to initialise. Find the default IRQ for
|
||||
* this port and try that.
|
||||
*/
|
||||
hwif->irq = ide_default_irq(hwif->io_ports.data_addr);
|
||||
hwif->irq = __ide_default_irq(hwif->io_ports.data_addr);
|
||||
if (!hwif->irq) {
|
||||
printk("%s: Disabled unable to get IRQ %d.\n",
|
||||
hwif->name, old_irq);
|
||||
|
|
|
@ -76,7 +76,7 @@ static int proc_ide_read_mate
|
|||
ide_hwif_t *hwif = (ide_hwif_t *) data;
|
||||
int len;
|
||||
|
||||
if (hwif && hwif->mate && hwif->mate->present)
|
||||
if (hwif && hwif->mate)
|
||||
len = sprintf(page, "%s\n", hwif->mate->name);
|
||||
else
|
||||
len = sprintf(page, "(none)\n");
|
||||
|
|
|
@ -315,13 +315,14 @@ void ide_unregister(ide_hwif_t *hwif)
|
|||
|
||||
BUG_ON(in_interrupt());
|
||||
BUG_ON(irqs_disabled());
|
||||
|
||||
mutex_lock(&ide_cfg_mtx);
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
if (!hwif->present)
|
||||
goto abort;
|
||||
if (hwif->present) {
|
||||
__ide_port_unregister_devices(hwif);
|
||||
hwif->present = 0;
|
||||
|
||||
}
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
||||
ide_proc_unregister_port(hwif);
|
||||
|
@ -351,16 +352,15 @@ void ide_unregister(ide_hwif_t *hwif)
|
|||
blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<<PARTN_BITS);
|
||||
kfree(hwif->sg_table);
|
||||
unregister_blkdev(hwif->major, hwif->name);
|
||||
spin_lock_irq(&ide_lock);
|
||||
|
||||
if (hwif->dma_base)
|
||||
ide_release_dma_engine(hwif);
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
/* restore hwif data to pristine status */
|
||||
ide_init_port_data(hwif, hwif->index);
|
||||
|
||||
abort:
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
||||
mutex_unlock(&ide_cfg_mtx);
|
||||
}
|
||||
|
||||
|
@ -1094,13 +1094,6 @@ struct bus_type ide_bus_type = {
|
|||
|
||||
EXPORT_SYMBOL_GPL(ide_bus_type);
|
||||
|
||||
static void ide_port_class_release(struct device *portdev)
|
||||
{
|
||||
ide_hwif_t *hwif = dev_get_drvdata(portdev);
|
||||
|
||||
put_device(&hwif->gendev);
|
||||
}
|
||||
|
||||
int ide_vlb_clk;
|
||||
EXPORT_SYMBOL_GPL(ide_vlb_clk);
|
||||
|
||||
|
@ -1305,7 +1298,6 @@ static int __init ide_init(void)
|
|||
ret = PTR_ERR(ide_port_class);
|
||||
goto out_port_class;
|
||||
}
|
||||
ide_port_class->dev_release = ide_port_class_release;
|
||||
|
||||
init_ide_data();
|
||||
|
||||
|
|
|
@ -184,8 +184,7 @@ static const struct ide_port_info it8213_chipsets[] __devinitdata = {
|
|||
|
||||
static int __devinit it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]);
|
||||
return 0;
|
||||
return ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]);
|
||||
}
|
||||
|
||||
static const struct pci_device_id it8213_pci_tbl[] = {
|
||||
|
|
|
@ -225,10 +225,6 @@ static int ns87415_dma_setup(ide_drive_t *drive)
|
|||
return 1;
|
||||
}
|
||||
|
||||
#ifndef ide_default_irq
|
||||
#define ide_default_irq(irq) 0
|
||||
#endif
|
||||
|
||||
static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
|
@ -288,7 +284,7 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
|
|||
}
|
||||
|
||||
if (!using_inta)
|
||||
hwif->irq = ide_default_irq(hwif->io_ports.data_addr);
|
||||
hwif->irq = __ide_default_irq(hwif->io_ports.data_addr);
|
||||
else if (!hwif->irq && hwif->mate && hwif->mate->irq)
|
||||
hwif->irq = hwif->mate->irq; /* share IRQ with mate */
|
||||
|
||||
|
|
|
@ -1096,7 +1096,9 @@ static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, ch
|
|||
struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev;
|
||||
|
||||
PDBG("%s dev 0x%p\n", __func__, dev);
|
||||
rtnl_lock();
|
||||
lldev->ethtool_ops->get_drvinfo(lldev, &info);
|
||||
rtnl_unlock();
|
||||
return sprintf(buf, "%s\n", info.fw_version);
|
||||
}
|
||||
|
||||
|
@ -1109,7 +1111,9 @@ static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
|
|||
struct net_device *lldev = iwch_dev->rdev.t3cdev_p->lldev;
|
||||
|
||||
PDBG("%s dev 0x%p\n", __func__, dev);
|
||||
rtnl_lock();
|
||||
lldev->ethtool_ops->get_drvinfo(lldev, &info);
|
||||
rtnl_unlock();
|
||||
return sprintf(buf, "%s\n", info.driver);
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
/*
|
||||
* Check that the effect_id is a valid effect and whether the user
|
||||
|
@ -166,8 +167,10 @@ int input_ff_upload(struct input_dev *dev, struct ff_effect *effect,
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
spin_lock_irq(&dev->event_lock);
|
||||
ff->effects[id] = *effect;
|
||||
ff->effect_owners[id] = file;
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ff->mutex);
|
||||
|
@ -189,15 +192,21 @@ static int erase_effect(struct input_dev *dev, int effect_id,
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
spin_lock_irq(&dev->event_lock);
|
||||
ff->playback(dev, effect_id, 0);
|
||||
ff->effect_owners[effect_id] = NULL;
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
if (ff->erase) {
|
||||
error = ff->erase(dev, effect_id);
|
||||
if (error)
|
||||
if (error) {
|
||||
spin_lock_irq(&dev->event_lock);
|
||||
ff->effect_owners[effect_id] = file;
|
||||
spin_unlock_irq(&dev->event_lock);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
ff->effect_owners[effect_id] = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -263,8 +272,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
|
|||
if (type != EV_FF)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&ff->mutex);
|
||||
|
||||
switch (code) {
|
||||
case FF_GAIN:
|
||||
if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff)
|
||||
|
@ -286,7 +293,6 @@ int input_ff_event(struct input_dev *dev, unsigned int type,
|
|||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&ff->mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(input_ff_event);
|
||||
|
|
|
@ -432,6 +432,7 @@ static int crypt_convert(struct crypt_config *cc,
|
|||
case 0:
|
||||
atomic_dec(&ctx->pending);
|
||||
ctx->sector++;
|
||||
cond_resched();
|
||||
continue;
|
||||
|
||||
/* error */
|
||||
|
|
|
@ -3897,7 +3897,9 @@ static void autorun_devices(int part)
|
|||
|
||||
md_probe(dev, NULL, NULL);
|
||||
mddev = mddev_find(dev);
|
||||
if (!mddev) {
|
||||
if (!mddev || !mddev->gendisk) {
|
||||
if (mddev)
|
||||
mddev_put(mddev);
|
||||
printk(KERN_ERR
|
||||
"md: cannot allocate memory for md drive.\n");
|
||||
break;
|
||||
|
|
|
@ -2137,6 +2137,8 @@ static int run(mddev_t *mddev)
|
|||
!test_bit(In_sync, &disk->rdev->flags)) {
|
||||
disk->head_position = 0;
|
||||
mddev->degraded++;
|
||||
if (disk->rdev)
|
||||
conf->fullsync = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2017,12 +2017,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh,
|
|||
*/
|
||||
s->uptodate++;
|
||||
return 0; /* uptodate + compute == disks */
|
||||
} else if ((s->uptodate < disks - 1) &&
|
||||
test_bit(R5_Insync, &dev->flags)) {
|
||||
/* Note: we hold off compute operations while checks are
|
||||
* in flight, but we still prefer 'compute' over 'read'
|
||||
* hence we only read if (uptodate < * disks-1)
|
||||
*/
|
||||
} else if (test_bit(R5_Insync, &dev->flags)) {
|
||||
set_bit(R5_LOCKED, &dev->flags);
|
||||
set_bit(R5_Wantread, &dev->flags);
|
||||
if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
|
||||
|
@ -2898,6 +2893,8 @@ static void handle_stripe5(struct stripe_head *sh)
|
|||
|
||||
for (i = conf->raid_disks; i--; ) {
|
||||
set_bit(R5_Wantwrite, &sh->dev[i].flags);
|
||||
set_bit(R5_LOCKED, &dev->flags);
|
||||
s.locked++;
|
||||
if (!test_and_set_bit(STRIPE_OP_IO, &sh->ops.pending))
|
||||
sh->ops.count++;
|
||||
}
|
||||
|
@ -2911,6 +2908,7 @@ static void handle_stripe5(struct stripe_head *sh)
|
|||
conf->raid_disks);
|
||||
s.locked += handle_write_operations5(sh, 1, 1);
|
||||
} else if (s.expanded &&
|
||||
s.locked == 0 &&
|
||||
!test_bit(STRIPE_OP_POSTXOR, &sh->ops.pending)) {
|
||||
clear_bit(STRIPE_EXPAND_READY, &sh->state);
|
||||
atomic_dec(&conf->reshape_stripes);
|
||||
|
@ -4305,7 +4303,9 @@ static int run(mddev_t *mddev)
|
|||
" disk %d\n", bdevname(rdev->bdev,b),
|
||||
raid_disk);
|
||||
working_disks++;
|
||||
}
|
||||
} else
|
||||
/* Cannot rely on bitmap to complete recovery */
|
||||
conf->fullsync = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue