Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
e48d199ba1
@ -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
|
||||
|
283
Documentation/filesystems/seq_file.txt
Normal file
283
Documentation/filesystems/seq_file.txt
Normal file
@ -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.
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -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
|
||||
|
@ -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
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
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: {
|
||||
|
@ -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
|
||||
|
@ -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)"
|
||||
|
@ -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 || \
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user