Merge branch 'master' of /repos/git/net-next-2.6
Conflicts: Documentation/feature-removal-schedule.txt net/ipv6/netfilter/ip6t_REJECT.c net/netfilter/xt_limit.c Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
29
Documentation/ABI/obsolete/sysfs-class-rfkill
Normal file
29
Documentation/ABI/obsolete/sysfs-class-rfkill
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
rfkill - radio frequency (RF) connector kill switch support
|
||||||
|
|
||||||
|
For details to this subsystem look at Documentation/rfkill.txt.
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/state
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Current state of the transmitter.
|
||||||
|
This file is deprecated and sheduled to be removed in 2014,
|
||||||
|
because its not possible to express the 'soft and hard block'
|
||||||
|
state of the rfkill driver.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: RFKILL_STATE_SOFT_BLOCKED
|
||||||
|
transmitter is turned off by software
|
||||||
|
1: RFKILL_STATE_UNBLOCKED
|
||||||
|
transmitter is (potentially) active
|
||||||
|
2: RFKILL_STATE_HARD_BLOCKED
|
||||||
|
transmitter is forced off by something outside of
|
||||||
|
the driver's control.
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/claim
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: This file is deprecated because there no longer is a way to
|
||||||
|
claim just control over a single rfkill instance.
|
||||||
|
This file is scheduled to be removed in 2012.
|
||||||
|
Values: 0: Kernel handles events
|
67
Documentation/ABI/stable/sysfs-class-rfkill
Normal file
67
Documentation/ABI/stable/sysfs-class-rfkill
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
rfkill - radio frequency (RF) connector kill switch support
|
||||||
|
|
||||||
|
For details to this subsystem look at Documentation/rfkill.txt.
|
||||||
|
|
||||||
|
For the deprecated /sys/class/rfkill/*/state and
|
||||||
|
/sys/class/rfkill/*/claim knobs of this interface look in
|
||||||
|
Documentation/ABI/obsolete/sysfs-class-rfkill.
|
||||||
|
|
||||||
|
What: /sys/class/rfkill
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion: v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org,
|
||||||
|
Description: The rfkill class subsystem folder.
|
||||||
|
Each registered rfkill driver is represented by an rfkillX
|
||||||
|
subfolder (X being an integer > 0).
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/name
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Name assigned by driver to this key (interface or driver name).
|
||||||
|
Values: arbitrary string.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/type
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Driver type string ("wlan", "bluetooth", etc).
|
||||||
|
Values: See include/linux/rfkill.h.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/persistent
|
||||||
|
Date: 09-Jul-2007
|
||||||
|
KernelVersion v2.6.22
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Whether the soft blocked state is initialised from non-volatile
|
||||||
|
storage at startup.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: false
|
||||||
|
1: true
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/hard
|
||||||
|
Date: 12-March-2010
|
||||||
|
KernelVersion v2.6.34
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Current hardblock state. This file is read only.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: inactive
|
||||||
|
The transmitter is (potentially) active.
|
||||||
|
1: active
|
||||||
|
The transmitter is forced off by something outside of
|
||||||
|
the driver's control.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/class/rfkill/rfkill[0-9]+/soft
|
||||||
|
Date: 12-March-2010
|
||||||
|
KernelVersion v2.6.34
|
||||||
|
Contact: linux-wireless@vger.kernel.org
|
||||||
|
Description: Current softblock state. This file is read and write.
|
||||||
|
Values: A numeric value.
|
||||||
|
0: inactive
|
||||||
|
The transmitter is (potentially) active.
|
||||||
|
1: active
|
||||||
|
The transmitter is turned off by software.
|
@@ -160,7 +160,7 @@ Description:
|
|||||||
match the driver to the device. For example:
|
match the driver to the device. For example:
|
||||||
# echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id
|
# echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id
|
||||||
|
|
||||||
What: /sys/bus/usb/device/.../avoid_reset
|
What: /sys/bus/usb/device/.../avoid_reset_quirk
|
||||||
Date: December 2009
|
Date: December 2009
|
||||||
Contact: Oliver Neukum <oliver@neukum.org>
|
Contact: Oliver Neukum <oliver@neukum.org>
|
||||||
Description:
|
Description:
|
||||||
|
@@ -16,6 +16,15 @@
|
|||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
<author>
|
||||||
|
<firstname>William</firstname>
|
||||||
|
<surname>Cohen</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address>
|
||||||
|
<email>wcohen@redhat.com</email>
|
||||||
|
</address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
</authorgroup>
|
</authorgroup>
|
||||||
|
|
||||||
<legalnotice>
|
<legalnotice>
|
||||||
@@ -91,4 +100,8 @@
|
|||||||
!Iinclude/trace/events/signal.h
|
!Iinclude/trace/events/signal.h
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="block">
|
||||||
|
<title>Block IO</title>
|
||||||
|
!Iinclude/trace/events/block.h
|
||||||
|
</chapter>
|
||||||
</book>
|
</book>
|
||||||
|
@@ -1162,8 +1162,8 @@ where a driver received a request ala this before:
|
|||||||
|
|
||||||
As mentioned, there is no virtual mapping of a bio. For DMA, this is
|
As mentioned, there is no virtual mapping of a bio. For DMA, this is
|
||||||
not a problem as the driver probably never will need a virtual mapping.
|
not a problem as the driver probably never will need a virtual mapping.
|
||||||
Instead it needs a bus mapping (pci_map_page for a single segment or
|
Instead it needs a bus mapping (dma_map_page for a single segment or
|
||||||
use blk_rq_map_sg for scatter gather) to be able to ship it to the driver. For
|
use dma_map_sg for scatter gather) to be able to ship it to the driver. For
|
||||||
PIO drivers (or drivers that need to revert to PIO transfer once in a
|
PIO drivers (or drivers that need to revert to PIO transfer once in a
|
||||||
while (IDE for example)), where the CPU is doing the actual data
|
while (IDE for example)), where the CPU is doing the actual data
|
||||||
transfer a virtual mapping is needed. If the driver supports highmem I/O,
|
transfer a virtual mapping is needed. If the driver supports highmem I/O,
|
||||||
|
@@ -340,7 +340,7 @@ Note:
|
|||||||
5.3 swappiness
|
5.3 swappiness
|
||||||
Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only.
|
Similar to /proc/sys/vm/swappiness, but affecting a hierarchy of groups only.
|
||||||
|
|
||||||
Following cgroups' swapiness can't be changed.
|
Following cgroups' swappiness can't be changed.
|
||||||
- root cgroup (uses /proc/sys/vm/swappiness).
|
- root cgroup (uses /proc/sys/vm/swappiness).
|
||||||
- a cgroup which uses hierarchy and it has child cgroup.
|
- a cgroup which uses hierarchy and it has child cgroup.
|
||||||
- a cgroup which uses hierarchy and not the root of hierarchy.
|
- a cgroup which uses hierarchy and not the root of hierarchy.
|
||||||
|
234
Documentation/circular-buffers.txt
Normal file
234
Documentation/circular-buffers.txt
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
================
|
||||||
|
CIRCULAR BUFFERS
|
||||||
|
================
|
||||||
|
|
||||||
|
By: David Howells <dhowells@redhat.com>
|
||||||
|
Paul E. McKenney <paulmck@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
|
||||||
|
Linux provides a number of features that can be used to implement circular
|
||||||
|
buffering. There are two sets of such features:
|
||||||
|
|
||||||
|
(1) Convenience functions for determining information about power-of-2 sized
|
||||||
|
buffers.
|
||||||
|
|
||||||
|
(2) Memory barriers for when the producer and the consumer of objects in the
|
||||||
|
buffer don't want to share a lock.
|
||||||
|
|
||||||
|
To use these facilities, as discussed below, there needs to be just one
|
||||||
|
producer and just one consumer. It is possible to handle multiple producers by
|
||||||
|
serialising them, and to handle multiple consumers by serialising them.
|
||||||
|
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
(*) What is a circular buffer?
|
||||||
|
|
||||||
|
(*) Measuring power-of-2 buffers.
|
||||||
|
|
||||||
|
(*) Using memory barriers with circular buffers.
|
||||||
|
- The producer.
|
||||||
|
- The consumer.
|
||||||
|
|
||||||
|
|
||||||
|
==========================
|
||||||
|
WHAT IS A CIRCULAR BUFFER?
|
||||||
|
==========================
|
||||||
|
|
||||||
|
First of all, what is a circular buffer? A circular buffer is a buffer of
|
||||||
|
fixed, finite size into which there are two indices:
|
||||||
|
|
||||||
|
(1) A 'head' index - the point at which the producer inserts items into the
|
||||||
|
buffer.
|
||||||
|
|
||||||
|
(2) A 'tail' index - the point at which the consumer finds the next item in
|
||||||
|
the buffer.
|
||||||
|
|
||||||
|
Typically when the tail pointer is equal to the head pointer, the buffer is
|
||||||
|
empty; and the buffer is full when the head pointer is one less than the tail
|
||||||
|
pointer.
|
||||||
|
|
||||||
|
The head index is incremented when items are added, and the tail index when
|
||||||
|
items are removed. The tail index should never jump the head index, and both
|
||||||
|
indices should be wrapped to 0 when they reach the end of the buffer, thus
|
||||||
|
allowing an infinite amount of data to flow through the buffer.
|
||||||
|
|
||||||
|
Typically, items will all be of the same unit size, but this isn't strictly
|
||||||
|
required to use the techniques below. The indices can be increased by more
|
||||||
|
than 1 if multiple items or variable-sized items are to be included in the
|
||||||
|
buffer, provided that neither index overtakes the other. The implementer must
|
||||||
|
be careful, however, as a region more than one unit in size may wrap the end of
|
||||||
|
the buffer and be broken into two segments.
|
||||||
|
|
||||||
|
|
||||||
|
============================
|
||||||
|
MEASURING POWER-OF-2 BUFFERS
|
||||||
|
============================
|
||||||
|
|
||||||
|
Calculation of the occupancy or the remaining capacity of an arbitrarily sized
|
||||||
|
circular buffer would normally be a slow operation, requiring the use of a
|
||||||
|
modulus (divide) instruction. However, if the buffer is of a power-of-2 size,
|
||||||
|
then a much quicker bitwise-AND instruction can be used instead.
|
||||||
|
|
||||||
|
Linux provides a set of macros for handling power-of-2 circular buffers. These
|
||||||
|
can be made use of by:
|
||||||
|
|
||||||
|
#include <linux/circ_buf.h>
|
||||||
|
|
||||||
|
The macros are:
|
||||||
|
|
||||||
|
(*) Measure the remaining capacity of a buffer:
|
||||||
|
|
||||||
|
CIRC_SPACE(head_index, tail_index, buffer_size);
|
||||||
|
|
||||||
|
This returns the amount of space left in the buffer[1] into which items
|
||||||
|
can be inserted.
|
||||||
|
|
||||||
|
|
||||||
|
(*) Measure the maximum consecutive immediate space in a buffer:
|
||||||
|
|
||||||
|
CIRC_SPACE_TO_END(head_index, tail_index, buffer_size);
|
||||||
|
|
||||||
|
This returns the amount of consecutive space left in the buffer[1] into
|
||||||
|
which items can be immediately inserted without having to wrap back to the
|
||||||
|
beginning of the buffer.
|
||||||
|
|
||||||
|
|
||||||
|
(*) Measure the occupancy of a buffer:
|
||||||
|
|
||||||
|
CIRC_CNT(head_index, tail_index, buffer_size);
|
||||||
|
|
||||||
|
This returns the number of items currently occupying a buffer[2].
|
||||||
|
|
||||||
|
|
||||||
|
(*) Measure the non-wrapping occupancy of a buffer:
|
||||||
|
|
||||||
|
CIRC_CNT_TO_END(head_index, tail_index, buffer_size);
|
||||||
|
|
||||||
|
This returns the number of consecutive items[2] that can be extracted from
|
||||||
|
the buffer without having to wrap back to the beginning of the buffer.
|
||||||
|
|
||||||
|
|
||||||
|
Each of these macros will nominally return a value between 0 and buffer_size-1,
|
||||||
|
however:
|
||||||
|
|
||||||
|
[1] CIRC_SPACE*() are intended to be used in the producer. To the producer
|
||||||
|
they will return a lower bound as the producer controls the head index,
|
||||||
|
but the consumer may still be depleting the buffer on another CPU and
|
||||||
|
moving the tail index.
|
||||||
|
|
||||||
|
To the consumer it will show an upper bound as the producer may be busy
|
||||||
|
depleting the space.
|
||||||
|
|
||||||
|
[2] CIRC_CNT*() are intended to be used in the consumer. To the consumer they
|
||||||
|
will return a lower bound as the consumer controls the tail index, but the
|
||||||
|
producer may still be filling the buffer on another CPU and moving the
|
||||||
|
head index.
|
||||||
|
|
||||||
|
To the producer it will show an upper bound as the consumer may be busy
|
||||||
|
emptying the buffer.
|
||||||
|
|
||||||
|
[3] To a third party, the order in which the writes to the indices by the
|
||||||
|
producer and consumer become visible cannot be guaranteed as they are
|
||||||
|
independent and may be made on different CPUs - so the result in such a
|
||||||
|
situation will merely be a guess, and may even be negative.
|
||||||
|
|
||||||
|
|
||||||
|
===========================================
|
||||||
|
USING MEMORY BARRIERS WITH CIRCULAR BUFFERS
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
By using memory barriers in conjunction with circular buffers, you can avoid
|
||||||
|
the need to:
|
||||||
|
|
||||||
|
(1) use a single lock to govern access to both ends of the buffer, thus
|
||||||
|
allowing the buffer to be filled and emptied at the same time; and
|
||||||
|
|
||||||
|
(2) use atomic counter operations.
|
||||||
|
|
||||||
|
There are two sides to this: the producer that fills the buffer, and the
|
||||||
|
consumer that empties it. Only one thing should be filling a buffer at any one
|
||||||
|
time, and only one thing should be emptying a buffer at any one time, but the
|
||||||
|
two sides can operate simultaneously.
|
||||||
|
|
||||||
|
|
||||||
|
THE PRODUCER
|
||||||
|
------------
|
||||||
|
|
||||||
|
The producer will look something like this:
|
||||||
|
|
||||||
|
spin_lock(&producer_lock);
|
||||||
|
|
||||||
|
unsigned long head = buffer->head;
|
||||||
|
unsigned long tail = ACCESS_ONCE(buffer->tail);
|
||||||
|
|
||||||
|
if (CIRC_SPACE(head, tail, buffer->size) >= 1) {
|
||||||
|
/* insert one item into the buffer */
|
||||||
|
struct item *item = buffer[head];
|
||||||
|
|
||||||
|
produce_item(item);
|
||||||
|
|
||||||
|
smp_wmb(); /* commit the item before incrementing the head */
|
||||||
|
|
||||||
|
buffer->head = (head + 1) & (buffer->size - 1);
|
||||||
|
|
||||||
|
/* wake_up() will make sure that the head is committed before
|
||||||
|
* waking anyone up */
|
||||||
|
wake_up(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock(&producer_lock);
|
||||||
|
|
||||||
|
This will instruct the CPU that the contents of the new item must be written
|
||||||
|
before the head index makes it available to the consumer and then instructs the
|
||||||
|
CPU that the revised head index must be written before the consumer is woken.
|
||||||
|
|
||||||
|
Note that wake_up() doesn't have to be the exact mechanism used, but whatever
|
||||||
|
is used must guarantee a (write) memory barrier between the update of the head
|
||||||
|
index and the change of state of the consumer, if a change of state occurs.
|
||||||
|
|
||||||
|
|
||||||
|
THE CONSUMER
|
||||||
|
------------
|
||||||
|
|
||||||
|
The consumer will look something like this:
|
||||||
|
|
||||||
|
spin_lock(&consumer_lock);
|
||||||
|
|
||||||
|
unsigned long head = ACCESS_ONCE(buffer->head);
|
||||||
|
unsigned long tail = buffer->tail;
|
||||||
|
|
||||||
|
if (CIRC_CNT(head, tail, buffer->size) >= 1) {
|
||||||
|
/* read index before reading contents at that index */
|
||||||
|
smp_read_barrier_depends();
|
||||||
|
|
||||||
|
/* extract one item from the buffer */
|
||||||
|
struct item *item = buffer[tail];
|
||||||
|
|
||||||
|
consume_item(item);
|
||||||
|
|
||||||
|
smp_mb(); /* finish reading descriptor before incrementing tail */
|
||||||
|
|
||||||
|
buffer->tail = (tail + 1) & (buffer->size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock(&consumer_lock);
|
||||||
|
|
||||||
|
This will instruct the CPU to make sure the index is up to date before reading
|
||||||
|
the new item, and then it shall make sure the CPU has finished reading the item
|
||||||
|
before it writes the new tail pointer, which will erase the item.
|
||||||
|
|
||||||
|
|
||||||
|
Note the use of ACCESS_ONCE() in both algorithms to read the opposition index.
|
||||||
|
This prevents the compiler from discarding and reloading its cached value -
|
||||||
|
which some compilers will do across smp_read_barrier_depends(). This isn't
|
||||||
|
strictly needed if you can be sure that the opposition index will _only_ be
|
||||||
|
used the once.
|
||||||
|
|
||||||
|
|
||||||
|
===============
|
||||||
|
FURTHER READING
|
||||||
|
===============
|
||||||
|
|
||||||
|
See also Documentation/memory-barriers.txt for a description of Linux's memory
|
||||||
|
barrier facilities.
|
@@ -25,6 +25,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
|
|
||||||
#include <linux/connector.h>
|
#include <linux/connector.h>
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
|
|
||||||
What is imacfb?
|
What is efifb?
|
||||||
===============
|
===============
|
||||||
|
|
||||||
This is a generic EFI platform driver for Intel based Apple computers.
|
This is a generic EFI platform driver for Intel based Apple computers.
|
||||||
Imacfb is only for EFI booted Intel Macs.
|
efifb is only for EFI booted Intel Macs.
|
||||||
|
|
||||||
Supported Hardware
|
Supported Hardware
|
||||||
==================
|
==================
|
||||||
@@ -16,16 +16,16 @@ MacMini
|
|||||||
How to use it?
|
How to use it?
|
||||||
==============
|
==============
|
||||||
|
|
||||||
Imacfb does not have any kind of autodetection of your machine.
|
efifb does not have any kind of autodetection of your machine.
|
||||||
You have to add the following kernel parameters in your elilo.conf:
|
You have to add the following kernel parameters in your elilo.conf:
|
||||||
Macbook :
|
Macbook :
|
||||||
video=imacfb:macbook
|
video=efifb:macbook
|
||||||
MacMini :
|
MacMini :
|
||||||
video=imacfb:mini
|
video=efifb:mini
|
||||||
Macbook Pro 15", iMac 17" :
|
Macbook Pro 15", iMac 17" :
|
||||||
video=imacfb:i17
|
video=efifb:i17
|
||||||
Macbook Pro 17", iMac 20" :
|
Macbook Pro 17", iMac 20" :
|
||||||
video=imacfb:i20
|
video=efifb:i20
|
||||||
|
|
||||||
--
|
--
|
||||||
Edgar Hucek <gimli@dark-green.com>
|
Edgar Hucek <gimli@dark-green.com>
|
@@ -533,6 +533,24 @@ Who: Eric Miao <eric.y.miao@gmail.com>
|
|||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: sysfs-class-rfkill state file
|
||||||
|
When: Feb 2014
|
||||||
|
Files: net/rfkill/core.c
|
||||||
|
Why: Documented as obsolete since Feb 2010. This file is limited to 3
|
||||||
|
states while the rfkill drivers can have 4 states.
|
||||||
|
Who: anybody or Florian Mickler <florian@mickler.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: sysfs-class-rfkill claim file
|
||||||
|
When: Feb 2012
|
||||||
|
Files: net/rfkill/core.c
|
||||||
|
Why: It is not possible to claim an rfkill driver since 2007. This is
|
||||||
|
Documented as obsolete since Feb 2010.
|
||||||
|
Who: anybody or Florian Mickler <florian@mickler.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
What: capifs
|
What: capifs
|
||||||
When: February 2011
|
When: February 2011
|
||||||
Files: drivers/isdn/capi/capifs.*
|
Files: drivers/isdn/capi/capifs.*
|
||||||
@@ -580,6 +598,27 @@ Why: Useful in 2003, implementation is a hack.
|
|||||||
Seen as doing more harm than good.
|
Seen as doing more harm than good.
|
||||||
Who: Len Brown <len.brown@intel.com>
|
Who: Len Brown <len.brown@intel.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: iwlwifi 50XX module parameters
|
||||||
|
When: 2.6.40
|
||||||
|
Why: The "..50" modules parameters were used to configure 5000 series and
|
||||||
|
up devices; different set of module parameters also available for 4965
|
||||||
|
with same functionalities. Consolidate both set into single place
|
||||||
|
in drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
|
||||||
|
Who: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: iwl4965 alias support
|
||||||
|
When: 2.6.40
|
||||||
|
Why: Internal alias support has been present in module-init-tools for some
|
||||||
|
time, the MODULE_ALIAS("iwl4965") boilerplate aliases can be removed
|
||||||
|
with no impact.
|
||||||
|
|
||||||
|
Who: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: xt_NOTRACK
|
What: xt_NOTRACK
|
||||||
|
@@ -16,6 +16,8 @@ befs.txt
|
|||||||
- information about the BeOS filesystem for Linux.
|
- information about the BeOS filesystem for Linux.
|
||||||
bfs.txt
|
bfs.txt
|
||||||
- info for the SCO UnixWare Boot Filesystem (BFS).
|
- info for the SCO UnixWare Boot Filesystem (BFS).
|
||||||
|
ceph.txt
|
||||||
|
- info for the Ceph Distributed File System
|
||||||
cifs.txt
|
cifs.txt
|
||||||
- description of the CIFS filesystem.
|
- description of the CIFS filesystem.
|
||||||
coda.txt
|
coda.txt
|
||||||
|
@@ -37,6 +37,15 @@ For Plan 9 From User Space applications (http://swtch.com/plan9)
|
|||||||
|
|
||||||
mount -t 9p `namespace`/acme /mnt/9 -o trans=unix,uname=$USER
|
mount -t 9p `namespace`/acme /mnt/9 -o trans=unix,uname=$USER
|
||||||
|
|
||||||
|
For server running on QEMU host with virtio transport:
|
||||||
|
|
||||||
|
mount -t 9p -o trans=virtio <mount_tag> /mnt/9
|
||||||
|
|
||||||
|
where mount_tag is the tag associated by the server to each of the exported
|
||||||
|
mount points. Each 9P export is seen by the client as a virtio device with an
|
||||||
|
associated "mount_tag" property. Available mount tags can be
|
||||||
|
seen by reading /sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag files.
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
=======
|
=======
|
||||||
|
|
||||||
@@ -47,7 +56,7 @@ OPTIONS
|
|||||||
fd - used passed file descriptors for connection
|
fd - used passed file descriptors for connection
|
||||||
(see rfdno and wfdno)
|
(see rfdno and wfdno)
|
||||||
virtio - connect to the next virtio channel available
|
virtio - connect to the next virtio channel available
|
||||||
(from lguest or KVM with trans_virtio module)
|
(from QEMU with trans_virtio module)
|
||||||
rdma - connect to a specified RDMA channel
|
rdma - connect to a specified RDMA channel
|
||||||
|
|
||||||
uname=name user name to attempt mount as on the remote server. The
|
uname=name user name to attempt mount as on the remote server. The
|
||||||
@@ -85,7 +94,12 @@ OPTIONS
|
|||||||
|
|
||||||
port=n port to connect to on the remote server
|
port=n port to connect to on the remote server
|
||||||
|
|
||||||
noextend force legacy mode (no 9p2000.u semantics)
|
noextend force legacy mode (no 9p2000.u or 9p2000.L semantics)
|
||||||
|
|
||||||
|
version=name Select 9P protocol version. Valid options are:
|
||||||
|
9p2000 - Legacy mode (same as noextend)
|
||||||
|
9p2000.u - Use 9P2000.u protocol
|
||||||
|
9p2000.L - Use 9P2000.L protocol
|
||||||
|
|
||||||
dfltuid attempt to mount as a particular uid
|
dfltuid attempt to mount as a particular uid
|
||||||
|
|
||||||
|
140
Documentation/filesystems/ceph.txt
Normal file
140
Documentation/filesystems/ceph.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
Ceph Distributed File System
|
||||||
|
============================
|
||||||
|
|
||||||
|
Ceph is a distributed network file system designed to provide good
|
||||||
|
performance, reliability, and scalability.
|
||||||
|
|
||||||
|
Basic features include:
|
||||||
|
|
||||||
|
* POSIX semantics
|
||||||
|
* Seamless scaling from 1 to many thousands of nodes
|
||||||
|
* High availability and reliability. No single point of failure.
|
||||||
|
* N-way replication of data across storage nodes
|
||||||
|
* Fast recovery from node failures
|
||||||
|
* Automatic rebalancing of data on node addition/removal
|
||||||
|
* Easy deployment: most FS components are userspace daemons
|
||||||
|
|
||||||
|
Also,
|
||||||
|
* Flexible snapshots (on any directory)
|
||||||
|
* Recursive accounting (nested files, directories, bytes)
|
||||||
|
|
||||||
|
In contrast to cluster filesystems like GFS, OCFS2, and GPFS that rely
|
||||||
|
on symmetric access by all clients to shared block devices, Ceph
|
||||||
|
separates data and metadata management into independent server
|
||||||
|
clusters, similar to Lustre. Unlike Lustre, however, metadata and
|
||||||
|
storage nodes run entirely as user space daemons. Storage nodes
|
||||||
|
utilize btrfs to store data objects, leveraging its advanced features
|
||||||
|
(checksumming, metadata replication, etc.). File data is striped
|
||||||
|
across storage nodes in large chunks to distribute workload and
|
||||||
|
facilitate high throughputs. When storage nodes fail, data is
|
||||||
|
re-replicated in a distributed fashion by the storage nodes themselves
|
||||||
|
(with some minimal coordination from a cluster monitor), making the
|
||||||
|
system extremely efficient and scalable.
|
||||||
|
|
||||||
|
Metadata servers effectively form a large, consistent, distributed
|
||||||
|
in-memory cache above the file namespace that is extremely scalable,
|
||||||
|
dynamically redistributes metadata in response to workload changes,
|
||||||
|
and can tolerate arbitrary (well, non-Byzantine) node failures. The
|
||||||
|
metadata server takes a somewhat unconventional approach to metadata
|
||||||
|
storage to significantly improve performance for common workloads. In
|
||||||
|
particular, inodes with only a single link are embedded in
|
||||||
|
directories, allowing entire directories of dentries and inodes to be
|
||||||
|
loaded into its cache with a single I/O operation. The contents of
|
||||||
|
extremely large directories can be fragmented and managed by
|
||||||
|
independent metadata servers, allowing scalable concurrent access.
|
||||||
|
|
||||||
|
The system offers automatic data rebalancing/migration when scaling
|
||||||
|
from a small cluster of just a few nodes to many hundreds, without
|
||||||
|
requiring an administrator carve the data set into static volumes or
|
||||||
|
go through the tedious process of migrating data between servers.
|
||||||
|
When the file system approaches full, new nodes can be easily added
|
||||||
|
and things will "just work."
|
||||||
|
|
||||||
|
Ceph includes flexible snapshot mechanism that allows a user to create
|
||||||
|
a snapshot on any subdirectory (and its nested contents) in the
|
||||||
|
system. Snapshot creation and deletion are as simple as 'mkdir
|
||||||
|
.snap/foo' and 'rmdir .snap/foo'.
|
||||||
|
|
||||||
|
Ceph also provides some recursive accounting on directories for nested
|
||||||
|
files and bytes. That is, a 'getfattr -d foo' on any directory in the
|
||||||
|
system will reveal the total number of nested regular files and
|
||||||
|
subdirectories, and a summation of all nested file sizes. This makes
|
||||||
|
the identification of large disk space consumers relatively quick, as
|
||||||
|
no 'du' or similar recursive scan of the file system is required.
|
||||||
|
|
||||||
|
|
||||||
|
Mount Syntax
|
||||||
|
============
|
||||||
|
|
||||||
|
The basic mount syntax is:
|
||||||
|
|
||||||
|
# mount -t ceph monip[:port][,monip2[:port]...]:/[subdir] mnt
|
||||||
|
|
||||||
|
You only need to specify a single monitor, as the client will get the
|
||||||
|
full list when it connects. (However, if the monitor you specify
|
||||||
|
happens to be down, the mount won't succeed.) The port can be left
|
||||||
|
off if the monitor is using the default. So if the monitor is at
|
||||||
|
1.2.3.4,
|
||||||
|
|
||||||
|
# mount -t ceph 1.2.3.4:/ /mnt/ceph
|
||||||
|
|
||||||
|
is sufficient. If /sbin/mount.ceph is installed, a hostname can be
|
||||||
|
used instead of an IP address.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Mount Options
|
||||||
|
=============
|
||||||
|
|
||||||
|
ip=A.B.C.D[:N]
|
||||||
|
Specify the IP and/or port the client should bind to locally.
|
||||||
|
There is normally not much reason to do this. If the IP is not
|
||||||
|
specified, the client's IP address is determined by looking at the
|
||||||
|
address it's connection to the monitor originates from.
|
||||||
|
|
||||||
|
wsize=X
|
||||||
|
Specify the maximum write size in bytes. By default there is no
|
||||||
|
maximum. Ceph will normally size writes based on the file stripe
|
||||||
|
size.
|
||||||
|
|
||||||
|
rsize=X
|
||||||
|
Specify the maximum readahead.
|
||||||
|
|
||||||
|
mount_timeout=X
|
||||||
|
Specify the timeout value for mount (in seconds), in the case
|
||||||
|
of a non-responsive Ceph file system. The default is 30
|
||||||
|
seconds.
|
||||||
|
|
||||||
|
rbytes
|
||||||
|
When stat() is called on a directory, set st_size to 'rbytes',
|
||||||
|
the summation of file sizes over all files nested beneath that
|
||||||
|
directory. This is the default.
|
||||||
|
|
||||||
|
norbytes
|
||||||
|
When stat() is called on a directory, set st_size to the
|
||||||
|
number of entries in that directory.
|
||||||
|
|
||||||
|
nocrc
|
||||||
|
Disable CRC32C calculation for data writes. If set, the storage node
|
||||||
|
must rely on TCP's error correction to detect data corruption
|
||||||
|
in the data payload.
|
||||||
|
|
||||||
|
noasyncreaddir
|
||||||
|
Disable client's use its local cache to satisfy readdir
|
||||||
|
requests. (This does not change correctness; the client uses
|
||||||
|
cached metadata only when a lease or capability ensures it is
|
||||||
|
valid.)
|
||||||
|
|
||||||
|
|
||||||
|
More Information
|
||||||
|
================
|
||||||
|
|
||||||
|
For more information on Ceph, see the home page at
|
||||||
|
http://ceph.newdream.net/
|
||||||
|
|
||||||
|
The Linux kernel client source tree is available at
|
||||||
|
git://ceph.newdream.net/git/ceph-client.git
|
||||||
|
git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
|
||||||
|
|
||||||
|
and the source for the full system is at
|
||||||
|
git://ceph.newdream.net/git/ceph.git
|
@@ -82,11 +82,13 @@ tmpfs has a mount option to set the NUMA memory allocation policy for
|
|||||||
all files in that instance (if CONFIG_NUMA is enabled) - which can be
|
all files in that instance (if CONFIG_NUMA is enabled) - which can be
|
||||||
adjusted on the fly via 'mount -o remount ...'
|
adjusted on the fly via 'mount -o remount ...'
|
||||||
|
|
||||||
mpol=default prefers to allocate memory from the local node
|
mpol=default use the process allocation policy
|
||||||
|
(see set_mempolicy(2))
|
||||||
mpol=prefer:Node prefers to allocate memory from the given Node
|
mpol=prefer:Node prefers to allocate memory from the given Node
|
||||||
mpol=bind:NodeList allocates memory only from nodes in NodeList
|
mpol=bind:NodeList allocates memory only from nodes in NodeList
|
||||||
mpol=interleave prefers to allocate from each node in turn
|
mpol=interleave prefers to allocate from each node in turn
|
||||||
mpol=interleave:NodeList allocates from each node of NodeList in turn
|
mpol=interleave:NodeList allocates from each node of NodeList in turn
|
||||||
|
mpol=local prefers to allocate memory from the local node
|
||||||
|
|
||||||
NodeList format is a comma-separated list of decimal numbers and ranges,
|
NodeList format is a comma-separated list of decimal numbers and ranges,
|
||||||
a range being two hyphen-separated decimal numbers, the smallest and
|
a range being two hyphen-separated decimal numbers, the smallest and
|
||||||
@@ -134,3 +136,5 @@ Author:
|
|||||||
Christoph Rohland <cr@sap.com>, 1.12.01
|
Christoph Rohland <cr@sap.com>, 1.12.01
|
||||||
Updated:
|
Updated:
|
||||||
Hugh Dickins, 4 June 2007
|
Hugh Dickins, 4 June 2007
|
||||||
|
Updated:
|
||||||
|
KOSAKI Motohiro, 16 Mar 2010
|
||||||
|
@@ -291,6 +291,7 @@ Code Seq#(hex) Include File Comments
|
|||||||
0x92 00-0F drivers/usb/mon/mon_bin.c
|
0x92 00-0F drivers/usb/mon/mon_bin.c
|
||||||
0x93 60-7F linux/auto_fs.h
|
0x93 60-7F linux/auto_fs.h
|
||||||
0x94 all fs/btrfs/ioctl.h
|
0x94 all fs/btrfs/ioctl.h
|
||||||
|
0x97 00-7F fs/ceph/ioctl.h Ceph file system
|
||||||
0x99 00-0F 537-Addinboard driver
|
0x99 00-0F 537-Addinboard driver
|
||||||
<mailto:buk@buks.ipn.de>
|
<mailto:buk@buks.ipn.de>
|
||||||
0xA0 all linux/sdp/sdp.h Industrial Device Project
|
0xA0 all linux/sdp/sdp.h Industrial Device Project
|
||||||
|
@@ -59,37 +59,56 @@ nice to have in other objects. The C language does not allow for the
|
|||||||
direct expression of inheritance, so other techniques - such as structure
|
direct expression of inheritance, so other techniques - such as structure
|
||||||
embedding - must be used.
|
embedding - must be used.
|
||||||
|
|
||||||
So, for example, the UIO code has a structure that defines the memory
|
(As an aside, for those familiar with the kernel linked list implementation,
|
||||||
region associated with a uio device:
|
this is analogous as to how "list_head" structs are rarely useful on
|
||||||
|
their own, but are invariably found embedded in the larger objects of
|
||||||
|
interest.)
|
||||||
|
|
||||||
struct uio_mem {
|
So, for example, the UIO code in drivers/uio/uio.c has a structure that
|
||||||
|
defines the memory region associated with a uio device:
|
||||||
|
|
||||||
|
struct uio_map {
|
||||||
struct kobject kobj;
|
struct kobject kobj;
|
||||||
unsigned long addr;
|
struct uio_mem *mem;
|
||||||
unsigned long size;
|
};
|
||||||
int memtype;
|
|
||||||
void __iomem *internal_addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
If you have a struct uio_mem structure, finding its embedded kobject is
|
If you have a struct uio_map structure, finding its embedded kobject is
|
||||||
just a matter of using the kobj member. Code that works with kobjects will
|
just a matter of using the kobj member. Code that works with kobjects will
|
||||||
often have the opposite problem, however: given a struct kobject pointer,
|
often have the opposite problem, however: given a struct kobject pointer,
|
||||||
what is the pointer to the containing structure? You must avoid tricks
|
what is the pointer to the containing structure? You must avoid tricks
|
||||||
(such as assuming that the kobject is at the beginning of the structure)
|
(such as assuming that the kobject is at the beginning of the structure)
|
||||||
and, instead, use the container_of() macro, found in <linux/kernel.h>:
|
and, instead, use the container_of() macro, found in <linux/kernel.h>:
|
||||||
|
|
||||||
container_of(pointer, type, member)
|
container_of(pointer, type, member)
|
||||||
|
|
||||||
where pointer is the pointer to the embedded kobject, type is the type of
|
where:
|
||||||
the containing structure, and member is the name of the structure field to
|
|
||||||
which pointer points. The return value from container_of() is a pointer to
|
|
||||||
the given type. So, for example, a pointer "kp" to a struct kobject
|
|
||||||
embedded within a struct uio_mem could be converted to a pointer to the
|
|
||||||
containing uio_mem structure with:
|
|
||||||
|
|
||||||
struct uio_mem *u_mem = container_of(kp, struct uio_mem, kobj);
|
* "pointer" is the pointer to the embedded kobject,
|
||||||
|
* "type" is the type of the containing structure, and
|
||||||
|
* "member" is the name of the structure field to which "pointer" points.
|
||||||
|
|
||||||
Programmers often define a simple macro for "back-casting" kobject pointers
|
The return value from container_of() is a pointer to the corresponding
|
||||||
to the containing type.
|
container type. So, for example, a pointer "kp" to a struct kobject
|
||||||
|
embedded *within* a struct uio_map could be converted to a pointer to the
|
||||||
|
*containing* uio_map structure with:
|
||||||
|
|
||||||
|
struct uio_map *u_map = container_of(kp, struct uio_map, kobj);
|
||||||
|
|
||||||
|
For convenience, programmers often define a simple macro for "back-casting"
|
||||||
|
kobject pointers to the containing type. Exactly this happens in the
|
||||||
|
earlier drivers/uio/uio.c, as you can see here:
|
||||||
|
|
||||||
|
struct uio_map {
|
||||||
|
struct kobject kobj;
|
||||||
|
struct uio_mem *mem;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define to_map(map) container_of(map, struct uio_map, kobj)
|
||||||
|
|
||||||
|
where the macro argument "map" is a pointer to the struct kobject in
|
||||||
|
question. That macro is subsequently invoked with:
|
||||||
|
|
||||||
|
struct uio_map *map = to_map(kobj);
|
||||||
|
|
||||||
|
|
||||||
Initialization of kobjects
|
Initialization of kobjects
|
||||||
@@ -387,4 +406,5 @@ called, and the objects in the former circle release each other.
|
|||||||
Example code to copy from
|
Example code to copy from
|
||||||
|
|
||||||
For a more complete example of using ksets and kobjects properly, see the
|
For a more complete example of using ksets and kobjects properly, see the
|
||||||
sample/kobject/kset-example.c code.
|
example programs samples/kobject/{kobject-example.c,kset-example.c},
|
||||||
|
which will be built as loadable modules if you select CONFIG_SAMPLE_KOBJECT.
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
============================
|
============================
|
||||||
|
|
||||||
By: David Howells <dhowells@redhat.com>
|
By: David Howells <dhowells@redhat.com>
|
||||||
|
Paul E. McKenney <paulmck@linux.vnet.ibm.com>
|
||||||
|
|
||||||
Contents:
|
Contents:
|
||||||
|
|
||||||
@@ -60,6 +61,10 @@ Contents:
|
|||||||
|
|
||||||
- And then there's the Alpha.
|
- And then there's the Alpha.
|
||||||
|
|
||||||
|
(*) Example uses.
|
||||||
|
|
||||||
|
- Circular buffers.
|
||||||
|
|
||||||
(*) References.
|
(*) References.
|
||||||
|
|
||||||
|
|
||||||
@@ -2226,6 +2231,21 @@ The Alpha defines the Linux kernel's memory barrier model.
|
|||||||
See the subsection on "Cache Coherency" above.
|
See the subsection on "Cache Coherency" above.
|
||||||
|
|
||||||
|
|
||||||
|
============
|
||||||
|
EXAMPLE USES
|
||||||
|
============
|
||||||
|
|
||||||
|
CIRCULAR BUFFERS
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Memory barriers can be used to implement circular buffering without the need
|
||||||
|
of a lock to serialise the producer with the consumer. See:
|
||||||
|
|
||||||
|
Documentation/circular-buffers.txt
|
||||||
|
|
||||||
|
for details.
|
||||||
|
|
||||||
|
|
||||||
==========
|
==========
|
||||||
REFERENCES
|
REFERENCES
|
||||||
==========
|
==========
|
||||||
|
212
Documentation/networking/caif/Linux-CAIF.txt
Normal file
212
Documentation/networking/caif/Linux-CAIF.txt
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
Linux CAIF
|
||||||
|
===========
|
||||||
|
copyright (C) ST-Ericsson AB 2010
|
||||||
|
Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||||||
|
License terms: GNU General Public License (GPL) version 2
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
CAIF is a MUX protocol used by ST-Ericsson cellular modems for
|
||||||
|
communication between Modem and host. The host processes can open virtual AT
|
||||||
|
channels, initiate GPRS Data connections, Video channels and Utility Channels.
|
||||||
|
The Utility Channels are general purpose pipes between modem and host.
|
||||||
|
|
||||||
|
ST-Ericsson modems support a number of transports between modem
|
||||||
|
and host. Currently, UART and Loopback are available for Linux.
|
||||||
|
|
||||||
|
|
||||||
|
Architecture:
|
||||||
|
------------
|
||||||
|
The implementation of CAIF is divided into:
|
||||||
|
* CAIF Socket Layer, Kernel API, and Net Device.
|
||||||
|
* CAIF Core Protocol Implementation
|
||||||
|
* CAIF Link Layer, implemented as NET devices.
|
||||||
|
|
||||||
|
|
||||||
|
RTNL
|
||||||
|
!
|
||||||
|
! +------+ +------+ +------+
|
||||||
|
! +------+! +------+! +------+!
|
||||||
|
! ! Sock !! !Kernel!! ! Net !!
|
||||||
|
! ! API !+ ! API !+ ! Dev !+ <- CAIF Client APIs
|
||||||
|
! +------+ +------! +------+
|
||||||
|
! ! ! !
|
||||||
|
! +----------!----------+
|
||||||
|
! +------+ <- CAIF Protocol Implementation
|
||||||
|
+-------> ! CAIF !
|
||||||
|
! Core !
|
||||||
|
+------+
|
||||||
|
+--------!--------+
|
||||||
|
! !
|
||||||
|
+------+ +-----+
|
||||||
|
! ! ! TTY ! <- Link Layer (Net Devices)
|
||||||
|
+------+ +-----+
|
||||||
|
|
||||||
|
|
||||||
|
Using the Kernel API
|
||||||
|
----------------------
|
||||||
|
The Kernel API is used for accessing CAIF channels from the
|
||||||
|
kernel.
|
||||||
|
The user of the API has to implement two callbacks for receive
|
||||||
|
and control.
|
||||||
|
The receive callback gives a CAIF packet as a SKB. The control
|
||||||
|
callback will
|
||||||
|
notify of channel initialization complete, and flow-on/flow-
|
||||||
|
off.
|
||||||
|
|
||||||
|
|
||||||
|
struct caif_device caif_dev = {
|
||||||
|
.caif_config = {
|
||||||
|
.name = "MYDEV"
|
||||||
|
.type = CAIF_CHTY_AT
|
||||||
|
}
|
||||||
|
.receive_cb = my_receive,
|
||||||
|
.control_cb = my_control,
|
||||||
|
};
|
||||||
|
caif_add_device(&caif_dev);
|
||||||
|
caif_transmit(&caif_dev, skb);
|
||||||
|
|
||||||
|
See the caif_kernel.h for details about the CAIF kernel API.
|
||||||
|
|
||||||
|
|
||||||
|
I M P L E M E N T A T I O N
|
||||||
|
===========================
|
||||||
|
===========================
|
||||||
|
|
||||||
|
CAIF Core Protocol Layer
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
CAIF Core layer implements the CAIF protocol as defined by ST-Ericsson.
|
||||||
|
It implements the CAIF protocol stack in a layered approach, where
|
||||||
|
each layer described in the specification is implemented as a separate layer.
|
||||||
|
The architecture is inspired by the design patterns "Protocol Layer" and
|
||||||
|
"Protocol Packet".
|
||||||
|
|
||||||
|
== CAIF structure ==
|
||||||
|
The Core CAIF implementation contains:
|
||||||
|
- Simple implementation of CAIF.
|
||||||
|
- Layered architecture (a la Streams), each layer in the CAIF
|
||||||
|
specification is implemented in a separate c-file.
|
||||||
|
- Clients must implement PHY layer to access physical HW
|
||||||
|
with receive and transmit functions.
|
||||||
|
- Clients must call configuration function to add PHY layer.
|
||||||
|
- Clients must implement CAIF layer to consume/produce
|
||||||
|
CAIF payload with receive and transmit functions.
|
||||||
|
- Clients must call configuration function to add and connect the
|
||||||
|
Client layer.
|
||||||
|
- When receiving / transmitting CAIF Packets (cfpkt), ownership is passed
|
||||||
|
to the called function (except for framing layers' receive functions
|
||||||
|
or if a transmit function returns an error, in which case the caller
|
||||||
|
must free the packet).
|
||||||
|
|
||||||
|
Layered Architecture
|
||||||
|
--------------------
|
||||||
|
The CAIF protocol can be divided into two parts: Support functions and Protocol
|
||||||
|
Implementation. The support functions include:
|
||||||
|
|
||||||
|
- CFPKT CAIF Packet. Implementation of CAIF Protocol Packet. The
|
||||||
|
CAIF Packet has functions for creating, destroying and adding content
|
||||||
|
and for adding/extracting header and trailers to protocol packets.
|
||||||
|
|
||||||
|
- CFLST CAIF list implementation.
|
||||||
|
|
||||||
|
- CFGLUE CAIF Glue. Contains OS Specifics, such as memory
|
||||||
|
allocation, endianness, etc.
|
||||||
|
|
||||||
|
The CAIF Protocol implementation contains:
|
||||||
|
|
||||||
|
- CFCNFG CAIF Configuration layer. Configures the CAIF Protocol
|
||||||
|
Stack and provides a Client interface for adding Link-Layer and
|
||||||
|
Driver interfaces on top of the CAIF Stack.
|
||||||
|
|
||||||
|
- CFCTRL CAIF Control layer. Encodes and Decodes control messages
|
||||||
|
such as enumeration and channel setup. Also matches request and
|
||||||
|
response messages.
|
||||||
|
|
||||||
|
- CFSERVL General CAIF Service Layer functionality; handles flow
|
||||||
|
control and remote shutdown requests.
|
||||||
|
|
||||||
|
- CFVEI CAIF VEI layer. Handles CAIF AT Channels on VEI (Virtual
|
||||||
|
External Interface). This layer encodes/decodes VEI frames.
|
||||||
|
|
||||||
|
- CFDGML CAIF Datagram layer. Handles CAIF Datagram layer (IP
|
||||||
|
traffic), encodes/decodes Datagram frames.
|
||||||
|
|
||||||
|
- CFMUX CAIF Mux layer. Handles multiplexing between multiple
|
||||||
|
physical bearers and multiple channels such as VEI, Datagram, etc.
|
||||||
|
The MUX keeps track of the existing CAIF Channels and
|
||||||
|
Physical Instances and selects the apropriate instance based
|
||||||
|
on Channel-Id and Physical-ID.
|
||||||
|
|
||||||
|
- CFFRML CAIF Framing layer. Handles Framing i.e. Frame length
|
||||||
|
and frame checksum.
|
||||||
|
|
||||||
|
- CFSERL CAIF Serial layer. Handles concatenation/split of frames
|
||||||
|
into CAIF Frames with correct length.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
+---------+
|
||||||
|
| Config |
|
||||||
|
| CFCNFG |
|
||||||
|
+---------+
|
||||||
|
!
|
||||||
|
+---------+ +---------+ +---------+
|
||||||
|
| AT | | Control | | Datagram|
|
||||||
|
| CFVEIL | | CFCTRL | | CFDGML |
|
||||||
|
+---------+ +---------+ +---------+
|
||||||
|
\_____________!______________/
|
||||||
|
!
|
||||||
|
+---------+
|
||||||
|
| MUX |
|
||||||
|
| |
|
||||||
|
+---------+
|
||||||
|
_____!_____
|
||||||
|
/ \
|
||||||
|
+---------+ +---------+
|
||||||
|
| CFFRML | | CFFRML |
|
||||||
|
| Framing | | Framing |
|
||||||
|
+---------+ +---------+
|
||||||
|
! !
|
||||||
|
+---------+ +---------+
|
||||||
|
| | | Serial |
|
||||||
|
| | | CFSERL |
|
||||||
|
+---------+ +---------+
|
||||||
|
|
||||||
|
|
||||||
|
In this layered approach the following "rules" apply.
|
||||||
|
- All layers embed the same structure "struct cflayer"
|
||||||
|
- A layer does not depend on any other layer's private data.
|
||||||
|
- Layers are stacked by setting the pointers
|
||||||
|
layer->up , layer->dn
|
||||||
|
- In order to send data upwards, each layer should do
|
||||||
|
layer->up->receive(layer->up, packet);
|
||||||
|
- In order to send data downwards, each layer should do
|
||||||
|
layer->dn->transmit(layer->dn, packet);
|
||||||
|
|
||||||
|
|
||||||
|
Linux Driver Implementation
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Linux GPRS Net Device and CAIF socket are implemented on top of the
|
||||||
|
CAIF Core protocol. The Net device and CAIF socket have an instance of
|
||||||
|
'struct cflayer', just like the CAIF Core protocol stack.
|
||||||
|
Net device and Socket implement the 'receive()' function defined by
|
||||||
|
'struct cflayer', just like the rest of the CAIF stack. In this way, transmit and
|
||||||
|
receive of packets is handled as by the rest of the layers: the 'dn->transmit()'
|
||||||
|
function is called in order to transmit data.
|
||||||
|
|
||||||
|
The layer on top of the CAIF Core implementation is
|
||||||
|
sometimes referred to as the "Client layer".
|
||||||
|
|
||||||
|
|
||||||
|
Configuration of Link Layer
|
||||||
|
---------------------------
|
||||||
|
The Link Layer is implemented as Linux net devices (struct net_device).
|
||||||
|
Payload handling and registration is done using standard Linux mechanisms.
|
||||||
|
|
||||||
|
The CAIF Protocol relies on a loss-less link layer without implementing
|
||||||
|
retransmission. This implies that packet drops must not happen.
|
||||||
|
Therefore a flow-control mechanism is implemented where the physical
|
||||||
|
interface can initiate flow stop for all CAIF Channels.
|
109
Documentation/networking/caif/README
Normal file
109
Documentation/networking/caif/README
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
Copyright (C) ST-Ericsson AB 2010
|
||||||
|
Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||||||
|
License terms: GNU General Public License (GPL) version 2
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
=== Start ===
|
||||||
|
If you have compiled CAIF for modules do:
|
||||||
|
|
||||||
|
$modprobe crc_ccitt
|
||||||
|
$modprobe caif
|
||||||
|
$modprobe caif_socket
|
||||||
|
$modprobe chnl_net
|
||||||
|
|
||||||
|
|
||||||
|
=== Preparing the setup with a STE modem ===
|
||||||
|
|
||||||
|
If you are working on integration of CAIF you should make sure
|
||||||
|
that the kernel is built with module support.
|
||||||
|
|
||||||
|
There are some things that need to be tweaked to get the host TTY correctly
|
||||||
|
set up to talk to the modem.
|
||||||
|
Since the CAIF stack is running in the kernel and we want to use the existing
|
||||||
|
TTY, we are installing our physical serial driver as a line discipline above
|
||||||
|
the TTY device.
|
||||||
|
|
||||||
|
To achieve this we need to install the N_CAIF ldisc from user space.
|
||||||
|
The benefit is that we can hook up to any TTY.
|
||||||
|
|
||||||
|
The use of Start-of-frame-extension (STX) must also be set as
|
||||||
|
module parameter "ser_use_stx".
|
||||||
|
|
||||||
|
Normally Frame Checksum is always used on UART, but this is also provided as a
|
||||||
|
module parameter "ser_use_fcs".
|
||||||
|
|
||||||
|
$ modprobe caif_serial ser_ttyname=/dev/ttyS0 ser_use_stx=yes
|
||||||
|
$ ifconfig caif_ttyS0 up
|
||||||
|
|
||||||
|
PLEASE NOTE: There is a limitation in Android shell.
|
||||||
|
It only accepts one argument to insmod/modprobe!
|
||||||
|
|
||||||
|
=== Trouble shooting ===
|
||||||
|
|
||||||
|
There are debugfs parameters provided for serial communication.
|
||||||
|
/sys/kernel/debug/caif_serial/<tty-name>/
|
||||||
|
|
||||||
|
* ser_state: Prints the bit-mask status where
|
||||||
|
- 0x02 means SENDING, this is a transient state.
|
||||||
|
- 0x10 means FLOW_OFF_SENT, i.e. the previous frame has not been sent
|
||||||
|
and is blocking further send operation. Flow OFF has been propagated
|
||||||
|
to all CAIF Channels using this TTY.
|
||||||
|
|
||||||
|
* tty_status: Prints the bit-mask tty status information
|
||||||
|
- 0x01 - tty->warned is on.
|
||||||
|
- 0x02 - tty->low_latency is on.
|
||||||
|
- 0x04 - tty->packed is on.
|
||||||
|
- 0x08 - tty->flow_stopped is on.
|
||||||
|
- 0x10 - tty->hw_stopped is on.
|
||||||
|
- 0x20 - tty->stopped is on.
|
||||||
|
|
||||||
|
* last_tx_msg: Binary blob Prints the last transmitted frame.
|
||||||
|
This can be printed with
|
||||||
|
$od --format=x1 /sys/kernel/debug/caif_serial/<tty>/last_rx_msg.
|
||||||
|
The first two tx messages sent look like this. Note: The initial
|
||||||
|
byte 02 is start of frame extension (STX) used for re-syncing
|
||||||
|
upon errors.
|
||||||
|
|
||||||
|
- Enumeration:
|
||||||
|
0000000 02 05 00 00 03 01 d2 02
|
||||||
|
| | | | | |
|
||||||
|
STX(1) | | | |
|
||||||
|
Length(2)| | |
|
||||||
|
Control Channel(1)
|
||||||
|
Command:Enumeration(1)
|
||||||
|
Link-ID(1)
|
||||||
|
Checksum(2)
|
||||||
|
- Channel Setup:
|
||||||
|
0000000 02 07 00 00 00 21 a1 00 48 df
|
||||||
|
| | | | | | | |
|
||||||
|
STX(1) | | | | | |
|
||||||
|
Length(2)| | | | |
|
||||||
|
Control Channel(1)
|
||||||
|
Command:Channel Setup(1)
|
||||||
|
Channel Type(1)
|
||||||
|
Priority and Link-ID(1)
|
||||||
|
Endpoint(1)
|
||||||
|
Checksum(2)
|
||||||
|
|
||||||
|
* last_rx_msg: Prints the last transmitted frame.
|
||||||
|
The RX messages for LinkSetup look almost identical but they have the
|
||||||
|
bit 0x20 set in the command bit, and Channel Setup has added one byte
|
||||||
|
before Checksum containing Channel ID.
|
||||||
|
NOTE: Several CAIF Messages might be concatenated. The maximum debug
|
||||||
|
buffer size is 128 bytes.
|
||||||
|
|
||||||
|
== Error Scenarios:
|
||||||
|
- last_tx_msg contains channel setup message and last_rx_msg is empty ->
|
||||||
|
The host seems to be able to send over the UART, at least the CAIF ldisc get
|
||||||
|
notified that sending is completed.
|
||||||
|
|
||||||
|
- last_tx_msg contains enumeration message and last_rx_msg is empty ->
|
||||||
|
The host is not able to send the message from UART, the tty has not been
|
||||||
|
able to complete the transmit operation.
|
||||||
|
|
||||||
|
- if /sys/kernel/debug/caif_serial/<tty>/tty_status is non-zero there
|
||||||
|
might be problems transmitting over UART.
|
||||||
|
E.g. host and modem wiring is not correct you will typically see
|
||||||
|
tty_status = 0x10 (hw_stopped) and ser_state = 0x10 (FLOW_OFF_SENT).
|
||||||
|
You will probably see the enumeration message in last_tx_message
|
||||||
|
and empty last_rx_message.
|
@@ -1,44 +1,95 @@
|
|||||||
This brief document describes how to use the kernel's PPPoL2TP driver
|
This document describes how to use the kernel's L2TP drivers to
|
||||||
to provide L2TP functionality. L2TP is a protocol that tunnels one or
|
provide L2TP functionality. L2TP is a protocol that tunnels one or
|
||||||
more PPP sessions over a UDP tunnel. It is commonly used for VPNs
|
more sessions over an IP tunnel. It is commonly used for VPNs
|
||||||
(L2TP/IPSec) and by ISPs to tunnel subscriber PPP sessions over an IP
|
(L2TP/IPSec) and by ISPs to tunnel subscriber PPP sessions over an IP
|
||||||
network infrastructure.
|
network infrastructure. With L2TPv3, it is also useful as a Layer-2
|
||||||
|
tunneling infrastructure.
|
||||||
|
|
||||||
|
Features
|
||||||
|
========
|
||||||
|
|
||||||
|
L2TPv2 (PPP over L2TP (UDP tunnels)).
|
||||||
|
L2TPv3 ethernet pseudowires.
|
||||||
|
L2TPv3 PPP pseudowires.
|
||||||
|
L2TPv3 IP encapsulation.
|
||||||
|
Netlink sockets for L2TPv3 configuration management.
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
The original pppol2tp driver was introduced in 2.6.23 and provided
|
||||||
|
L2TPv2 functionality (rfc2661). L2TPv2 is used to tunnel one or more PPP
|
||||||
|
sessions over a UDP tunnel.
|
||||||
|
|
||||||
|
L2TPv3 (rfc3931) changes the protocol to allow different frame types
|
||||||
|
to be passed over an L2TP tunnel by moving the PPP-specific parts of
|
||||||
|
the protocol out of the core L2TP packet headers. Each frame type is
|
||||||
|
known as a pseudowire type. Ethernet, PPP, HDLC, Frame Relay and ATM
|
||||||
|
pseudowires for L2TP are defined in separate RFC standards. Another
|
||||||
|
change for L2TPv3 is that it can be carried directly over IP with no
|
||||||
|
UDP header (UDP is optional). It is also possible to create static
|
||||||
|
unmanaged L2TPv3 tunnels manually without a control protocol
|
||||||
|
(userspace daemon) to manage them.
|
||||||
|
|
||||||
|
To support L2TPv3, the original pppol2tp driver was split up to
|
||||||
|
separate the L2TP and PPP functionality. Existing L2TPv2 userspace
|
||||||
|
apps should be unaffected as the original pppol2tp sockets API is
|
||||||
|
retained. L2TPv3, however, uses netlink to manage L2TPv3 tunnels and
|
||||||
|
sessions.
|
||||||
|
|
||||||
Design
|
Design
|
||||||
======
|
======
|
||||||
|
|
||||||
The PPPoL2TP driver, drivers/net/pppol2tp.c, provides a mechanism by
|
The L2TP protocol separates control and data frames. The L2TP kernel
|
||||||
which PPP frames carried through an L2TP session are passed through
|
drivers handle only L2TP data frames; control frames are always
|
||||||
the kernel's PPP subsystem. The standard PPP daemon, pppd, handles all
|
handled by userspace. L2TP control frames carry messages between L2TP
|
||||||
PPP interaction with the peer. PPP network interfaces are created for
|
clients/servers and are used to setup / teardown tunnels and
|
||||||
each local PPP endpoint.
|
sessions. An L2TP client or server is implemented in userspace.
|
||||||
|
|
||||||
The L2TP protocol http://www.faqs.org/rfcs/rfc2661.html defines L2TP
|
Each L2TP tunnel is implemented using a UDP or L2TPIP socket; L2TPIP
|
||||||
control and data frames. L2TP control frames carry messages between
|
provides L2TPv3 IP encapsulation (no UDP) and is implemented using a
|
||||||
L2TP clients/servers and are used to setup / teardown tunnels and
|
new l2tpip socket family. The tunnel socket is typically created by
|
||||||
sessions. An L2TP client or server is implemented in userspace and
|
userspace, though for unmanaged L2TPv3 tunnels, the socket can also be
|
||||||
will use a regular UDP socket per tunnel. L2TP data frames carry PPP
|
created by the kernel. Each L2TP session (pseudowire) gets a network
|
||||||
frames, which may be PPP control or PPP data. The kernel's PPP
|
interface instance. In the case of PPP, these interfaces are created
|
||||||
|
indirectly by pppd using a pppol2tp socket. In the case of ethernet,
|
||||||
|
the netdevice is created upon a netlink request to create an L2TPv3
|
||||||
|
ethernet pseudowire.
|
||||||
|
|
||||||
|
For PPP, the PPPoL2TP driver, net/l2tp/l2tp_ppp.c, provides a
|
||||||
|
mechanism by which PPP frames carried through an L2TP session are
|
||||||
|
passed through the kernel's PPP subsystem. The standard PPP daemon,
|
||||||
|
pppd, handles all PPP interaction with the peer. PPP network
|
||||||
|
interfaces are created for each local PPP endpoint. The kernel's PPP
|
||||||
subsystem arranges for PPP control frames to be delivered to pppd,
|
subsystem arranges for PPP control frames to be delivered to pppd,
|
||||||
while data frames are forwarded as usual.
|
while data frames are forwarded as usual.
|
||||||
|
|
||||||
|
For ethernet, the L2TPETH driver, net/l2tp/l2tp_eth.c, implements a
|
||||||
|
netdevice driver, managing virtual ethernet devices, one per
|
||||||
|
pseudowire. These interfaces can be managed using standard Linux tools
|
||||||
|
such as "ip" and "ifconfig". If only IP frames are passed over the
|
||||||
|
tunnel, the interface can be given an IP addresses of itself and its
|
||||||
|
peer. If non-IP frames are to be passed over the tunnel, the interface
|
||||||
|
can be added to a bridge using brctl. All L2TP datapath protocol
|
||||||
|
functions are handled by the L2TP core driver.
|
||||||
|
|
||||||
Each tunnel and session within a tunnel is assigned a unique tunnel_id
|
Each tunnel and session within a tunnel is assigned a unique tunnel_id
|
||||||
and session_id. These ids are carried in the L2TP header of every
|
and session_id. These ids are carried in the L2TP header of every
|
||||||
control and data packet. The pppol2tp driver uses them to lookup
|
control and data packet. (Actually, in L2TPv3, the tunnel_id isn't
|
||||||
internal tunnel and/or session contexts. Zero tunnel / session ids are
|
present in data frames - it is inferred from the IP connection on
|
||||||
treated specially - zero ids are never assigned to tunnels or sessions
|
which the packet was received.) The L2TP driver uses the ids to lookup
|
||||||
in the network. In the driver, the tunnel context keeps a pointer to
|
internal tunnel and/or session contexts to determine how to handle the
|
||||||
the tunnel UDP socket. The session context keeps a pointer to the
|
packet. Zero tunnel / session ids are treated specially - zero ids are
|
||||||
PPPoL2TP socket, as well as other data that lets the driver interface
|
never assigned to tunnels or sessions in the network. In the driver,
|
||||||
to the kernel PPP subsystem.
|
the tunnel context keeps a reference to the tunnel UDP or L2TPIP
|
||||||
|
socket. The session context holds data that lets the driver interface
|
||||||
|
to the kernel's network frame type subsystems, i.e. PPP, ethernet.
|
||||||
|
|
||||||
Note that the pppol2tp kernel driver handles only L2TP data frames;
|
Userspace Programming
|
||||||
L2TP control frames are simply passed up to userspace in the UDP
|
=====================
|
||||||
tunnel socket. The kernel handles all datapath aspects of the
|
|
||||||
protocol, including data packet resequencing (if enabled).
|
|
||||||
|
|
||||||
There are a number of requirements on the userspace L2TP daemon in
|
For L2TPv2, there are a number of requirements on the userspace L2TP
|
||||||
order to use the pppol2tp driver.
|
daemon in order to use the pppol2tp driver.
|
||||||
|
|
||||||
1. Use a UDP socket per tunnel.
|
1. Use a UDP socket per tunnel.
|
||||||
|
|
||||||
@@ -86,6 +137,35 @@ In addition to the standard PPP ioctls, a PPPIOCGL2TPSTATS is provided
|
|||||||
to retrieve tunnel and session statistics from the kernel using the
|
to retrieve tunnel and session statistics from the kernel using the
|
||||||
PPPoX socket of the appropriate tunnel or session.
|
PPPoX socket of the appropriate tunnel or session.
|
||||||
|
|
||||||
|
For L2TPv3, userspace must use the netlink API defined in
|
||||||
|
include/linux/l2tp.h to manage tunnel and session contexts. The
|
||||||
|
general procedure to create a new L2TP tunnel with one session is:-
|
||||||
|
|
||||||
|
1. Open a GENL socket using L2TP_GENL_NAME for configuring the kernel
|
||||||
|
using netlink.
|
||||||
|
|
||||||
|
2. Create a UDP or L2TPIP socket for the tunnel.
|
||||||
|
|
||||||
|
3. Create a new L2TP tunnel using a L2TP_CMD_TUNNEL_CREATE
|
||||||
|
request. Set attributes according to desired tunnel parameters,
|
||||||
|
referencing the UDP or L2TPIP socket created in the previous step.
|
||||||
|
|
||||||
|
4. Create a new L2TP session in the tunnel using a
|
||||||
|
L2TP_CMD_SESSION_CREATE request.
|
||||||
|
|
||||||
|
The tunnel and all of its sessions are closed when the tunnel socket
|
||||||
|
is closed. The netlink API may also be used to delete sessions and
|
||||||
|
tunnels. Configuration and status info may be set or read using netlink.
|
||||||
|
|
||||||
|
The L2TP driver also supports static (unmanaged) L2TPv3 tunnels. These
|
||||||
|
are where there is no L2TP control message exchange with the peer to
|
||||||
|
setup the tunnel; the tunnel is configured manually at each end of the
|
||||||
|
tunnel. There is no need for an L2TP userspace application in this
|
||||||
|
case -- the tunnel socket is created by the kernel and configured
|
||||||
|
using parameters sent in the L2TP_CMD_TUNNEL_CREATE netlink
|
||||||
|
request. The "ip" utility of iproute2 has commands for managing static
|
||||||
|
L2TPv3 tunnels; do "ip l2tp help" for more information.
|
||||||
|
|
||||||
Debugging
|
Debugging
|
||||||
=========
|
=========
|
||||||
|
|
||||||
@@ -102,6 +182,69 @@ PPPOL2TP_MSG_CONTROL userspace - kernel interface
|
|||||||
PPPOL2TP_MSG_SEQ sequence numbers handling
|
PPPOL2TP_MSG_SEQ sequence numbers handling
|
||||||
PPPOL2TP_MSG_DATA data packets
|
PPPOL2TP_MSG_DATA data packets
|
||||||
|
|
||||||
|
If enabled, files under a l2tp debugfs directory can be used to dump
|
||||||
|
kernel state about L2TP tunnels and sessions. To access it, the
|
||||||
|
debugfs filesystem must first be mounted.
|
||||||
|
|
||||||
|
# mount -t debugfs debugfs /debug
|
||||||
|
|
||||||
|
Files under the l2tp directory can then be accessed.
|
||||||
|
|
||||||
|
# cat /debug/l2tp/tunnels
|
||||||
|
|
||||||
|
The debugfs files should not be used by applications to obtain L2TP
|
||||||
|
state information because the file format is subject to change. It is
|
||||||
|
implemented to provide extra debug information to help diagnose
|
||||||
|
problems.) Users should use the netlink API.
|
||||||
|
|
||||||
|
/proc/net/pppol2tp is also provided for backwards compaibility with
|
||||||
|
the original pppol2tp driver. It lists information about L2TPv2
|
||||||
|
tunnels and sessions only. Its use is discouraged.
|
||||||
|
|
||||||
|
Unmanaged L2TPv3 Tunnels
|
||||||
|
========================
|
||||||
|
|
||||||
|
Some commercial L2TP products support unmanaged L2TPv3 ethernet
|
||||||
|
tunnels, where there is no L2TP control protocol; tunnels are
|
||||||
|
configured at each side manually. New commands are available in
|
||||||
|
iproute2's ip utility to support this.
|
||||||
|
|
||||||
|
To create an L2TPv3 ethernet pseudowire between local host 192.168.1.1
|
||||||
|
and peer 192.168.1.2, using IP addresses 10.5.1.1 and 10.5.1.2 for the
|
||||||
|
tunnel endpoints:-
|
||||||
|
|
||||||
|
# modprobe l2tp_eth
|
||||||
|
# modprobe l2tp_netlink
|
||||||
|
|
||||||
|
# ip l2tp add tunnel tunnel_id 1 peer_tunnel_id 1 udp_sport 5000 \
|
||||||
|
udp_dport 5000 encap udp local 192.168.1.1 remote 192.168.1.2
|
||||||
|
# ip l2tp add session tunnel_id 1 session_id 1 peer_session_id 1
|
||||||
|
# ifconfig -a
|
||||||
|
# ip addr add 10.5.1.2/32 peer 10.5.1.1/32 dev l2tpeth0
|
||||||
|
# ifconfig l2tpeth0 up
|
||||||
|
|
||||||
|
Choose IP addresses to be the address of a local IP interface and that
|
||||||
|
of the remote system. The IP addresses of the l2tpeth0 interface can be
|
||||||
|
anything suitable.
|
||||||
|
|
||||||
|
Repeat the above at the peer, with ports, tunnel/session ids and IP
|
||||||
|
addresses reversed. The tunnel and session IDs can be any non-zero
|
||||||
|
32-bit number, but the values must be reversed at the peer.
|
||||||
|
|
||||||
|
Host 1 Host2
|
||||||
|
udp_sport=5000 udp_sport=5001
|
||||||
|
udp_dport=5001 udp_dport=5000
|
||||||
|
tunnel_id=42 tunnel_id=45
|
||||||
|
peer_tunnel_id=45 peer_tunnel_id=42
|
||||||
|
session_id=128 session_id=5196755
|
||||||
|
peer_session_id=5196755 peer_session_id=128
|
||||||
|
|
||||||
|
When done at both ends of the tunnel, it should be possible to send
|
||||||
|
data over the network. e.g.
|
||||||
|
|
||||||
|
# ping 10.5.1.1
|
||||||
|
|
||||||
|
|
||||||
Sample Userspace Code
|
Sample Userspace Code
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
@@ -158,12 +301,48 @@ Sample Userspace Code
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Miscellaneous
|
Internal Implementation
|
||||||
============
|
=======================
|
||||||
|
|
||||||
The PPPoL2TP driver was developed as part of the OpenL2TP project by
|
The driver keeps a struct l2tp_tunnel context per L2TP tunnel and a
|
||||||
|
struct l2tp_session context for each session. The l2tp_tunnel is
|
||||||
|
always associated with a UDP or L2TP/IP socket and keeps a list of
|
||||||
|
sessions in the tunnel. The l2tp_session context keeps kernel state
|
||||||
|
about the session. It has private data which is used for data specific
|
||||||
|
to the session type. With L2TPv2, the session always carried PPP
|
||||||
|
traffic. With L2TPv3, the session can also carry ethernet frames
|
||||||
|
(ethernet pseudowire) or other data types such as ATM, HDLC or Frame
|
||||||
|
Relay.
|
||||||
|
|
||||||
|
When a tunnel is first opened, the reference count on the socket is
|
||||||
|
increased using sock_hold(). This ensures that the kernel socket
|
||||||
|
cannot be removed while L2TP's data structures reference it.
|
||||||
|
|
||||||
|
Some L2TP sessions also have a socket (PPP pseudowires) while others
|
||||||
|
do not (ethernet pseudowires). We can't use the socket reference count
|
||||||
|
as the reference count for session contexts. The L2TP implementation
|
||||||
|
therefore has its own internal reference counts on the session
|
||||||
|
contexts.
|
||||||
|
|
||||||
|
To Do
|
||||||
|
=====
|
||||||
|
|
||||||
|
Add L2TP tunnel switching support. This would route tunneled traffic
|
||||||
|
from one L2TP tunnel into another. Specified in
|
||||||
|
http://tools.ietf.org/html/draft-ietf-l2tpext-tunnel-switching-08
|
||||||
|
|
||||||
|
Add L2TPv3 VLAN pseudowire support.
|
||||||
|
|
||||||
|
Add L2TPv3 IP pseudowire support.
|
||||||
|
|
||||||
|
Add L2TPv3 ATM pseudowire support.
|
||||||
|
|
||||||
|
Miscellaneous
|
||||||
|
=============
|
||||||
|
|
||||||
|
The L2TP drivers were developed as part of the OpenL2TP project by
|
||||||
Katalix Systems Ltd. OpenL2TP is a full-featured L2TP client / server,
|
Katalix Systems Ltd. OpenL2TP is a full-featured L2TP client / server,
|
||||||
designed from the ground up to have the L2TP datapath in the
|
designed from the ground up to have the L2TP datapath in the
|
||||||
kernel. The project also implemented the pppol2tp plugin for pppd
|
kernel. The project also implemented the pppol2tp plugin for pppd
|
||||||
which allows pppd to use the kernel driver. Details can be found at
|
which allows pppd to use the kernel driver. Details can be found at
|
||||||
http://openl2tp.sourceforge.net.
|
http://www.openl2tp.org.
|
||||||
|
143
Documentation/networking/stmmac.txt
Normal file
143
Documentation/networking/stmmac.txt
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
STMicroelectronics 10/100/1000 Synopsys Ethernet driver
|
||||||
|
|
||||||
|
Copyright (C) 2007-2010 STMicroelectronics Ltd
|
||||||
|
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||||
|
|
||||||
|
This is the driver for the MAC 10/100/1000 on-chip Ethernet controllers
|
||||||
|
(Synopsys IP blocks); it has been fully tested on STLinux platforms.
|
||||||
|
|
||||||
|
Currently this network device driver is for all STM embedded MAC/GMAC
|
||||||
|
(7xxx SoCs).
|
||||||
|
|
||||||
|
DWC Ether MAC 10/100/1000 Universal version 3.41a and DWC Ether MAC 10/100
|
||||||
|
Universal version 4.0 have been used for developing the first code
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
Please, for more information also visit: www.stlinux.com
|
||||||
|
|
||||||
|
1) Kernel Configuration
|
||||||
|
The kernel configuration option is STMMAC_ETH:
|
||||||
|
Device Drivers ---> Network device support ---> Ethernet (1000 Mbit) --->
|
||||||
|
STMicroelectronics 10/100/1000 Ethernet driver (STMMAC_ETH)
|
||||||
|
|
||||||
|
2) Driver parameters list:
|
||||||
|
debug: message level (0: no output, 16: all);
|
||||||
|
phyaddr: to manually provide the physical address to the PHY device;
|
||||||
|
dma_rxsize: DMA rx ring size;
|
||||||
|
dma_txsize: DMA tx ring size;
|
||||||
|
buf_sz: DMA buffer size;
|
||||||
|
tc: control the HW FIFO threshold;
|
||||||
|
tx_coe: Enable/Disable Tx Checksum Offload engine;
|
||||||
|
watchdog: transmit timeout (in milliseconds);
|
||||||
|
flow_ctrl: Flow control ability [on/off];
|
||||||
|
pause: Flow Control Pause Time;
|
||||||
|
tmrate: timer period (only if timer optimisation is configured).
|
||||||
|
|
||||||
|
3) Command line options
|
||||||
|
Driver parameters can be also passed in command line by using:
|
||||||
|
stmmaceth=dma_rxsize:128,dma_txsize:512
|
||||||
|
|
||||||
|
4) Driver information and notes
|
||||||
|
|
||||||
|
4.1) Transmit process
|
||||||
|
The xmit method is invoked when the kernel needs to transmit a packet; it sets
|
||||||
|
the descriptors in the ring and informs the DMA engine that there is a packet
|
||||||
|
ready to be transmitted.
|
||||||
|
Once the controller has finished transmitting the packet, an interrupt is
|
||||||
|
triggered; So the driver will be able to release the socket buffers.
|
||||||
|
By default, the driver sets the NETIF_F_SG bit in the features field of the
|
||||||
|
net_device structure enabling the scatter/gather feature.
|
||||||
|
|
||||||
|
4.2) Receive process
|
||||||
|
When one or more packets are received, an interrupt happens. The interrupts
|
||||||
|
are not queued so the driver has to scan all the descriptors in the ring during
|
||||||
|
the receive process.
|
||||||
|
This is based on NAPI so the interrupt handler signals only if there is work to be
|
||||||
|
done, and it exits.
|
||||||
|
Then the poll method will be scheduled at some future point.
|
||||||
|
The incoming packets are stored, by the DMA, in a list of pre-allocated socket
|
||||||
|
buffers in order to avoid the memcpy (Zero-copy).
|
||||||
|
|
||||||
|
4.3) Timer-Driver Interrupt
|
||||||
|
Instead of having the device that asynchronously notifies the frame receptions, the
|
||||||
|
driver configures a timer to generate an interrupt at regular intervals.
|
||||||
|
Based on the granularity of the timer, the frames that are received by the device
|
||||||
|
will experience different levels of latency. Some NICs have dedicated timer
|
||||||
|
device to perform this task. STMMAC can use either the RTC device or the TMU
|
||||||
|
channel 2 on STLinux platforms.
|
||||||
|
The timers frequency can be passed to the driver as parameter; when change it,
|
||||||
|
take care of both hardware capability and network stability/performance impact.
|
||||||
|
Several performance tests on STM platforms showed this optimisation allows to spare
|
||||||
|
the CPU while having the maximum throughput.
|
||||||
|
|
||||||
|
4.4) WOL
|
||||||
|
Wake up on Lan feature through Magic Frame is only supported for the GMAC
|
||||||
|
core.
|
||||||
|
|
||||||
|
4.5) DMA descriptors
|
||||||
|
Driver handles both normal and enhanced descriptors. The latter has been only
|
||||||
|
tested on DWC Ether MAC 10/100/1000 Universal version 3.41a.
|
||||||
|
|
||||||
|
4.6) Ethtool support
|
||||||
|
Ethtool is supported. Driver statistics and internal errors can be taken using:
|
||||||
|
ethtool -S ethX command. It is possible to dump registers etc.
|
||||||
|
|
||||||
|
4.7) Jumbo and Segmentation Offloading
|
||||||
|
Jumbo frames are supported and tested for the GMAC.
|
||||||
|
The GSO has been also added but it's performed in software.
|
||||||
|
LRO is not supported.
|
||||||
|
|
||||||
|
4.8) Physical
|
||||||
|
The driver is compatible with PAL to work with PHY and GPHY devices.
|
||||||
|
|
||||||
|
4.9) Platform information
|
||||||
|
Several information came from the platform; please refer to the
|
||||||
|
driver's Header file in include/linux directory.
|
||||||
|
|
||||||
|
struct plat_stmmacenet_data {
|
||||||
|
int bus_id;
|
||||||
|
int pbl;
|
||||||
|
int has_gmac;
|
||||||
|
void (*fix_mac_speed)(void *priv, unsigned int speed);
|
||||||
|
void (*bus_setup)(unsigned long ioaddr);
|
||||||
|
#ifdef CONFIG_STM_DRIVERS
|
||||||
|
struct stm_pad_config *pad_config;
|
||||||
|
#endif
|
||||||
|
void *bsp_priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
Where:
|
||||||
|
- pbl (Programmable Burst Length) is maximum number of
|
||||||
|
beats to be transferred in one DMA transaction.
|
||||||
|
GMAC also enables the 4xPBL by default.
|
||||||
|
- fix_mac_speed and bus_setup are used to configure internal target
|
||||||
|
registers (on STM platforms);
|
||||||
|
- has_gmac: GMAC core is on board (get it at run-time in the next step);
|
||||||
|
- bus_id: bus identifier.
|
||||||
|
|
||||||
|
struct plat_stmmacphy_data {
|
||||||
|
int bus_id;
|
||||||
|
int phy_addr;
|
||||||
|
unsigned int phy_mask;
|
||||||
|
int interface;
|
||||||
|
int (*phy_reset)(void *priv);
|
||||||
|
void *priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
Where:
|
||||||
|
- bus_id: bus identifier;
|
||||||
|
- phy_addr: physical address used for the attached phy device;
|
||||||
|
set it to -1 to get it at run-time;
|
||||||
|
- interface: physical MII interface mode;
|
||||||
|
- phy_reset: hook to reset HW function.
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- Continue to make the driver more generic and suitable for other Synopsys
|
||||||
|
Ethernet controllers used on other architectures (i.e. ARM).
|
||||||
|
- 10G controllers are not supported.
|
||||||
|
- MAC uses Normal descriptors and GMAC uses enhanced ones.
|
||||||
|
This is a limit that should be reviewed. MAC could want to
|
||||||
|
use the enhanced structure.
|
||||||
|
- Checksumming: Rx/Tx csum is done in HW in case of GMAC only.
|
||||||
|
- Review the timer optimisation code to use an embedded device that seems to be
|
||||||
|
available in new chip generations.
|
@@ -41,11 +41,12 @@ SOF_TIMESTAMPING_SOFTWARE: return system time stamp generated in
|
|||||||
SOF_TIMESTAMPING_TX/RX determine how time stamps are generated.
|
SOF_TIMESTAMPING_TX/RX determine how time stamps are generated.
|
||||||
SOF_TIMESTAMPING_RAW/SYS determine how they are reported in the
|
SOF_TIMESTAMPING_RAW/SYS determine how they are reported in the
|
||||||
following control message:
|
following control message:
|
||||||
struct scm_timestamping {
|
|
||||||
struct timespec systime;
|
struct scm_timestamping {
|
||||||
struct timespec hwtimetrans;
|
struct timespec systime;
|
||||||
struct timespec hwtimeraw;
|
struct timespec hwtimetrans;
|
||||||
};
|
struct timespec hwtimeraw;
|
||||||
|
};
|
||||||
|
|
||||||
recvmsg() can be used to get this control message for regular incoming
|
recvmsg() can be used to get this control message for regular incoming
|
||||||
packets. For send time stamps the outgoing packet is looped back to
|
packets. For send time stamps the outgoing packet is looped back to
|
||||||
@@ -87,12 +88,13 @@ by the network device and will be empty without that support.
|
|||||||
SIOCSHWTSTAMP:
|
SIOCSHWTSTAMP:
|
||||||
|
|
||||||
Hardware time stamping must also be initialized for each device driver
|
Hardware time stamping must also be initialized for each device driver
|
||||||
that is expected to do hardware time stamping. The parameter is:
|
that is expected to do hardware time stamping. The parameter is defined in
|
||||||
|
/include/linux/net_tstamp.h as:
|
||||||
|
|
||||||
struct hwtstamp_config {
|
struct hwtstamp_config {
|
||||||
int flags; /* no flags defined right now, must be zero */
|
int flags; /* no flags defined right now, must be zero */
|
||||||
int tx_type; /* HWTSTAMP_TX_* */
|
int tx_type; /* HWTSTAMP_TX_* */
|
||||||
int rx_filter; /* HWTSTAMP_FILTER_* */
|
int rx_filter; /* HWTSTAMP_FILTER_* */
|
||||||
};
|
};
|
||||||
|
|
||||||
Desired behavior is passed into the kernel and to a specific device by
|
Desired behavior is passed into the kernel and to a specific device by
|
||||||
@@ -139,42 +141,56 @@ enum {
|
|||||||
/* time stamp any incoming packet */
|
/* time stamp any incoming packet */
|
||||||
HWTSTAMP_FILTER_ALL,
|
HWTSTAMP_FILTER_ALL,
|
||||||
|
|
||||||
/* return value: time stamp all packets requested plus some others */
|
/* return value: time stamp all packets requested plus some others */
|
||||||
HWTSTAMP_FILTER_SOME,
|
HWTSTAMP_FILTER_SOME,
|
||||||
|
|
||||||
/* PTP v1, UDP, any kind of event packet */
|
/* PTP v1, UDP, any kind of event packet */
|
||||||
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
|
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
|
||||||
|
|
||||||
...
|
/* for the complete list of values, please check
|
||||||
|
* the include file /include/linux/net_tstamp.h
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
DEVICE IMPLEMENTATION
|
DEVICE IMPLEMENTATION
|
||||||
|
|
||||||
A driver which supports hardware time stamping must support the
|
A driver which supports hardware time stamping must support the
|
||||||
SIOCSHWTSTAMP ioctl. Time stamps for received packets must be stored
|
SIOCSHWTSTAMP ioctl and update the supplied struct hwtstamp_config with
|
||||||
in the skb with skb_hwtstamp_set().
|
the actual values as described in the section on SIOCSHWTSTAMP.
|
||||||
|
|
||||||
|
Time stamps for received packets must be stored in the skb. To get a pointer
|
||||||
|
to the shared time stamp structure of the skb call skb_hwtstamps(). Then
|
||||||
|
set the time stamps in the structure:
|
||||||
|
|
||||||
|
struct skb_shared_hwtstamps {
|
||||||
|
/* hardware time stamp transformed into duration
|
||||||
|
* since arbitrary point in time
|
||||||
|
*/
|
||||||
|
ktime_t hwtstamp;
|
||||||
|
ktime_t syststamp; /* hwtstamp transformed to system time base */
|
||||||
|
};
|
||||||
|
|
||||||
Time stamps for outgoing packets are to be generated as follows:
|
Time stamps for outgoing packets are to be generated as follows:
|
||||||
- In hard_start_xmit(), check if skb_hwtstamp_check_tx_hardware()
|
- In hard_start_xmit(), check if skb_tx(skb)->hardware is set no-zero.
|
||||||
returns non-zero. If yes, then the driver is expected
|
If yes, then the driver is expected to do hardware time stamping.
|
||||||
to do hardware time stamping.
|
|
||||||
- If this is possible for the skb and requested, then declare
|
- If this is possible for the skb and requested, then declare
|
||||||
that the driver is doing the time stamping by calling
|
that the driver is doing the time stamping by setting the field
|
||||||
skb_hwtstamp_tx_in_progress(). A driver not supporting
|
skb_tx(skb)->in_progress non-zero. You might want to keep a pointer
|
||||||
hardware time stamping doesn't do that. A driver must never
|
to the associated skb for the next step and not free the skb. A driver
|
||||||
touch sk_buff::tstamp! It is used to store how time stamping
|
not supporting hardware time stamping doesn't do that. A driver must
|
||||||
for an outgoing packets is to be done.
|
never touch sk_buff::tstamp! It is used to store software generated
|
||||||
|
time stamps by the network subsystem.
|
||||||
- As soon as the driver has sent the packet and/or obtained a
|
- As soon as the driver has sent the packet and/or obtained a
|
||||||
hardware time stamp for it, it passes the time stamp back by
|
hardware time stamp for it, it passes the time stamp back by
|
||||||
calling skb_hwtstamp_tx() with the original skb, the raw
|
calling skb_hwtstamp_tx() with the original skb, the raw
|
||||||
hardware time stamp and a handle to the device (necessary
|
hardware time stamp. skb_hwtstamp_tx() clones the original skb and
|
||||||
to convert the hardware time stamp to system time). If obtaining
|
adds the timestamps, therefore the original skb has to be freed now.
|
||||||
the hardware time stamp somehow fails, then the driver should
|
If obtaining the hardware time stamp somehow fails, then the driver
|
||||||
not fall back to software time stamping. The rationale is that
|
should not fall back to software time stamping. The rationale is that
|
||||||
this would occur at a later time in the processing pipeline
|
this would occur at a later time in the processing pipeline than other
|
||||||
than other software time stamping and therefore could lead
|
software time stamping and therefore could lead to unexpected deltas
|
||||||
to unexpected deltas between time stamps.
|
between time stamps.
|
||||||
- If the driver did not call skb_hwtstamp_tx_in_progress(), then
|
- If the driver did not call set skb_tx(skb)->in_progress, then
|
||||||
dev_hard_start_xmit() checks whether software time stamping
|
dev_hard_start_xmit() checks whether software time stamping
|
||||||
is wanted as fallback and potentially generates the time stamp.
|
is wanted as fallback and potentially generates the time stamp.
|
||||||
|
@@ -21,6 +21,15 @@ Required properties:
|
|||||||
- fsl,qe-num-snums: define how many serial number(SNUM) the QE can use for the
|
- fsl,qe-num-snums: define how many serial number(SNUM) the QE can use for the
|
||||||
threads.
|
threads.
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- fsl,firmware-phandle:
|
||||||
|
Usage: required only if there is no fsl,qe-firmware child node
|
||||||
|
Value type: <phandle>
|
||||||
|
Definition: Points to a firmware node (see "QE Firmware Node" below)
|
||||||
|
that contains the firmware that should be uploaded for this QE.
|
||||||
|
The compatible property for the firmware node should say,
|
||||||
|
"fsl,qe-firmware".
|
||||||
|
|
||||||
Recommended properties
|
Recommended properties
|
||||||
- brg-frequency : the internal clock source frequency for baud-rate
|
- brg-frequency : the internal clock source frequency for baud-rate
|
||||||
generators in Hz.
|
generators in Hz.
|
||||||
@@ -59,3 +68,48 @@ Example:
|
|||||||
reg = <0 c000>;
|
reg = <0 c000>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
* QE Firmware Node
|
||||||
|
|
||||||
|
This node defines a firmware binary that is embedded in the device tree, for
|
||||||
|
the purpose of passing the firmware from bootloader to the kernel, or from
|
||||||
|
the hypervisor to the guest.
|
||||||
|
|
||||||
|
The firmware node itself contains the firmware binary contents, a compatible
|
||||||
|
property, and any firmware-specific properties. The node should be placed
|
||||||
|
inside a QE node that needs it. Doing so eliminates the need for a
|
||||||
|
fsl,firmware-phandle property. Other QE nodes that need the same firmware
|
||||||
|
should define an fsl,firmware-phandle property that points to the firmware node
|
||||||
|
in the first QE node.
|
||||||
|
|
||||||
|
The fsl,firmware property can be specified in the DTS (possibly using incbin)
|
||||||
|
or can be inserted by the boot loader at boot time.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible
|
||||||
|
Usage: required
|
||||||
|
Value type: <string>
|
||||||
|
Definition: A standard property. Specify a string that indicates what
|
||||||
|
kind of firmware it is. For QE, this should be "fsl,qe-firmware".
|
||||||
|
|
||||||
|
- fsl,firmware
|
||||||
|
Usage: required
|
||||||
|
Value type: <prop-encoded-array>, encoded as an array of bytes
|
||||||
|
Definition: A standard property. This property contains the firmware
|
||||||
|
binary "blob".
|
||||||
|
|
||||||
|
Example:
|
||||||
|
qe1@e0080000 {
|
||||||
|
compatible = "fsl,qe";
|
||||||
|
qe_firmware:qe-firmware {
|
||||||
|
compatible = "fsl,qe-firmware";
|
||||||
|
fsl,firmware = [0x70 0xcd 0x00 0x00 0x01 0x46 0x45 ...];
|
||||||
|
};
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
qe2@e0090000 {
|
||||||
|
compatible = "fsl,qe";
|
||||||
|
fsl,firmware-phandle = <&qe_firmware>;
|
||||||
|
...
|
||||||
|
};
|
||||||
|
@@ -99,37 +99,15 @@ system. Also, it is possible to switch all rfkill drivers (or all drivers of
|
|||||||
a specified type) into a state which also updates the default state for
|
a specified type) into a state which also updates the default state for
|
||||||
hotplugged devices.
|
hotplugged devices.
|
||||||
|
|
||||||
After an application opens /dev/rfkill, it can read the current state of
|
After an application opens /dev/rfkill, it can read the current state of all
|
||||||
all devices, and afterwards can poll the descriptor for hotplug or state
|
devices. Changes can be either obtained by either polling the descriptor for
|
||||||
change events.
|
hotplug or state change events or by listening for uevents emitted by the
|
||||||
|
rfkill core framework.
|
||||||
|
|
||||||
Applications must ignore operations (the "op" field) they do not handle,
|
Additionally, each rfkill device is registered in sysfs and emits uevents.
|
||||||
this allows the API to be extended in the future.
|
|
||||||
|
|
||||||
Additionally, each rfkill device is registered in sysfs and there has the
|
rfkill devices issue uevents (with an action of "change"), with the following
|
||||||
following attributes:
|
environment variables set:
|
||||||
|
|
||||||
name: Name assigned by driver to this key (interface or driver name).
|
|
||||||
type: Driver type string ("wlan", "bluetooth", etc).
|
|
||||||
persistent: Whether the soft blocked state is initialised from
|
|
||||||
non-volatile storage at startup.
|
|
||||||
state: Current state of the transmitter
|
|
||||||
0: RFKILL_STATE_SOFT_BLOCKED
|
|
||||||
transmitter is turned off by software
|
|
||||||
1: RFKILL_STATE_UNBLOCKED
|
|
||||||
transmitter is (potentially) active
|
|
||||||
2: RFKILL_STATE_HARD_BLOCKED
|
|
||||||
transmitter is forced off by something outside of
|
|
||||||
the driver's control.
|
|
||||||
This file is deprecated because it can only properly show
|
|
||||||
three of the four possible states, soft-and-hard-blocked is
|
|
||||||
missing.
|
|
||||||
claim: 0: Kernel handles events
|
|
||||||
This file is deprecated because there no longer is a way to
|
|
||||||
claim just control over a single rfkill instance.
|
|
||||||
|
|
||||||
rfkill devices also issue uevents (with an action of "change"), with the
|
|
||||||
following environment variables set:
|
|
||||||
|
|
||||||
RFKILL_NAME
|
RFKILL_NAME
|
||||||
RFKILL_STATE
|
RFKILL_STATE
|
||||||
@@ -137,3 +115,7 @@ RFKILL_TYPE
|
|||||||
|
|
||||||
The contents of these variables corresponds to the "name", "state" and
|
The contents of these variables corresponds to the "name", "state" and
|
||||||
"type" sysfs files explained above.
|
"type" sysfs files explained above.
|
||||||
|
|
||||||
|
|
||||||
|
For further details consult Documentation/ABI/stable/dev-rfkill and
|
||||||
|
Documentation/ABI/stable/sysfs-class-rfkill.
|
||||||
|
@@ -119,10 +119,18 @@ the codec slots 0 and 1 no matter what the hardware reports.
|
|||||||
|
|
||||||
Interrupt Handling
|
Interrupt Handling
|
||||||
~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~
|
||||||
In rare but some cases, the interrupt isn't properly handled as
|
HD-audio driver uses MSI as default (if available) since 2.6.33
|
||||||
default. You would notice this by the DMA transfer error reported by
|
kernel as MSI works better on some machines, and in general, it's
|
||||||
ALSA PCM core, for example. Using MSI might help in such a case.
|
better for performance. However, Nvidia controllers showed bad
|
||||||
Pass `enable_msi=1` option for enabling MSI.
|
regressions with MSI (especially in a combination with AMD chipset),
|
||||||
|
thus we disabled MSI for them.
|
||||||
|
|
||||||
|
There seem also still other devices that don't work with MSI. If you
|
||||||
|
see a regression wrt the sound quality (stuttering, etc) or a lock-up
|
||||||
|
in the recent kernel, try to pass `enable_msi=0` option to disable
|
||||||
|
MSI. If it works, you can add the known bad device to the blacklist
|
||||||
|
defined in hda_intel.c. In such a case, please report and give the
|
||||||
|
patch back to the upstream developer.
|
||||||
|
|
||||||
|
|
||||||
HD-AUDIO CODEC
|
HD-AUDIO CODEC
|
||||||
|
@@ -63,9 +63,9 @@ way to perform a busy wait is:
|
|||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
|
||||||
The cpu_relax() call can lower CPU power consumption or yield to a
|
The cpu_relax() call can lower CPU power consumption or yield to a
|
||||||
hyperthreaded twin processor; it also happens to serve as a memory barrier,
|
hyperthreaded twin processor; it also happens to serve as a compiler
|
||||||
so, once again, volatile is unnecessary. Of course, busy-waiting is
|
barrier, so, once again, volatile is unnecessary. Of course, busy-
|
||||||
generally an anti-social act to begin with.
|
waiting is generally an anti-social act to begin with.
|
||||||
|
|
||||||
There are still a few rare situations where volatile makes sense in the
|
There are still a few rare situations where volatile makes sense in the
|
||||||
kernel:
|
kernel:
|
||||||
|
@@ -17,9 +17,6 @@ int main(void)
|
|||||||
ret = -1;
|
ret = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ret = fsync(fd);
|
|
||||||
if (ret)
|
|
||||||
break;
|
|
||||||
sleep(10);
|
sleep(10);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@@ -31,6 +31,8 @@ static void keep_alive(void)
|
|||||||
*/
|
*/
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
int flags;
|
||||||
|
|
||||||
fd = open("/dev/watchdog", O_WRONLY);
|
fd = open("/dev/watchdog", O_WRONLY);
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
@@ -41,12 +43,14 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
if (!strncasecmp(argv[1], "-d", 2)) {
|
if (!strncasecmp(argv[1], "-d", 2)) {
|
||||||
ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD);
|
flags = WDIOS_DISABLECARD;
|
||||||
|
ioctl(fd, WDIOC_SETOPTIONS, &flags);
|
||||||
fprintf(stderr, "Watchdog card disabled.\n");
|
fprintf(stderr, "Watchdog card disabled.\n");
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
exit(0);
|
exit(0);
|
||||||
} else if (!strncasecmp(argv[1], "-e", 2)) {
|
} else if (!strncasecmp(argv[1], "-e", 2)) {
|
||||||
ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
|
flags = WDIOS_ENABLECARD;
|
||||||
|
ioctl(fd, WDIOC_SETOPTIONS, &flags);
|
||||||
fprintf(stderr, "Watchdog card enabled.\n");
|
fprintf(stderr, "Watchdog card enabled.\n");
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@@ -222,11 +222,10 @@ returned value is the temperature in degrees fahrenheit.
|
|||||||
ioctl(fd, WDIOC_GETTEMP, &temperature);
|
ioctl(fd, WDIOC_GETTEMP, &temperature);
|
||||||
|
|
||||||
Finally the SETOPTIONS ioctl can be used to control some aspects of
|
Finally the SETOPTIONS ioctl can be used to control some aspects of
|
||||||
the cards operation; right now the pcwd driver is the only one
|
the cards operation.
|
||||||
supporting this ioctl.
|
|
||||||
|
|
||||||
int options = 0;
|
int options = 0;
|
||||||
ioctl(fd, WDIOC_SETOPTIONS, options);
|
ioctl(fd, WDIOC_SETOPTIONS, &options);
|
||||||
|
|
||||||
The following options are available:
|
The following options are available:
|
||||||
|
|
||||||
|
98
MAINTAINERS
98
MAINTAINERS
@@ -797,12 +797,12 @@ M: Michael Petchkovsky <mkpetch@internode.on.net>
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/NOMADIK ARCHITECTURE
|
ARM/NOMADIK ARCHITECTURE
|
||||||
M: Alessandro Rubini <rubini@unipv.it>
|
M: Alessandro Rubini <rubini@unipv.it>
|
||||||
M: STEricsson <STEricsson_nomadik_linux@list.st.com>
|
M: STEricsson <STEricsson_nomadik_linux@list.st.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-nomadik/
|
F: arch/arm/mach-nomadik/
|
||||||
F: arch/arm/plat-nomadik/
|
F: arch/arm/plat-nomadik/
|
||||||
|
|
||||||
ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
|
ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
|
||||||
M: Nelson Castillo <arhuaco@freaks-unidos.net>
|
M: Nelson Castillo <arhuaco@freaks-unidos.net>
|
||||||
@@ -1441,6 +1441,15 @@ F: arch/powerpc/include/asm/spu*.h
|
|||||||
F: arch/powerpc/oprofile/*cell*
|
F: arch/powerpc/oprofile/*cell*
|
||||||
F: arch/powerpc/platforms/cell/
|
F: arch/powerpc/platforms/cell/
|
||||||
|
|
||||||
|
CEPH DISTRIBUTED FILE SYSTEM CLIENT
|
||||||
|
M: Sage Weil <sage@newdream.net>
|
||||||
|
L: ceph-devel@vger.kernel.org
|
||||||
|
W: http://ceph.newdream.net/
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
|
||||||
|
S: Supported
|
||||||
|
F: Documentation/filesystems/ceph.txt
|
||||||
|
F: fs/ceph
|
||||||
|
|
||||||
CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM:
|
CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM:
|
||||||
M: David Vrabel <david.vrabel@csr.com>
|
M: David Vrabel <david.vrabel@csr.com>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
@@ -1482,9 +1491,10 @@ M: Andy Whitcroft <apw@canonical.com>
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: scripts/checkpatch.pl
|
F: scripts/checkpatch.pl
|
||||||
|
|
||||||
CISCO 10G ETHERNET DRIVER
|
CISCO VIC ETHERNET NIC DRIVER
|
||||||
M: Scott Feldman <scofeldm@cisco.com>
|
M: Scott Feldman <scofeldm@cisco.com>
|
||||||
M: Joe Eykholt <jeykholt@cisco.com>
|
M: Vasanthy Kolluri <vkolluri@cisco.com>
|
||||||
|
M: Roopa Prabhu <roprabhu@cisco.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/enic/
|
F: drivers/net/enic/
|
||||||
|
|
||||||
@@ -1917,17 +1927,17 @@ F: drivers/scsi/dpt*
|
|||||||
F: drivers/scsi/dpt/
|
F: drivers/scsi/dpt/
|
||||||
|
|
||||||
DRBD DRIVER
|
DRBD DRIVER
|
||||||
P: Philipp Reisner
|
P: Philipp Reisner
|
||||||
P: Lars Ellenberg
|
P: Lars Ellenberg
|
||||||
M: drbd-dev@lists.linbit.com
|
M: drbd-dev@lists.linbit.com
|
||||||
L: drbd-user@lists.linbit.com
|
L: drbd-user@lists.linbit.com
|
||||||
W: http://www.drbd.org
|
W: http://www.drbd.org
|
||||||
T: git git://git.drbd.org/linux-2.6-drbd.git drbd
|
T: git git://git.drbd.org/linux-2.6-drbd.git drbd
|
||||||
T: git git://git.drbd.org/drbd-8.3.git
|
T: git git://git.drbd.org/drbd-8.3.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/block/drbd/
|
F: drivers/block/drbd/
|
||||||
F: lib/lru_cache.c
|
F: lib/lru_cache.c
|
||||||
F: Documentation/blockdev/drbd/
|
F: Documentation/blockdev/drbd/
|
||||||
|
|
||||||
DRIVER CORE, KOBJECTS, AND SYSFS
|
DRIVER CORE, KOBJECTS, AND SYSFS
|
||||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
@@ -2465,12 +2475,6 @@ L: linuxppc-dev@ozlabs.org
|
|||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: drivers/char/hvc_*
|
F: drivers/char/hvc_*
|
||||||
|
|
||||||
VIRTIO CONSOLE DRIVER
|
|
||||||
M: Amit Shah <amit.shah@redhat.com>
|
|
||||||
L: virtualization@lists.linux-foundation.org
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/char/virtio_console.c
|
|
||||||
|
|
||||||
iSCSI BOOT FIRMWARE TABLE (iBFT) DRIVER
|
iSCSI BOOT FIRMWARE TABLE (iBFT) DRIVER
|
||||||
M: Peter Jones <pjones@redhat.com>
|
M: Peter Jones <pjones@redhat.com>
|
||||||
M: Konrad Rzeszutek Wilk <konrad@kernel.org>
|
M: Konrad Rzeszutek Wilk <konrad@kernel.org>
|
||||||
@@ -2989,10 +2993,9 @@ F: net/ipv4/netfilter/ipt_MASQUERADE.c
|
|||||||
IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER
|
IP1000A 10/100/1000 GIGABIT ETHERNET DRIVER
|
||||||
M: Francois Romieu <romieu@fr.zoreil.com>
|
M: Francois Romieu <romieu@fr.zoreil.com>
|
||||||
M: Sorbica Shieh <sorbica@icplus.com.tw>
|
M: Sorbica Shieh <sorbica@icplus.com.tw>
|
||||||
M: Jesse Huang <jesse@icplus.com.tw>
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ipg.c
|
F: drivers/net/ipg.*
|
||||||
|
|
||||||
IPATH DRIVER
|
IPATH DRIVER
|
||||||
M: Ralph Campbell <infinipath@qlogic.com>
|
M: Ralph Campbell <infinipath@qlogic.com>
|
||||||
@@ -3074,6 +3077,7 @@ F: include/scsi/*iscsi*
|
|||||||
ISDN SUBSYSTEM
|
ISDN SUBSYSTEM
|
||||||
M: Karsten Keil <isdn@linux-pingi.de>
|
M: Karsten Keil <isdn@linux-pingi.de>
|
||||||
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.isdn4linux.de
|
W: http://www.isdn4linux.de
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/isdn-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kkeil/isdn-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -3260,6 +3264,16 @@ S: Maintained
|
|||||||
F: include/linux/kexec.h
|
F: include/linux/kexec.h
|
||||||
F: kernel/kexec.c
|
F: kernel/kexec.c
|
||||||
|
|
||||||
|
KEYS/KEYRINGS:
|
||||||
|
M: David Howells <dhowells@redhat.com>
|
||||||
|
L: keyrings@linux-nfs.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/keys.txt
|
||||||
|
F: include/linux/key.h
|
||||||
|
F: include/linux/key-type.h
|
||||||
|
F: include/keys/
|
||||||
|
F: security/keys/
|
||||||
|
|
||||||
KGDB
|
KGDB
|
||||||
M: Jason Wessel <jason.wessel@windriver.com>
|
M: Jason Wessel <jason.wessel@windriver.com>
|
||||||
L: kgdb-bugreport@lists.sourceforge.net
|
L: kgdb-bugreport@lists.sourceforge.net
|
||||||
@@ -3509,8 +3523,8 @@ F: drivers/scsi/sym53c8xx_2/
|
|||||||
LTP (Linux Test Project)
|
LTP (Linux Test Project)
|
||||||
M: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com>
|
M: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com>
|
||||||
M: Garrett Cooper <yanegomi@gmail.com>
|
M: Garrett Cooper <yanegomi@gmail.com>
|
||||||
M: Mike Frysinger <vapier@gentoo.org>
|
M: Mike Frysinger <vapier@gentoo.org>
|
||||||
M: Subrata Modak <subrata@linux.vnet.ibm.com>
|
M: Subrata Modak <subrata@linux.vnet.ibm.com>
|
||||||
L: ltp-list@lists.sourceforge.net (subscribers-only)
|
L: ltp-list@lists.sourceforge.net (subscribers-only)
|
||||||
W: http://ltp.sourceforge.net/
|
W: http://ltp.sourceforge.net/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
|
||||||
@@ -3828,7 +3842,6 @@ M: Ramkrishna Vepa <ram.vepa@neterion.com>
|
|||||||
M: Rastapur Santosh <santosh.rastapur@neterion.com>
|
M: Rastapur Santosh <santosh.rastapur@neterion.com>
|
||||||
M: Sivakumar Subramani <sivakumar.subramani@neterion.com>
|
M: Sivakumar Subramani <sivakumar.subramani@neterion.com>
|
||||||
M: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
|
M: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
|
||||||
M: Anil Murthy <anil.murthy@neterion.com>
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous
|
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/Linux?Anonymous
|
||||||
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
|
W: http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
|
||||||
@@ -5214,6 +5227,21 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/sparc/
|
F: arch/sparc/
|
||||||
|
|
||||||
|
SPARC SERIAL DRIVERS
|
||||||
|
M: "David S. Miller" <davem@davemloft.net>
|
||||||
|
L: sparclinux@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/serial/suncore.c
|
||||||
|
F: drivers/serial/suncore.h
|
||||||
|
F: drivers/serial/sunhv.c
|
||||||
|
F: drivers/serial/sunsab.c
|
||||||
|
F: drivers/serial/sunsab.h
|
||||||
|
F: drivers/serial/sunsu.c
|
||||||
|
F: drivers/serial/sunzilog.c
|
||||||
|
F: drivers/serial/sunzilog.h
|
||||||
|
|
||||||
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
|
||||||
M: Roger Wolff <R.E.Wolff@BitWizard.nl>
|
M: Roger Wolff <R.E.Wolff@BitWizard.nl>
|
||||||
S: Supported
|
S: Supported
|
||||||
@@ -5399,7 +5427,6 @@ S: Maintained
|
|||||||
F: sound/soc/codecs/twl4030*
|
F: sound/soc/codecs/twl4030*
|
||||||
|
|
||||||
TIPC NETWORK LAYER
|
TIPC NETWORK LAYER
|
||||||
M: Per Liden <per.liden@ericsson.com>
|
|
||||||
M: Jon Maloy <jon.maloy@ericsson.com>
|
M: Jon Maloy <jon.maloy@ericsson.com>
|
||||||
M: Allan Stephens <allan.stephens@windriver.com>
|
M: Allan Stephens <allan.stephens@windriver.com>
|
||||||
L: tipc-discussion@lists.sourceforge.net
|
L: tipc-discussion@lists.sourceforge.net
|
||||||
@@ -5937,6 +5964,13 @@ S: Maintained
|
|||||||
F: Documentation/filesystems/vfat.txt
|
F: Documentation/filesystems/vfat.txt
|
||||||
F: fs/fat/
|
F: fs/fat/
|
||||||
|
|
||||||
|
VIRTIO CONSOLE DRIVER
|
||||||
|
M: Amit Shah <amit.shah@redhat.com>
|
||||||
|
L: virtualization@lists.linux-foundation.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/char/virtio_console.c
|
||||||
|
F: include/linux/virtio_console.h
|
||||||
|
|
||||||
VIRTIO HOST (VHOST)
|
VIRTIO HOST (VHOST)
|
||||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
@@ -6177,7 +6211,7 @@ F: arch/x86/
|
|||||||
X86 PLATFORM DRIVERS
|
X86 PLATFORM DRIVERS
|
||||||
M: Matthew Garrett <mjg@redhat.com>
|
M: Matthew Garrett <mjg@redhat.com>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86
|
F: drivers/platform/x86
|
||||||
|
|
||||||
|
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 34
|
SUBLEVEL = 34
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc3
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
* based significantly on the arch/alpha/boot/main.c of Linus Torvalds
|
* based significantly on the arch/alpha/boot/main.c of Linus Torvalds
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <generated/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
* and the decompression code from MILO.
|
* and the decompression code from MILO.
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <generated/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
* This file is the bootloader for the Linux/AXP kernel
|
* This file is the bootloader for the Linux/AXP kernel
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <generated/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
@@ -12,7 +12,6 @@
|
|||||||
#define __ALPHA_MARVEL__H__
|
#define __ALPHA_MARVEL__H__
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
|
|
||||||
#include <asm/compiler.h>
|
#include <asm/compiler.h>
|
||||||
|
@@ -6,7 +6,6 @@
|
|||||||
#define MCPCIA_ONE_HAE_WINDOW 1
|
#define MCPCIA_ONE_HAE_WINDOW 1
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <asm/compiler.h>
|
#include <asm/compiler.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -2,7 +2,6 @@
|
|||||||
#define __ALPHA_TITAN__H__
|
#define __ALPHA_TITAN__H__
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <asm/compiler.h>
|
#include <asm/compiler.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -2,7 +2,6 @@
|
|||||||
#define __ALPHA_TSUNAMI__H__
|
#define __ALPHA_TSUNAMI__H__
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <asm/compiler.h>
|
#include <asm/compiler.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -18,7 +18,6 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
@@ -37,6 +36,7 @@
|
|||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <asm/fpu.h>
|
#include <asm/fpu.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
|
#include <linux/gfp.h>
|
||||||
#include <linux/capability.h>
|
#include <linux/capability.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
|
||||||
static int hose_mmap_page_range(struct pci_controller *hose,
|
static int hose_mmap_page_range(struct pci_controller *hose,
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/gfp.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/scatterlist.h>
|
#include <linux/scatterlist.h>
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
|
@@ -17,7 +17,6 @@
|
|||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
#include <linux/major.h>
|
#include <linux/major.h>
|
||||||
@@ -28,6 +27,7 @@
|
|||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <asm/reg.h>
|
#include <asm/reg.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@@ -11,7 +11,6 @@
|
|||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
|
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
@@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/gfp.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
|
@@ -224,7 +224,7 @@ static void
|
|||||||
dp264_device_interrupt(unsigned long vector)
|
dp264_device_interrupt(unsigned long vector)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n");
|
printk("dp264_device_interrupt: NOT IMPLEMENTED YET!!\n");
|
||||||
#else
|
#else
|
||||||
unsigned long pld;
|
unsigned long pld;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@@ -171,7 +171,7 @@ titan_set_irq_affinity(unsigned int irq, const struct cpumask *affinity)
|
|||||||
static void
|
static void
|
||||||
titan_device_interrupt(unsigned long vector)
|
titan_device_interrupt(unsigned long vector)
|
||||||
{
|
{
|
||||||
printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n");
|
printk("titan_device_interrupt: NOT IMPLEMENTED YET!!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
|
|
||||||
#include <asm/gentrap.h>
|
#include <asm/gentrap.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
@@ -771,8 +772,7 @@ asmlinkage void
|
|||||||
do_entUnaUser(void __user * va, unsigned long opcode,
|
do_entUnaUser(void __user * va, unsigned long opcode,
|
||||||
unsigned long reg, struct pt_regs *regs)
|
unsigned long reg, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
static int cnt = 0;
|
static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);
|
||||||
static unsigned long last_time;
|
|
||||||
|
|
||||||
unsigned long tmp1, tmp2, tmp3, tmp4;
|
unsigned long tmp1, tmp2, tmp3, tmp4;
|
||||||
unsigned long fake_reg, *reg_addr = &fake_reg;
|
unsigned long fake_reg, *reg_addr = &fake_reg;
|
||||||
@@ -783,15 +783,11 @@ do_entUnaUser(void __user * va, unsigned long opcode,
|
|||||||
with the unaliged access. */
|
with the unaliged access. */
|
||||||
|
|
||||||
if (!test_thread_flag (TIF_UAC_NOPRINT)) {
|
if (!test_thread_flag (TIF_UAC_NOPRINT)) {
|
||||||
if (cnt >= 5 && time_after(jiffies, last_time + 5 * HZ)) {
|
if (__ratelimit(&ratelimit)) {
|
||||||
cnt = 0;
|
|
||||||
}
|
|
||||||
if (++cnt < 5) {
|
|
||||||
printk("%s(%d): unaligned trap at %016lx: %p %lx %ld\n",
|
printk("%s(%d): unaligned trap at %016lx: %p %lx %ld\n",
|
||||||
current->comm, task_pid_nr(current),
|
current->comm, task_pid_nr(current),
|
||||||
regs->pc - 4, va, opcode, reg);
|
regs->pc - 4, va, opcode, reg);
|
||||||
}
|
}
|
||||||
last_time = jiffies;
|
|
||||||
}
|
}
|
||||||
if (test_thread_flag (TIF_UAC_SIGBUS))
|
if (test_thread_flag (TIF_UAC_SIGBUS))
|
||||||
goto give_sigbus;
|
goto give_sigbus;
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/bootmem.h> /* max_low_pfn */
|
#include <linux/bootmem.h> /* max_low_pfn */
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
#include <linux/gfp.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@@ -218,6 +218,10 @@ config MMU
|
|||||||
Select if you want MMU-based virtualised addressing space
|
Select if you want MMU-based virtualised addressing space
|
||||||
support by paged memory management. If unsure, say 'Y'.
|
support by paged memory management. If unsure, say 'Y'.
|
||||||
|
|
||||||
|
#
|
||||||
|
# The "ARM system type" choice list is ordered alphabetically by option
|
||||||
|
# text. Please add new entries in the option alphabetic order.
|
||||||
|
#
|
||||||
choice
|
choice
|
||||||
prompt "ARM system type"
|
prompt "ARM system type"
|
||||||
default ARCH_VERSATILE
|
default ARCH_VERSATILE
|
||||||
@@ -274,6 +278,18 @@ config ARCH_AT91
|
|||||||
This enables support for systems based on the Atmel AT91RM9200,
|
This enables support for systems based on the Atmel AT91RM9200,
|
||||||
AT91SAM9 and AT91CAP9 processors.
|
AT91SAM9 and AT91CAP9 processors.
|
||||||
|
|
||||||
|
config ARCH_BCMRING
|
||||||
|
bool "Broadcom BCMRING"
|
||||||
|
depends on MMU
|
||||||
|
select CPU_V6
|
||||||
|
select ARM_AMBA
|
||||||
|
select COMMON_CLKDEV
|
||||||
|
select GENERIC_TIME
|
||||||
|
select GENERIC_CLOCKEVENTS
|
||||||
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||||
|
help
|
||||||
|
Support for Broadcom's BCMRing platform.
|
||||||
|
|
||||||
config ARCH_CLPS711X
|
config ARCH_CLPS711X
|
||||||
bool "Cirrus Logic CLPS711x/EP721x-based"
|
bool "Cirrus Logic CLPS711x/EP721x-based"
|
||||||
select CPU_ARM720T
|
select CPU_ARM720T
|
||||||
@@ -359,20 +375,6 @@ config ARCH_H720X
|
|||||||
help
|
help
|
||||||
This enables support for systems based on the Hynix HMS720x
|
This enables support for systems based on the Hynix HMS720x
|
||||||
|
|
||||||
config ARCH_NOMADIK
|
|
||||||
bool "STMicroelectronics Nomadik"
|
|
||||||
select ARM_AMBA
|
|
||||||
select ARM_VIC
|
|
||||||
select CPU_ARM926T
|
|
||||||
select HAVE_CLK
|
|
||||||
select COMMON_CLKDEV
|
|
||||||
select GENERIC_TIME
|
|
||||||
select GENERIC_CLOCKEVENTS
|
|
||||||
select GENERIC_GPIO
|
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
|
||||||
help
|
|
||||||
Support for the Nomadik platform by ST-Ericsson
|
|
||||||
|
|
||||||
config ARCH_IOP13XX
|
config ARCH_IOP13XX
|
||||||
bool "IOP13xx-based"
|
bool "IOP13xx-based"
|
||||||
depends on MMU
|
depends on MMU
|
||||||
@@ -747,6 +749,30 @@ config ARCH_U300
|
|||||||
help
|
help
|
||||||
Support for ST-Ericsson U300 series mobile platforms.
|
Support for ST-Ericsson U300 series mobile platforms.
|
||||||
|
|
||||||
|
config ARCH_U8500
|
||||||
|
bool "ST-Ericsson U8500 Series"
|
||||||
|
select CPU_V7
|
||||||
|
select ARM_AMBA
|
||||||
|
select GENERIC_TIME
|
||||||
|
select GENERIC_CLOCKEVENTS
|
||||||
|
select COMMON_CLKDEV
|
||||||
|
help
|
||||||
|
Support for ST-Ericsson's Ux500 architecture
|
||||||
|
|
||||||
|
config ARCH_NOMADIK
|
||||||
|
bool "STMicroelectronics Nomadik"
|
||||||
|
select ARM_AMBA
|
||||||
|
select ARM_VIC
|
||||||
|
select CPU_ARM926T
|
||||||
|
select HAVE_CLK
|
||||||
|
select COMMON_CLKDEV
|
||||||
|
select GENERIC_TIME
|
||||||
|
select GENERIC_CLOCKEVENTS
|
||||||
|
select GENERIC_GPIO
|
||||||
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
|
help
|
||||||
|
Support for the Nomadik platform by ST-Ericsson
|
||||||
|
|
||||||
config ARCH_DAVINCI
|
config ARCH_DAVINCI
|
||||||
bool "TI DaVinci"
|
bool "TI DaVinci"
|
||||||
select CPU_ARM926T
|
select CPU_ARM926T
|
||||||
@@ -775,30 +801,13 @@ config ARCH_OMAP
|
|||||||
help
|
help
|
||||||
Support for TI's OMAP platform (OMAP1 and OMAP2).
|
Support for TI's OMAP platform (OMAP1 and OMAP2).
|
||||||
|
|
||||||
config ARCH_BCMRING
|
|
||||||
bool "Broadcom BCMRING"
|
|
||||||
depends on MMU
|
|
||||||
select CPU_V6
|
|
||||||
select ARM_AMBA
|
|
||||||
select COMMON_CLKDEV
|
|
||||||
select GENERIC_TIME
|
|
||||||
select GENERIC_CLOCKEVENTS
|
|
||||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
||||||
help
|
|
||||||
Support for Broadcom's BCMRing platform.
|
|
||||||
|
|
||||||
config ARCH_U8500
|
|
||||||
bool "ST-Ericsson U8500 Series"
|
|
||||||
select CPU_V7
|
|
||||||
select ARM_AMBA
|
|
||||||
select GENERIC_TIME
|
|
||||||
select GENERIC_CLOCKEVENTS
|
|
||||||
select COMMON_CLKDEV
|
|
||||||
help
|
|
||||||
Support for ST-Ericsson's Ux500 architecture
|
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is sorted alphabetically by mach-* pathname. However, plat-*
|
||||||
|
# Kconfigs may be included either alphabetically (according to the
|
||||||
|
# plat- suffix) or along side the corresponding mach-* source.
|
||||||
|
#
|
||||||
source "arch/arm/mach-aaec2000/Kconfig"
|
source "arch/arm/mach-aaec2000/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-at91/Kconfig"
|
source "arch/arm/mach-at91/Kconfig"
|
||||||
|
@@ -11,6 +11,7 @@ extern unsigned long free_mem_end_ptr;
|
|||||||
extern void error(char *);
|
extern void error(char *);
|
||||||
|
|
||||||
#define STATIC static
|
#define STATIC static
|
||||||
|
#define STATIC_RW_DATA /* non-static please */
|
||||||
|
|
||||||
#define ARCH_HAS_DECOMP_WDOG
|
#define ARCH_HAS_DECOMP_WDOG
|
||||||
|
|
||||||
|
@@ -742,7 +742,7 @@ proc_types:
|
|||||||
.word 0x000f0000
|
.word 0x000f0000
|
||||||
W(b) __armv4_mmu_cache_on
|
W(b) __armv4_mmu_cache_on
|
||||||
W(b) __armv4_mmu_cache_off
|
W(b) __armv4_mmu_cache_off
|
||||||
W(b) __armv4_mmu_cache_flush
|
W(b) __armv5tej_mmu_cache_flush
|
||||||
|
|
||||||
.word 0x0007b000 @ ARMv6
|
.word 0x0007b000 @ ARMv6
|
||||||
.word 0x000ff000
|
.word 0x000ff000
|
||||||
|
@@ -33,6 +33,7 @@ unsigned int __machine_arch_type;
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
static void putstr(const char *ptr);
|
static void putstr(const char *ptr);
|
||||||
|
extern void error(char *x);
|
||||||
|
|
||||||
#include <mach/uncompress.h>
|
#include <mach/uncompress.h>
|
||||||
|
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <asm/clkdev.h>
|
#include <asm/clkdev.h>
|
||||||
#include <mach/clkdev.h>
|
#include <mach/clkdev.h>
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
@@ -290,7 +290,7 @@ static int locomo_suspend(struct platform_device *dev, pm_message_t state)
|
|||||||
save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */
|
save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */
|
||||||
locomo_writel(0x00, lchip->base + LOCOMO_GPO);
|
locomo_writel(0x00, lchip->base + LOCOMO_GPO);
|
||||||
save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPICT); /* SPI */
|
save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPICT); /* SPI */
|
||||||
locomo_writel(0x40, lchip->base + LOCOMO_SPICT);
|
locomo_writel(0x40, lchip->base + LOCOMO_SPI + LOCOMO_SPICT);
|
||||||
save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */
|
save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */
|
||||||
locomo_writel(0x00, lchip->base + LOCOMO_GPE);
|
locomo_writel(0x00, lchip->base + LOCOMO_GPE);
|
||||||
save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */
|
save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */
|
||||||
@@ -418,7 +418,7 @@ __locomo_probe(struct device *me, struct resource *mem, int irq)
|
|||||||
/* Longtime timer */
|
/* Longtime timer */
|
||||||
locomo_writel(0, lchip->base + LOCOMO_LTINT);
|
locomo_writel(0, lchip->base + LOCOMO_LTINT);
|
||||||
/* SPI */
|
/* SPI */
|
||||||
locomo_writel(0, lchip->base + LOCOMO_SPIIE);
|
locomo_writel(0, lchip->base + LOCOMO_SPI + LOCOMO_SPIIE);
|
||||||
|
|
||||||
locomo_writel(6 + 8 + 320 + 30 - 10, lchip->base + LOCOMO_ASD);
|
locomo_writel(6 + 8 + 320 + 30 - 10, lchip->base + LOCOMO_ASD);
|
||||||
r = locomo_readl(lchip->base + LOCOMO_ASD);
|
r = locomo_readl(lchip->base + LOCOMO_ASD);
|
||||||
@@ -707,7 +707,7 @@ void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int
|
|||||||
udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
|
udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
|
||||||
if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) { /* High is error */
|
if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) { /* High is error */
|
||||||
printk(KERN_WARNING "locomo: m62332_senddata Error 1\n");
|
printk(KERN_WARNING "locomo: m62332_senddata Error 1\n");
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send Sub address (LSB is channel select) */
|
/* Send Sub address (LSB is channel select) */
|
||||||
@@ -735,7 +735,7 @@ void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int
|
|||||||
udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
|
udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
|
||||||
if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) { /* High is error */
|
if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) { /* High is error */
|
||||||
printk(KERN_WARNING "locomo: m62332_senddata Error 2\n");
|
printk(KERN_WARNING "locomo: m62332_senddata Error 2\n");
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send DAC data */
|
/* Send DAC data */
|
||||||
@@ -760,9 +760,9 @@ void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int
|
|||||||
udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
|
udelay(DAC_SCL_HIGH_HOLD_TIME); /* 4.7 usec */
|
||||||
if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) { /* High is error */
|
if (locomo_readl(mapbase + LOCOMO_DAC) & LOCOMO_DAC_SDAOEB) { /* High is error */
|
||||||
printk(KERN_WARNING "locomo: m62332_senddata Error 3\n");
|
printk(KERN_WARNING "locomo: m62332_senddata Error 3\n");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
/* stop */
|
/* stop */
|
||||||
r = locomo_readl(mapbase + LOCOMO_DAC);
|
r = locomo_readl(mapbase + LOCOMO_DAC);
|
||||||
r &= ~(LOCOMO_DAC_SCLOEB);
|
r &= ~(LOCOMO_DAC_SCLOEB);
|
||||||
|
@@ -358,7 +358,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
# CONFIG_PM_RUNTIME is not set
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -308,6 +308,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND_UP_POSSIBLE=y
|
CONFIG_SUSPEND_UP_POSSIBLE=y
|
||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Networking
|
# Networking
|
||||||
|
@@ -191,6 +191,7 @@ CONFIG_ARCH_OMAP=y
|
|||||||
#
|
#
|
||||||
CONFIG_ARCH_OMAP_OTG=y
|
CONFIG_ARCH_OMAP_OTG=y
|
||||||
# CONFIG_ARCH_OMAP1 is not set
|
# CONFIG_ARCH_OMAP1 is not set
|
||||||
|
CONFIG_ARCH_OMAP2PLUS=y
|
||||||
CONFIG_ARCH_OMAP2=y
|
CONFIG_ARCH_OMAP2=y
|
||||||
# CONFIG_ARCH_OMAP3 is not set
|
# CONFIG_ARCH_OMAP3 is not set
|
||||||
# CONFIG_ARCH_OMAP4 is not set
|
# CONFIG_ARCH_OMAP4 is not set
|
||||||
@@ -198,8 +199,6 @@ CONFIG_ARCH_OMAP2=y
|
|||||||
#
|
#
|
||||||
# OMAP Feature Selections
|
# OMAP Feature Selections
|
||||||
#
|
#
|
||||||
# CONFIG_OMAP_DEBUG_POWERDOMAIN is not set
|
|
||||||
# CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set
|
|
||||||
CONFIG_OMAP_RESET_CLOCKS=y
|
CONFIG_OMAP_RESET_CLOCKS=y
|
||||||
# CONFIG_OMAP_MUX is not set
|
# CONFIG_OMAP_MUX is not set
|
||||||
# CONFIG_OMAP_MCBSP is not set
|
# CONFIG_OMAP_MCBSP is not set
|
||||||
@@ -208,15 +207,13 @@ CONFIG_OMAP_MBOX_FWK=y
|
|||||||
CONFIG_OMAP_32K_TIMER=y
|
CONFIG_OMAP_32K_TIMER=y
|
||||||
CONFIG_OMAP_32K_TIMER_HZ=128
|
CONFIG_OMAP_32K_TIMER_HZ=128
|
||||||
CONFIG_OMAP_DM_TIMER=y
|
CONFIG_OMAP_DM_TIMER=y
|
||||||
# CONFIG_OMAP_LL_DEBUG_UART1 is not set
|
# CONFIG_OMAP_PM_NONE is not set
|
||||||
# CONFIG_OMAP_LL_DEBUG_UART2 is not set
|
CONFIG_OMAP_PM_NOOP=y
|
||||||
CONFIG_OMAP_LL_DEBUG_UART3=y
|
|
||||||
# CONFIG_MACH_OMAP_GENERIC is not set
|
# CONFIG_MACH_OMAP_GENERIC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# OMAP Core Type
|
# OMAP Core Type
|
||||||
#
|
#
|
||||||
CONFIG_ARCH_OMAP24XX=y
|
|
||||||
CONFIG_ARCH_OMAP2420=y
|
CONFIG_ARCH_OMAP2420=y
|
||||||
# CONFIG_ARCH_OMAP2430 is not set
|
# CONFIG_ARCH_OMAP2430 is not set
|
||||||
|
|
||||||
@@ -227,6 +224,9 @@ CONFIG_MACH_OMAP2_TUSB6010=y
|
|||||||
# CONFIG_MACH_OMAP_H4 is not set
|
# CONFIG_MACH_OMAP_H4 is not set
|
||||||
# CONFIG_MACH_OMAP_APOLLON is not set
|
# CONFIG_MACH_OMAP_APOLLON is not set
|
||||||
# CONFIG_MACH_OMAP_2430SDP is not set
|
# CONFIG_MACH_OMAP_2430SDP is not set
|
||||||
|
CONFIG_MACH_NOKIA_N800=y
|
||||||
|
CONFIG_MACH_NOKIA_N810=y
|
||||||
|
CONFIG_MACH_NOKIA_N810_WIMAX=y
|
||||||
CONFIG_MACH_NOKIA_N8X0=y
|
CONFIG_MACH_NOKIA_N8X0=y
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -303,7 +303,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||||||
CONFIG_ZBOOT_ROM_TEXT=0x10C08000
|
CONFIG_ZBOOT_ROM_TEXT=0x10C08000
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x10200000
|
CONFIG_ZBOOT_ROM_BSS=0x10200000
|
||||||
# CONFIG_ZBOOT_ROM is not set
|
# CONFIG_ZBOOT_ROM is not set
|
||||||
CONFIG_CMDLINE="root=1f03 rootfstype=jffs2 console=ttyS2,115200n8"
|
CONFIG_CMDLINE="root=/dev/mmcblk0p2 console=ttyS2,115200n8 debug earlyprintk rootwait"
|
||||||
# CONFIG_XIP_KERNEL is not set
|
# CONFIG_XIP_KERNEL is not set
|
||||||
# CONFIG_KEXEC is not set
|
# CONFIG_KEXEC is not set
|
||||||
|
|
||||||
@@ -337,7 +337,14 @@ CONFIG_HAVE_AOUT=y
|
|||||||
#
|
#
|
||||||
# Power management options
|
# Power management options
|
||||||
#
|
#
|
||||||
# CONFIG_PM is not set
|
CONFIG_PM=y
|
||||||
|
# CONFIG_PM_DEBUG is not set
|
||||||
|
CONFIG_PM_SLEEP=y
|
||||||
|
CONFIG_SUSPEND=y
|
||||||
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
|
CONFIG_PM_OPS=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
@@ -617,7 +624,55 @@ CONFIG_UNIX98_PTYS=y
|
|||||||
# CONFIG_R3964 is not set
|
# CONFIG_R3964 is not set
|
||||||
# CONFIG_RAW_DRIVER is not set
|
# CONFIG_RAW_DRIVER is not set
|
||||||
# CONFIG_TCG_TPM is not set
|
# CONFIG_TCG_TPM is not set
|
||||||
# CONFIG_I2C is not set
|
CONFIG_I2C=y
|
||||||
|
CONFIG_I2C_BOARDINFO=y
|
||||||
|
# CONFIG_I2C_COMPAT is not set
|
||||||
|
# CONFIG_I2C_CHARDEV is not set
|
||||||
|
# CONFIG_I2C_HELPER_AUTO is not set
|
||||||
|
# CONFIG_I2C_SMBUS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# I2C Algorithms
|
||||||
|
#
|
||||||
|
# CONFIG_I2C_ALGOBIT is not set
|
||||||
|
# CONFIG_I2C_ALGOPCF is not set
|
||||||
|
# CONFIG_I2C_ALGOPCA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# I2C Hardware Bus support
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# I2C system bus drivers (mostly embedded / system-on-chip)
|
||||||
|
#
|
||||||
|
# CONFIG_I2C_DESIGNWARE is not set
|
||||||
|
# CONFIG_I2C_GPIO is not set
|
||||||
|
# CONFIG_I2C_OCORES is not set
|
||||||
|
CONFIG_I2C_OMAP=y
|
||||||
|
# CONFIG_I2C_SIMTEC is not set
|
||||||
|
# CONFIG_I2C_XILINX is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# External I2C/SMBus adapter drivers
|
||||||
|
#
|
||||||
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
|
# CONFIG_I2C_TAOS_EVM is not set
|
||||||
|
# CONFIG_I2C_TINY_USB is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Other I2C/SMBus bus drivers
|
||||||
|
#
|
||||||
|
# CONFIG_I2C_PCA_PLATFORM is not set
|
||||||
|
# CONFIG_I2C_STUB is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Miscellaneous I2C Chip support
|
||||||
|
#
|
||||||
|
# CONFIG_SENSORS_TSL2550 is not set
|
||||||
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||||
CONFIG_SPI=y
|
CONFIG_SPI=y
|
||||||
# CONFIG_SPI_DEBUG is not set
|
# CONFIG_SPI_DEBUG is not set
|
||||||
CONFIG_SPI_MASTER=y
|
CONFIG_SPI_MASTER=y
|
||||||
@@ -673,15 +728,44 @@ CONFIG_SSB_POSSIBLE=y
|
|||||||
# Multifunction device drivers
|
# Multifunction device drivers
|
||||||
#
|
#
|
||||||
# CONFIG_MFD_CORE is not set
|
# CONFIG_MFD_CORE is not set
|
||||||
|
# CONFIG_MFD_88PM860X is not set
|
||||||
# CONFIG_MFD_SM501 is not set
|
# CONFIG_MFD_SM501 is not set
|
||||||
# CONFIG_MFD_ASIC3 is not set
|
# CONFIG_MFD_ASIC3 is not set
|
||||||
# CONFIG_HTC_EGPIO is not set
|
# CONFIG_HTC_EGPIO is not set
|
||||||
# CONFIG_HTC_PASIC3 is not set
|
# CONFIG_HTC_PASIC3 is not set
|
||||||
|
# CONFIG_HTC_I2CPLD is not set
|
||||||
|
# CONFIG_TPS65010 is not set
|
||||||
|
CONFIG_MENELAUS=y
|
||||||
|
# CONFIG_TWL4030_CORE is not set
|
||||||
# CONFIG_MFD_TMIO is not set
|
# CONFIG_MFD_TMIO is not set
|
||||||
# CONFIG_MFD_T7L66XB is not set
|
# CONFIG_MFD_T7L66XB is not set
|
||||||
# CONFIG_MFD_TC6387XB is not set
|
# CONFIG_MFD_TC6387XB is not set
|
||||||
# CONFIG_MFD_TC6393XB is not set
|
# CONFIG_MFD_TC6393XB is not set
|
||||||
|
# CONFIG_PMIC_DA903X is not set
|
||||||
|
# CONFIG_PMIC_ADP5520 is not set
|
||||||
|
# CONFIG_MFD_MAX8925 is not set
|
||||||
|
# CONFIG_MFD_WM8400 is not set
|
||||||
|
# CONFIG_MFD_WM831X is not set
|
||||||
|
# CONFIG_MFD_WM8350_I2C is not set
|
||||||
|
# CONFIG_MFD_WM8994 is not set
|
||||||
|
# CONFIG_MFD_PCF50633 is not set
|
||||||
|
# CONFIG_MFD_MC13783 is not set
|
||||||
|
# CONFIG_AB3100_CORE is not set
|
||||||
# CONFIG_EZX_PCAP is not set
|
# CONFIG_EZX_PCAP is not set
|
||||||
|
# CONFIG_AB4500_CORE is not set
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
# CONFIG_REGULATOR_DEBUG is not set
|
||||||
|
# CONFIG_REGULATOR_DUMMY is not set
|
||||||
|
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
||||||
|
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
|
||||||
|
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
|
||||||
|
# CONFIG_REGULATOR_BQ24022 is not set
|
||||||
|
# CONFIG_REGULATOR_MAX1586 is not set
|
||||||
|
# CONFIG_REGULATOR_MAX8649 is not set
|
||||||
|
# CONFIG_REGULATOR_MAX8660 is not set
|
||||||
|
# CONFIG_REGULATOR_LP3971 is not set
|
||||||
|
# CONFIG_REGULATOR_TPS65023 is not set
|
||||||
|
# CONFIG_REGULATOR_TPS6507X is not set
|
||||||
# CONFIG_MEDIA_SUPPORT is not set
|
# CONFIG_MEDIA_SUPPORT is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -718,7 +802,10 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
|||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
CONFIG_USB_DEVICE_CLASS=y
|
CONFIG_USB_DEVICE_CLASS=y
|
||||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||||
# CONFIG_USB_OTG is not set
|
CONFIG_USB_SUSPEND=y
|
||||||
|
CONFIG_USB_OTG=y
|
||||||
|
# CONFIG_USB_OTG_WHITELIST is not set
|
||||||
|
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
||||||
# CONFIG_USB_MON is not set
|
# CONFIG_USB_MON is not set
|
||||||
# CONFIG_USB_WUSB is not set
|
# CONFIG_USB_WUSB is not set
|
||||||
# CONFIG_USB_WUSB_CBAF is not set
|
# CONFIG_USB_WUSB_CBAF is not set
|
||||||
@@ -737,9 +824,10 @@ CONFIG_USB_DEVICE_CLASS=y
|
|||||||
CONFIG_USB_MUSB_HDRC=y
|
CONFIG_USB_MUSB_HDRC=y
|
||||||
CONFIG_USB_TUSB6010=y
|
CONFIG_USB_TUSB6010=y
|
||||||
# CONFIG_USB_MUSB_HOST is not set
|
# CONFIG_USB_MUSB_HOST is not set
|
||||||
CONFIG_USB_MUSB_PERIPHERAL=y
|
# CONFIG_USB_MUSB_PERIPHERAL is not set
|
||||||
# CONFIG_USB_MUSB_OTG is not set
|
CONFIG_USB_MUSB_OTG=y
|
||||||
CONFIG_USB_GADGET_MUSB_HDRC=y
|
CONFIG_USB_GADGET_MUSB_HDRC=y
|
||||||
|
CONFIG_USB_MUSB_HDRC_HCD=y
|
||||||
# CONFIG_MUSB_PIO_ONLY is not set
|
# CONFIG_MUSB_PIO_ONLY is not set
|
||||||
# CONFIG_USB_INVENTRA_DMA is not set
|
# CONFIG_USB_INVENTRA_DMA is not set
|
||||||
# CONFIG_USB_TI_CPPI_DMA is not set
|
# CONFIG_USB_TI_CPPI_DMA is not set
|
||||||
@@ -824,44 +912,77 @@ CONFIG_USB_GADGET_DUALSPEED=y
|
|||||||
# CONFIG_USB_ZERO is not set
|
# CONFIG_USB_ZERO is not set
|
||||||
# CONFIG_USB_AUDIO is not set
|
# CONFIG_USB_AUDIO is not set
|
||||||
CONFIG_USB_ETH=y
|
CONFIG_USB_ETH=y
|
||||||
# CONFIG_USB_ETH_RNDIS is not set
|
CONFIG_USB_ETH_RNDIS=y
|
||||||
|
CONFIG_USB_ETH_EEM=y
|
||||||
# CONFIG_USB_GADGETFS is not set
|
# CONFIG_USB_GADGETFS is not set
|
||||||
# CONFIG_USB_FILE_STORAGE is not set
|
# CONFIG_USB_FILE_STORAGE is not set
|
||||||
|
# CONFIG_USB_MASS_STORAGE is not set
|
||||||
# CONFIG_USB_G_SERIAL is not set
|
# CONFIG_USB_G_SERIAL is not set
|
||||||
# CONFIG_USB_MIDI_GADGET is not set
|
# CONFIG_USB_MIDI_GADGET is not set
|
||||||
# CONFIG_USB_G_PRINTER is not set
|
# CONFIG_USB_G_PRINTER is not set
|
||||||
# CONFIG_USB_CDC_COMPOSITE is not set
|
# CONFIG_USB_CDC_COMPOSITE is not set
|
||||||
|
# CONFIG_USB_G_NOKIA is not set
|
||||||
|
# CONFIG_USB_G_MULTI is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# OTG and related infrastructure
|
# OTG and related infrastructure
|
||||||
#
|
#
|
||||||
CONFIG_USB_OTG_UTILS=y
|
CONFIG_USB_OTG_UTILS=y
|
||||||
# CONFIG_USB_GPIO_VBUS is not set
|
# CONFIG_USB_GPIO_VBUS is not set
|
||||||
|
# CONFIG_ISP1301_OMAP is not set
|
||||||
|
# CONFIG_USB_ULPI is not set
|
||||||
CONFIG_NOP_USB_XCEIV=y
|
CONFIG_NOP_USB_XCEIV=y
|
||||||
# CONFIG_MMC is not set
|
CONFIG_MMC=y
|
||||||
|
# CONFIG_MMC_DEBUG is not set
|
||||||
|
# CONFIG_MMC_UNSAFE_RESUME is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# MMC/SD/SDIO Card Drivers
|
||||||
|
#
|
||||||
|
CONFIG_MMC_BLOCK=y
|
||||||
|
CONFIG_MMC_BLOCK_BOUNCE=y
|
||||||
|
# CONFIG_SDIO_UART is not set
|
||||||
|
# CONFIG_MMC_TEST is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# MMC/SD/SDIO Host Controller Drivers
|
||||||
|
#
|
||||||
|
# CONFIG_MMC_SDHCI is not set
|
||||||
|
CONFIG_MMC_OMAP=y
|
||||||
|
# CONFIG_MMC_SPI is not set
|
||||||
# CONFIG_MEMSTICK is not set
|
# CONFIG_MEMSTICK is not set
|
||||||
# CONFIG_ACCESSIBILITY is not set
|
|
||||||
# CONFIG_NEW_LEDS is not set
|
# CONFIG_NEW_LEDS is not set
|
||||||
|
# CONFIG_ACCESSIBILITY is not set
|
||||||
CONFIG_RTC_LIB=y
|
CONFIG_RTC_LIB=y
|
||||||
# CONFIG_RTC_CLASS is not set
|
# CONFIG_RTC_CLASS is not set
|
||||||
# CONFIG_DMADEVICES is not set
|
# CONFIG_DMADEVICES is not set
|
||||||
# CONFIG_AUXDISPLAY is not set
|
# CONFIG_AUXDISPLAY is not set
|
||||||
# CONFIG_REGULATOR is not set
|
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TI VLYNQ
|
||||||
|
#
|
||||||
# CONFIG_STAGING is not set
|
# CONFIG_STAGING is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
#
|
#
|
||||||
# CONFIG_EXT2_FS is not set
|
# CONFIG_EXT2_FS is not set
|
||||||
# CONFIG_EXT3_FS is not set
|
CONFIG_EXT3_FS=y
|
||||||
|
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
|
||||||
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
|
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||||
|
# CONFIG_EXT3_FS_SECURITY is not set
|
||||||
# CONFIG_EXT4_FS is not set
|
# CONFIG_EXT4_FS is not set
|
||||||
|
CONFIG_JBD=y
|
||||||
|
CONFIG_FS_MBCACHE=y
|
||||||
# CONFIG_REISERFS_FS is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
# CONFIG_FS_POSIX_ACL is not set
|
# CONFIG_FS_POSIX_ACL is not set
|
||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_OCFS2_FS is not set
|
# CONFIG_OCFS2_FS is not set
|
||||||
# CONFIG_BTRFS_FS is not set
|
# CONFIG_BTRFS_FS is not set
|
||||||
|
# CONFIG_NILFS2_FS is not set
|
||||||
CONFIG_FILE_LOCKING=y
|
CONFIG_FILE_LOCKING=y
|
||||||
CONFIG_FSNOTIFY=y
|
CONFIG_FSNOTIFY=y
|
||||||
CONFIG_DNOTIFY=y
|
CONFIG_DNOTIFY=y
|
||||||
@@ -886,8 +1007,11 @@ CONFIG_INOTIFY_USER=y
|
|||||||
#
|
#
|
||||||
# DOS/FAT/NT Filesystems
|
# DOS/FAT/NT Filesystems
|
||||||
#
|
#
|
||||||
|
CONFIG_FAT_FS=y
|
||||||
# CONFIG_MSDOS_FS is not set
|
# CONFIG_MSDOS_FS is not set
|
||||||
# CONFIG_VFAT_FS is not set
|
CONFIG_VFAT_FS=y
|
||||||
|
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||||
|
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||||
# CONFIG_NTFS_FS is not set
|
# CONFIG_NTFS_FS is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@@ -324,6 +324,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -450,7 +450,7 @@ CONFIG_SUSPEND=y
|
|||||||
# CONFIG_PM_TEST_SUSPEND is not set
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
# CONFIG_PM_RUNTIME is not set
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -340,6 +340,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -368,7 +368,7 @@ CONFIG_SUSPEND=y
|
|||||||
# CONFIG_PM_TEST_SUSPEND is not set
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
# CONFIG_PM_RUNTIME is not set
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -363,6 +363,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -361,7 +361,7 @@ CONFIG_SUSPEND=y
|
|||||||
# CONFIG_PM_TEST_SUSPEND is not set
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
# CONFIG_PM_RUNTIME is not set
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -331,6 +331,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@@ -343,6 +343,7 @@ CONFIG_SUSPEND=y
|
|||||||
# CONFIG_PM_TEST_SUSPEND is not set
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -361,7 +361,7 @@ CONFIG_SUSPEND=y
|
|||||||
# CONFIG_PM_TEST_SUSPEND is not set
|
# CONFIG_PM_TEST_SUSPEND is not set
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
# CONFIG_PM_RUNTIME is not set
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -322,6 +322,7 @@ CONFIG_PM_SLEEP=y
|
|||||||
CONFIG_SUSPEND=y
|
CONFIG_SUSPEND=y
|
||||||
CONFIG_SUSPEND_FREEZER=y
|
CONFIG_SUSPEND_FREEZER=y
|
||||||
# CONFIG_APM_EMULATION is not set
|
# CONFIG_APM_EMULATION is not set
|
||||||
|
CONFIG_PM_RUNTIME=y
|
||||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include <asm/glue.h>
|
#include <asm/glue.h>
|
||||||
#include <asm/shmparam.h>
|
#include <asm/shmparam.h>
|
||||||
#include <asm/cachetype.h>
|
#include <asm/cachetype.h>
|
||||||
|
#include <asm/outercache.h>
|
||||||
|
|
||||||
#define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
|
#define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
|
||||||
|
|
||||||
@@ -219,12 +220,6 @@ struct cpu_cache_fns {
|
|||||||
void (*dma_flush_range)(const void *, const void *);
|
void (*dma_flush_range)(const void *, const void *);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct outer_cache_fns {
|
|
||||||
void (*inv_range)(unsigned long, unsigned long);
|
|
||||||
void (*clean_range)(unsigned long, unsigned long);
|
|
||||||
void (*flush_range)(unsigned long, unsigned long);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Select the calling method
|
* Select the calling method
|
||||||
*/
|
*/
|
||||||
@@ -281,37 +276,6 @@ extern void dmac_flush_range(const void *, const void *);
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_OUTER_CACHE
|
|
||||||
|
|
||||||
extern struct outer_cache_fns outer_cache;
|
|
||||||
|
|
||||||
static inline void outer_inv_range(unsigned long start, unsigned long end)
|
|
||||||
{
|
|
||||||
if (outer_cache.inv_range)
|
|
||||||
outer_cache.inv_range(start, end);
|
|
||||||
}
|
|
||||||
static inline void outer_clean_range(unsigned long start, unsigned long end)
|
|
||||||
{
|
|
||||||
if (outer_cache.clean_range)
|
|
||||||
outer_cache.clean_range(start, end);
|
|
||||||
}
|
|
||||||
static inline void outer_flush_range(unsigned long start, unsigned long end)
|
|
||||||
{
|
|
||||||
if (outer_cache.flush_range)
|
|
||||||
outer_cache.flush_range(start, end);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static inline void outer_inv_range(unsigned long start, unsigned long end)
|
|
||||||
{ }
|
|
||||||
static inline void outer_clean_range(unsigned long start, unsigned long end)
|
|
||||||
{ }
|
|
||||||
static inline void outer_flush_range(unsigned long start, unsigned long end)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy user data from/to a page which is mapped into a different
|
* Copy user data from/to a page which is mapped into a different
|
||||||
* processes address space. Really, we want to allow our "user
|
* processes address space. Really, we want to allow our "user
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#define __ASM_CLKDEV_H
|
#define __ASM_CLKDEV_H
|
||||||
|
|
||||||
struct clk;
|
struct clk;
|
||||||
|
struct device;
|
||||||
|
|
||||||
struct clk_lookup {
|
struct clk_lookup {
|
||||||
struct list_head node;
|
struct list_head node;
|
||||||
|
@@ -98,6 +98,7 @@ extern int elf_check_arch(const struct elf32_hdr *);
|
|||||||
extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int);
|
extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int);
|
||||||
#define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk)
|
#define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk)
|
||||||
|
|
||||||
|
struct task_struct;
|
||||||
int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs);
|
int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs);
|
||||||
#define ELF_CORE_COPY_TASK_REGS dump_task_regs
|
#define ELF_CORE_COPY_TASK_REGS dump_task_regs
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
struct irqaction;
|
struct irqaction;
|
||||||
|
struct pt_regs;
|
||||||
extern void migrate_irqs(void);
|
extern void migrate_irqs(void);
|
||||||
|
|
||||||
extern void asm_do_IRQ(unsigned int, struct pt_regs *);
|
extern void asm_do_IRQ(unsigned int, struct pt_regs *);
|
||||||
|
75
arch/arm/include/asm/outercache.h
Normal file
75
arch/arm/include/asm/outercache.h
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* arch/arm/include/asm/outercache.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 ARM Ltd.
|
||||||
|
* Written by Catalin Marinas <catalin.marinas@arm.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_OUTERCACHE_H
|
||||||
|
#define __ASM_OUTERCACHE_H
|
||||||
|
|
||||||
|
struct outer_cache_fns {
|
||||||
|
void (*inv_range)(unsigned long, unsigned long);
|
||||||
|
void (*clean_range)(unsigned long, unsigned long);
|
||||||
|
void (*flush_range)(unsigned long, unsigned long);
|
||||||
|
#ifdef CONFIG_OUTER_CACHE_SYNC
|
||||||
|
void (*sync)(void);
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_OUTER_CACHE
|
||||||
|
|
||||||
|
extern struct outer_cache_fns outer_cache;
|
||||||
|
|
||||||
|
static inline void outer_inv_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
if (outer_cache.inv_range)
|
||||||
|
outer_cache.inv_range(start, end);
|
||||||
|
}
|
||||||
|
static inline void outer_clean_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
if (outer_cache.clean_range)
|
||||||
|
outer_cache.clean_range(start, end);
|
||||||
|
}
|
||||||
|
static inline void outer_flush_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
if (outer_cache.flush_range)
|
||||||
|
outer_cache.flush_range(start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline void outer_inv_range(unsigned long start, unsigned long end)
|
||||||
|
{ }
|
||||||
|
static inline void outer_clean_range(unsigned long start, unsigned long end)
|
||||||
|
{ }
|
||||||
|
static inline void outer_flush_range(unsigned long start, unsigned long end)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_OUTER_CACHE_SYNC
|
||||||
|
static inline void outer_sync(void)
|
||||||
|
{
|
||||||
|
if (outer_cache.sync)
|
||||||
|
outer_cache.sync();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void outer_sync(void)
|
||||||
|
{ }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASM_OUTERCACHE_H */
|
@@ -67,6 +67,7 @@ static inline int pte_file(pte_t pte) { return 0; }
|
|||||||
*/
|
*/
|
||||||
#define pgprot_noncached(prot) __pgprot(0)
|
#define pgprot_noncached(prot) __pgprot(0)
|
||||||
#define pgprot_writecombine(prot) __pgprot(0)
|
#define pgprot_writecombine(prot) __pgprot(0)
|
||||||
|
#define pgprot_dmacoherent(prot) __pgprot(0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -60,6 +60,8 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/irqflags.h>
|
#include <linux/irqflags.h>
|
||||||
|
|
||||||
|
#include <asm/outercache.h>
|
||||||
|
|
||||||
#define __exception __attribute__((section(".exception.text")))
|
#define __exception __attribute__((section(".exception.text")))
|
||||||
|
|
||||||
struct thread_info;
|
struct thread_info;
|
||||||
@@ -137,10 +139,12 @@ extern unsigned int user_debug;
|
|||||||
#define dmb() __asm__ __volatile__ ("" : : : "memory")
|
#define dmb() __asm__ __volatile__ ("" : : : "memory")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP)
|
#ifdef CONFIG_ARCH_HAS_BARRIERS
|
||||||
#define mb() dmb()
|
#include <mach/barriers.h>
|
||||||
|
#elif __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP)
|
||||||
|
#define mb() do { dsb(); outer_sync(); } while (0)
|
||||||
#define rmb() dmb()
|
#define rmb() dmb()
|
||||||
#define wmb() dmb()
|
#define wmb() mb()
|
||||||
#else
|
#else
|
||||||
#define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
|
#define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
|
||||||
#define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
|
#define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
|
||||||
@@ -152,9 +156,9 @@ extern unsigned int user_debug;
|
|||||||
#define smp_rmb() barrier()
|
#define smp_rmb() barrier()
|
||||||
#define smp_wmb() barrier()
|
#define smp_wmb() barrier()
|
||||||
#else
|
#else
|
||||||
#define smp_mb() mb()
|
#define smp_mb() dmb()
|
||||||
#define smp_rmb() rmb()
|
#define smp_rmb() dmb()
|
||||||
#define smp_wmb() wmb()
|
#define smp_wmb() dmb()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define read_barrier_depends() do { } while(0)
|
#define read_barrier_depends() do { } while(0)
|
||||||
|
@@ -102,6 +102,8 @@
|
|||||||
.else
|
.else
|
||||||
ldmdb sp, {r0 - lr}^ @ get calling r0 - lr
|
ldmdb sp, {r0 - lr}^ @ get calling r0 - lr
|
||||||
.endif
|
.endif
|
||||||
|
mov r0, r0 @ ARMv5T and earlier require a nop
|
||||||
|
@ after ldm {}^
|
||||||
add sp, sp, #S_FRAME_SIZE - S_PC
|
add sp, sp, #S_FRAME_SIZE - S_PC
|
||||||
movs pc, lr @ return & move spsr_svc into cpsr
|
movs pc, lr @ return & move spsr_svc into cpsr
|
||||||
.endm
|
.endm
|
||||||
|
@@ -27,7 +27,6 @@
|
|||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
* Authors: George Davis <davis_g@mvista.com>
|
* Authors: George Davis <davis_g@mvista.com>
|
||||||
* Deepak Saxena <dsaxena@plexity.net>
|
* Deepak Saxena <dsaxena@plexity.net>
|
||||||
*/
|
*/
|
||||||
|
#include <linux/irq.h>
|
||||||
#include <linux/kgdb.h>
|
#include <linux/kgdb.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
|
||||||
@@ -158,6 +159,18 @@ static struct undef_hook kgdb_compiled_brkpt_hook = {
|
|||||||
.fn = kgdb_compiled_brk_fn
|
.fn = kgdb_compiled_brk_fn
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void kgdb_call_nmi_hook(void *ignored)
|
||||||
|
{
|
||||||
|
kgdb_nmicallback(raw_smp_processor_id(), get_irq_regs());
|
||||||
|
}
|
||||||
|
|
||||||
|
void kgdb_roundup_cpus(unsigned long flags)
|
||||||
|
{
|
||||||
|
local_irq_enable();
|
||||||
|
smp_call_function(kgdb_call_nmi_hook, NULL, 0);
|
||||||
|
local_irq_disable();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kgdb_arch_init - Perform any architecture specific initalization.
|
* kgdb_arch_init - Perform any architecture specific initalization.
|
||||||
*
|
*
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/stop_machine.h>
|
#include <linux/stop_machine.h>
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
@@ -393,6 +394,14 @@ void __kprobes jprobe_return(void)
|
|||||||
/*
|
/*
|
||||||
* Setup an empty pt_regs. Fill SP and PC fields as
|
* Setup an empty pt_regs. Fill SP and PC fields as
|
||||||
* they're needed by longjmp_break_handler.
|
* they're needed by longjmp_break_handler.
|
||||||
|
*
|
||||||
|
* We allocate some slack between the original SP and start of
|
||||||
|
* our fabricated regs. To be precise we want to have worst case
|
||||||
|
* covered which is STMFD with all 16 regs so we allocate 2 *
|
||||||
|
* sizeof(struct_pt_regs)).
|
||||||
|
*
|
||||||
|
* This is to prevent any simulated instruction from writing
|
||||||
|
* over the regs when they are accessing the stack.
|
||||||
*/
|
*/
|
||||||
"sub sp, %0, %1 \n\t"
|
"sub sp, %0, %1 \n\t"
|
||||||
"ldr r0, ="__stringify(JPROBE_MAGIC_ADDR)"\n\t"
|
"ldr r0, ="__stringify(JPROBE_MAGIC_ADDR)"\n\t"
|
||||||
@@ -410,7 +419,7 @@ void __kprobes jprobe_return(void)
|
|||||||
"ldmia sp, {r0 - pc} \n\t"
|
"ldmia sp, {r0 - pc} \n\t"
|
||||||
:
|
:
|
||||||
: "r" (kcb->jprobe_saved_regs.ARM_sp),
|
: "r" (kcb->jprobe_saved_regs.ARM_sp),
|
||||||
"I" (sizeof(struct pt_regs)),
|
"I" (sizeof(struct pt_regs) * 2),
|
||||||
"J" (offsetof(struct pt_regs, ARM_sp)),
|
"J" (offsetof(struct pt_regs, ARM_sp)),
|
||||||
"J" (offsetof(struct pt_regs, ARM_pc)),
|
"J" (offsetof(struct pt_regs, ARM_pc)),
|
||||||
"J" (offsetof(struct pt_regs, ARM_cpsr))
|
"J" (offsetof(struct pt_regs, ARM_cpsr))
|
||||||
|
@@ -16,9 +16,9 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/gfp.h>
|
||||||
|
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
@@ -332,7 +332,8 @@ armpmu_reserve_hardware(void)
|
|||||||
|
|
||||||
for (i = 0; i < pmu_irqs->num_irqs; ++i) {
|
for (i = 0; i < pmu_irqs->num_irqs; ++i) {
|
||||||
err = request_irq(pmu_irqs->irqs[i], armpmu->handle_irq,
|
err = request_irq(pmu_irqs->irqs[i], armpmu->handle_irq,
|
||||||
IRQF_DISABLED, "armpmu", NULL);
|
IRQF_DISABLED | IRQF_NOBALANCING,
|
||||||
|
"armpmu", NULL);
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_warning("unable to request IRQ%d for ARM "
|
pr_warning("unable to request IRQ%d for ARM "
|
||||||
"perf counters\n", pmu_irqs->irqs[i]);
|
"perf counters\n", pmu_irqs->irqs[i]);
|
||||||
@@ -1624,7 +1625,7 @@ enum armv7_counters {
|
|||||||
/*
|
/*
|
||||||
* EVTSEL: Event selection reg
|
* EVTSEL: Event selection reg
|
||||||
*/
|
*/
|
||||||
#define ARMV7_EVTSEL_MASK 0x7f /* Mask for writable bits */
|
#define ARMV7_EVTSEL_MASK 0xff /* Mask for writable bits */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SELECT: Counter selection reg
|
* SELECT: Counter selection reg
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
|
@@ -99,6 +99,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
|||||||
*pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) |
|
*pmd = __pmd((PHYS_OFFSET & PGDIR_MASK) |
|
||||||
PMD_TYPE_SECT | PMD_SECT_AP_WRITE);
|
PMD_TYPE_SECT | PMD_SECT_AP_WRITE);
|
||||||
flush_pmd_entry(pmd);
|
flush_pmd_entry(pmd);
|
||||||
|
outer_clean_range(__pa(pmd), __pa(pmd + 1));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to tell the secondary core where to find
|
* We need to tell the secondary core where to find
|
||||||
@@ -106,7 +107,8 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
|||||||
*/
|
*/
|
||||||
secondary_data.stack = task_stack_page(idle) + THREAD_START_SP;
|
secondary_data.stack = task_stack_page(idle) + THREAD_START_SP;
|
||||||
secondary_data.pgdir = virt_to_phys(pgd);
|
secondary_data.pgdir = virt_to_phys(pgd);
|
||||||
wmb();
|
__cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data));
|
||||||
|
outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now bring the CPU into our world.
|
* Now bring the CPU into our world.
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/sem.h>
|
#include <linux/sem.h>
|
||||||
#include <linux/msg.h>
|
#include <linux/msg.h>
|
||||||
@@ -27,6 +26,7 @@
|
|||||||
#include <linux/file.h>
|
#include <linux/file.h>
|
||||||
#include <linux/ipc.h>
|
#include <linux/ipc.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
/* Fork a new task - this creates a new program thread.
|
/* Fork a new task - this creates a new program thread.
|
||||||
* This is called indirectly via a small wrapper
|
* This is called indirectly via a small wrapper
|
||||||
|
@@ -74,7 +74,7 @@ ENTRY(memmove)
|
|||||||
rsb ip, ip, #32
|
rsb ip, ip, #32
|
||||||
addne pc, pc, ip @ C is always clear here
|
addne pc, pc, ip @ C is always clear here
|
||||||
b 7f
|
b 7f
|
||||||
6: nop
|
6: W(nop)
|
||||||
W(ldr) r3, [r1, #-4]!
|
W(ldr) r3, [r1, #-4]!
|
||||||
W(ldr) r4, [r1, #-4]!
|
W(ldr) r4, [r1, #-4]!
|
||||||
W(ldr) r5, [r1, #-4]!
|
W(ldr) r5, [r1, #-4]!
|
||||||
@@ -85,7 +85,7 @@ ENTRY(memmove)
|
|||||||
|
|
||||||
add pc, pc, ip
|
add pc, pc, ip
|
||||||
nop
|
nop
|
||||||
nop
|
W(nop)
|
||||||
W(str) r3, [r0, #-4]!
|
W(str) r3, [r0, #-4]!
|
||||||
W(str) r4, [r0, #-4]!
|
W(str) r4, [r0, #-4]!
|
||||||
W(str) r5, [r0, #-4]!
|
W(str) r5, [r0, #-4]!
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/hardirq.h> /* for in_atomic() */
|
#include <linux/hardirq.h> /* for in_atomic() */
|
||||||
|
#include <linux/gfp.h>
|
||||||
#include <asm/current.h>
|
#include <asm/current.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/gfp.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@@ -271,10 +271,12 @@ static void __init ek_add_device_buttons(void) {}
|
|||||||
|
|
||||||
|
|
||||||
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("24c512", 0x50),
|
I2C_BOARD_INFO("24c512", 0x50)
|
||||||
I2C_BOARD_INFO("wm8731", 0x1b),
|
},
|
||||||
},
|
{
|
||||||
|
I2C_BOARD_INFO("wm8731", 0x1b)
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irqreturn.h>
|
#include <linux/irqreturn.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <mach/timer.h>
|
#include <mach/timer.h>
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <linux/leds.h>
|
#include <linux/leds.h>
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
#include <linux/mtd/nand.h>
|
#include <linux/mtd/nand.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
|
@@ -758,7 +758,6 @@ static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
|
|||||||
[IRQ_MMCINT] = 7,
|
[IRQ_MMCINT] = 7,
|
||||||
[IRQ_DM365_MMCINT1] = 7,
|
[IRQ_DM365_MMCINT1] = 7,
|
||||||
[IRQ_DM365_PWMINT3] = 7,
|
[IRQ_DM365_PWMINT3] = 7,
|
||||||
[IRQ_DDRINT] = 4,
|
|
||||||
[IRQ_AEMIFINT] = 2,
|
[IRQ_AEMIFINT] = 2,
|
||||||
[IRQ_DM365_SDIOINT1] = 2,
|
[IRQ_DM365_SDIOINT1] = 2,
|
||||||
[IRQ_TINT0_TINT12] = 7,
|
[IRQ_TINT0_TINT12] = 7,
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
#include <mach/edma.h>
|
#include <mach/edma.h>
|
||||||
|
|
||||||
@@ -1266,7 +1267,8 @@ int edma_start(unsigned channel)
|
|||||||
/* EDMA channel with event association */
|
/* EDMA channel with event association */
|
||||||
pr_debug("EDMA: ER%d %08x\n", j,
|
pr_debug("EDMA: ER%d %08x\n", j,
|
||||||
edma_shadow0_read_array(ctlr, SH_ER, j));
|
edma_shadow0_read_array(ctlr, SH_ER, j));
|
||||||
/* Clear any pending error */
|
/* Clear any pending event or error */
|
||||||
|
edma_write_array(ctlr, EDMA_ECR, j, mask);
|
||||||
edma_write_array(ctlr, EDMA_EMCR, j, mask);
|
edma_write_array(ctlr, EDMA_EMCR, j, mask);
|
||||||
/* Clear any SER */
|
/* Clear any SER */
|
||||||
edma_shadow0_write_array(ctlr, SH_SECR, j, mask);
|
edma_shadow0_write_array(ctlr, SH_SECR, j, mask);
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Author: Mark A. Greer <mgreer@mvista.com>
|
* Author: Mark A. Greer <mgreer@mvista.com>
|
||||||
*
|
*
|
||||||
* 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
|
* 2007, 2009-2010 (c) MontaVista Software, Inc. This file is licensed under
|
||||||
* the terms of the GNU General Public License version 2. This program
|
* the terms of the GNU General Public License version 2. This program
|
||||||
* is licensed "as is" without any warranty of any kind, whether express
|
* is licensed "as is" without any warranty of any kind, whether express
|
||||||
* or implied.
|
* or implied.
|
||||||
@@ -13,7 +13,9 @@
|
|||||||
|
|
||||||
#include <video/da8xx-fb.h>
|
#include <video/da8xx-fb.h>
|
||||||
|
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/davinci_emac.h>
|
#include <linux/davinci_emac.h>
|
||||||
|
|
||||||
#include <mach/serial.h>
|
#include <mach/serial.h>
|
||||||
#include <mach/edma.h>
|
#include <mach/edma.h>
|
||||||
#include <mach/i2c.h>
|
#include <mach/i2c.h>
|
||||||
@@ -144,6 +146,10 @@ extern const short da850_mmcsd0_pins[];
|
|||||||
extern const short da850_nand_pins[];
|
extern const short da850_nand_pins[];
|
||||||
extern const short da850_nor_pins[];
|
extern const short da850_nor_pins[];
|
||||||
|
|
||||||
|
#ifdef CONFIG_DAVINCI_MUX
|
||||||
int da8xx_pinmux_setup(const short pins[]);
|
int da8xx_pinmux_setup(const short pins[]);
|
||||||
|
#else
|
||||||
|
static inline int da8xx_pinmux_setup(const short pins[]) { return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_ARCH_DAVINCI_DA8XX_H */
|
#endif /* __ASM_ARCH_DAVINCI_DA8XX_H */
|
||||||
|
@@ -253,8 +253,6 @@ static void __init timer_init(void)
|
|||||||
irq = USING_COMPARE(t) ? dtip[i].cmp_irq : irq;
|
irq = USING_COMPARE(t) ? dtip[i].cmp_irq : irq;
|
||||||
setup_irq(irq, &t->irqaction);
|
setup_irq(irq, &t->irqaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
timer32_config(&timers[i]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,6 +329,7 @@ static void __init davinci_timer_init(void)
|
|||||||
unsigned int clocksource_id;
|
unsigned int clocksource_id;
|
||||||
static char err[] __initdata = KERN_ERR
|
static char err[] __initdata = KERN_ERR
|
||||||
"%s: can't register clocksource!\n";
|
"%s: can't register clocksource!\n";
|
||||||
|
int i;
|
||||||
|
|
||||||
clockevent_id = soc_info->timer_info->clockevent_id;
|
clockevent_id = soc_info->timer_info->clockevent_id;
|
||||||
clocksource_id = soc_info->timer_info->clocksource_id;
|
clocksource_id = soc_info->timer_info->clocksource_id;
|
||||||
@@ -389,6 +388,9 @@ static void __init davinci_timer_init(void)
|
|||||||
|
|
||||||
clockevent_davinci.cpumask = cpumask_of(0);
|
clockevent_davinci.cpumask = cpumask_of(0);
|
||||||
clockevents_register_device(&clockevent_davinci);
|
clockevents_register_device(&clockevent_davinci);
|
||||||
|
|
||||||
|
for (i=0; i< ARRAY_SIZE(timers); i++)
|
||||||
|
timer32_config(&timers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sys_timer davinci_timer = {
|
struct sys_timer davinci_timer = {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user