mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-30 08:42:27 -05:00
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
@@ -271,8 +271,6 @@ netlabel/
|
||||
- directory with information on the NetLabel subsystem.
|
||||
networking/
|
||||
- directory with info on various aspects of networking with Linux.
|
||||
nfsroot.txt
|
||||
- short guide on setting up a diskless box with NFS root filesystem.
|
||||
nmi_watchdog.txt
|
||||
- info on NMI watchdog for SMP systems.
|
||||
nommu-mmap.txt
|
||||
@@ -321,8 +319,6 @@ robust-futexes.txt
|
||||
- a description of what robust futexes are.
|
||||
rocket.txt
|
||||
- info on the Comtrol RocketPort multiport serial driver.
|
||||
rpc-cache.txt
|
||||
- introduction to the caching mechanisms in the sunrpc layer.
|
||||
rt-mutex-design.txt
|
||||
- description of the RealTime mutex implementation design.
|
||||
rt-mutex.txt
|
||||
|
||||
@@ -328,7 +328,7 @@ now, but you can do this to mark internal company procedures or just
|
||||
point out some special detail about the sign-off.
|
||||
|
||||
|
||||
13) When to use Acked-by:
|
||||
13) When to use Acked-by: and Cc:
|
||||
|
||||
The Signed-off-by: tag indicates that the signer was involved in the
|
||||
development of the patch, or that he/she was in the patch's delivery path.
|
||||
@@ -349,11 +349,59 @@ Acked-by: does not necessarily indicate acknowledgement of the entire patch.
|
||||
For example, if a patch affects multiple subsystems and has an Acked-by: from
|
||||
one subsystem maintainer then this usually indicates acknowledgement of just
|
||||
the part which affects that maintainer's code. Judgement should be used here.
|
||||
When in doubt people should refer to the original discussion in the mailing
|
||||
When in doubt people should refer to the original discussion in the mailing
|
||||
list archives.
|
||||
|
||||
If a person has had the opportunity to comment on a patch, but has not
|
||||
provided such comments, you may optionally add a "Cc:" tag to the patch.
|
||||
This is the only tag which might be added without an explicit action by the
|
||||
person it names. This tag documents that potentially interested parties
|
||||
have been included in the discussion
|
||||
|
||||
14) The canonical patch format
|
||||
|
||||
14) Using Test-by: and Reviewed-by:
|
||||
|
||||
A Tested-by: tag indicates that the patch has been successfully tested (in
|
||||
some environment) by the person named. This tag informs maintainers that
|
||||
some testing has been performed, provides a means to locate testers for
|
||||
future patches, and ensures credit for the testers.
|
||||
|
||||
Reviewed-by:, instead, indicates that the patch has been reviewed and found
|
||||
acceptable according to the Reviewer's Statement:
|
||||
|
||||
Reviewer's statement of oversight
|
||||
|
||||
By offering my Reviewed-by: tag, I state that:
|
||||
|
||||
(a) I have carried out a technical review of this patch to
|
||||
evaluate its appropriateness and readiness for inclusion into
|
||||
the mainline kernel.
|
||||
|
||||
(b) Any problems, concerns, or questions relating to the patch
|
||||
have been communicated back to the submitter. I am satisfied
|
||||
with the submitter's response to my comments.
|
||||
|
||||
(c) While there may be things that could be improved with this
|
||||
submission, I believe that it is, at this time, (1) a
|
||||
worthwhile modification to the kernel, and (2) free of known
|
||||
issues which would argue against its inclusion.
|
||||
|
||||
(d) While I have reviewed the patch and believe it to be sound, I
|
||||
do not (unless explicitly stated elsewhere) make any
|
||||
warranties or guarantees that it will achieve its stated
|
||||
purpose or function properly in any given situation.
|
||||
|
||||
A Reviewed-by tag is a statement of opinion that the patch is an
|
||||
appropriate modification of the kernel without any remaining serious
|
||||
technical issues. Any interested reviewer (who has done the work) can
|
||||
offer a Reviewed-by tag for a patch. This tag serves to give credit to
|
||||
reviewers and to inform maintainers of the degree of review which has been
|
||||
done on the patch. Reviewed-by: tags, when supplied by reviewers known to
|
||||
understand the subject area and to perform thorough reviews, will normally
|
||||
increase the liklihood of your patch getting into the kernel.
|
||||
|
||||
|
||||
15) The canonical patch format
|
||||
|
||||
The canonical patch subject line is:
|
||||
|
||||
|
||||
@@ -66,6 +66,8 @@ mandatory-locking.txt
|
||||
- info on the Linux implementation of Sys V mandatory file locking.
|
||||
ncpfs.txt
|
||||
- info on Novell Netware(tm) filesystem using NCP protocol.
|
||||
nfsroot.txt
|
||||
- short guide on setting up a diskless box with NFS root filesystem.
|
||||
ntfs.txt
|
||||
- info and mount options for the NTFS filesystem (Windows NT).
|
||||
ocfs2.txt
|
||||
@@ -82,6 +84,10 @@ relay.txt
|
||||
- info on relay, for efficient streaming from kernel to user space.
|
||||
romfs.txt
|
||||
- description of the ROMFS filesystem.
|
||||
rpc-cache.txt
|
||||
- introduction to the caching mechanisms in the sunrpc layer.
|
||||
seq_file.txt
|
||||
- how to use the seq_file API
|
||||
sharedsubtree.txt
|
||||
- a description of shared subtrees for namespaces.
|
||||
smbfs.txt
|
||||
|
||||
@@ -0,0 +1,283 @@
|
||||
The seq_file interface
|
||||
|
||||
Copyright 2003 Jonathan Corbet <corbet@lwn.net>
|
||||
This file is originally from the LWN.net Driver Porting series at
|
||||
http://lwn.net/Articles/driver-porting/
|
||||
|
||||
|
||||
There are numerous ways for a device driver (or other kernel component) to
|
||||
provide information to the user or system administrator. One useful
|
||||
technique is the creation of virtual files, in debugfs, /proc or elsewhere.
|
||||
Virtual files can provide human-readable output that is easy to get at
|
||||
without any special utility programs; they can also make life easier for
|
||||
script writers. It is not surprising that the use of virtual files has
|
||||
grown over the years.
|
||||
|
||||
Creating those files correctly has always been a bit of a challenge,
|
||||
however. It is not that hard to make a virtual file which returns a
|
||||
string. But life gets trickier if the output is long - anything greater
|
||||
than an application is likely to read in a single operation. Handling
|
||||
multiple reads (and seeks) requires careful attention to the reader's
|
||||
position within the virtual file - that position is, likely as not, in the
|
||||
middle of a line of output. The kernel has traditionally had a number of
|
||||
implementations that got this wrong.
|
||||
|
||||
The 2.6 kernel contains a set of functions (implemented by Alexander Viro)
|
||||
which are designed to make it easy for virtual file creators to get it
|
||||
right.
|
||||
|
||||
The seq_file interface is available via <linux/seq_file.h>. There are
|
||||
three aspects to seq_file:
|
||||
|
||||
* An iterator interface which lets a virtual file implementation
|
||||
step through the objects it is presenting.
|
||||
|
||||
* Some utility functions for formatting objects for output without
|
||||
needing to worry about things like output buffers.
|
||||
|
||||
* A set of canned file_operations which implement most operations on
|
||||
the virtual file.
|
||||
|
||||
We'll look at the seq_file interface via an extremely simple example: a
|
||||
loadable module which creates a file called /proc/sequence. The file, when
|
||||
read, simply produces a set of increasing integer values, one per line. The
|
||||
sequence will continue until the user loses patience and finds something
|
||||
better to do. The file is seekable, in that one can do something like the
|
||||
following:
|
||||
|
||||
dd if=/proc/sequence of=out1 count=1
|
||||
dd if=/proc/sequence skip=1 out=out2 count=1
|
||||
|
||||
Then concatenate the output files out1 and out2 and get the right
|
||||
result. Yes, it is a thoroughly useless module, but the point is to show
|
||||
how the mechanism works without getting lost in other details. (Those
|
||||
wanting to see the full source for this module can find it at
|
||||
http://lwn.net/Articles/22359/).
|
||||
|
||||
|
||||
The iterator interface
|
||||
|
||||
Modules implementing a virtual file with seq_file must implement a simple
|
||||
iterator object that allows stepping through the data of interest.
|
||||
Iterators must be able to move to a specific position - like the file they
|
||||
implement - but the interpretation of that position is up to the iterator
|
||||
itself. A seq_file implementation that is formatting firewall rules, for
|
||||
example, could interpret position N as the Nth rule in the chain.
|
||||
Positioning can thus be done in whatever way makes the most sense for the
|
||||
generator of the data, which need not be aware of how a position translates
|
||||
to an offset in the virtual file. The one obvious exception is that a
|
||||
position of zero should indicate the beginning of the file.
|
||||
|
||||
The /proc/sequence iterator just uses the count of the next number it
|
||||
will output as its position.
|
||||
|
||||
Four functions must be implemented to make the iterator work. The first,
|
||||
called start() takes a position as an argument and returns an iterator
|
||||
which will start reading at that position. For our simple sequence example,
|
||||
the start() function looks like:
|
||||
|
||||
static void *ct_seq_start(struct seq_file *s, loff_t *pos)
|
||||
{
|
||||
loff_t *spos = kmalloc(sizeof(loff_t), GFP_KERNEL);
|
||||
if (! spos)
|
||||
return NULL;
|
||||
*spos = *pos;
|
||||
return spos;
|
||||
}
|
||||
|
||||
The entire data structure for this iterator is a single loff_t value
|
||||
holding the current position. There is no upper bound for the sequence
|
||||
iterator, but that will not be the case for most other seq_file
|
||||
implementations; in most cases the start() function should check for a
|
||||
"past end of file" condition and return NULL if need be.
|
||||
|
||||
For more complicated applications, the private field of the seq_file
|
||||
structure can be used. There is also a special value whch can be returned
|
||||
by the start() function called SEQ_START_TOKEN; it can be used if you wish
|
||||
to instruct your show() function (described below) to print a header at the
|
||||
top of the output. SEQ_START_TOKEN should only be used if the offset is
|
||||
zero, however.
|
||||
|
||||
The next function to implement is called, amazingly, next(); its job is to
|
||||
move the iterator forward to the next position in the sequence. The
|
||||
example module can simply increment the position by one; more useful
|
||||
modules will do what is needed to step through some data structure. The
|
||||
next() function returns a new iterator, or NULL if the sequence is
|
||||
complete. Here's the example version:
|
||||
|
||||
static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
|
||||
{
|
||||
loff_t *spos = v;
|
||||
*pos = ++*spos;
|
||||
return spos;
|
||||
}
|
||||
|
||||
The stop() function is called when iteration is complete; its job, of
|
||||
course, is to clean up. If dynamic memory is allocated for the iterator,
|
||||
stop() is the place to free it.
|
||||
|
||||
static void ct_seq_stop(struct seq_file *s, void *v)
|
||||
{
|
||||
kfree(v);
|
||||
}
|
||||
|
||||
Finally, the show() function should format the object currently pointed to
|
||||
by the iterator for output. It should return zero, or an error code if
|
||||
something goes wrong. The example module's show() function is:
|
||||
|
||||
static int ct_seq_show(struct seq_file *s, void *v)
|
||||
{
|
||||
loff_t *spos = v;
|
||||
seq_printf(s, "%lld\n", (long long)*spos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
We will look at seq_printf() in a moment. But first, the definition of the
|
||||
seq_file iterator is finished by creating a seq_operations structure with
|
||||
the four functions we have just defined:
|
||||
|
||||
static const struct seq_operations ct_seq_ops = {
|
||||
.start = ct_seq_start,
|
||||
.next = ct_seq_next,
|
||||
.stop = ct_seq_stop,
|
||||
.show = ct_seq_show
|
||||
};
|
||||
|
||||
This structure will be needed to tie our iterator to the /proc file in
|
||||
a little bit.
|
||||
|
||||
It's worth noting that the interator value returned by start() and
|
||||
manipulated by the other functions is considered to be completely opaque by
|
||||
the seq_file code. It can thus be anything that is useful in stepping
|
||||
through the data to be output. Counters can be useful, but it could also be
|
||||
a direct pointer into an array or linked list. Anything goes, as long as
|
||||
the programmer is aware that things can happen between calls to the
|
||||
iterator function. However, the seq_file code (by design) will not sleep
|
||||
between the calls to start() and stop(), so holding a lock during that time
|
||||
is a reasonable thing to do. The seq_file code will also avoid taking any
|
||||
other locks while the iterator is active.
|
||||
|
||||
|
||||
Formatted output
|
||||
|
||||
The seq_file code manages positioning within the output created by the
|
||||
iterator and getting it into the user's buffer. But, for that to work, that
|
||||
output must be passed to the seq_file code. Some utility functions have
|
||||
been defined which make this task easy.
|
||||
|
||||
Most code will simply use seq_printf(), which works pretty much like
|
||||
printk(), but which requires the seq_file pointer as an argument. It is
|
||||
common to ignore the return value from seq_printf(), but a function
|
||||
producing complicated output may want to check that value and quit if
|
||||
something non-zero is returned; an error return means that the seq_file
|
||||
buffer has been filled and further output will be discarded.
|
||||
|
||||
For straight character output, the following functions may be used:
|
||||
|
||||
int seq_putc(struct seq_file *m, char c);
|
||||
int seq_puts(struct seq_file *m, const char *s);
|
||||
int seq_escape(struct seq_file *m, const char *s, const char *esc);
|
||||
|
||||
The first two output a single character and a string, just like one would
|
||||
expect. seq_escape() is like seq_puts(), except that any character in s
|
||||
which is in the string esc will be represented in octal form in the output.
|
||||
|
||||
There is also a function for printing filenames:
|
||||
|
||||
int seq_path(struct seq_file *m, struct path *path, char *esc);
|
||||
|
||||
Here, path indicates the file of interest, and esc is a set of characters
|
||||
which should be escaped in the output.
|
||||
|
||||
|
||||
Making it all work
|
||||
|
||||
So far, we have a nice set of functions which can produce output within the
|
||||
seq_file system, but we have not yet turned them into a file that a user
|
||||
can see. Creating a file within the kernel requires, of course, the
|
||||
creation of a set of file_operations which implement the operations on that
|
||||
file. The seq_file interface provides a set of canned operations which do
|
||||
most of the work. The virtual file author still must implement the open()
|
||||
method, however, to hook everything up. The open function is often a single
|
||||
line, as in the example module:
|
||||
|
||||
static int ct_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open(file, &ct_seq_ops);
|
||||
}
|
||||
|
||||
Here, the call to seq_open() takes the seq_operations structure we created
|
||||
before, and gets set up to iterate through the virtual file.
|
||||
|
||||
On a successful open, seq_open() stores the struct seq_file pointer in
|
||||
file->private_data. If you have an application where the same iterator can
|
||||
be used for more than one file, you can store an arbitrary pointer in the
|
||||
private field of the seq_file structure; that value can then be retrieved
|
||||
by the iterator functions.
|
||||
|
||||
The other operations of interest - read(), llseek(), and release() - are
|
||||
all implemented by the seq_file code itself. So a virtual file's
|
||||
file_operations structure will look like:
|
||||
|
||||
static const struct file_operations ct_file_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = ct_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release
|
||||
};
|
||||
|
||||
There is also a seq_release_private() which passes the contents of the
|
||||
seq_file private field to kfree() before releasing the structure.
|
||||
|
||||
The final step is the creation of the /proc file itself. In the example
|
||||
code, that is done in the initialization code in the usual way:
|
||||
|
||||
static int ct_init(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
entry = create_proc_entry("sequence", 0, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ct_file_ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(ct_init);
|
||||
|
||||
And that is pretty much it.
|
||||
|
||||
|
||||
seq_list
|
||||
|
||||
If your file will be iterating through a linked list, you may find these
|
||||
routines useful:
|
||||
|
||||
struct list_head *seq_list_start(struct list_head *head,
|
||||
loff_t pos);
|
||||
struct list_head *seq_list_start_head(struct list_head *head,
|
||||
loff_t pos);
|
||||
struct list_head *seq_list_next(void *v, struct list_head *head,
|
||||
loff_t *ppos);
|
||||
|
||||
These helpers will interpret pos as a position within the list and iterate
|
||||
accordingly. Your start() and next() functions need only invoke the
|
||||
seq_list_* helpers with a pointer to the appropriate list_head structure.
|
||||
|
||||
|
||||
The extra-simple version
|
||||
|
||||
For extremely simple virtual files, there is an even easier interface. A
|
||||
module can define only the show() function, which should create all the
|
||||
output that the virtual file will contain. The file's open() method then
|
||||
calls:
|
||||
|
||||
int single_open(struct file *file,
|
||||
int (*show)(struct seq_file *m, void *p),
|
||||
void *data);
|
||||
|
||||
When output time comes, the show() function will be called once. The data
|
||||
value given to single_open() can be found in the private field of the
|
||||
seq_file structure. When using single_open(), the programmer should use
|
||||
single_release() instead of seq_release() in the file_operations structure
|
||||
to avoid a memory leak.
|
||||
@@ -98,7 +98,7 @@ System-level global event devices are used for the Linux periodic tick. Per-CPU
|
||||
event devices are used to provide local CPU functionality such as process
|
||||
accounting, profiling, and high resolution timers.
|
||||
|
||||
The management layer assignes one or more of the folliwing functions to a clock
|
||||
The management layer assigns one or more of the following functions to a clock
|
||||
event device:
|
||||
- system global periodic tick (jiffies update)
|
||||
- cpu local update_process_times
|
||||
|
||||
@@ -375,6 +375,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
ccw_timeout_log [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
cgroup_disable= [KNL] Disable a particular controller
|
||||
Format: {name of the controller(s) to disable}
|
||||
{Currently supported controllers - "memory"}
|
||||
|
||||
checkreqprot [SELINUX] Set initial checkreqprot flag value.
|
||||
Format: { "0" | "1" }
|
||||
See security/selinux/Kconfig help text.
|
||||
@@ -840,7 +844,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
arch/alpha/kernel/core_marvel.c.
|
||||
|
||||
ip= [IP_PNP]
|
||||
See Documentation/nfsroot.txt.
|
||||
See Documentation/filesystems/nfsroot.txt.
|
||||
|
||||
ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards
|
||||
See comment before ip2_setup() in
|
||||
@@ -1194,10 +1198,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
file if at all.
|
||||
|
||||
nfsaddrs= [NFS]
|
||||
See Documentation/nfsroot.txt.
|
||||
See Documentation/filesystems/nfsroot.txt.
|
||||
|
||||
nfsroot= [NFS] nfs root filesystem for disk-less boxes.
|
||||
See Documentation/nfsroot.txt.
|
||||
See Documentation/filesystems/nfsroot.txt.
|
||||
|
||||
nfs.callback_tcpport=
|
||||
[NFS] set the TCP port on which the NFSv4 callback
|
||||
|
||||
@@ -12,5 +12,7 @@ sched-domains.txt
|
||||
- information on scheduling domains.
|
||||
sched-nice-design.txt
|
||||
- How and why the scheduler's nice levels are implemented.
|
||||
sched-rt-group.txt
|
||||
- real-time group scheduling.
|
||||
sched-stats.txt
|
||||
- information on schedstats (Linux Scheduler Statistics).
|
||||
|
||||
@@ -116,6 +116,13 @@ low order bit. So when a chip's timing diagram shows the clock
|
||||
starting low (CPOL=0) and data stabilized for sampling during the
|
||||
trailing clock edge (CPHA=1), that's SPI mode 1.
|
||||
|
||||
Note that the clock mode is relevant as soon as the chipselect goes
|
||||
active. So the master must set the clock to inactive before selecting
|
||||
a slave, and the slave can tell the chosen polarity by sampling the
|
||||
clock level when its select line goes active. That's why many devices
|
||||
support for example both modes 0 and 3: they don't care about polarity,
|
||||
and alway clock data in/out on rising clock edges.
|
||||
|
||||
|
||||
How do these driver programming interfaces work?
|
||||
------------------------------------------------
|
||||
@@ -379,8 +386,14 @@ any more such messages.
|
||||
+ when bidirectional reads and writes start ... by how its
|
||||
sequence of spi_transfer requests is arranged;
|
||||
|
||||
+ which I/O buffers are used ... each spi_transfer wraps a
|
||||
buffer for each transfer direction, supporting full duplex
|
||||
(two pointers, maybe the same one in both cases) and half
|
||||
duplex (one pointer is NULL) transfers;
|
||||
|
||||
+ optionally defining short delays after transfers ... using
|
||||
the spi_transfer.delay_usecs setting;
|
||||
the spi_transfer.delay_usecs setting (this delay can be the
|
||||
only protocol effect, if the buffer length is zero);
|
||||
|
||||
+ whether the chipselect becomes inactive after a transfer and
|
||||
any delay ... by using the spi_transfer.cs_change flag;
|
||||
|
||||
@@ -5,6 +5,28 @@ Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or
|
||||
__SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate for static
|
||||
initialization.
|
||||
|
||||
Most of the time, you can simply turn:
|
||||
|
||||
static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
into:
|
||||
|
||||
static DEFINE_SPINLOCK(xxx_lock);
|
||||
|
||||
Static structure member variables go from:
|
||||
|
||||
struct foo bar {
|
||||
.lock = SPIN_LOCK_UNLOCKED;
|
||||
};
|
||||
|
||||
to:
|
||||
|
||||
struct foo bar {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(bar.lock);
|
||||
};
|
||||
|
||||
Declaration of static rw_locks undergo a similar transformation.
|
||||
|
||||
Dynamic initialization, when necessary, may be performed as
|
||||
demonstrated below.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 25
|
||||
EXTRAVERSION = -rc8
|
||||
EXTRAVERSION = -rc9
|
||||
NAME = Funky Weasel is Jiggy wit it
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -316,8 +316,14 @@ __trap_fixup_kernel_data_tlb_miss:
|
||||
.section .trap.vector
|
||||
.org TBR_TT_TRAP0 >> 2
|
||||
.long system_call
|
||||
.rept 126
|
||||
.rept 119
|
||||
.long __entry_unsupported_trap
|
||||
.endr
|
||||
|
||||
# userspace atomic op emulation, traps 120-126
|
||||
.rept 7
|
||||
.long __entry_atomic_op
|
||||
.endr
|
||||
|
||||
.org TBR_TT_BREAK >> 2
|
||||
.long __entry_debug_exception
|
||||
|
||||
@@ -654,6 +654,26 @@ __entry_debug_exception:
|
||||
movgs gr4,psr
|
||||
jmpl @(gr5,gr0) ; call ill_insn(esfr1,epcr0,esr0)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# handle atomic operation emulation for userspace
|
||||
#
|
||||
###############################################################################
|
||||
.globl __entry_atomic_op
|
||||
__entry_atomic_op:
|
||||
LEDS 0x6012
|
||||
sethi.p %hi(atomic_operation),gr5
|
||||
setlo %lo(atomic_operation),gr5
|
||||
movsg esfr1,gr8
|
||||
movsg epcr0,gr9
|
||||
movsg esr0,gr10
|
||||
|
||||
# now that we've accessed the exception regs, we can enable exceptions
|
||||
movsg psr,gr4
|
||||
ori gr4,#PSR_ET,gr4
|
||||
movgs gr4,psr
|
||||
jmpl @(gr5,gr0) ; call atomic_operation(esfr1,epcr0,esr0)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# handle media exception
|
||||
|
||||
@@ -46,5 +46,5 @@
|
||||
#ifdef CONFIG_MMU
|
||||
__sdram_base = 0x00000000 /* base address to which SDRAM relocated */
|
||||
#else
|
||||
__sdram_base = 0xc0000000 /* base address to which SDRAM relocated */
|
||||
__sdram_base = __page_offset /* base address to which SDRAM relocated */
|
||||
#endif
|
||||
|
||||
@@ -102,13 +102,6 @@ __switch_to:
|
||||
movgs gr14,lr
|
||||
bar
|
||||
|
||||
srli gr15,#28,gr5
|
||||
subicc gr5,#0xc,gr0,icc0
|
||||
beq icc0,#0,111f
|
||||
break
|
||||
nop
|
||||
111:
|
||||
|
||||
# jump to __switch_back or ret_from_fork as appropriate
|
||||
# - move prev to GR8
|
||||
movgs gr4,psr
|
||||
|
||||
+228
-1
@@ -73,7 +73,7 @@ asmlinkage void illegal_instruction(unsigned long esfr1, unsigned long epcr0, un
|
||||
epcr0, esr0, esfr1);
|
||||
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) ((epcr0 & EPCR0_PC) ? (epcr0 & EPCR0_PC) : __frame->pc);
|
||||
info.si_addr = (void *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
|
||||
|
||||
switch (__frame->tbr & TBR_TT) {
|
||||
case TBR_TT_ILLEGAL_INSTR:
|
||||
@@ -100,6 +100,233 @@ asmlinkage void illegal_instruction(unsigned long esfr1, unsigned long epcr0, un
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
} /* end illegal_instruction() */
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
* handle atomic operations with errors
|
||||
* - arguments in gr8, gr9, gr10
|
||||
* - original memory value placed in gr5
|
||||
* - replacement memory value placed in gr9
|
||||
*/
|
||||
asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
||||
unsigned long esr0)
|
||||
{
|
||||
static DEFINE_SPINLOCK(atomic_op_lock);
|
||||
unsigned long x, y, z, *p;
|
||||
mm_segment_t oldfs;
|
||||
siginfo_t info;
|
||||
int ret;
|
||||
|
||||
y = 0;
|
||||
z = 0;
|
||||
|
||||
oldfs = get_fs();
|
||||
if (!user_mode(__frame))
|
||||
set_fs(KERNEL_DS);
|
||||
|
||||
switch (__frame->tbr & TBR_TT) {
|
||||
/* TIRA gr0,#120
|
||||
* u32 __atomic_user_cmpxchg32(u32 *ptr, u32 test, u32 new)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_CMPXCHG32:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
y = __frame->gr10;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
if (z != x)
|
||||
goto done;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
if (z != x)
|
||||
goto done2;
|
||||
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#121
|
||||
* u32 __atomic_kernel_xchg32(void *v, u32 new)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_XCHG32:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
y = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#122
|
||||
* ulong __atomic_kernel_XOR_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_XOR:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = x ^ z;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#123
|
||||
* ulong __atomic_kernel_OR_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_OR:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = x ^ z;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#124
|
||||
* ulong __atomic_kernel_AND_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_AND:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = x & z;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#125
|
||||
* int __atomic_user_sub_return(atomic_t *v, int i)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_SUB:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = z - x;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#126
|
||||
* int __atomic_user_add_return(atomic_t *v, int i)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_ADD:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = z + x;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
done2:
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
done:
|
||||
if (!user_mode(__frame))
|
||||
set_fs(oldfs);
|
||||
__frame->gr5 = z;
|
||||
__frame->gr9 = y;
|
||||
return;
|
||||
|
||||
error2:
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
error:
|
||||
if (!user_mode(__frame))
|
||||
set_fs(oldfs);
|
||||
__frame->pc -= 4;
|
||||
|
||||
die_if_kernel("-- Atomic Op Error --\n");
|
||||
|
||||
info.si_signo = SIGSEGV;
|
||||
info.si_code = SEGV_ACCERR;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) __frame->pc;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
*
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
# Copyright (C) 1994 by Hamish Macdonald
|
||||
#
|
||||
|
||||
KBUILD_DEFCONFIG := amiga_defconfig
|
||||
|
||||
# override top level makefile
|
||||
AS += -m68020
|
||||
LDFLAGS := -m m68kelf
|
||||
|
||||
+576
-435
File diff suppressed because it is too large
Load Diff
+530
-361
File diff suppressed because it is too large
Load Diff
+565
-408
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+540
-363
File diff suppressed because it is too large
Load Diff
+566
-434
File diff suppressed because it is too large
Load Diff
+496
-382
File diff suppressed because it is too large
Load Diff
+498
-381
File diff suppressed because it is too large
Load Diff
+576
-425
File diff suppressed because it is too large
Load Diff
+514
-370
File diff suppressed because it is too large
Load Diff
+515
-371
File diff suppressed because it is too large
Load Diff
@@ -1,657 +0,0 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc6-m68k
|
||||
# Tue Jun 7 20:34:17 2005
|
||||
#
|
||||
CONFIG_M68K=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
# CONFIG_MODULES is not set
|
||||
|
||||
#
|
||||
# Platform dependent setup
|
||||
#
|
||||
# CONFIG_SUN3 is not set
|
||||
CONFIG_AMIGA=y
|
||||
# CONFIG_ATARI is not set
|
||||
# CONFIG_MAC is not set
|
||||
# CONFIG_APOLLO is not set
|
||||
# CONFIG_VME is not set
|
||||
# CONFIG_HP300 is not set
|
||||
# CONFIG_SUN3X is not set
|
||||
# CONFIG_Q40 is not set
|
||||
|
||||
#
|
||||
# Processor type
|
||||
#
|
||||
CONFIG_M68020=y
|
||||
CONFIG_M68030=y
|
||||
CONFIG_M68040=y
|
||||
# CONFIG_M68060 is not set
|
||||
CONFIG_MMU_MOTOROLA=y
|
||||
# CONFIG_M68KFPU_EMU is not set
|
||||
# CONFIG_ADVANCED is not set
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_AOUT=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_ZORRO=y
|
||||
# CONFIG_AMIGA_PCMCIA is not set
|
||||
# CONFIG_HEARTBEAT is not set
|
||||
CONFIG_PROC_HARDWARE=y
|
||||
# CONFIG_ZORRO_NAMES is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
CONFIG_AMIGA_FLOPPY=y
|
||||
# CONFIG_AMIGA_Z2RAM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CDROM_PKTCDVD=y
|
||||
CONFIG_CDROM_PKTCDVD_BUFFERS=8
|
||||
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
# CONFIG_BLK_DEV_SR_VENDOR is not set
|
||||
# CONFIG_CHR_DEV_SG is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transport Attributes
|
||||
#
|
||||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
CONFIG_A3000_SCSI=y
|
||||
CONFIG_A2091_SCSI=y
|
||||
CONFIG_GVP11_SCSI=y
|
||||
# CONFIG_CYBERSTORM_SCSI is not set
|
||||
# CONFIG_CYBERSTORMII_SCSI is not set
|
||||
# CONFIG_BLZ2060_SCSI is not set
|
||||
# CONFIG_BLZ1230_SCSI is not set
|
||||
# CONFIG_FASTLANE_SCSI is not set
|
||||
# CONFIG_OKTAGON_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Networking support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
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_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# 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_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 is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_AMIGA is not set
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_AMIGA is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
# CONFIG_A2232 is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FB=y
|
||||
# CONFIG_FB_CFB_FILLRECT is not set
|
||||
# CONFIG_FB_CFB_COPYAREA is not set
|
||||
# CONFIG_FB_CFB_IMAGEBLIT is not set
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
# CONFIG_FB_CIRRUS is not set
|
||||
CONFIG_FB_AMIGA=y
|
||||
CONFIG_FB_AMIGA_OCS=y
|
||||
CONFIG_FB_AMIGA_ECS=y
|
||||
CONFIG_FB_AMIGA_AGA=y
|
||||
# CONFIG_FB_FM2 is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
# CONFIG_LOGO is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_AMIGA_BUILTIN_SERIAL=y
|
||||
# CONFIG_MULTIFACE_III_TTY is not set
|
||||
# CONFIG_GVPIOEXT is not set
|
||||
# CONFIG_SERIAL_CONSOLE is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
CONFIG_MINIX_FS=y
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
# CONFIG_VFAT_FS is not set
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
# CONFIG_TMPFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_NFS_V3 is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_AMIGA_PARTITION=y
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
# CONFIG_NLS_ISO8859_1 is not set
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
@@ -139,7 +139,6 @@
|
||||
#include <asm/system.h>
|
||||
#include <asm/gdb-stub.h>
|
||||
#include <asm/inst.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
/*
|
||||
* external low-level support routines
|
||||
@@ -656,6 +655,7 @@ void set_async_breakpoint(unsigned long *epc)
|
||||
*epc = (unsigned long)async_breakpoint;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void kgdb_wait(void *arg)
|
||||
{
|
||||
unsigned flags;
|
||||
@@ -668,6 +668,7 @@ static void kgdb_wait(void *arg)
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* GDB stub needs to call kgdb_wait on all processor with interrupts
|
||||
|
||||
@@ -361,6 +361,16 @@ static inline int has_valid_asid(const struct mm_struct *mm)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void r4k__flush_cache_vmap(void)
|
||||
{
|
||||
r4k_blast_dcache();
|
||||
}
|
||||
|
||||
static void r4k__flush_cache_vunmap(void)
|
||||
{
|
||||
r4k_blast_dcache();
|
||||
}
|
||||
|
||||
static inline void local_r4k_flush_cache_range(void * args)
|
||||
{
|
||||
struct vm_area_struct *vma = args;
|
||||
@@ -1281,6 +1291,10 @@ void __cpuinit r4k_cache_init(void)
|
||||
PAGE_SIZE - 1);
|
||||
else
|
||||
shm_align_mask = PAGE_SIZE-1;
|
||||
|
||||
__flush_cache_vmap = r4k__flush_cache_vmap;
|
||||
__flush_cache_vunmap = r4k__flush_cache_vunmap;
|
||||
|
||||
flush_cache_all = cache_noop;
|
||||
__flush_cache_all = r4k___flush_cache_all;
|
||||
flush_cache_mm = r4k_flush_cache_mm;
|
||||
|
||||
@@ -122,6 +122,16 @@ static inline void tx39_blast_icache(void)
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static void tx39__flush_cache_vmap(void)
|
||||
{
|
||||
tx39_blast_dcache();
|
||||
}
|
||||
|
||||
static void tx39__flush_cache_vunmap(void)
|
||||
{
|
||||
tx39_blast_dcache();
|
||||
}
|
||||
|
||||
static inline void tx39_flush_cache_all(void)
|
||||
{
|
||||
if (!cpu_has_dc_aliases)
|
||||
@@ -344,6 +354,8 @@ void __cpuinit tx39_cache_init(void)
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_TX3912:
|
||||
/* TX39/H core (writethru direct-map cache) */
|
||||
__flush_cache_vmap = tx39__flush_cache_vmap;
|
||||
__flush_cache_vunmap = tx39__flush_cache_vunmap;
|
||||
flush_cache_all = tx39h_flush_icache_all;
|
||||
__flush_cache_all = tx39h_flush_icache_all;
|
||||
flush_cache_mm = (void *) tx39h_flush_icache_all;
|
||||
@@ -369,6 +381,9 @@ void __cpuinit tx39_cache_init(void)
|
||||
write_c0_wired(0); /* set 8 on reset... */
|
||||
/* board-dependent init code may set WBON */
|
||||
|
||||
__flush_cache_vmap = tx39__flush_cache_vmap;
|
||||
__flush_cache_vunmap = tx39__flush_cache_vunmap;
|
||||
|
||||
flush_cache_all = tx39_flush_cache_all;
|
||||
__flush_cache_all = tx39___flush_cache_all;
|
||||
flush_cache_mm = tx39_flush_cache_mm;
|
||||
|
||||
@@ -30,6 +30,9 @@ void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page,
|
||||
unsigned long pfn);
|
||||
void (*flush_icache_range)(unsigned long start, unsigned long end);
|
||||
|
||||
void (*__flush_cache_vmap)(void);
|
||||
void (*__flush_cache_vunmap)(void);
|
||||
|
||||
/* MIPS specific cache operations */
|
||||
void (*flush_cache_sigtramp)(unsigned long addr);
|
||||
void (*local_flush_data_cache_page)(void * addr);
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
.text
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
.global startup
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
* Modification for compressed loader:
|
||||
* Copyright (C) 2002 Stuart Menefy (stuart.menefy@st.com)
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/cpu/mmu_context.h>
|
||||
#include <asm/cpu/registers.h>
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/fpu.h>
|
||||
|
||||
struct task_struct *last_task_used_math = NULL;
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <asm/system.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/fpu.h>
|
||||
|
||||
/* This mask defines the bits of the SR which the user is not allowed to
|
||||
change, which are everything except S, Q, M, PR, SZ, FR. */
|
||||
|
||||
@@ -149,3 +149,4 @@ EXPORT_SYMBOL(clear_page);
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
EXPORT_SYMBOL(__clear_user);
|
||||
EXPORT_SYMBOL(_ebss);
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
|
||||
@@ -44,6 +44,7 @@ EXPORT_SYMBOL(__put_user_asm_l);
|
||||
EXPORT_SYMBOL(__get_user_asm_l);
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
EXPORT_SYMBOL(__copy_user);
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(__udelay);
|
||||
EXPORT_SYMBOL(__ndelay);
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/fpu.h>
|
||||
|
||||
#define REG_RET 9
|
||||
#define REG_ARG1 2
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/limits.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/fpu.h>
|
||||
|
||||
#ifdef CONFIG_SH_KGDB
|
||||
#include <asm/kgdb.h>
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/fpu.h>
|
||||
|
||||
#undef DEBUG_EXCEPTION
|
||||
#ifdef DEBUG_EXCEPTION
|
||||
|
||||
@@ -325,7 +325,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
const struct user_regset_view *view;
|
||||
int ret;
|
||||
|
||||
view = task_user_regset_view(child);
|
||||
view = task_user_regset_view(current);
|
||||
|
||||
switch(request) {
|
||||
case PTRACE_GETREGS: {
|
||||
|
||||
+171
-31
@@ -114,6 +114,85 @@ void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static int get_from_target(struct task_struct *target, unsigned long uaddr,
|
||||
void *kbuf, int len)
|
||||
{
|
||||
if (target == current) {
|
||||
if (copy_from_user(kbuf, (void __user *) uaddr, len))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
int len2 = access_process_vm(target, uaddr, kbuf, len, 0);
|
||||
if (len2 != len)
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_to_target(struct task_struct *target, unsigned long uaddr,
|
||||
void *kbuf, int len)
|
||||
{
|
||||
if (target == current) {
|
||||
if (copy_to_user((void __user *) uaddr, kbuf, len))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
int len2 = access_process_vm(target, uaddr, kbuf, len, 1);
|
||||
if (len2 != len)
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int regwindow64_get(struct task_struct *target,
|
||||
const struct pt_regs *regs,
|
||||
struct reg_window *wbuf)
|
||||
{
|
||||
unsigned long rw_addr = regs->u_regs[UREG_I6];
|
||||
|
||||
if (test_tsk_thread_flag(current, TIF_32BIT)) {
|
||||
struct reg_window32 win32;
|
||||
int i;
|
||||
|
||||
if (get_from_target(target, rw_addr, &win32, sizeof(win32)))
|
||||
return -EFAULT;
|
||||
for (i = 0; i < 8; i++)
|
||||
wbuf->locals[i] = win32.locals[i];
|
||||
for (i = 0; i < 8; i++)
|
||||
wbuf->ins[i] = win32.ins[i];
|
||||
} else {
|
||||
rw_addr += STACK_BIAS;
|
||||
if (get_from_target(target, rw_addr, wbuf, sizeof(*wbuf)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int regwindow64_set(struct task_struct *target,
|
||||
const struct pt_regs *regs,
|
||||
struct reg_window *wbuf)
|
||||
{
|
||||
unsigned long rw_addr = regs->u_regs[UREG_I6];
|
||||
|
||||
if (test_tsk_thread_flag(current, TIF_32BIT)) {
|
||||
struct reg_window32 win32;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
win32.locals[i] = wbuf->locals[i];
|
||||
for (i = 0; i < 8; i++)
|
||||
win32.ins[i] = wbuf->ins[i];
|
||||
|
||||
if (set_to_target(target, rw_addr, &win32, sizeof(win32)))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
rw_addr += STACK_BIAS;
|
||||
if (set_to_target(target, rw_addr, wbuf, sizeof(*wbuf)))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum sparc_regset {
|
||||
REGSET_GENERAL,
|
||||
REGSET_FP,
|
||||
@@ -133,16 +212,13 @@ static int genregs64_get(struct task_struct *target,
|
||||
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
regs->u_regs,
|
||||
0, 16 * sizeof(u64));
|
||||
if (!ret) {
|
||||
unsigned long __user *reg_window = (unsigned long __user *)
|
||||
(regs->u_regs[UREG_I6] + STACK_BIAS);
|
||||
unsigned long window[16];
|
||||
if (!ret && count && pos < (32 * sizeof(u64))) {
|
||||
struct reg_window window;
|
||||
|
||||
if (copy_from_user(window, reg_window, sizeof(window)))
|
||||
if (regwindow64_get(target, regs, &window))
|
||||
return -EFAULT;
|
||||
|
||||
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
|
||||
window,
|
||||
&window,
|
||||
16 * sizeof(u64),
|
||||
32 * sizeof(u64));
|
||||
}
|
||||
@@ -164,10 +240,11 @@ static int genregs64_get(struct task_struct *target,
|
||||
36 * sizeof(u64));
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
|
||||
36 * sizeof(u64), -1);
|
||||
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -185,20 +262,19 @@ static int genregs64_set(struct task_struct *target,
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
regs->u_regs,
|
||||
0, 16 * sizeof(u64));
|
||||
if (!ret && count > 0) {
|
||||
unsigned long __user *reg_window = (unsigned long __user *)
|
||||
(regs->u_regs[UREG_I6] + STACK_BIAS);
|
||||
unsigned long window[16];
|
||||
if (!ret && count && pos < (32 * sizeof(u64))) {
|
||||
struct reg_window window;
|
||||
|
||||
if (copy_from_user(window, reg_window, sizeof(window)))
|
||||
if (regwindow64_get(target, regs, &window))
|
||||
return -EFAULT;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
window,
|
||||
&window,
|
||||
16 * sizeof(u64),
|
||||
32 * sizeof(u64));
|
||||
|
||||
if (!ret &&
|
||||
copy_to_user(reg_window, window, sizeof(window)))
|
||||
regwindow64_set(target, regs, &window))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -412,9 +488,22 @@ static int genregs32_get(struct task_struct *target,
|
||||
*k++ = regs->u_regs[pos++];
|
||||
|
||||
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (get_user(*k++, ®_window[pos++]))
|
||||
return -EFAULT;
|
||||
if (target == current) {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (get_user(*k++, ®_window[pos++]))
|
||||
return -EFAULT;
|
||||
}
|
||||
} else {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (access_process_vm(target,
|
||||
(unsigned long)
|
||||
®_window[pos],
|
||||
k, sizeof(*k), 0)
|
||||
!= sizeof(*k))
|
||||
return -EFAULT;
|
||||
k++;
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (; count > 0 && pos < 16; count--) {
|
||||
@@ -423,10 +512,28 @@ static int genregs32_get(struct task_struct *target,
|
||||
}
|
||||
|
||||
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (get_user(reg, ®_window[pos++]) ||
|
||||
put_user(reg, u++))
|
||||
return -EFAULT;
|
||||
if (target == current) {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (get_user(reg, ®_window[pos++]) ||
|
||||
put_user(reg, u++))
|
||||
return -EFAULT;
|
||||
}
|
||||
} else {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (access_process_vm(target,
|
||||
(unsigned long)
|
||||
®_window[pos],
|
||||
®, sizeof(reg), 0)
|
||||
!= sizeof(reg))
|
||||
return -EFAULT;
|
||||
if (access_process_vm(target,
|
||||
(unsigned long) u,
|
||||
®, sizeof(reg), 1)
|
||||
!= sizeof(reg))
|
||||
return -EFAULT;
|
||||
pos++;
|
||||
u++;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (count > 0) {
|
||||
@@ -488,9 +595,23 @@ static int genregs32_set(struct task_struct *target,
|
||||
regs->u_regs[pos++] = *k++;
|
||||
|
||||
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (put_user(*k++, ®_window[pos++]))
|
||||
return -EFAULT;
|
||||
if (target == current) {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (put_user(*k++, ®_window[pos++]))
|
||||
return -EFAULT;
|
||||
}
|
||||
} else {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (access_process_vm(target,
|
||||
(unsigned long)
|
||||
®_window[pos],
|
||||
(void *) k,
|
||||
sizeof(*k), 1)
|
||||
!= sizeof(*k))
|
||||
return -EFAULT;
|
||||
k++;
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (; count > 0 && pos < 16; count--) {
|
||||
@@ -500,10 +621,29 @@ static int genregs32_set(struct task_struct *target,
|
||||
}
|
||||
|
||||
reg_window = (compat_ulong_t __user *) regs->u_regs[UREG_I6];
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (get_user(reg, u++) ||
|
||||
put_user(reg, ®_window[pos++]))
|
||||
return -EFAULT;
|
||||
if (target == current) {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (get_user(reg, u++) ||
|
||||
put_user(reg, ®_window[pos++]))
|
||||
return -EFAULT;
|
||||
}
|
||||
} else {
|
||||
for (; count > 0 && pos < 32; count--) {
|
||||
if (access_process_vm(target,
|
||||
(unsigned long)
|
||||
u,
|
||||
®, sizeof(reg), 0)
|
||||
!= sizeof(reg))
|
||||
return -EFAULT;
|
||||
if (access_process_vm(target,
|
||||
(unsigned long)
|
||||
®_window[pos],
|
||||
®, sizeof(reg), 1)
|
||||
!= sizeof(reg))
|
||||
return -EFAULT;
|
||||
pos++;
|
||||
u++;
|
||||
}
|
||||
}
|
||||
}
|
||||
while (count > 0) {
|
||||
@@ -711,7 +851,7 @@ struct compat_fps {
|
||||
long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
||||
compat_ulong_t caddr, compat_ulong_t cdata)
|
||||
{
|
||||
const struct user_regset_view *view = task_user_regset_view(child);
|
||||
const struct user_regset_view *view = task_user_regset_view(current);
|
||||
compat_ulong_t caddr2 = task_pt_regs(current)->u_regs[UREG_I4];
|
||||
struct pt_regs32 __user *pregs;
|
||||
struct compat_fps __user *fps;
|
||||
@@ -819,7 +959,7 @@ struct fps {
|
||||
|
||||
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||
{
|
||||
const struct user_regset_view *view = task_user_regset_view(child);
|
||||
const struct user_regset_view *view = task_user_regset_view(current);
|
||||
unsigned long addr2 = task_pt_regs(current)->u_regs[UREG_I4];
|
||||
struct pt_regs __user *pregs;
|
||||
struct fps __user *fps;
|
||||
|
||||
@@ -357,7 +357,7 @@ static int invalid_frame_pointer(void __user *fp, int fplen)
|
||||
static inline int
|
||||
save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
|
||||
{
|
||||
unsigned long *fpregs = (unsigned long *)(regs+1);
|
||||
unsigned long *fpregs = current_thread_info()->fpregs;
|
||||
unsigned long fprs;
|
||||
int err = 0;
|
||||
|
||||
|
||||
@@ -65,7 +65,8 @@ __setup("noreplace-paravirt", setup_noreplace_paravirt);
|
||||
get them easily into strings. */
|
||||
asm("\t.section .rodata, \"a\"\nintelnops: "
|
||||
GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6
|
||||
GENERIC_NOP7 GENERIC_NOP8);
|
||||
GENERIC_NOP7 GENERIC_NOP8
|
||||
"\t.previous");
|
||||
extern const unsigned char intelnops[];
|
||||
static const unsigned char *const intel_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
@@ -83,7 +84,8 @@ static const unsigned char *const intel_nops[ASM_NOP_MAX+1] = {
|
||||
#ifdef K8_NOP1
|
||||
asm("\t.section .rodata, \"a\"\nk8nops: "
|
||||
K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6
|
||||
K8_NOP7 K8_NOP8);
|
||||
K8_NOP7 K8_NOP8
|
||||
"\t.previous");
|
||||
extern const unsigned char k8nops[];
|
||||
static const unsigned char *const k8_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
@@ -101,7 +103,8 @@ static const unsigned char *const k8_nops[ASM_NOP_MAX+1] = {
|
||||
#ifdef K7_NOP1
|
||||
asm("\t.section .rodata, \"a\"\nk7nops: "
|
||||
K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6
|
||||
K7_NOP7 K7_NOP8);
|
||||
K7_NOP7 K7_NOP8
|
||||
"\t.previous");
|
||||
extern const unsigned char k7nops[];
|
||||
static const unsigned char *const k7_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
@@ -119,7 +122,8 @@ static const unsigned char *const k7_nops[ASM_NOP_MAX+1] = {
|
||||
#ifdef P6_NOP1
|
||||
asm("\t.section .rodata, \"a\"\np6nops: "
|
||||
P6_NOP1 P6_NOP2 P6_NOP3 P6_NOP4 P6_NOP5 P6_NOP6
|
||||
P6_NOP7 P6_NOP8);
|
||||
P6_NOP7 P6_NOP8
|
||||
"\t.previous");
|
||||
extern const unsigned char p6nops[];
|
||||
static const unsigned char *const p6_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
|
||||
@@ -142,14 +142,6 @@ static void __init check_config(void)
|
||||
panic("Kernel requires i486+ for 'invlpg' and other features");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we configured ourselves for a TSC, we'd better have one!
|
||||
*/
|
||||
#ifdef CONFIG_X86_TSC
|
||||
if (!cpu_has_tsc)
|
||||
panic("Kernel compiled for Pentium+, requires TSC feature!");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we were told we had a good local APIC, check for buggy Pentia,
|
||||
* i.e. all B steppings and the C2 stepping of P54C when using their
|
||||
|
||||
@@ -652,9 +652,6 @@ static void probe_nmi_watchdog(void)
|
||||
wd_ops = &p6_wd_ops;
|
||||
break;
|
||||
case 15:
|
||||
if (boot_cpu_data.x86_model > 0x4)
|
||||
return;
|
||||
|
||||
wd_ops = &p4_wd_ops;
|
||||
break;
|
||||
default:
|
||||
@@ -670,8 +667,10 @@ int lapic_watchdog_init(unsigned nmi_hz)
|
||||
{
|
||||
if (!wd_ops) {
|
||||
probe_nmi_watchdog();
|
||||
if (!wd_ops)
|
||||
if (!wd_ops) {
|
||||
printk(KERN_INFO "NMI watchdog: CPU not supported\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!wd_ops->reserve()) {
|
||||
printk(KERN_ERR
|
||||
|
||||
@@ -133,13 +133,16 @@ static void hpet_reserve_platform_timers(unsigned long id)
|
||||
#ifdef CONFIG_HPET_EMULATE_RTC
|
||||
hpet_reserve_timer(&hd, 1);
|
||||
#endif
|
||||
|
||||
hd.hd_irq[0] = HPET_LEGACY_8254;
|
||||
hd.hd_irq[1] = HPET_LEGACY_RTC;
|
||||
|
||||
for (i = 2; i < nrtimers; timer++, i++)
|
||||
hd.hd_irq[i] = (timer->hpet_config & Tn_INT_ROUTE_CNF_MASK) >>
|
||||
Tn_INT_ROUTE_CNF_SHIFT;
|
||||
for (i = 2; i < nrtimers; timer++, i++)
|
||||
hd.hd_irq[i] = (timer->hpet_config & Tn_INT_ROUTE_CNF_MASK) >>
|
||||
Tn_INT_ROUTE_CNF_SHIFT;
|
||||
|
||||
hpet_alloc(&hd);
|
||||
|
||||
}
|
||||
#else
|
||||
static void hpet_reserve_platform_timers(unsigned long id) { }
|
||||
|
||||
@@ -615,8 +615,8 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
|
||||
|
||||
nommu:
|
||||
/* Should not happen anymore */
|
||||
printk(KERN_ERR "PCI-DMA: More than 4GB of RAM and no IOMMU\n"
|
||||
KERN_ERR "PCI-DMA: 32bit PCI IO may malfunction.\n");
|
||||
printk(KERN_WARNING "PCI-DMA: More than 4GB of RAM and no IOMMU\n"
|
||||
KERN_WARNING "falling back to iommu=soft.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -692,9 +692,9 @@ void __init gart_iommu_init(void)
|
||||
!gart_iommu_aperture ||
|
||||
(no_agp && init_k8_gatt(&info) < 0)) {
|
||||
if (end_pfn > MAX_DMA32_PFN) {
|
||||
printk(KERN_ERR "WARNING more than 4GB of memory "
|
||||
"but GART IOMMU not available.\n"
|
||||
KERN_ERR "WARNING 32bit PCI may malfunction.\n");
|
||||
printk(KERN_WARNING "More than 4GB of memory "
|
||||
"but GART IOMMU not available.\n"
|
||||
KERN_WARNING "falling back to iommu=soft.\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -82,7 +82,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
|
||||
*/
|
||||
void (*pm_idle)(void);
|
||||
EXPORT_SYMBOL(pm_idle);
|
||||
static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
|
||||
|
||||
void disable_hlt(void)
|
||||
{
|
||||
@@ -190,9 +189,6 @@ void cpu_idle(void)
|
||||
while (!need_resched()) {
|
||||
void (*idle)(void);
|
||||
|
||||
if (__get_cpu_var(cpu_idle_state))
|
||||
__get_cpu_var(cpu_idle_state) = 0;
|
||||
|
||||
check_pgt_cache();
|
||||
rmb();
|
||||
idle = pm_idle;
|
||||
@@ -220,40 +216,19 @@ static void do_nothing(void *unused)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* cpu_idle_wait - Used to ensure that all the CPUs discard old value of
|
||||
* pm_idle and update to new pm_idle value. Required while changing pm_idle
|
||||
* handler on SMP systems.
|
||||
*
|
||||
* Caller must have changed pm_idle to the new value before the call. Old
|
||||
* pm_idle value will not be used by any CPU after the return of this function.
|
||||
*/
|
||||
void cpu_idle_wait(void)
|
||||
{
|
||||
unsigned int cpu, this_cpu = get_cpu();
|
||||
cpumask_t map, tmp = current->cpus_allowed;
|
||||
|
||||
set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
|
||||
put_cpu();
|
||||
|
||||
cpus_clear(map);
|
||||
for_each_online_cpu(cpu) {
|
||||
per_cpu(cpu_idle_state, cpu) = 1;
|
||||
cpu_set(cpu, map);
|
||||
}
|
||||
|
||||
__get_cpu_var(cpu_idle_state) = 0;
|
||||
|
||||
wmb();
|
||||
do {
|
||||
ssleep(1);
|
||||
for_each_online_cpu(cpu) {
|
||||
if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu))
|
||||
cpu_clear(cpu, map);
|
||||
}
|
||||
cpus_and(map, map, cpu_online_map);
|
||||
/*
|
||||
* We waited 1 sec, if a CPU still did not call idle
|
||||
* it may be because it is in idle and not waking up
|
||||
* because it has nothing to do.
|
||||
* Give all the remaining CPUS a kick.
|
||||
*/
|
||||
smp_call_function_mask(map, do_nothing, NULL, 0);
|
||||
} while (!cpus_empty(map));
|
||||
|
||||
set_cpus_allowed(current, tmp);
|
||||
smp_mb();
|
||||
/* kick all the CPUs so that they exit out of pm_idle */
|
||||
smp_call_function(do_nothing, NULL, 0, 1);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpu_idle_wait);
|
||||
|
||||
|
||||
@@ -63,7 +63,6 @@ EXPORT_SYMBOL(boot_option_idle_override);
|
||||
*/
|
||||
void (*pm_idle)(void);
|
||||
EXPORT_SYMBOL(pm_idle);
|
||||
static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
|
||||
|
||||
static ATOMIC_NOTIFIER_HEAD(idle_notifier);
|
||||
|
||||
@@ -173,9 +172,6 @@ void cpu_idle(void)
|
||||
while (!need_resched()) {
|
||||
void (*idle)(void);
|
||||
|
||||
if (__get_cpu_var(cpu_idle_state))
|
||||
__get_cpu_var(cpu_idle_state) = 0;
|
||||
|
||||
rmb();
|
||||
idle = pm_idle;
|
||||
if (!idle)
|
||||
@@ -207,40 +203,19 @@ static void do_nothing(void *unused)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* cpu_idle_wait - Used to ensure that all the CPUs discard old value of
|
||||
* pm_idle and update to new pm_idle value. Required while changing pm_idle
|
||||
* handler on SMP systems.
|
||||
*
|
||||
* Caller must have changed pm_idle to the new value before the call. Old
|
||||
* pm_idle value will not be used by any CPU after the return of this function.
|
||||
*/
|
||||
void cpu_idle_wait(void)
|
||||
{
|
||||
unsigned int cpu, this_cpu = get_cpu();
|
||||
cpumask_t map, tmp = current->cpus_allowed;
|
||||
|
||||
set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
|
||||
put_cpu();
|
||||
|
||||
cpus_clear(map);
|
||||
for_each_online_cpu(cpu) {
|
||||
per_cpu(cpu_idle_state, cpu) = 1;
|
||||
cpu_set(cpu, map);
|
||||
}
|
||||
|
||||
__get_cpu_var(cpu_idle_state) = 0;
|
||||
|
||||
wmb();
|
||||
do {
|
||||
ssleep(1);
|
||||
for_each_online_cpu(cpu) {
|
||||
if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu))
|
||||
cpu_clear(cpu, map);
|
||||
}
|
||||
cpus_and(map, map, cpu_online_map);
|
||||
/*
|
||||
* We waited 1 sec, if a CPU still did not call idle
|
||||
* it may be because it is in idle and not waking up
|
||||
* because it has nothing to do.
|
||||
* Give all the remaining CPUS a kick.
|
||||
*/
|
||||
smp_call_function_mask(map, do_nothing, 0, 0);
|
||||
} while (!cpus_empty(map));
|
||||
|
||||
set_cpus_allowed(current, tmp);
|
||||
smp_mb();
|
||||
/* kick all the CPUs so that they exit out of pm_idle */
|
||||
smp_call_function(do_nothing, NULL, 0, 1);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpu_idle_wait);
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ int do_set_thread_area(struct task_struct *p, int idx,
|
||||
asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
|
||||
{
|
||||
int ret = do_set_thread_area(current, -1, u_info, 1);
|
||||
prevent_tail_call(ret);
|
||||
asmlinkage_protect(1, ret, u_info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ int do_get_thread_area(struct task_struct *p, int idx,
|
||||
asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
|
||||
{
|
||||
int ret = do_get_thread_area(current, -1, u_info);
|
||||
prevent_tail_call(ret);
|
||||
asmlinkage_protect(1, ret, u_info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -256,9 +256,7 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, void *data)
|
||||
ref_freq, freq->new);
|
||||
if (!(freq->flags & CPUFREQ_CONST_LOOPS)) {
|
||||
tsc_khz = cpu_khz;
|
||||
preempt_disable();
|
||||
set_cyc2ns_scale(cpu_khz, smp_processor_id());
|
||||
preempt_enable();
|
||||
set_cyc2ns_scale(cpu_khz, freq->cpu);
|
||||
/*
|
||||
* TSC based sched_clock turns
|
||||
* to junk w/ cpufreq
|
||||
|
||||
@@ -148,9 +148,7 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
||||
mark_tsc_unstable("cpufreq changes");
|
||||
}
|
||||
|
||||
preempt_disable();
|
||||
set_cyc2ns_scale(tsc_khz_ref, smp_processor_id());
|
||||
preempt_enable();
|
||||
set_cyc2ns_scale(tsc_khz_ref, freq->cpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -667,10 +667,10 @@ static void xen_release_pt_init(u32 pfn)
|
||||
make_lowmem_page_readwrite(__va(PFN_PHYS(pfn)));
|
||||
}
|
||||
|
||||
static void pin_pagetable_pfn(unsigned level, unsigned long pfn)
|
||||
static void pin_pagetable_pfn(unsigned cmd, unsigned long pfn)
|
||||
{
|
||||
struct mmuext_op op;
|
||||
op.cmd = level;
|
||||
op.cmd = cmd;
|
||||
op.arg1.mfn = pfn_to_mfn(pfn);
|
||||
if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF))
|
||||
BUG();
|
||||
@@ -687,7 +687,8 @@ static void xen_alloc_ptpage(struct mm_struct *mm, u32 pfn, unsigned level)
|
||||
|
||||
if (!PageHighMem(page)) {
|
||||
make_lowmem_page_readonly(__va(PFN_PHYS(pfn)));
|
||||
pin_pagetable_pfn(level, pfn);
|
||||
if (level == PT_PTE)
|
||||
pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE, pfn);
|
||||
} else
|
||||
/* make sure there are no stray mappings of
|
||||
this page */
|
||||
@@ -697,27 +698,39 @@ static void xen_alloc_ptpage(struct mm_struct *mm, u32 pfn, unsigned level)
|
||||
|
||||
static void xen_alloc_pt(struct mm_struct *mm, u32 pfn)
|
||||
{
|
||||
xen_alloc_ptpage(mm, pfn, MMUEXT_PIN_L1_TABLE);
|
||||
xen_alloc_ptpage(mm, pfn, PT_PTE);
|
||||
}
|
||||
|
||||
static void xen_alloc_pd(struct mm_struct *mm, u32 pfn)
|
||||
{
|
||||
xen_alloc_ptpage(mm, pfn, MMUEXT_PIN_L2_TABLE);
|
||||
xen_alloc_ptpage(mm, pfn, PT_PMD);
|
||||
}
|
||||
|
||||
/* This should never happen until we're OK to use struct page */
|
||||
static void xen_release_pt(u32 pfn)
|
||||
static void xen_release_ptpage(u32 pfn, unsigned level)
|
||||
{
|
||||
struct page *page = pfn_to_page(pfn);
|
||||
|
||||
if (PagePinned(page)) {
|
||||
if (!PageHighMem(page)) {
|
||||
pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, pfn);
|
||||
if (level == PT_PTE)
|
||||
pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, pfn);
|
||||
make_lowmem_page_readwrite(__va(PFN_PHYS(pfn)));
|
||||
}
|
||||
ClearPagePinned(page);
|
||||
}
|
||||
}
|
||||
|
||||
static void xen_release_pt(u32 pfn)
|
||||
{
|
||||
xen_release_ptpage(pfn, PT_PTE);
|
||||
}
|
||||
|
||||
static void xen_release_pd(u32 pfn)
|
||||
{
|
||||
xen_release_ptpage(pfn, PT_PMD);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HIGHPTE
|
||||
static void *xen_kmap_atomic_pte(struct page *page, enum km_type type)
|
||||
{
|
||||
@@ -838,7 +851,7 @@ static __init void xen_pagetable_setup_done(pgd_t *base)
|
||||
pv_mmu_ops.alloc_pt = xen_alloc_pt;
|
||||
pv_mmu_ops.alloc_pd = xen_alloc_pd;
|
||||
pv_mmu_ops.release_pt = xen_release_pt;
|
||||
pv_mmu_ops.release_pd = xen_release_pt;
|
||||
pv_mmu_ops.release_pd = xen_release_pd;
|
||||
pv_mmu_ops.set_pte = xen_set_pte;
|
||||
|
||||
setup_shared_info();
|
||||
|
||||
@@ -310,13 +310,6 @@ pgd_t xen_make_pgd(unsigned long pgd)
|
||||
}
|
||||
#endif /* CONFIG_X86_PAE */
|
||||
|
||||
enum pt_level {
|
||||
PT_PGD,
|
||||
PT_PUD,
|
||||
PT_PMD,
|
||||
PT_PTE
|
||||
};
|
||||
|
||||
/*
|
||||
(Yet another) pagetable walker. This one is intended for pinning a
|
||||
pagetable. This means that it walks a pagetable and calls the
|
||||
|
||||
@@ -3,6 +3,13 @@
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
enum pt_level {
|
||||
PT_PGD,
|
||||
PT_PUD,
|
||||
PT_PMD,
|
||||
PT_PTE
|
||||
};
|
||||
|
||||
/*
|
||||
* Page-directory addresses above 4GB do not fit into architectural %cr3.
|
||||
* When accessing %cr3, or equivalent field in vcpu_guest_context, guests
|
||||
|
||||
+6
-3
@@ -1214,6 +1214,8 @@ static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
|
||||
static void __cfq_exit_single_io_context(struct cfq_data *cfqd,
|
||||
struct cfq_io_context *cic)
|
||||
{
|
||||
struct io_context *ioc = cic->ioc;
|
||||
|
||||
list_del_init(&cic->queue_list);
|
||||
|
||||
/*
|
||||
@@ -1223,6 +1225,9 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd,
|
||||
cic->dead_key = (unsigned long) cic->key;
|
||||
cic->key = NULL;
|
||||
|
||||
if (ioc->ioc_data == cic)
|
||||
rcu_assign_pointer(ioc->ioc_data, NULL);
|
||||
|
||||
if (cic->cfqq[ASYNC]) {
|
||||
cfq_exit_cfqq(cfqd, cic->cfqq[ASYNC]);
|
||||
cic->cfqq[ASYNC] = NULL;
|
||||
@@ -1255,7 +1260,6 @@ static void cfq_exit_single_io_context(struct io_context *ioc,
|
||||
*/
|
||||
static void cfq_exit_io_context(struct io_context *ioc)
|
||||
{
|
||||
rcu_assign_pointer(ioc->ioc_data, NULL);
|
||||
call_for_each_cic(ioc, cfq_exit_single_io_context);
|
||||
}
|
||||
|
||||
@@ -1478,8 +1482,7 @@ cfq_drop_dead_cic(struct cfq_data *cfqd, struct io_context *ioc,
|
||||
|
||||
spin_lock_irqsave(&ioc->lock, flags);
|
||||
|
||||
if (ioc->ioc_data == cic)
|
||||
rcu_assign_pointer(ioc->ioc_data, NULL);
|
||||
BUG_ON(ioc->ioc_data == cic);
|
||||
|
||||
radix_tree_delete(&ioc->radix_root, (unsigned long) cfqd);
|
||||
hlist_del_rcu(&cic->cic_list);
|
||||
|
||||
@@ -822,7 +822,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type)
|
||||
}
|
||||
|
||||
processors[pr->id] = NULL;
|
||||
|
||||
processor_device_array[pr->id] = NULL;
|
||||
kfree(pr);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1125,7 +1125,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
|
||||
tz->trips.active[i].flags.valid; i++, trips++);
|
||||
tz->thermal_zone = thermal_zone_device_register("ACPI thermal zone",
|
||||
trips, tz, &acpi_thermal_zone_ops);
|
||||
if (!tz->thermal_zone)
|
||||
if (IS_ERR(tz->thermal_zone))
|
||||
return -ENODEV;
|
||||
|
||||
result = sysfs_create_link(&tz->device->dev.kobj,
|
||||
|
||||
@@ -713,7 +713,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
||||
|
||||
kfree(obj);
|
||||
|
||||
if (device->cap._BCL && device->cap._BCM && max_level > 0) {
|
||||
if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){
|
||||
int result;
|
||||
static int count = 0;
|
||||
char *name;
|
||||
|
||||
@@ -325,6 +325,44 @@ static void ata_force_horkage(struct ata_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* atapi_cmd_type - Determine ATAPI command type from SCSI opcode
|
||||
* @opcode: SCSI opcode
|
||||
*
|
||||
* Determine ATAPI command type from @opcode.
|
||||
*
|
||||
* LOCKING:
|
||||
* None.
|
||||
*
|
||||
* RETURNS:
|
||||
* ATAPI_{READ|WRITE|READ_CD|PASS_THRU|MISC}
|
||||
*/
|
||||
int atapi_cmd_type(u8 opcode)
|
||||
{
|
||||
switch (opcode) {
|
||||
case GPCMD_READ_10:
|
||||
case GPCMD_READ_12:
|
||||
return ATAPI_READ;
|
||||
|
||||
case GPCMD_WRITE_10:
|
||||
case GPCMD_WRITE_12:
|
||||
case GPCMD_WRITE_AND_VERIFY_10:
|
||||
return ATAPI_WRITE;
|
||||
|
||||
case GPCMD_READ_CD:
|
||||
case GPCMD_READ_CD_MSF:
|
||||
return ATAPI_READ_CD;
|
||||
|
||||
case ATA_16:
|
||||
case ATA_12:
|
||||
if (atapi_passthru16)
|
||||
return ATAPI_PASS_THRU;
|
||||
/* fall thru */
|
||||
default:
|
||||
return ATAPI_MISC;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
|
||||
* @tf: Taskfile to convert
|
||||
@@ -2660,7 +2698,7 @@ int ata_bus_probe(struct ata_port *ap)
|
||||
specific sequence bass-ackwards so that PDIAG- is released by
|
||||
the slave device */
|
||||
|
||||
ata_link_for_each_dev(dev, &ap->link) {
|
||||
ata_link_for_each_dev_reverse(dev, &ap->link) {
|
||||
if (tries[dev->devno])
|
||||
dev->class = classes[dev->devno];
|
||||
|
||||
@@ -7774,6 +7812,7 @@ EXPORT_SYMBOL_GPL(ata_tf_read);
|
||||
EXPORT_SYMBOL_GPL(ata_noop_dev_select);
|
||||
EXPORT_SYMBOL_GPL(ata_std_dev_select);
|
||||
EXPORT_SYMBOL_GPL(sata_print_link_status);
|
||||
EXPORT_SYMBOL_GPL(atapi_cmd_type);
|
||||
EXPORT_SYMBOL_GPL(ata_tf_to_fis);
|
||||
EXPORT_SYMBOL_GPL(ata_tf_from_fis);
|
||||
EXPORT_SYMBOL_GPL(ata_pack_xfermask);
|
||||
|
||||
@@ -36,6 +36,10 @@
|
||||
#define DRV_NAME "pata_ali"
|
||||
#define DRV_VERSION "0.7.5"
|
||||
|
||||
static int ali_atapi_dma = 0;
|
||||
module_param_named(atapi_dma, ali_atapi_dma, int, 0644);
|
||||
MODULE_PARM_DESC(atapi_dma, "Enable ATAPI DMA (0=disable, 1=enable)");
|
||||
|
||||
/*
|
||||
* Cable special cases
|
||||
*/
|
||||
@@ -269,6 +273,27 @@ static void ali_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ali_warn_atapi_dma - Warn about ATAPI DMA disablement
|
||||
* @adev: Device
|
||||
*
|
||||
* Whine about ATAPI DMA disablement if @adev is an ATAPI device.
|
||||
* Can be used as ->dev_config.
|
||||
*/
|
||||
|
||||
static void ali_warn_atapi_dma(struct ata_device *adev)
|
||||
{
|
||||
struct ata_eh_context *ehc = &adev->link->eh_context;
|
||||
int print_info = ehc->i.flags & ATA_EHI_PRINTINFO;
|
||||
|
||||
if (print_info && adev->class == ATA_DEV_ATAPI && !ali_atapi_dma) {
|
||||
ata_dev_printk(adev, KERN_WARNING,
|
||||
"WARNING: ATAPI DMA disabled for reliablity issues. It can be enabled\n");
|
||||
ata_dev_printk(adev, KERN_WARNING,
|
||||
"WARNING: via pata_ali.atapi_dma modparam or corresponding sysfs node.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ali_lock_sectors - Keep older devices to 255 sector mode
|
||||
* @adev: Device
|
||||
@@ -283,6 +308,7 @@ static void ali_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
static void ali_lock_sectors(struct ata_device *adev)
|
||||
{
|
||||
adev->max_sectors = 255;
|
||||
ali_warn_atapi_dma(adev);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -294,6 +320,18 @@ static void ali_lock_sectors(struct ata_device *adev)
|
||||
|
||||
static int ali_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||
{
|
||||
if (!ali_atapi_dma) {
|
||||
/* FIXME: pata_ali can't do ATAPI DMA reliably but the
|
||||
* IDE alim15x3 driver can. I tried lots of things
|
||||
* but couldn't find what the actual difference was.
|
||||
* If you got an idea, please write it to
|
||||
* linux-ide@vger.kernel.org and cc htejun@gmail.com.
|
||||
*
|
||||
* Disable ATAPI DMA for now.
|
||||
*/
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* If its not a media command, its not worth it */
|
||||
if (atapi_cmd_type(qc->cdb[0]) == ATAPI_MISC)
|
||||
return -EOPNOTSUPP;
|
||||
@@ -359,6 +397,7 @@ static struct ata_port_operations ali_20_port_ops = {
|
||||
|
||||
.tf_load = ata_tf_load,
|
||||
.tf_read = ata_tf_read,
|
||||
.check_atapi_dma = ali_check_atapi_dma,
|
||||
.check_status = ata_check_status,
|
||||
.exec_command = ata_exec_command,
|
||||
.dev_select = ata_std_dev_select,
|
||||
@@ -438,6 +477,7 @@ static struct ata_port_operations ali_c5_port_ops = {
|
||||
.check_status = ata_check_status,
|
||||
.exec_command = ata_exec_command,
|
||||
.dev_select = ata_std_dev_select,
|
||||
.dev_config = ali_warn_atapi_dma,
|
||||
|
||||
.freeze = ata_bmdma_freeze,
|
||||
.thaw = ata_bmdma_thaw,
|
||||
|
||||
@@ -270,7 +270,7 @@ static u8 sil680_init_chip(struct pci_dev *pdev, int *try_mmio)
|
||||
tmpbyte & 1, tmpbyte & 0x30);
|
||||
|
||||
*try_mmio = 0;
|
||||
#ifdef CONFIG_PPC
|
||||
#ifdef CONFIG_PPC_MERGE
|
||||
if (machine_is(cell))
|
||||
*try_mmio = (tmpbyte & 1) || pci_resource_start(pdev, 5);
|
||||
#endif
|
||||
|
||||
@@ -1256,7 +1256,6 @@ static int sata_fsl_probe(struct of_device *ofdev,
|
||||
void __iomem *ssr_base = NULL;
|
||||
void __iomem *csr_base = NULL;
|
||||
struct sata_fsl_host_priv *host_priv = NULL;
|
||||
struct resource *r;
|
||||
int irq;
|
||||
struct ata_host *host;
|
||||
|
||||
@@ -1266,8 +1265,6 @@ static int sata_fsl_probe(struct of_device *ofdev,
|
||||
dev_printk(KERN_INFO, &ofdev->dev,
|
||||
"Sata FSL Platform/CSB Driver init\n");
|
||||
|
||||
r = kmalloc(sizeof(struct resource), GFP_KERNEL);
|
||||
|
||||
hcr_base = of_iomap(ofdev->node, 0);
|
||||
if (!hcr_base)
|
||||
goto error_exit_with_cleanup;
|
||||
|
||||
@@ -531,8 +531,8 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en
|
||||
* */
|
||||
static const struct pci_device_id k2_sata_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw4 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw8 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw8 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw4 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 },
|
||||
{ PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 },
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
#include <scsi/sg.h>
|
||||
#include <scsi/scsi_ioctl.h>
|
||||
#include <linux/cdrom.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
#define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
|
||||
#define DRIVER_NAME "HP CISS Driver (v 3.6.14)"
|
||||
|
||||
+29
-9
@@ -8,6 +8,7 @@
|
||||
* and is not licensed separately. See file COPYING for details.
|
||||
*
|
||||
* TODO (sorted by decreasing priority)
|
||||
* -- Return sense now that rq allows it (we always auto-sense anyway).
|
||||
* -- set readonly flag for CDs, set removable flag for CF readers
|
||||
* -- do inquiry and verify we got a disk and not a tape (for LUN mismatch)
|
||||
* -- verify the 13 conditions and do bulk resets
|
||||
@@ -359,7 +360,8 @@ static void ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun,
|
||||
static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun,
|
||||
struct ub_scsi_cmd *cmd, struct ub_request *urq);
|
||||
static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
static void ub_end_rq(struct request *rq, unsigned int status);
|
||||
static void ub_end_rq(struct request *rq, unsigned int status,
|
||||
unsigned int cmd_len);
|
||||
static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun,
|
||||
struct ub_request *urq, struct ub_scsi_cmd *cmd);
|
||||
static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd);
|
||||
@@ -642,13 +644,13 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq)
|
||||
|
||||
if (atomic_read(&sc->poison)) {
|
||||
blkdev_dequeue_request(rq);
|
||||
ub_end_rq(rq, DID_NO_CONNECT << 16);
|
||||
ub_end_rq(rq, DID_NO_CONNECT << 16, blk_rq_bytes(rq));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (lun->changed && !blk_pc_request(rq)) {
|
||||
blkdev_dequeue_request(rq);
|
||||
ub_end_rq(rq, SAM_STAT_CHECK_CONDITION);
|
||||
ub_end_rq(rq, SAM_STAT_CHECK_CONDITION, blk_rq_bytes(rq));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -701,7 +703,7 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq)
|
||||
|
||||
drop:
|
||||
ub_put_cmd(lun, cmd);
|
||||
ub_end_rq(rq, DID_ERROR << 16);
|
||||
ub_end_rq(rq, DID_ERROR << 16, blk_rq_bytes(rq));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -770,6 +772,7 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
||||
struct ub_request *urq = cmd->back;
|
||||
struct request *rq;
|
||||
unsigned int scsi_status;
|
||||
unsigned int cmd_len;
|
||||
|
||||
rq = urq->rq;
|
||||
|
||||
@@ -779,8 +782,18 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
||||
rq->data_len = 0;
|
||||
else
|
||||
rq->data_len -= cmd->act_len;
|
||||
scsi_status = 0;
|
||||
} else {
|
||||
if (cmd->act_len != cmd->len) {
|
||||
if ((cmd->key == MEDIUM_ERROR ||
|
||||
cmd->key == UNIT_ATTENTION) &&
|
||||
ub_rw_cmd_retry(sc, lun, urq, cmd) == 0)
|
||||
return;
|
||||
scsi_status = SAM_STAT_CHECK_CONDITION;
|
||||
} else {
|
||||
scsi_status = 0;
|
||||
}
|
||||
}
|
||||
scsi_status = 0;
|
||||
} else {
|
||||
if (blk_pc_request(rq)) {
|
||||
/* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */
|
||||
@@ -801,14 +814,17 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
|
||||
|
||||
urq->rq = NULL;
|
||||
|
||||
cmd_len = cmd->len;
|
||||
ub_put_cmd(lun, cmd);
|
||||
ub_end_rq(rq, scsi_status);
|
||||
ub_end_rq(rq, scsi_status, cmd_len);
|
||||
blk_start_queue(lun->disk->queue);
|
||||
}
|
||||
|
||||
static void ub_end_rq(struct request *rq, unsigned int scsi_status)
|
||||
static void ub_end_rq(struct request *rq, unsigned int scsi_status,
|
||||
unsigned int cmd_len)
|
||||
{
|
||||
int error;
|
||||
long rqlen;
|
||||
|
||||
if (scsi_status == 0) {
|
||||
error = 0;
|
||||
@@ -816,8 +832,12 @@ static void ub_end_rq(struct request *rq, unsigned int scsi_status)
|
||||
error = -EIO;
|
||||
rq->errors = scsi_status;
|
||||
}
|
||||
if (__blk_end_request(rq, error, blk_rq_bytes(rq)))
|
||||
BUG();
|
||||
rqlen = blk_rq_bytes(rq); /* Oddly enough, this is the residue. */
|
||||
if (__blk_end_request(rq, error, cmd_len)) {
|
||||
printk(KERN_WARNING DRV_NAME
|
||||
": __blk_end_request blew, %s-cmd total %u rqlen %ld\n",
|
||||
blk_pc_request(rq)? "pc": "fs", cmd_len, rqlen);
|
||||
}
|
||||
}
|
||||
|
||||
static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun,
|
||||
|
||||
@@ -1092,8 +1092,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
|
||||
#define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a)
|
||||
#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
|
||||
#define IS_I945G(dev) ((dev)->pci_device == 0x2772)
|
||||
#define IS_I945GM(dev) ((dev)->pci_device == 0x27A2)
|
||||
|
||||
#define IS_I945GM(dev) ((dev)->pci_device == 0x27A2 ||\
|
||||
(dev)->pci_device == 0x27AE)
|
||||
#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \
|
||||
(dev)->pci_device == 0x2982 || \
|
||||
(dev)->pci_device == 0x2992 || \
|
||||
|
||||
+8
-45
@@ -731,14 +731,14 @@ static unsigned long hpet_calibrate(struct hpets *hpetp)
|
||||
|
||||
int hpet_alloc(struct hpet_data *hdp)
|
||||
{
|
||||
u64 cap, mcfg, hpet_config;
|
||||
u64 cap, mcfg;
|
||||
struct hpet_dev *devp;
|
||||
u32 i, ntimer, irq;
|
||||
u32 i, ntimer;
|
||||
struct hpets *hpetp;
|
||||
size_t siz;
|
||||
struct hpet __iomem *hpet;
|
||||
static struct hpets *last = NULL;
|
||||
unsigned long period, irq_bitmap;
|
||||
unsigned long period;
|
||||
unsigned long long temp;
|
||||
|
||||
/*
|
||||
@@ -765,48 +765,12 @@ int hpet_alloc(struct hpet_data *hdp)
|
||||
hpetp->hp_hpet_phys = hdp->hd_phys_address;
|
||||
|
||||
hpetp->hp_ntimer = hdp->hd_nirqs;
|
||||
|
||||
for (i = 0; i < hdp->hd_nirqs; i++)
|
||||
hpetp->hp_dev[i].hd_hdwirq = hdp->hd_irq[i];
|
||||
|
||||
hpet = hpetp->hp_hpet;
|
||||
|
||||
/* Assign IRQs statically for legacy devices */
|
||||
hpetp->hp_dev[0].hd_hdwirq = hdp->hd_irq[0];
|
||||
hpetp->hp_dev[1].hd_hdwirq = hdp->hd_irq[1];
|
||||
|
||||
/* Assign IRQs dynamically for the others */
|
||||
for (i = 2, devp = &hpetp->hp_dev[2]; i < hdp->hd_nirqs; i++, devp++) {
|
||||
struct hpet_timer __iomem *timer;
|
||||
|
||||
timer = &hpet->hpet_timers[devp - hpetp->hp_dev];
|
||||
|
||||
/* Check if there's already an IRQ assigned to the timer */
|
||||
if (hdp->hd_irq[i]) {
|
||||
hpetp->hp_dev[i].hd_hdwirq = hdp->hd_irq[i];
|
||||
continue;
|
||||
}
|
||||
|
||||
hpet_config = readq(&timer->hpet_config);
|
||||
irq_bitmap = (hpet_config & Tn_INT_ROUTE_CAP_MASK)
|
||||
>> Tn_INT_ROUTE_CAP_SHIFT;
|
||||
if (!irq_bitmap)
|
||||
irq = 0; /* No valid IRQ Assignable */
|
||||
else {
|
||||
irq = find_first_bit(&irq_bitmap, 32);
|
||||
do {
|
||||
hpet_config |= irq << Tn_INT_ROUTE_CNF_SHIFT;
|
||||
writeq(hpet_config, &timer->hpet_config);
|
||||
|
||||
/*
|
||||
* Verify whether we have written a valid
|
||||
* IRQ number by reading it back again
|
||||
*/
|
||||
hpet_config = readq(&timer->hpet_config);
|
||||
if (irq == (hpet_config & Tn_INT_ROUTE_CNF_MASK)
|
||||
>> Tn_INT_ROUTE_CNF_SHIFT)
|
||||
break; /* Success */
|
||||
} while ((irq = (find_next_bit(&irq_bitmap, 32, irq))));
|
||||
}
|
||||
hpetp->hp_dev[i].hd_hdwirq = irq;
|
||||
}
|
||||
|
||||
cap = readq(&hpet->hpet_cap);
|
||||
|
||||
ntimer = ((cap & HPET_NUM_TIM_CAP_MASK) >> HPET_NUM_TIM_CAP_SHIFT) + 1;
|
||||
@@ -836,8 +800,7 @@ int hpet_alloc(struct hpet_data *hdp)
|
||||
hpetp->hp_which, hdp->hd_phys_address,
|
||||
hpetp->hp_ntimer > 1 ? "s" : "");
|
||||
for (i = 0; i < hpetp->hp_ntimer; i++)
|
||||
printk("%s %d", i > 0 ? "," : "",
|
||||
hpetp->hp_dev[i].hd_hdwirq);
|
||||
printk("%s %d", i > 0 ? "," : "", hdp->hd_irq[i]);
|
||||
printk("\n");
|
||||
|
||||
printk(KERN_INFO "hpet%u: %u %d-bit timers, %Lu Hz\n",
|
||||
|
||||
@@ -266,7 +266,7 @@ static void __init dmi_save_ipmi_device(const struct dmi_header *dm)
|
||||
dev->name = "IPMI controller";
|
||||
dev->device_data = data;
|
||||
|
||||
list_add(&dev->list, &dmi_devices);
|
||||
list_add_tail(&dev->list, &dmi_devices);
|
||||
}
|
||||
|
||||
static void __init dmi_save_extended_devices(const struct dmi_header *dm)
|
||||
|
||||
@@ -382,9 +382,8 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
||||
break;
|
||||
|
||||
case DAVINCI_I2C_IVR_ARDY:
|
||||
w = davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG);
|
||||
MOD_REG_BIT(w, DAVINCI_I2C_STR_ARDY, 1);
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, w);
|
||||
davinci_i2c_write_reg(dev,
|
||||
DAVINCI_I2C_STR_REG, DAVINCI_I2C_STR_ARDY);
|
||||
complete(&dev->cmd_complete);
|
||||
break;
|
||||
|
||||
@@ -397,12 +396,9 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
||||
if (dev->buf_len)
|
||||
continue;
|
||||
|
||||
w = davinci_i2c_read_reg(dev,
|
||||
DAVINCI_I2C_STR_REG);
|
||||
MOD_REG_BIT(w, DAVINCI_I2C_IMR_RRDY, 0);
|
||||
davinci_i2c_write_reg(dev,
|
||||
DAVINCI_I2C_STR_REG,
|
||||
w);
|
||||
DAVINCI_I2C_STR_REG,
|
||||
DAVINCI_I2C_IMR_RRDY);
|
||||
} else
|
||||
dev_err(dev->dev, "RDR IRQ while no "
|
||||
"data requested\n");
|
||||
@@ -428,9 +424,8 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
||||
break;
|
||||
|
||||
case DAVINCI_I2C_IVR_SCD:
|
||||
w = davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG);
|
||||
MOD_REG_BIT(w, DAVINCI_I2C_STR_SCD, 1);
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, w);
|
||||
davinci_i2c_write_reg(dev,
|
||||
DAVINCI_I2C_STR_REG, DAVINCI_I2C_STR_SCD);
|
||||
complete(&dev->cmd_complete);
|
||||
break;
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ MODULE_PARM_DESC(iic_force_poll, "Force polling mode");
|
||||
|
||||
static int iic_force_fast;
|
||||
module_param(iic_force_fast, bool, 0);
|
||||
MODULE_PARM_DESC(iic_fast_poll, "Force fast mode (400 kHz)");
|
||||
MODULE_PARM_DESC(iic_force_fast, "Force fast mode (400 kHz)");
|
||||
|
||||
#define DBG_LEVEL 0
|
||||
|
||||
|
||||
@@ -131,11 +131,15 @@ static const struct i2c_algorithm usb_algorithm = {
|
||||
|
||||
/* ----- begin of usb layer ---------------------------------------------- */
|
||||
|
||||
/* The usb i2c interface uses a vid/pid pair donated by */
|
||||
/* Future Technology Devices International Ltd. */
|
||||
/*
|
||||
* Initially the usb i2c interface uses a vid/pid pair donated by
|
||||
* Future Technology Devices International Ltd., later a pair was
|
||||
* bought from EZPrototypes
|
||||
*/
|
||||
static struct usb_device_id i2c_tiny_usb_table [] = {
|
||||
{ USB_DEVICE(0x0403, 0xc631) },
|
||||
{ } /* Terminating entry */
|
||||
{ USB_DEVICE(0x0403, 0xc631) }, /* FTDI */
|
||||
{ USB_DEVICE(0x1c40, 0x0534) }, /* EZPrototypes */
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, i2c_tiny_usb_table);
|
||||
|
||||
@@ -492,7 +492,7 @@ static void proc_reports_siimage (struct pci_dev *dev, u8 clocking, const char *
|
||||
|
||||
static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name)
|
||||
{
|
||||
unsigned long bar5 = pci_resource_start(dev, 5);
|
||||
resource_size_t bar5 = pci_resource_start(dev, 5);
|
||||
unsigned long barsize = pci_resource_len(dev, 5);
|
||||
u8 tmpbyte = 0;
|
||||
void __iomem *ioaddr;
|
||||
|
||||
@@ -2010,6 +2010,7 @@ isdn_net_init(struct net_device *ndev)
|
||||
ndev->flags = IFF_NOARP|IFF_POINTOPOINT;
|
||||
ndev->type = ARPHRD_ETHER;
|
||||
ndev->addr_len = ETH_ALEN;
|
||||
ndev->validate_addr = NULL;
|
||||
|
||||
/* for clients with MPPP maybe higher values better */
|
||||
ndev->tx_queue_len = 30;
|
||||
|
||||
+31
-24
@@ -2348,25 +2348,15 @@ static void handle_issuing_new_write_requests6(raid5_conf_t *conf,
|
||||
static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
|
||||
struct stripe_head_state *s, int disks)
|
||||
{
|
||||
set_bit(STRIPE_HANDLE, &sh->state);
|
||||
/* Take one of the following actions:
|
||||
* 1/ start a check parity operation if (uptodate == disks)
|
||||
* 2/ finish a check parity operation and act on the result
|
||||
* 3/ skip to the writeback section if we previously
|
||||
* initiated a recovery operation
|
||||
*/
|
||||
if (s->failed == 0 &&
|
||||
!test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
|
||||
if (!test_and_set_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
|
||||
BUG_ON(s->uptodate != disks);
|
||||
clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags);
|
||||
sh->ops.count++;
|
||||
s->uptodate--;
|
||||
} else if (
|
||||
test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) {
|
||||
clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
|
||||
clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
|
||||
int canceled_check = 0;
|
||||
|
||||
set_bit(STRIPE_HANDLE, &sh->state);
|
||||
|
||||
/* complete a check operation */
|
||||
if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) {
|
||||
clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
|
||||
clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
|
||||
if (s->failed == 0) {
|
||||
if (sh->ops.zero_sum_result == 0)
|
||||
/* parity is correct (on disc,
|
||||
* not in buffer any more)
|
||||
@@ -2391,7 +2381,8 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
|
||||
s->uptodate++;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
canceled_check = 1; /* STRIPE_INSYNC is not set */
|
||||
}
|
||||
|
||||
/* check if we can clear a parity disk reconstruct */
|
||||
@@ -2404,12 +2395,28 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
|
||||
clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
|
||||
}
|
||||
|
||||
/* Wait for check parity and compute block operations to complete
|
||||
* before write-back
|
||||
/* start a new check operation if there are no failures, the stripe is
|
||||
* not insync, and a repair is not in flight
|
||||
*/
|
||||
if (!test_bit(STRIPE_INSYNC, &sh->state) &&
|
||||
!test_bit(STRIPE_OP_CHECK, &sh->ops.pending) &&
|
||||
!test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) {
|
||||
if (s->failed == 0 &&
|
||||
!test_bit(STRIPE_INSYNC, &sh->state) &&
|
||||
!test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
|
||||
if (!test_and_set_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
|
||||
BUG_ON(s->uptodate != disks);
|
||||
clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags);
|
||||
sh->ops.count++;
|
||||
s->uptodate--;
|
||||
}
|
||||
}
|
||||
|
||||
/* Wait for check parity and compute block operations to complete
|
||||
* before write-back. If a failure occurred while the check operation
|
||||
* was in flight we need to cycle this stripe through handle_stripe
|
||||
* since the parity block may not be uptodate
|
||||
*/
|
||||
if (!canceled_check && !test_bit(STRIPE_INSYNC, &sh->state) &&
|
||||
!test_bit(STRIPE_OP_CHECK, &sh->ops.pending) &&
|
||||
!test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) {
|
||||
struct r5dev *dev;
|
||||
/* either failed parity check, or recovery is happening */
|
||||
if (s->failed == 0)
|
||||
|
||||
@@ -6,3 +6,6 @@ obj-y := common/
|
||||
obj-y += video/
|
||||
obj-$(CONFIG_VIDEO_DEV) += radio/
|
||||
obj-$(CONFIG_DVB_CORE) += dvb/
|
||||
ifeq ($(CONFIG_DVB_CORE),)
|
||||
obj-$(CONFIG_VIDEO_TUNER) += dvb/frontends/
|
||||
endif
|
||||
|
||||
@@ -445,7 +445,7 @@ static int s5h1409_set_gpio(struct dvb_frontend* fe, int enable)
|
||||
s5h1409_readreg(state, 0xe3) | 0x1100);
|
||||
else
|
||||
return s5h1409_writereg(state, 0xe3,
|
||||
s5h1409_readreg(state, 0xe3) & 0xeeff);
|
||||
s5h1409_readreg(state, 0xe3) & 0xfeff);
|
||||
}
|
||||
|
||||
static int s5h1409_sleep(struct dvb_frontend* fe, int enable)
|
||||
|
||||
@@ -97,6 +97,11 @@ int bt832_init(struct i2c_client *i2c_client_s)
|
||||
int rc;
|
||||
|
||||
buf=kmalloc(65,GFP_KERNEL);
|
||||
if (!buf) {
|
||||
v4l_err(&t->client,
|
||||
"Unable to allocate memory. Detaching.\n");
|
||||
return 0;
|
||||
}
|
||||
bt832_hexdump(i2c_client_s,buf);
|
||||
|
||||
if(buf[0x40] != 0x31) {
|
||||
@@ -211,7 +216,12 @@ bt832_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
switch (cmd) {
|
||||
case BT832_HEXDUMP: {
|
||||
unsigned char *buf;
|
||||
buf=kmalloc(65,GFP_KERNEL);
|
||||
buf = kmalloc(65, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
v4l_err(&t->client,
|
||||
"Unable to allocate memory\n");
|
||||
break;
|
||||
}
|
||||
bt832_hexdump(&t->client,buf);
|
||||
kfree(buf);
|
||||
}
|
||||
|
||||
@@ -154,6 +154,41 @@ static const struct pvr2_device_desc pvr2_device_onair_usb2 = {
|
||||
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
/* Hauppauge PVR-USB2 Model 73xxx */
|
||||
|
||||
static const char *pvr2_client_73xxx[] = {
|
||||
"cx25840",
|
||||
"tuner",
|
||||
};
|
||||
|
||||
static const char *pvr2_fw1_names_73xxx[] = {
|
||||
"v4l-pvrusb2-73xxx-01.fw",
|
||||
};
|
||||
|
||||
static const struct pvr2_device_desc pvr2_device_73xxx = {
|
||||
.description = "WinTV PVR USB2 Model Category 73xxxx",
|
||||
.shortname = "73xxx",
|
||||
.client_modules.lst = pvr2_client_73xxx,
|
||||
.client_modules.cnt = ARRAY_SIZE(pvr2_client_73xxx),
|
||||
.fx2_firmware.lst = pvr2_fw1_names_73xxx,
|
||||
.fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_73xxx),
|
||||
.flag_has_cx25840 = !0,
|
||||
.flag_has_hauppauge_rom = !0,
|
||||
#if 0
|
||||
.flag_has_analogtuner = !0,
|
||||
.flag_has_composite = !0,
|
||||
.flag_has_svideo = !0,
|
||||
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
|
||||
.digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE,
|
||||
.led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
|
||||
#else
|
||||
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------*/
|
||||
/* Hauppauge PVR-USB2 Model 75xxx */
|
||||
|
||||
@@ -198,8 +233,12 @@ struct usb_device_id pvr2_device_table[] = {
|
||||
{ USB_DEVICE(0x11ba, 0x1001),
|
||||
.driver_info = (kernel_ulong_t)&pvr2_device_onair_usb2},
|
||||
#endif
|
||||
{ USB_DEVICE(0x2040, 0x7300),
|
||||
.driver_info = (kernel_ulong_t)&pvr2_device_73xxx},
|
||||
{ USB_DEVICE(0x2040, 0x7500),
|
||||
.driver_info = (kernel_ulong_t)&pvr2_device_75xxx},
|
||||
{ USB_DEVICE(0x2040, 0x7501),
|
||||
.driver_info = (kernel_ulong_t)&pvr2_device_75xxx},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -718,7 +718,7 @@ static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long
|
||||
/* Someone else might have been playing with it. */
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/* Fall through */
|
||||
case FL_READY:
|
||||
case FL_CFI_QUERY:
|
||||
case FL_JEDEC_QUERY:
|
||||
@@ -778,14 +778,14 @@ static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long
|
||||
chip->state = FL_READY;
|
||||
return 0;
|
||||
|
||||
case FL_SHUTDOWN:
|
||||
/* The machine is rebooting now,so no one can get chip anymore */
|
||||
return -EIO;
|
||||
case FL_POINT:
|
||||
/* Only if there's no operation suspended... */
|
||||
if (mode == FL_READY && chip->oldstate == FL_READY)
|
||||
return 0;
|
||||
|
||||
case FL_SHUTDOWN:
|
||||
/* The machine is rebooting now,so no one can get chip anymore */
|
||||
return -EIO;
|
||||
/* Fall through */
|
||||
default:
|
||||
sleep:
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
|
||||
@@ -1763,6 +1763,7 @@ static void cfi_amdstd_sync (struct mtd_info *mtd)
|
||||
|
||||
default:
|
||||
/* Not an idle state */
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
add_wait_queue(&chip->wq, &wait);
|
||||
|
||||
spin_unlock(chip->mutex);
|
||||
|
||||
@@ -1015,6 +1015,7 @@ static void cfi_staa_sync (struct mtd_info *mtd)
|
||||
|
||||
default:
|
||||
/* Not an idle state */
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
add_wait_queue(&chip->wq, &wait);
|
||||
|
||||
spin_unlock_bh(chip->mutex);
|
||||
|
||||
+3
-3
@@ -63,8 +63,8 @@
|
||||
#include "bnx2x.h"
|
||||
#include "bnx2x_init.h"
|
||||
|
||||
#define DRV_MODULE_VERSION "1.42.3"
|
||||
#define DRV_MODULE_RELDATE "2008/3/9"
|
||||
#define DRV_MODULE_VERSION "1.42.4"
|
||||
#define DRV_MODULE_RELDATE "2008/4/9"
|
||||
#define BNX2X_BC_VER 0x040200
|
||||
|
||||
/* Time in jiffies before concluding the transmitter is hung. */
|
||||
@@ -6153,7 +6153,7 @@ static int bnx2x_function_init(struct bnx2x *bp, int mode)
|
||||
func, mode);
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET,
|
||||
0xffffffff);
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET,
|
||||
REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
|
||||
0xfffc);
|
||||
bnx2x_init_block(bp, MISC_COMMON_START, MISC_COMMON_END);
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
#include <asm/io.h>
|
||||
|
||||
#define DRV_NAME "ehea"
|
||||
#define DRV_VERSION "EHEA_0089"
|
||||
#define DRV_VERSION "EHEA_0090"
|
||||
|
||||
/* eHEA capability flags */
|
||||
#define DLPAR_PORT_ADD_REM 1
|
||||
@@ -371,6 +371,7 @@ struct ehea_port_res {
|
||||
struct ehea_q_skb_arr rq2_skba;
|
||||
struct ehea_q_skb_arr rq3_skba;
|
||||
struct ehea_q_skb_arr sq_skba;
|
||||
int sq_skba_size;
|
||||
spinlock_t netif_queue;
|
||||
int queue_stopped;
|
||||
int swqe_refill_th;
|
||||
|
||||
@@ -349,7 +349,8 @@ static void ehea_refill_rq1(struct ehea_port_res *pr, int index, int nr_of_wqes)
|
||||
pr->rq1_skba.os_skbs = 0;
|
||||
|
||||
if (unlikely(test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))) {
|
||||
pr->rq1_skba.index = index;
|
||||
if (nr_of_wqes > 0)
|
||||
pr->rq1_skba.index = index;
|
||||
pr->rq1_skba.os_skbs = fill_wqes;
|
||||
return;
|
||||
}
|
||||
@@ -1464,7 +1465,9 @@ static int ehea_init_port_res(struct ehea_port *port, struct ehea_port_res *pr,
|
||||
init_attr->act_nr_rwqes_rq2,
|
||||
init_attr->act_nr_rwqes_rq3);
|
||||
|
||||
ret = ehea_init_q_skba(&pr->sq_skba, init_attr->act_nr_send_wqes + 1);
|
||||
pr->sq_skba_size = init_attr->act_nr_send_wqes + 1;
|
||||
|
||||
ret = ehea_init_q_skba(&pr->sq_skba, pr->sq_skba_size);
|
||||
ret |= ehea_init_q_skba(&pr->rq1_skba, init_attr->act_nr_rwqes_rq1 + 1);
|
||||
ret |= ehea_init_q_skba(&pr->rq2_skba, init_attr->act_nr_rwqes_rq2 + 1);
|
||||
ret |= ehea_init_q_skba(&pr->rq3_skba, init_attr->act_nr_rwqes_rq3 + 1);
|
||||
@@ -2621,6 +2624,22 @@ void ehea_purge_sq(struct ehea_qp *orig_qp)
|
||||
}
|
||||
}
|
||||
|
||||
void ehea_flush_sq(struct ehea_port *port)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) {
|
||||
struct ehea_port_res *pr = &port->port_res[i];
|
||||
int swqe_max = pr->sq_skba_size - 2 - pr->swqe_ll_count;
|
||||
int k = 0;
|
||||
while (atomic_read(&pr->swqe_avail) < swqe_max) {
|
||||
msleep(5);
|
||||
if (++k == 20)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ehea_stop_qps(struct net_device *dev)
|
||||
{
|
||||
struct ehea_port *port = netdev_priv(dev);
|
||||
@@ -2845,6 +2864,7 @@ static void ehea_rereg_mrs(struct work_struct *work)
|
||||
if (dev->flags & IFF_UP) {
|
||||
down(&port->port_lock);
|
||||
netif_stop_queue(dev);
|
||||
ehea_flush_sq(port);
|
||||
ret = ehea_stop_qps(dev);
|
||||
if (ret) {
|
||||
up(&port->port_lock);
|
||||
|
||||
+26
-5
@@ -2112,9 +2112,8 @@ static inline void nv_tx_flip_ownership(struct net_device *dev)
|
||||
|
||||
np->tx_pkts_in_progress--;
|
||||
if (np->tx_change_owner) {
|
||||
__le32 flaglen = le32_to_cpu(np->tx_change_owner->first_tx_desc->flaglen);
|
||||
flaglen |= NV_TX2_VALID;
|
||||
np->tx_change_owner->first_tx_desc->flaglen = cpu_to_le32(flaglen);
|
||||
np->tx_change_owner->first_tx_desc->flaglen |=
|
||||
cpu_to_le32(NV_TX2_VALID);
|
||||
np->tx_pkts_in_progress++;
|
||||
|
||||
np->tx_change_owner = np->tx_change_owner->next_tx_ctx;
|
||||
@@ -5317,8 +5316,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
|
||||
/* check the workaround bit for correct mac address order */
|
||||
txreg = readl(base + NvRegTransmitPoll);
|
||||
if ((txreg & NVREG_TRANSMITPOLL_MAC_ADDR_REV) ||
|
||||
(id->driver_data & DEV_HAS_CORRECT_MACADDR)) {
|
||||
if (id->driver_data & DEV_HAS_CORRECT_MACADDR) {
|
||||
/* mac address is already in correct order */
|
||||
dev->dev_addr[0] = (np->orig_mac[0] >> 0) & 0xff;
|
||||
dev->dev_addr[1] = (np->orig_mac[0] >> 8) & 0xff;
|
||||
@@ -5326,6 +5324,22 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
||||
dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff;
|
||||
dev->dev_addr[4] = (np->orig_mac[1] >> 0) & 0xff;
|
||||
dev->dev_addr[5] = (np->orig_mac[1] >> 8) & 0xff;
|
||||
} else if (txreg & NVREG_TRANSMITPOLL_MAC_ADDR_REV) {
|
||||
/* mac address is already in correct order */
|
||||
dev->dev_addr[0] = (np->orig_mac[0] >> 0) & 0xff;
|
||||
dev->dev_addr[1] = (np->orig_mac[0] >> 8) & 0xff;
|
||||
dev->dev_addr[2] = (np->orig_mac[0] >> 16) & 0xff;
|
||||
dev->dev_addr[3] = (np->orig_mac[0] >> 24) & 0xff;
|
||||
dev->dev_addr[4] = (np->orig_mac[1] >> 0) & 0xff;
|
||||
dev->dev_addr[5] = (np->orig_mac[1] >> 8) & 0xff;
|
||||
/*
|
||||
* Set orig mac address back to the reversed version.
|
||||
* This flag will be cleared during low power transition.
|
||||
* Therefore, we should always put back the reversed address.
|
||||
*/
|
||||
np->orig_mac[0] = (dev->dev_addr[5] << 0) + (dev->dev_addr[4] << 8) +
|
||||
(dev->dev_addr[3] << 16) + (dev->dev_addr[2] << 24);
|
||||
np->orig_mac[1] = (dev->dev_addr[1] << 0) + (dev->dev_addr[0] << 8);
|
||||
} else {
|
||||
/* need to reverse mac address to correct order */
|
||||
dev->dev_addr[0] = (np->orig_mac[1] >> 8) & 0xff;
|
||||
@@ -5596,7 +5610,9 @@ out:
|
||||
static int nv_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct net_device *dev = pci_get_drvdata(pdev);
|
||||
u8 __iomem *base = get_hwbase(dev);
|
||||
int rc = 0;
|
||||
u32 txreg;
|
||||
|
||||
if (!netif_running(dev))
|
||||
goto out;
|
||||
@@ -5607,6 +5623,11 @@ static int nv_resume(struct pci_dev *pdev)
|
||||
pci_restore_state(pdev);
|
||||
pci_enable_wake(pdev, PCI_D0, 0);
|
||||
|
||||
/* restore mac address reverse flag */
|
||||
txreg = readl(base + NvRegTransmitPoll);
|
||||
txreg |= NVREG_TRANSMITPOLL_MAC_ADDR_REV;
|
||||
writel(txreg, base + NvRegTransmitPoll);
|
||||
|
||||
rc = nv_open(dev);
|
||||
out:
|
||||
return rc;
|
||||
|
||||
@@ -835,7 +835,8 @@ static int fs_enet_close(struct net_device *dev)
|
||||
|
||||
netif_stop_queue(dev);
|
||||
netif_carrier_off(dev);
|
||||
napi_disable(&fep->napi);
|
||||
if (fep->fpi->use_napi)
|
||||
napi_disable(&fep->napi);
|
||||
phy_stop(fep->phydev);
|
||||
|
||||
spin_lock_irqsave(&fep->lock, flags);
|
||||
|
||||
+8
-6
@@ -242,12 +242,12 @@ static int macb_mii_init(struct macb *bp)
|
||||
/* Enable managment port */
|
||||
macb_writel(bp, NCR, MACB_BIT(MPE));
|
||||
|
||||
bp->mii_bus.name = "MACB_mii_bus",
|
||||
bp->mii_bus.read = &macb_mdio_read,
|
||||
bp->mii_bus.write = &macb_mdio_write,
|
||||
bp->mii_bus.reset = &macb_mdio_reset,
|
||||
bp->mii_bus.id = bp->pdev->id,
|
||||
bp->mii_bus.priv = bp,
|
||||
bp->mii_bus.name = "MACB_mii_bus";
|
||||
bp->mii_bus.read = &macb_mdio_read;
|
||||
bp->mii_bus.write = &macb_mdio_write;
|
||||
bp->mii_bus.reset = &macb_mdio_reset;
|
||||
bp->mii_bus.id = bp->pdev->id;
|
||||
bp->mii_bus.priv = bp;
|
||||
bp->mii_bus.dev = &bp->dev->dev;
|
||||
pdata = bp->pdev->dev.platform_data;
|
||||
|
||||
@@ -1257,6 +1257,8 @@ static int __exit macb_remove(struct platform_device *pdev)
|
||||
|
||||
if (dev) {
|
||||
bp = netdev_priv(dev);
|
||||
if (bp->phy_dev)
|
||||
phy_disconnect(bp->phy_dev);
|
||||
mdiobus_unregister(&bp->mii_bus);
|
||||
kfree(bp->mii_bus.irq);
|
||||
unregister_netdev(dev);
|
||||
|
||||
@@ -211,8 +211,6 @@ static int m88e1111_config_init(struct phy_device *phydev)
|
||||
}
|
||||
|
||||
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
|
||||
int temp;
|
||||
|
||||
temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
|
||||
if (temp < 0)
|
||||
return temp;
|
||||
|
||||
@@ -1446,6 +1446,7 @@ static int __devinit sc92031_probe(struct pci_dev *pdev,
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
|
||||
#if SC92031_USE_BAR == 0
|
||||
dev->mem_start = pci_resource_start(pdev, SC92031_USE_BAR);
|
||||
|
||||
@@ -154,6 +154,7 @@ static const char *yukon2_name[] = {
|
||||
"EC", /* 0xb6 */
|
||||
"FE", /* 0xb7 */
|
||||
"FE+", /* 0xb8 */
|
||||
"Supreme", /* 0xb9 */
|
||||
};
|
||||
|
||||
static void sky2_set_multicast(struct net_device *dev);
|
||||
|
||||
@@ -1326,9 +1326,11 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id)
|
||||
SMC_SET_INT_MASK(mask);
|
||||
spin_unlock(&lp->lock);
|
||||
|
||||
#ifndef CONFIG_NET_POLL_CONTROLLER
|
||||
if (timeout == MAX_IRQ_LOOPS)
|
||||
PRINTK("%s: spurious interrupt (mask = 0x%02x)\n",
|
||||
dev->name, mask);
|
||||
#endif
|
||||
DBG(3, "%s: Interrupt done (%d loops)\n",
|
||||
dev->name, MAX_IRQ_LOOPS - timeout);
|
||||
|
||||
|
||||
@@ -92,14 +92,14 @@
|
||||
#define SMC_insw(a, r, p, l) insw ((unsigned long *)((a) + (r)), p, l)
|
||||
# endif
|
||||
/* check if the mac in reg is valid */
|
||||
#define SMC_GET_MAC_ADDR(lp, addr) \
|
||||
#define SMC_GET_MAC_ADDR(addr) \
|
||||
do { \
|
||||
unsigned int __v; \
|
||||
__v = SMC_inw(ioaddr, ADDR0_REG(lp)); \
|
||||
__v = SMC_inw(ioaddr, ADDR0_REG); \
|
||||
addr[0] = __v; addr[1] = __v >> 8; \
|
||||
__v = SMC_inw(ioaddr, ADDR1_REG(lp)); \
|
||||
__v = SMC_inw(ioaddr, ADDR1_REG); \
|
||||
addr[2] = __v; addr[3] = __v >> 8; \
|
||||
__v = SMC_inw(ioaddr, ADDR2_REG(lp)); \
|
||||
__v = SMC_inw(ioaddr, ADDR2_REG); \
|
||||
addr[4] = __v; addr[5] = __v >> 8; \
|
||||
if (*(u32 *)(&addr[0]) == 0xFFFFFFFF) { \
|
||||
random_ether_addr(addr); \
|
||||
|
||||
@@ -1472,13 +1472,12 @@ static int __netdev_rx(struct net_device *dev, int *quota)
|
||||
#ifndef final_version /* Remove after testing. */
|
||||
/* You will want this info for the initial debug. */
|
||||
if (debug > 5) {
|
||||
DECLARE_MAC_BUF(mac);
|
||||
DECLARE_MAC_BUF(mac2);
|
||||
|
||||
printk(KERN_DEBUG " Rx data %s %s"
|
||||
printk(KERN_DEBUG " Rx data " MAC_FMT " " MAC_FMT
|
||||
" %2.2x%2.2x.\n",
|
||||
print_mac(mac, &skb->data[0]),
|
||||
print_mac(mac2, &skb->data[6]),
|
||||
skb->data[0], skb->data[1], skb->data[2],
|
||||
skb->data[3], skb->data[4], skb->data[5],
|
||||
skb->data[6], skb->data[7], skb->data[8],
|
||||
skb->data[9], skb->data[10], skb->data[11],
|
||||
skb->data[12], skb->data[13]);
|
||||
}
|
||||
#endif
|
||||
|
||||
+145
-12
@@ -64,8 +64,8 @@
|
||||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.88"
|
||||
#define DRV_MODULE_RELDATE "March 20, 2008"
|
||||
#define DRV_MODULE_VERSION "3.90"
|
||||
#define DRV_MODULE_RELDATE "April 12, 2008"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
@@ -804,6 +804,12 @@ static int tg3_writephy(struct tg3 *tp, int reg, u32 val)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val)
|
||||
{
|
||||
tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
|
||||
tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
|
||||
}
|
||||
|
||||
static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable)
|
||||
{
|
||||
u32 phy;
|
||||
@@ -886,6 +892,49 @@ static int tg3_bmcr_reset(struct tg3 *tp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tg3_phy_apply_otp(struct tg3 *tp)
|
||||
{
|
||||
u32 otp, phy;
|
||||
|
||||
if (!tp->phy_otp)
|
||||
return;
|
||||
|
||||
otp = tp->phy_otp;
|
||||
|
||||
/* Enable SM_DSP clock and tx 6dB coding. */
|
||||
phy = MII_TG3_AUXCTL_SHDWSEL_AUXCTL |
|
||||
MII_TG3_AUXCTL_ACTL_SMDSP_ENA |
|
||||
MII_TG3_AUXCTL_ACTL_TX_6DB;
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
|
||||
phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT;
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) |
|
||||
((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT);
|
||||
phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ;
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy);
|
||||
|
||||
phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) |
|
||||
((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
|
||||
|
||||
/* Turn off SM_DSP clock. */
|
||||
phy = MII_TG3_AUXCTL_SHDWSEL_AUXCTL |
|
||||
MII_TG3_AUXCTL_ACTL_TX_6DB;
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, phy);
|
||||
}
|
||||
|
||||
static int tg3_wait_macro_done(struct tg3 *tp)
|
||||
{
|
||||
int limit = 100;
|
||||
@@ -1073,6 +1122,7 @@ static void tg3_link_report(struct tg3 *);
|
||||
*/
|
||||
static int tg3_phy_reset(struct tg3 *tp)
|
||||
{
|
||||
u32 cpmuctrl;
|
||||
u32 phy_status;
|
||||
int err;
|
||||
|
||||
@@ -1102,10 +1152,28 @@ static int tg3_phy_reset(struct tg3 *tp)
|
||||
goto out;
|
||||
}
|
||||
|
||||
cpmuctrl = 0;
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
|
||||
cpmuctrl = tr32(TG3_CPMU_CTRL);
|
||||
if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY)
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY);
|
||||
}
|
||||
|
||||
err = tg3_bmcr_reset(tp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) {
|
||||
u32 phy;
|
||||
|
||||
phy = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz;
|
||||
tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, phy);
|
||||
|
||||
tw32(TG3_CPMU_CTRL, cpmuctrl);
|
||||
}
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
|
||||
u32 val;
|
||||
|
||||
@@ -1124,6 +1192,8 @@ static int tg3_phy_reset(struct tg3 *tp)
|
||||
MII_TG3_MISC_SHDW_APD_WKTM_84MS);
|
||||
}
|
||||
|
||||
tg3_phy_apply_otp(tp);
|
||||
|
||||
out:
|
||||
if (tp->tg3_flags2 & TG3_FLG2_PHY_ADC_BUG) {
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
|
||||
@@ -9464,7 +9534,8 @@ static int tg3_test_loopback(struct tg3 *tp)
|
||||
if (err)
|
||||
return TG3_LOOPBACK_FAILED;
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
|
||||
int i;
|
||||
u32 status;
|
||||
|
||||
@@ -9481,17 +9552,23 @@ static int tg3_test_loopback(struct tg3 *tp)
|
||||
if (status != CPMU_MUTEX_GNT_DRIVER)
|
||||
return TG3_LOOPBACK_FAILED;
|
||||
|
||||
/* Turn off power management based on link speed. */
|
||||
/* Turn off link-based power management. */
|
||||
cpmuctrl = tr32(TG3_CPMU_CTRL);
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE |
|
||||
CPMU_CTRL_LINK_AWARE_MODE));
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX)
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~(CPMU_CTRL_LINK_SPEED_MODE |
|
||||
CPMU_CTRL_LINK_AWARE_MODE));
|
||||
else
|
||||
tw32(TG3_CPMU_CTRL,
|
||||
cpmuctrl & ~CPMU_CTRL_LINK_AWARE_MODE);
|
||||
}
|
||||
|
||||
if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
|
||||
err |= TG3_MAC_LOOPBACK_FAILED;
|
||||
|
||||
if (tp->tg3_flags3 & TG3_FLG3_5761_5784_AX_FIXES) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761) {
|
||||
tw32(TG3_CPMU_CTRL, cpmuctrl);
|
||||
|
||||
/* Release the mutex */
|
||||
@@ -10724,9 +10801,8 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||
tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
|
||||
tp->led_ctrl = LED_CTRL_MODE_PHY_2;
|
||||
|
||||
if (tp->pci_chip_rev_id == CHIPREV_ID_5784_A0 ||
|
||||
tp->pci_chip_rev_id == CHIPREV_ID_5784_A1)
|
||||
tp->led_ctrl = LED_CTRL_MODE_MAC;
|
||||
if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX)
|
||||
tp->led_ctrl = LED_CTRL_MODE_PHY_1;
|
||||
|
||||
if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP) {
|
||||
tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
|
||||
@@ -10773,6 +10849,55 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
|
||||
}
|
||||
}
|
||||
|
||||
static int __devinit tg3_issue_otp_command(struct tg3 *tp, u32 cmd)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
|
||||
tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START);
|
||||
tw32(OTP_CTRL, cmd);
|
||||
|
||||
/* Wait for up to 1 ms for command to execute. */
|
||||
for (i = 0; i < 100; i++) {
|
||||
val = tr32(OTP_STATUS);
|
||||
if (val & OTP_STATUS_CMD_DONE)
|
||||
break;
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY;
|
||||
}
|
||||
|
||||
/* Read the gphy configuration from the OTP region of the chip. The gphy
|
||||
* configuration is a 32-bit value that straddles the alignment boundary.
|
||||
* We do two 32-bit reads and then shift and merge the results.
|
||||
*/
|
||||
static u32 __devinit tg3_read_otp_phycfg(struct tg3 *tp)
|
||||
{
|
||||
u32 bhalf_otp, thalf_otp;
|
||||
|
||||
tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC);
|
||||
|
||||
if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT))
|
||||
return 0;
|
||||
|
||||
tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1);
|
||||
|
||||
if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
|
||||
return 0;
|
||||
|
||||
thalf_otp = tr32(OTP_READ_DATA);
|
||||
|
||||
tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2);
|
||||
|
||||
if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
|
||||
return 0;
|
||||
|
||||
bhalf_otp = tr32(OTP_READ_DATA);
|
||||
|
||||
return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);
|
||||
}
|
||||
|
||||
static int __devinit tg3_phy_probe(struct tg3 *tp)
|
||||
{
|
||||
u32 hw_phy_id_1, hw_phy_id_2;
|
||||
@@ -11586,6 +11711,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
|
||||
}
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
|
||||
tp->phy_otp = tg3_read_otp_phycfg(tp);
|
||||
if (tp->phy_otp == 0)
|
||||
tp->phy_otp = TG3_OTP_DEFAULT;
|
||||
}
|
||||
|
||||
tp->coalesce_mode = 0;
|
||||
if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
|
||||
GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_BX)
|
||||
@@ -12446,7 +12578,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
static int tg3_version_printed = 0;
|
||||
unsigned long tg3reg_base, tg3reg_len;
|
||||
resource_size_t tg3reg_base;
|
||||
unsigned long tg3reg_len;
|
||||
struct net_device *dev;
|
||||
struct tg3 *tp;
|
||||
int err, pm_cap;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user