Merge branch 'linus' into core/generic-dma-coherent
Conflicts: arch/x86/Kconfig Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
cb28a1bbdb
CREDITS
Documentation
00-INDEX
ABI/testing
CodingStyleDMA-API.txtDMA-attributes.txtDocBook
HOWTOIntel-IOMMU.txtSubmittingPatchesaccounting
arm
bt8xxgpio.txtcontrollers
cpu-freq
edac.txtfb
feature-removal-schedule.txtfilesystems
gpio.txti2c
ia64
input
ioctl
iostats.txtisdn
kernel-parameters.txtkeys.txtlaptops
leds-class.txtlocal_ops.txtmd.txtmoxa-smartionetworking
bonding.txtcan.txtdm9000.txte1000.txtip-sysctl.txtixgb.txt
mac80211_hwsim
multiqueue.txtpacket_mmap.txts2io.txttc-actions-env-rules.txtudplite.txtpower
powerpc
rfkill.txts390
scsi
serial
sh
sound/alsa
sparse.txtspecialix.txtsysctl
sysfs-rules.txt
11
CREDITS
11
CREDITS
|
@ -317,6 +317,14 @@ S: 2322 37th Ave SW
|
||||||
S: Seattle, Washington 98126-2010
|
S: Seattle, Washington 98126-2010
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
|
N: Muli Ben-Yehuda
|
||||||
|
E: mulix@mulix.org
|
||||||
|
E: muli@il.ibm.com
|
||||||
|
W: http://www.mulix.org
|
||||||
|
D: trident OSS sound driver, x86-64 dma-ops and Calgary IOMMU,
|
||||||
|
D: KVM and Xen bits and other misc. hackery.
|
||||||
|
S: Haifa, Israel
|
||||||
|
|
||||||
N: Johannes Berg
|
N: Johannes Berg
|
||||||
E: johannes@sipsolutions.net
|
E: johannes@sipsolutions.net
|
||||||
W: http://johannes.sipsolutions.net/
|
W: http://johannes.sipsolutions.net/
|
||||||
|
@ -3344,8 +3352,7 @@ S: Spain
|
||||||
N: Linus Torvalds
|
N: Linus Torvalds
|
||||||
E: torvalds@linux-foundation.org
|
E: torvalds@linux-foundation.org
|
||||||
D: Original kernel hacker
|
D: Original kernel hacker
|
||||||
S: 12725 SW Millikan Way, Suite 400
|
S: Portland, Oregon 97005
|
||||||
S: Beaverton, Oregon 97005
|
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
N: Marcelo Tosatti
|
N: Marcelo Tosatti
|
||||||
|
|
|
@ -361,8 +361,6 @@ telephony/
|
||||||
- directory with info on telephony (e.g. voice over IP) support.
|
- directory with info on telephony (e.g. voice over IP) support.
|
||||||
time_interpolators.txt
|
time_interpolators.txt
|
||||||
- info on time interpolators.
|
- info on time interpolators.
|
||||||
tipar.txt
|
|
||||||
- information about Parallel link cable for Texas Instruments handhelds.
|
|
||||||
tty.txt
|
tty.txt
|
||||||
- guide to the locking policies of the tty layer.
|
- guide to the locking policies of the tty layer.
|
||||||
uml/
|
uml/
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
What: /sys/dev
|
||||||
|
Date: April 2008
|
||||||
|
KernelVersion: 2.6.26
|
||||||
|
Contact: Dan Williams <dan.j.williams@intel.com>
|
||||||
|
Description: The /sys/dev tree provides a method to look up the sysfs
|
||||||
|
path for a device using the information returned from
|
||||||
|
stat(2). There are two directories, 'block' and 'char',
|
||||||
|
beneath /sys/dev containing symbolic links with names of
|
||||||
|
the form "<major>:<minor>". These links point to the
|
||||||
|
corresponding sysfs path for the given device.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
$ readlink /sys/dev/block/8:32
|
||||||
|
../../block/sdc
|
||||||
|
|
||||||
|
Entries in /sys/dev/char and /sys/dev/block will be
|
||||||
|
dynamically created and destroyed as devices enter and
|
||||||
|
leave the system.
|
||||||
|
|
||||||
|
Users: mdadm <linux-raid@vger.kernel.org>
|
|
@ -0,0 +1,24 @@
|
||||||
|
What: /sys/devices/system/memory
|
||||||
|
Date: June 2008
|
||||||
|
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
||||||
|
Description:
|
||||||
|
The /sys/devices/system/memory contains a snapshot of the
|
||||||
|
internal state of the kernel memory blocks. Files could be
|
||||||
|
added or removed dynamically to represent hot-add/remove
|
||||||
|
operations.
|
||||||
|
|
||||||
|
Users: hotplug memory add/remove tools
|
||||||
|
https://w3.opensource.ibm.com/projects/powerpc-utils/
|
||||||
|
|
||||||
|
What: /sys/devices/system/memory/memoryX/removable
|
||||||
|
Date: June 2008
|
||||||
|
Contact: Badari Pulavarty <pbadari@us.ibm.com>
|
||||||
|
Description:
|
||||||
|
The file /sys/devices/system/memory/memoryX/removable
|
||||||
|
indicates whether this memory block is removable or not.
|
||||||
|
This is useful for a user-level agent to determine
|
||||||
|
identify removable sections of the memory before attempting
|
||||||
|
potentially expensive hot-remove memory operation
|
||||||
|
|
||||||
|
Users: hotplug memory remove tools
|
||||||
|
https://w3.opensource.ibm.com/projects/powerpc-utils/
|
|
@ -0,0 +1,6 @@
|
||||||
|
What: /sys/kernel/mm
|
||||||
|
Date: July 2008
|
||||||
|
Contact: Nishanth Aravamudan <nacc@us.ibm.com>, VM maintainers
|
||||||
|
Description:
|
||||||
|
/sys/kernel/mm/ should contain any and all VM
|
||||||
|
related information in /sys/kernel/.
|
|
@ -0,0 +1,15 @@
|
||||||
|
What: /sys/kernel/mm/hugepages/
|
||||||
|
Date: June 2008
|
||||||
|
Contact: Nishanth Aravamudan <nacc@us.ibm.com>, hugetlb maintainers
|
||||||
|
Description:
|
||||||
|
/sys/kernel/mm/hugepages/ contains a number of subdirectories
|
||||||
|
of the form hugepages-<size>kB, where <size> is the page size
|
||||||
|
of the hugepages supported by the kernel/CPU combination.
|
||||||
|
|
||||||
|
Under these directories are a number of files:
|
||||||
|
nr_hugepages
|
||||||
|
nr_overcommit_hugepages
|
||||||
|
free_hugepages
|
||||||
|
surplus_hugepages
|
||||||
|
resv_hugepages
|
||||||
|
See Documentation/vm/hugetlbpage.txt for details.
|
|
@ -474,25 +474,29 @@ make a good program).
|
||||||
So, you can either get rid of GNU emacs, or change it to use saner
|
So, you can either get rid of GNU emacs, or change it to use saner
|
||||||
values. To do the latter, you can stick the following in your .emacs file:
|
values. To do the latter, you can stick the following in your .emacs file:
|
||||||
|
|
||||||
(defun linux-c-mode ()
|
(defun c-lineup-arglist-tabs-only (ignored)
|
||||||
"C mode with adjusted defaults for use with the Linux kernel."
|
"Line up argument lists by tabs, not spaces"
|
||||||
(interactive)
|
(let* ((anchor (c-langelem-pos c-syntactic-element))
|
||||||
(c-mode)
|
(column (c-langelem-2nd-pos c-syntactic-element))
|
||||||
(c-set-style "K&R")
|
(offset (- (1+ column) anchor))
|
||||||
(setq tab-width 8)
|
(steps (floor offset c-basic-offset)))
|
||||||
(setq indent-tabs-mode t)
|
(* (max steps 1)
|
||||||
(setq c-basic-offset 8))
|
c-basic-offset)))
|
||||||
|
|
||||||
This will define the M-x linux-c-mode command. When hacking on a
|
(add-hook 'c-mode-hook
|
||||||
module, if you put the string -*- linux-c -*- somewhere on the first
|
(lambda ()
|
||||||
two lines, this mode will be automatically invoked. Also, you may want
|
(let ((filename (buffer-file-name)))
|
||||||
to add
|
;; Enable kernel mode for the appropriate files
|
||||||
|
(when (and filename
|
||||||
|
(string-match "~/src/linux-trees" filename))
|
||||||
|
(setq indent-tabs-mode t)
|
||||||
|
(c-set-style "linux")
|
||||||
|
(c-set-offset 'arglist-cont-nonempty
|
||||||
|
'(c-lineup-gcc-asm-reg
|
||||||
|
c-lineup-arglist-tabs-only))))))
|
||||||
|
|
||||||
(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode)
|
This will make emacs go better with the kernel coding style for C
|
||||||
auto-mode-alist))
|
files below ~/src/linux-trees.
|
||||||
|
|
||||||
to your .emacs file if you want to have linux-c-mode switched on
|
|
||||||
automagically when you edit source files under /usr/src/linux.
|
|
||||||
|
|
||||||
But even if you fail in getting emacs to do sane formatting, not
|
But even if you fail in getting emacs to do sane formatting, not
|
||||||
everything is lost: use "indent".
|
everything is lost: use "indent".
|
||||||
|
|
|
@ -298,10 +298,10 @@ recommended that you never use these unless you really know what the
|
||||||
cache width is.
|
cache width is.
|
||||||
|
|
||||||
int
|
int
|
||||||
dma_mapping_error(dma_addr_t dma_addr)
|
dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||||
|
|
||||||
int
|
int
|
||||||
pci_dma_mapping_error(dma_addr_t dma_addr)
|
pci_dma_mapping_error(struct pci_dev *hwdev, dma_addr_t dma_addr)
|
||||||
|
|
||||||
In some circumstances dma_map_single and dma_map_page will fail to create
|
In some circumstances dma_map_single and dma_map_page will fail to create
|
||||||
a mapping. A driver can check for these errors by testing the returned
|
a mapping. A driver can check for these errors by testing the returned
|
||||||
|
|
|
@ -22,3 +22,12 @@ ready and available in memory. The DMA of the "completion indication"
|
||||||
could race with data DMA. Mapping the memory used for completion
|
could race with data DMA. Mapping the memory used for completion
|
||||||
indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
|
indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
|
||||||
|
|
||||||
|
DMA_ATTR_WEAK_ORDERING
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
DMA_ATTR_WEAK_ORDERING specifies that reads and writes to the mapping
|
||||||
|
may be weakly ordered, that is that reads and writes may pass each other.
|
||||||
|
|
||||||
|
Since it is optional for platforms to implement DMA_ATTR_WEAK_ORDERING,
|
||||||
|
those that do not will simply ignore the attribute and exhibit default
|
||||||
|
behavior.
|
||||||
|
|
|
@ -524,6 +524,44 @@ These utilities include endpoint autoconfiguration.
|
||||||
<!-- !Edrivers/usb/gadget/epautoconf.c -->
|
<!-- !Edrivers/usb/gadget/epautoconf.c -->
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="composite"><title>Composite Device Framework</title>
|
||||||
|
|
||||||
|
<para>The core API is sufficient for writing drivers for composite
|
||||||
|
USB devices (with more than one function in a given configuration),
|
||||||
|
and also multi-configuration devices (also more than one function,
|
||||||
|
but not necessarily sharing a given configuration).
|
||||||
|
There is however an optional framework which makes it easier to
|
||||||
|
reuse and combine functions.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>Devices using this framework provide a <emphasis>struct
|
||||||
|
usb_composite_driver</emphasis>, which in turn provides one or
|
||||||
|
more <emphasis>struct usb_configuration</emphasis> instances.
|
||||||
|
Each such configuration includes at least one
|
||||||
|
<emphasis>struct usb_function</emphasis>, which packages a user
|
||||||
|
visible role such as "network link" or "mass storage device".
|
||||||
|
Management functions may also exist, such as "Device Firmware
|
||||||
|
Upgrade".
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Iinclude/linux/usb/composite.h
|
||||||
|
!Edrivers/usb/gadget/composite.c
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="functions"><title>Composite Device Functions</title>
|
||||||
|
|
||||||
|
<para>At this writing, a few of the current gadget drivers have
|
||||||
|
been converted to this framework.
|
||||||
|
Near-term plans include converting all of them, except for "gadgetfs".
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Edrivers/usb/gadget/f_acm.c
|
||||||
|
!Edrivers/usb/gadget/f_serial.c
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="controllers"><title>Peripheral Controller Drivers</title>
|
<chapter id="controllers"><title>Peripheral Controller Drivers</title>
|
||||||
|
|
|
@ -219,10 +219,10 @@
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<sect1 id="lock-intro">
|
<sect1 id="lock-intro">
|
||||||
<title>Three Main Types of Kernel Locks: Spinlocks, Mutexes and Semaphores</title>
|
<title>Two Main Types of Kernel Locks: Spinlocks and Mutexes</title>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
There are three main types of kernel locks. The fundamental type
|
There are two main types of kernel locks. The fundamental type
|
||||||
is the spinlock
|
is the spinlock
|
||||||
(<filename class="headerfile">include/asm/spinlock.h</filename>),
|
(<filename class="headerfile">include/asm/spinlock.h</filename>),
|
||||||
which is a very simple single-holder lock: if you can't get the
|
which is a very simple single-holder lock: if you can't get the
|
||||||
|
@ -239,14 +239,6 @@
|
||||||
can't sleep (see <xref linkend="sleeping-things"/>), and so have to
|
can't sleep (see <xref linkend="sleeping-things"/>), and so have to
|
||||||
use a spinlock instead.
|
use a spinlock instead.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
|
||||||
The third type is a semaphore
|
|
||||||
(<filename class="headerfile">include/linux/semaphore.h</filename>): it
|
|
||||||
can have more than one holder at any time (the number decided at
|
|
||||||
initialization time), although it is most commonly used as a
|
|
||||||
single-holder lock (a mutex). If you can't get a semaphore, your
|
|
||||||
task will be suspended and later on woken up - just like for mutexes.
|
|
||||||
</para>
|
|
||||||
<para>
|
<para>
|
||||||
Neither type of lock is recursive: see
|
Neither type of lock is recursive: see
|
||||||
<xref linkend="deadlock"/>.
|
<xref linkend="deadlock"/>.
|
||||||
|
@ -278,7 +270,7 @@
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Semaphores still exist, because they are required for
|
Mutexes still exist, because they are required for
|
||||||
synchronization between <firstterm linkend="gloss-usercontext">user
|
synchronization between <firstterm linkend="gloss-usercontext">user
|
||||||
contexts</firstterm>, as we will see below.
|
contexts</firstterm>, as we will see below.
|
||||||
</para>
|
</para>
|
||||||
|
@ -289,18 +281,17 @@
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
If you have a data structure which is only ever accessed from
|
If you have a data structure which is only ever accessed from
|
||||||
user context, then you can use a simple semaphore
|
user context, then you can use a simple mutex
|
||||||
(<filename>linux/linux/semaphore.h</filename>) to protect it. This
|
(<filename>include/linux/mutex.h</filename>) to protect it. This
|
||||||
is the most trivial case: you initialize the semaphore to the number
|
is the most trivial case: you initialize the mutex. Then you can
|
||||||
of resources available (usually 1), and call
|
call <function>mutex_lock_interruptible()</function> to grab the mutex,
|
||||||
<function>down_interruptible()</function> to grab the semaphore, and
|
and <function>mutex_unlock()</function> to release it. There is also a
|
||||||
<function>up()</function> to release it. There is also a
|
<function>mutex_lock()</function>, which should be avoided, because it
|
||||||
<function>down()</function>, which should be avoided, because it
|
|
||||||
will not return if a signal is received.
|
will not return if a signal is received.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Example: <filename>linux/net/core/netfilter.c</filename> allows
|
Example: <filename>net/netfilter/nf_sockopt.c</filename> allows
|
||||||
registration of new <function>setsockopt()</function> and
|
registration of new <function>setsockopt()</function> and
|
||||||
<function>getsockopt()</function> calls, with
|
<function>getsockopt()</function> calls, with
|
||||||
<function>nf_register_sockopt()</function>. Registration and
|
<function>nf_register_sockopt()</function>. Registration and
|
||||||
|
@ -515,7 +506,7 @@
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
If you are in a process context (any syscall) and want to
|
If you are in a process context (any syscall) and want to
|
||||||
lock other process out, use a semaphore. You can take a semaphore
|
lock other process out, use a mutex. You can take a mutex
|
||||||
and sleep (<function>copy_from_user*(</function> or
|
and sleep (<function>copy_from_user*(</function> or
|
||||||
<function>kmalloc(x,GFP_KERNEL)</function>).
|
<function>kmalloc(x,GFP_KERNEL)</function>).
|
||||||
</para>
|
</para>
|
||||||
|
@ -662,7 +653,7 @@
|
||||||
<entry>SLBH</entry>
|
<entry>SLBH</entry>
|
||||||
<entry>SLBH</entry>
|
<entry>SLBH</entry>
|
||||||
<entry>SLBH</entry>
|
<entry>SLBH</entry>
|
||||||
<entry>DI</entry>
|
<entry>MLI</entry>
|
||||||
<entry>None</entry>
|
<entry>None</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
|
@ -692,8 +683,8 @@
|
||||||
<entry>spin_lock_bh</entry>
|
<entry>spin_lock_bh</entry>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry>DI</entry>
|
<entry>MLI</entry>
|
||||||
<entry>down_interruptible</entry>
|
<entry>mutex_lock_interruptible</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -1310,7 +1301,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>.
|
||||||
<para>
|
<para>
|
||||||
There is a coding bug where a piece of code tries to grab a
|
There is a coding bug where a piece of code tries to grab a
|
||||||
spinlock twice: it will spin forever, waiting for the lock to
|
spinlock twice: it will spin forever, waiting for the lock to
|
||||||
be released (spinlocks, rwlocks and semaphores are not
|
be released (spinlocks, rwlocks and mutexes are not
|
||||||
recursive in Linux). This is trivial to diagnose: not a
|
recursive in Linux). This is trivial to diagnose: not a
|
||||||
stay-up-five-nights-talk-to-fluffy-code-bunnies kind of
|
stay-up-five-nights-talk-to-fluffy-code-bunnies kind of
|
||||||
problem.
|
problem.
|
||||||
|
@ -1335,7 +1326,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>.
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
This complete lockup is easy to diagnose: on SMP boxes the
|
This complete lockup is easy to diagnose: on SMP boxes the
|
||||||
watchdog timer or compiling with <symbol>DEBUG_SPINLOCKS</symbol> set
|
watchdog timer or compiling with <symbol>DEBUG_SPINLOCK</symbol> set
|
||||||
(<filename>include/linux/spinlock.h</filename>) will show this up
|
(<filename>include/linux/spinlock.h</filename>) will show this up
|
||||||
immediately when it happens.
|
immediately when it happens.
|
||||||
</para>
|
</para>
|
||||||
|
@ -1558,7 +1549,7 @@ the amount of locking which needs to be done.
|
||||||
<title>Read/Write Lock Variants</title>
|
<title>Read/Write Lock Variants</title>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
Both spinlocks and semaphores have read/write variants:
|
Both spinlocks and mutexes have read/write variants:
|
||||||
<type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
|
<type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
|
||||||
These divide users into two classes: the readers and the writers. If
|
These divide users into two classes: the readers and the writers. If
|
||||||
you are only reading the data, you can get a read lock, but to write to
|
you are only reading the data, you can get a read lock, but to write to
|
||||||
|
@ -1681,7 +1672,7 @@ the amount of locking which needs to be done.
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
+#include <linux/rcupdate.h>
|
+#include <linux/rcupdate.h>
|
||||||
#include <linux/semaphore.h>
|
#include <linux/mutex.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
|
|
||||||
struct object
|
struct object
|
||||||
|
@ -1913,7 +1904,7 @@ machines due to caching.
|
||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
<function> put_user()</function>
|
<function>put_user()</function>
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
@ -1927,13 +1918,13 @@ machines due to caching.
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
<function>down_interruptible()</function> and
|
<function>mutex_lock_interruptible()</function> and
|
||||||
<function>down()</function>
|
<function>mutex_lock()</function>
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
There is a <function>down_trylock()</function> which can be
|
There is a <function>mutex_trylock()</function> which can be
|
||||||
used inside interrupt context, as it will not sleep.
|
used inside interrupt context, as it will not sleep.
|
||||||
<function>up()</function> will also never sleep.
|
<function>mutex_unlock()</function> will also never sleep.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
@ -2023,7 +2014,7 @@ machines due to caching.
|
||||||
<para>
|
<para>
|
||||||
Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
|
Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
|
||||||
unset, processes in user context inside the kernel would not
|
unset, processes in user context inside the kernel would not
|
||||||
preempt each other (ie. you had that CPU until you have it up,
|
preempt each other (ie. you had that CPU until you gave it up,
|
||||||
except for interrupts). With the addition of
|
except for interrupts). With the addition of
|
||||||
<symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
|
<symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
|
||||||
in user context, higher priority tasks can "cut in": spinlocks
|
in user context, higher priority tasks can "cut in": spinlocks
|
||||||
|
|
|
@ -29,12 +29,12 @@
|
||||||
|
|
||||||
<revhistory>
|
<revhistory>
|
||||||
<revision>
|
<revision>
|
||||||
<revnumber>1.0 </revnumber>
|
<revnumber>1.0</revnumber>
|
||||||
<date>May 30, 2001</date>
|
<date>May 30, 2001</date>
|
||||||
<revremark>Initial revision posted to linux-kernel</revremark>
|
<revremark>Initial revision posted to linux-kernel</revremark>
|
||||||
</revision>
|
</revision>
|
||||||
<revision>
|
<revision>
|
||||||
<revnumber>1.1 </revnumber>
|
<revnumber>1.1</revnumber>
|
||||||
<date>June 3, 2001</date>
|
<date>June 3, 2001</date>
|
||||||
<revremark>Revised after comments from linux-kernel</revremark>
|
<revremark>Revised after comments from linux-kernel</revremark>
|
||||||
</revision>
|
</revision>
|
||||||
|
|
|
@ -21,6 +21,18 @@
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>2006-2008</year>
|
||||||
|
<holder>Hans-Jürgen Koch.</holder>
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<legalnotice>
|
||||||
|
<para>
|
||||||
|
This documentation is Free Software licensed under the terms of the
|
||||||
|
GPL version 2.
|
||||||
|
</para>
|
||||||
|
</legalnotice>
|
||||||
|
|
||||||
<pubdate>2006-12-11</pubdate>
|
<pubdate>2006-12-11</pubdate>
|
||||||
|
|
||||||
<abstract>
|
<abstract>
|
||||||
|
@ -29,6 +41,12 @@
|
||||||
</abstract>
|
</abstract>
|
||||||
|
|
||||||
<revhistory>
|
<revhistory>
|
||||||
|
<revision>
|
||||||
|
<revnumber>0.5</revnumber>
|
||||||
|
<date>2008-05-22</date>
|
||||||
|
<authorinitials>hjk</authorinitials>
|
||||||
|
<revremark>Added description of write() function.</revremark>
|
||||||
|
</revision>
|
||||||
<revision>
|
<revision>
|
||||||
<revnumber>0.4</revnumber>
|
<revnumber>0.4</revnumber>
|
||||||
<date>2007-11-26</date>
|
<date>2007-11-26</date>
|
||||||
|
@ -57,20 +75,9 @@
|
||||||
</bookinfo>
|
</bookinfo>
|
||||||
|
|
||||||
<chapter id="aboutthisdoc">
|
<chapter id="aboutthisdoc">
|
||||||
<?dbhtml filename="about.html"?>
|
<?dbhtml filename="aboutthis.html"?>
|
||||||
<title>About this document</title>
|
<title>About this document</title>
|
||||||
|
|
||||||
<sect1 id="copyright">
|
|
||||||
<?dbhtml filename="copyright.html"?>
|
|
||||||
<title>Copyright and License</title>
|
|
||||||
<para>
|
|
||||||
Copyright (c) 2006 by Hans-Jürgen Koch.</para>
|
|
||||||
<para>
|
|
||||||
This documentation is Free Software licensed under the terms of the
|
|
||||||
GPL version 2.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="translations">
|
<sect1 id="translations">
|
||||||
<?dbhtml filename="translations.html"?>
|
<?dbhtml filename="translations.html"?>
|
||||||
<title>Translations</title>
|
<title>Translations</title>
|
||||||
|
@ -189,6 +196,30 @@ interested in translating it, please email me
|
||||||
represents the total interrupt count. You can use this number
|
represents the total interrupt count. You can use this number
|
||||||
to figure out if you missed some interrupts.
|
to figure out if you missed some interrupts.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
For some hardware that has more than one interrupt source internally,
|
||||||
|
but not separate IRQ mask and status registers, there might be
|
||||||
|
situations where userspace cannot determine what the interrupt source
|
||||||
|
was if the kernel handler disables them by writing to the chip's IRQ
|
||||||
|
register. In such a case, the kernel has to disable the IRQ completely
|
||||||
|
to leave the chip's register untouched. Now the userspace part can
|
||||||
|
determine the cause of the interrupt, but it cannot re-enable
|
||||||
|
interrupts. Another cornercase is chips where re-enabling interrupts
|
||||||
|
is a read-modify-write operation to a combined IRQ status/acknowledge
|
||||||
|
register. This would be racy if a new interrupt occurred
|
||||||
|
simultaneously.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To address these problems, UIO also implements a write() function. It
|
||||||
|
is normally not used and can be ignored for hardware that has only a
|
||||||
|
single interrupt source or has separate IRQ mask and status registers.
|
||||||
|
If you need it, however, a write to <filename>/dev/uioX</filename>
|
||||||
|
will call the <function>irqcontrol()</function> function implemented
|
||||||
|
by the driver. You have to write a 32-bit value that is usually either
|
||||||
|
0 or 1 to disable or enable interrupts. If a driver does not implement
|
||||||
|
<function>irqcontrol()</function>, <function>write()</function> will
|
||||||
|
return with <varname>-ENOSYS</varname>.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
To handle interrupts properly, your custom kernel module can
|
To handle interrupts properly, your custom kernel module can
|
||||||
|
@ -362,6 +393,14 @@ device is actually used.
|
||||||
<function>open()</function>, you will probably also want a custom
|
<function>open()</function>, you will probably also want a custom
|
||||||
<function>release()</function> function.
|
<function>release()</function> function.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
<varname>int (*irqcontrol)(struct uio_info *info, s32 irq_on)
|
||||||
|
</varname>: Optional. If you need to be able to enable or disable
|
||||||
|
interrupts from userspace by writing to <filename>/dev/uioX</filename>,
|
||||||
|
you can implement this function. The parameter <varname>irq_on</varname>
|
||||||
|
will be 0 to disable interrupts and 1 to enable them.
|
||||||
|
</para></listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
|
|
@ -358,7 +358,7 @@ Here is a list of some of the different kernel trees available:
|
||||||
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
||||||
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||||
|
|
||||||
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
- SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
|
||||||
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||||
|
|
||||||
- x86, Ingo Molnar <mingo@elte.hu>
|
- x86, Ingo Molnar <mingo@elte.hu>
|
||||||
|
|
|
@ -48,7 +48,7 @@ IOVA generation is pretty generic. We used the same technique as vmalloc()
|
||||||
but these are not global address spaces, but separate for each domain.
|
but these are not global address spaces, but separate for each domain.
|
||||||
Different DMA engines may support different number of domains.
|
Different DMA engines may support different number of domains.
|
||||||
|
|
||||||
We also allocate gaurd pages with each mapping, so we can attempt to catch
|
We also allocate guard pages with each mapping, so we can attempt to catch
|
||||||
any overflow that might happen.
|
any overflow that might happen.
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,4 +112,4 @@ TBD
|
||||||
|
|
||||||
- For compatibility testing, could use unity map domain for all devices, just
|
- For compatibility testing, could use unity map domain for all devices, just
|
||||||
provide a 1-1 for all useful memory under a single domain for all devices.
|
provide a 1-1 for all useful memory under a single domain for all devices.
|
||||||
- API for paravirt ops for abstracting functionlity for VMM folks.
|
- API for paravirt ops for abstracting functionality for VMM folks.
|
||||||
|
|
|
@ -528,7 +528,33 @@ See more details on the proper patch format in the following
|
||||||
references.
|
references.
|
||||||
|
|
||||||
|
|
||||||
|
16) Sending "git pull" requests (from Linus emails)
|
||||||
|
|
||||||
|
Please write the git repo address and branch name alone on the same line
|
||||||
|
so that I can't even by mistake pull from the wrong branch, and so
|
||||||
|
that a triple-click just selects the whole thing.
|
||||||
|
|
||||||
|
So the proper format is something along the lines of:
|
||||||
|
|
||||||
|
"Please pull from
|
||||||
|
|
||||||
|
git://jdelvare.pck.nerim.net/jdelvare-2.6 i2c-for-linus
|
||||||
|
|
||||||
|
to get these changes:"
|
||||||
|
|
||||||
|
so that I don't have to hunt-and-peck for the address and inevitably
|
||||||
|
get it wrong (actually, I've only gotten it wrong a few times, and
|
||||||
|
checking against the diffstat tells me when I get it wrong, but I'm
|
||||||
|
just a lot more comfortable when I don't have to "look for" the right
|
||||||
|
thing to pull, and double-check that I have the right branch-name).
|
||||||
|
|
||||||
|
|
||||||
|
Please use "git diff -M --stat --summary" to generate the diffstat:
|
||||||
|
the -M enables rename detection, and the summary enables a summary of
|
||||||
|
new/deleted or renamed files.
|
||||||
|
|
||||||
|
With rename detection, the statistics are rather different [...]
|
||||||
|
because git will notice that a fair number of the changes are renames.
|
||||||
|
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
SECTION 2 - HINTS, TIPS, AND TRICKS
|
SECTION 2 - HINTS, TIPS, AND TRICKS
|
||||||
|
|
|
@ -11,6 +11,7 @@ the delays experienced by a task while
|
||||||
a) waiting for a CPU (while being runnable)
|
a) waiting for a CPU (while being runnable)
|
||||||
b) completion of synchronous block I/O initiated by the task
|
b) completion of synchronous block I/O initiated by the task
|
||||||
c) swapping in pages
|
c) swapping in pages
|
||||||
|
d) memory reclaim
|
||||||
|
|
||||||
and makes these statistics available to userspace through
|
and makes these statistics available to userspace through
|
||||||
the taskstats interface.
|
the taskstats interface.
|
||||||
|
@ -41,7 +42,7 @@ this structure. See
|
||||||
include/linux/taskstats.h
|
include/linux/taskstats.h
|
||||||
for a description of the fields pertaining to delay accounting.
|
for a description of the fields pertaining to delay accounting.
|
||||||
It will generally be in the form of counters returning the cumulative
|
It will generally be in the form of counters returning the cumulative
|
||||||
delay seen for cpu, sync block I/O, swapin etc.
|
delay seen for cpu, sync block I/O, swapin, memory reclaim etc.
|
||||||
|
|
||||||
Taking the difference of two successive readings of a given
|
Taking the difference of two successive readings of a given
|
||||||
counter (say cpu_delay_total) for a task will give the delay
|
counter (say cpu_delay_total) for a task will give the delay
|
||||||
|
@ -94,7 +95,9 @@ CPU count real total virtual total delay total
|
||||||
7876 92005750 100000000 24001500
|
7876 92005750 100000000 24001500
|
||||||
IO count delay total
|
IO count delay total
|
||||||
0 0
|
0 0
|
||||||
MEM count delay total
|
SWAP count delay total
|
||||||
|
0 0
|
||||||
|
RECLAIM count delay total
|
||||||
0 0
|
0 0
|
||||||
|
|
||||||
Get delays seen in executing a given simple command
|
Get delays seen in executing a given simple command
|
||||||
|
@ -108,5 +111,7 @@ CPU count real total virtual total delay total
|
||||||
6 4000250 4000000 0
|
6 4000250 4000000 0
|
||||||
IO count delay total
|
IO count delay total
|
||||||
0 0
|
0 0
|
||||||
MEM count delay total
|
SWAP count delay total
|
||||||
|
0 0
|
||||||
|
RECLAIM count delay total
|
||||||
0 0
|
0 0
|
||||||
|
|
|
@ -196,14 +196,18 @@ void print_delayacct(struct taskstats *t)
|
||||||
" %15llu%15llu%15llu%15llu\n"
|
" %15llu%15llu%15llu%15llu\n"
|
||||||
"IO %15s%15s\n"
|
"IO %15s%15s\n"
|
||||||
" %15llu%15llu\n"
|
" %15llu%15llu\n"
|
||||||
"MEM %15s%15s\n"
|
"SWAP %15s%15s\n"
|
||||||
|
" %15llu%15llu\n"
|
||||||
|
"RECLAIM %12s%15s\n"
|
||||||
" %15llu%15llu\n",
|
" %15llu%15llu\n",
|
||||||
"count", "real total", "virtual total", "delay total",
|
"count", "real total", "virtual total", "delay total",
|
||||||
t->cpu_count, t->cpu_run_real_total, t->cpu_run_virtual_total,
|
t->cpu_count, t->cpu_run_real_total, t->cpu_run_virtual_total,
|
||||||
t->cpu_delay_total,
|
t->cpu_delay_total,
|
||||||
"count", "delay total",
|
"count", "delay total",
|
||||||
t->blkio_count, t->blkio_delay_total,
|
t->blkio_count, t->blkio_delay_total,
|
||||||
"count", "delay total", t->swapin_count, t->swapin_delay_total);
|
"count", "delay total", t->swapin_count, t->swapin_delay_total,
|
||||||
|
"count", "delay total",
|
||||||
|
t->freepages_count, t->freepages_delay_total);
|
||||||
}
|
}
|
||||||
|
|
||||||
void task_context_switch_counts(struct taskstats *t)
|
void task_context_switch_counts(struct taskstats *t)
|
||||||
|
|
|
@ -6,7 +6,7 @@ This document contains an explanation of the struct taskstats fields.
|
||||||
There are three different groups of fields in the struct taskstats:
|
There are three different groups of fields in the struct taskstats:
|
||||||
|
|
||||||
1) Common and basic accounting fields
|
1) Common and basic accounting fields
|
||||||
If CONFIG_TASKSTATS is set, the taskstats inteface is enabled and
|
If CONFIG_TASKSTATS is set, the taskstats interface is enabled and
|
||||||
the common fields and basic accounting fields are collected for
|
the common fields and basic accounting fields are collected for
|
||||||
delivery at do_exit() of a task.
|
delivery at do_exit() of a task.
|
||||||
2) Delay accounting fields
|
2) Delay accounting fields
|
||||||
|
@ -26,6 +26,8 @@ There are three different groups of fields in the struct taskstats:
|
||||||
|
|
||||||
5) Time accounting for SMT machines
|
5) Time accounting for SMT machines
|
||||||
|
|
||||||
|
6) Extended delay accounting fields for memory reclaim
|
||||||
|
|
||||||
Future extension should add fields to the end of the taskstats struct, and
|
Future extension should add fields to the end of the taskstats struct, and
|
||||||
should not change the relative position of each field within the struct.
|
should not change the relative position of each field within the struct.
|
||||||
|
|
||||||
|
@ -170,4 +172,9 @@ struct taskstats {
|
||||||
__u64 ac_utimescaled; /* utime scaled on frequency etc */
|
__u64 ac_utimescaled; /* utime scaled on frequency etc */
|
||||||
__u64 ac_stimescaled; /* stime scaled on frequency etc */
|
__u64 ac_stimescaled; /* stime scaled on frequency etc */
|
||||||
__u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */
|
__u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */
|
||||||
|
|
||||||
|
6) Extended delay accounting fields for memory reclaim
|
||||||
|
/* Delay waiting for memory reclaim */
|
||||||
|
__u64 freepages_count;
|
||||||
|
__u64 freepages_delay_total;
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,14 +138,8 @@ So, what's changed?
|
||||||
|
|
||||||
Set active the IRQ edge(s)/level. This replaces the
|
Set active the IRQ edge(s)/level. This replaces the
|
||||||
SA1111 INTPOL manipulation, and the set_GPIO_IRQ_edge()
|
SA1111 INTPOL manipulation, and the set_GPIO_IRQ_edge()
|
||||||
function. Type should be one of the following:
|
function. Type should be one of IRQ_TYPE_xxx defined in
|
||||||
|
<linux/irq.h>
|
||||||
#define IRQT_NOEDGE (0)
|
|
||||||
#define IRQT_RISING (__IRQT_RISEDGE)
|
|
||||||
#define IRQT_FALLING (__IRQT_FALEDGE)
|
|
||||||
#define IRQT_BOTHEDGE (__IRQT_RISEDGE|__IRQT_FALEDGE)
|
|
||||||
#define IRQT_LOW (__IRQT_LOWLVL)
|
|
||||||
#define IRQT_HIGH (__IRQT_HIGHLVL)
|
|
||||||
|
|
||||||
3. set_GPIO_IRQ_edge() is obsolete, and should be replaced by set_irq_type.
|
3. set_GPIO_IRQ_edge() is obsolete, and should be replaced by set_irq_type.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
===============================================================
|
||||||
|
== BT8XXGPIO driver ==
|
||||||
|
== ==
|
||||||
|
== A driver for a selfmade cheap BT8xx based PCI GPIO-card ==
|
||||||
|
== ==
|
||||||
|
== For advanced documentation, see ==
|
||||||
|
== http://www.bu3sch.de/btgpio.php ==
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
|
||||||
|
A generic digital 24-port PCI GPIO card can be built out of an ordinary
|
||||||
|
Brooktree bt848, bt849, bt878 or bt879 based analog TV tuner card. The
|
||||||
|
Brooktree chip is used in old analog Hauppauge WinTV PCI cards. You can easily
|
||||||
|
find them used for low prices on the net.
|
||||||
|
|
||||||
|
The bt8xx chip does have 24 digital GPIO ports.
|
||||||
|
These ports are accessible via 24 pins on the SMD chip package.
|
||||||
|
|
||||||
|
|
||||||
|
==============================================
|
||||||
|
== How to physically access the GPIO pins ==
|
||||||
|
==============================================
|
||||||
|
|
||||||
|
The are several ways to access these pins. One might unsolder the whole chip
|
||||||
|
and put it on a custom PCI board, or one might only unsolder each individual
|
||||||
|
GPIO pin and solder that to some tiny wire. As the chip package really is tiny
|
||||||
|
there are some advanced soldering skills needed in any case.
|
||||||
|
|
||||||
|
The physical pinouts are drawn in the following ASCII art.
|
||||||
|
The GPIO pins are marked with G00-G23
|
||||||
|
|
||||||
|
G G G G G G G G G G G G G G G G G G
|
||||||
|
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
|
||||||
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
|
||||||
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
--| ^ ^ |--
|
||||||
|
--| pin 86 pin 67 |--
|
||||||
|
--| |--
|
||||||
|
--| pin 61 > |-- G18
|
||||||
|
--| |-- G19
|
||||||
|
--| |-- G20
|
||||||
|
--| |-- G21
|
||||||
|
--| |-- G22
|
||||||
|
--| pin 56 > |-- G23
|
||||||
|
--| |--
|
||||||
|
--| Brooktree 878/879 |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| |--
|
||||||
|
--| O |--
|
||||||
|
--| |--
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|
||||||
|
^
|
||||||
|
This is pin 1
|
||||||
|
|
|
@ -242,8 +242,7 @@ rmdir() if there are no tasks.
|
||||||
1. Add support for accounting huge pages (as a separate controller)
|
1. Add support for accounting huge pages (as a separate controller)
|
||||||
2. Make per-cgroup scanner reclaim not-shared pages first
|
2. Make per-cgroup scanner reclaim not-shared pages first
|
||||||
3. Teach controller to account for shared-pages
|
3. Teach controller to account for shared-pages
|
||||||
4. Start reclamation when the limit is lowered
|
4. Start reclamation in the background when the limit is
|
||||||
5. Start reclamation in the background when the limit is
|
|
||||||
not yet hit but the usage is getting closer
|
not yet hit but the usage is getting closer
|
||||||
|
|
||||||
Summary
|
Summary
|
||||||
|
|
|
@ -122,7 +122,7 @@ around '10000' or more.
|
||||||
show_sampling_rate_(min|max): the minimum and maximum sampling rates
|
show_sampling_rate_(min|max): the minimum and maximum sampling rates
|
||||||
available that you may set 'sampling_rate' to.
|
available that you may set 'sampling_rate' to.
|
||||||
|
|
||||||
up_threshold: defines what the average CPU usaged between the samplings
|
up_threshold: defines what the average CPU usage between the samplings
|
||||||
of 'sampling_rate' needs to be for the kernel to make a decision on
|
of 'sampling_rate' needs to be for the kernel to make a decision on
|
||||||
whether it should increase the frequency. For example when it is set
|
whether it should increase the frequency. For example when it is set
|
||||||
to its default value of '80' it means that between the checking
|
to its default value of '80' it means that between the checking
|
||||||
|
|
|
@ -222,74 +222,9 @@ both csrow2 and csrow3 are populated, this indicates a dual ranked
|
||||||
set of DIMMs for channels 0 and 1.
|
set of DIMMs for channels 0 and 1.
|
||||||
|
|
||||||
|
|
||||||
Within each of the 'mc','mcX' and 'csrowX' directories are several
|
Within each of the 'mcX' and 'csrowX' directories are several
|
||||||
EDAC control and attribute files.
|
EDAC control and attribute files.
|
||||||
|
|
||||||
|
|
||||||
============================================================================
|
|
||||||
DIRECTORY 'mc'
|
|
||||||
|
|
||||||
In directory 'mc' are EDAC system overall control and attribute files:
|
|
||||||
|
|
||||||
|
|
||||||
Panic on UE control file:
|
|
||||||
|
|
||||||
'edac_mc_panic_on_ue'
|
|
||||||
|
|
||||||
An uncorrectable error will cause a machine panic. This is usually
|
|
||||||
desirable. It is a bad idea to continue when an uncorrectable error
|
|
||||||
occurs - it is indeterminate what was uncorrected and the operating
|
|
||||||
system context might be so mangled that continuing will lead to further
|
|
||||||
corruption. If the kernel has MCE configured, then EDAC will never
|
|
||||||
notice the UE.
|
|
||||||
|
|
||||||
LOAD TIME: module/kernel parameter: panic_on_ue=[0|1]
|
|
||||||
|
|
||||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_panic_on_ue
|
|
||||||
|
|
||||||
|
|
||||||
Log UE control file:
|
|
||||||
|
|
||||||
'edac_mc_log_ue'
|
|
||||||
|
|
||||||
Generate kernel messages describing uncorrectable errors. These errors
|
|
||||||
are reported through the system message log system. UE statistics
|
|
||||||
will be accumulated even when UE logging is disabled.
|
|
||||||
|
|
||||||
LOAD TIME: module/kernel parameter: log_ue=[0|1]
|
|
||||||
|
|
||||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_log_ue
|
|
||||||
|
|
||||||
|
|
||||||
Log CE control file:
|
|
||||||
|
|
||||||
'edac_mc_log_ce'
|
|
||||||
|
|
||||||
Generate kernel messages describing correctable errors. These
|
|
||||||
errors are reported through the system message log system.
|
|
||||||
CE statistics will be accumulated even when CE logging is disabled.
|
|
||||||
|
|
||||||
LOAD TIME: module/kernel parameter: log_ce=[0|1]
|
|
||||||
|
|
||||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_log_ce
|
|
||||||
|
|
||||||
|
|
||||||
Polling period control file:
|
|
||||||
|
|
||||||
'edac_mc_poll_msec'
|
|
||||||
|
|
||||||
The time period, in milliseconds, for polling for error information.
|
|
||||||
Too small a value wastes resources. Too large a value might delay
|
|
||||||
necessary handling of errors and might loose valuable information for
|
|
||||||
locating the error. 1000 milliseconds (once each second) is the current
|
|
||||||
default. Systems which require all the bandwidth they can get, may
|
|
||||||
increase this.
|
|
||||||
|
|
||||||
LOAD TIME: module/kernel parameter: poll_msec=[0|1]
|
|
||||||
|
|
||||||
RUN TIME: echo "1000" >/sys/devices/system/edac/mc/edac_mc_poll_msec
|
|
||||||
|
|
||||||
|
|
||||||
============================================================================
|
============================================================================
|
||||||
'mcX' DIRECTORIES
|
'mcX' DIRECTORIES
|
||||||
|
|
||||||
|
@ -392,7 +327,7 @@ Sdram memory scrubbing rate:
|
||||||
'sdram_scrub_rate'
|
'sdram_scrub_rate'
|
||||||
|
|
||||||
Read/Write attribute file that controls memory scrubbing. The scrubbing
|
Read/Write attribute file that controls memory scrubbing. The scrubbing
|
||||||
rate is set by writing a minimum bandwith in bytes/sec to the attribute
|
rate is set by writing a minimum bandwidth in bytes/sec to the attribute
|
||||||
file. The rate will be translated to an internal value that gives at
|
file. The rate will be translated to an internal value that gives at
|
||||||
least the specified rate.
|
least the specified rate.
|
||||||
|
|
||||||
|
@ -537,7 +472,6 @@ Channel 1 DIMM Label control file:
|
||||||
motherboard specific and determination of this information
|
motherboard specific and determination of this information
|
||||||
must occur in userland at this time.
|
must occur in userland at this time.
|
||||||
|
|
||||||
|
|
||||||
============================================================================
|
============================================================================
|
||||||
SYSTEM LOGGING
|
SYSTEM LOGGING
|
||||||
|
|
||||||
|
@ -570,7 +504,6 @@ error type, a notice of "no info" and then an optional,
|
||||||
driver-specific error message.
|
driver-specific error message.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
============================================================================
|
============================================================================
|
||||||
PCI Bus Parity Detection
|
PCI Bus Parity Detection
|
||||||
|
|
||||||
|
@ -604,6 +537,74 @@ Enable/Disable PCI Parity checking control file:
|
||||||
echo "0" >/sys/devices/system/edac/pci/check_pci_parity
|
echo "0" >/sys/devices/system/edac/pci/check_pci_parity
|
||||||
|
|
||||||
|
|
||||||
|
Parity Count:
|
||||||
|
|
||||||
|
'pci_parity_count'
|
||||||
|
|
||||||
|
This attribute file will display the number of parity errors that
|
||||||
|
have been detected.
|
||||||
|
|
||||||
|
|
||||||
|
============================================================================
|
||||||
|
MODULE PARAMETERS
|
||||||
|
|
||||||
|
Panic on UE control file:
|
||||||
|
|
||||||
|
'edac_mc_panic_on_ue'
|
||||||
|
|
||||||
|
An uncorrectable error will cause a machine panic. This is usually
|
||||||
|
desirable. It is a bad idea to continue when an uncorrectable error
|
||||||
|
occurs - it is indeterminate what was uncorrected and the operating
|
||||||
|
system context might be so mangled that continuing will lead to further
|
||||||
|
corruption. If the kernel has MCE configured, then EDAC will never
|
||||||
|
notice the UE.
|
||||||
|
|
||||||
|
LOAD TIME: module/kernel parameter: edac_mc_panic_on_ue=[0|1]
|
||||||
|
|
||||||
|
RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_panic_on_ue
|
||||||
|
|
||||||
|
|
||||||
|
Log UE control file:
|
||||||
|
|
||||||
|
'edac_mc_log_ue'
|
||||||
|
|
||||||
|
Generate kernel messages describing uncorrectable errors. These errors
|
||||||
|
are reported through the system message log system. UE statistics
|
||||||
|
will be accumulated even when UE logging is disabled.
|
||||||
|
|
||||||
|
LOAD TIME: module/kernel parameter: edac_mc_log_ue=[0|1]
|
||||||
|
|
||||||
|
RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ue
|
||||||
|
|
||||||
|
|
||||||
|
Log CE control file:
|
||||||
|
|
||||||
|
'edac_mc_log_ce'
|
||||||
|
|
||||||
|
Generate kernel messages describing correctable errors. These
|
||||||
|
errors are reported through the system message log system.
|
||||||
|
CE statistics will be accumulated even when CE logging is disabled.
|
||||||
|
|
||||||
|
LOAD TIME: module/kernel parameter: edac_mc_log_ce=[0|1]
|
||||||
|
|
||||||
|
RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ce
|
||||||
|
|
||||||
|
|
||||||
|
Polling period control file:
|
||||||
|
|
||||||
|
'edac_mc_poll_msec'
|
||||||
|
|
||||||
|
The time period, in milliseconds, for polling for error information.
|
||||||
|
Too small a value wastes resources. Too large a value might delay
|
||||||
|
necessary handling of errors and might loose valuable information for
|
||||||
|
locating the error. 1000 milliseconds (once each second) is the current
|
||||||
|
default. Systems which require all the bandwidth they can get, may
|
||||||
|
increase this.
|
||||||
|
|
||||||
|
LOAD TIME: module/kernel parameter: edac_mc_poll_msec=[0|1]
|
||||||
|
|
||||||
|
RUN TIME: echo "1000" > /sys/module/edac_core/parameters/edac_mc_poll_msec
|
||||||
|
|
||||||
|
|
||||||
Panic on PCI PARITY Error:
|
Panic on PCI PARITY Error:
|
||||||
|
|
||||||
|
@ -614,21 +615,13 @@ Panic on PCI PARITY Error:
|
||||||
error has been detected.
|
error has been detected.
|
||||||
|
|
||||||
|
|
||||||
module/kernel parameter: panic_on_pci_parity=[0|1]
|
module/kernel parameter: edac_panic_on_pci_pe=[0|1]
|
||||||
|
|
||||||
Enable:
|
Enable:
|
||||||
echo "1" >/sys/devices/system/edac/pci/panic_on_pci_parity
|
echo "1" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
|
||||||
|
|
||||||
Disable:
|
Disable:
|
||||||
echo "0" >/sys/devices/system/edac/pci/panic_on_pci_parity
|
echo "0" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
|
||||||
|
|
||||||
|
|
||||||
Parity Count:
|
|
||||||
|
|
||||||
'pci_parity_count'
|
|
||||||
|
|
||||||
This attribute file will display the number of parity errors that
|
|
||||||
have been detected.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,131 @@
|
||||||
|
SH7760/SH7763 integrated LCDC Framebuffer driver
|
||||||
|
================================================
|
||||||
|
|
||||||
|
0. Overwiew
|
||||||
|
-----------
|
||||||
|
The SH7760/SH7763 have an integrated LCD Display controller (LCDC) which
|
||||||
|
supports (in theory) resolutions ranging from 1x1 to 1024x1024,
|
||||||
|
with color depths ranging from 1 to 16 bits, on STN, DSTN and TFT Panels.
|
||||||
|
|
||||||
|
Caveats:
|
||||||
|
* Framebuffer memory must be a large chunk allocated at the top
|
||||||
|
of Area3 (HW requirement). Because of this requirement you should NOT
|
||||||
|
make the driver a module since at runtime it may become impossible to
|
||||||
|
get a large enough contiguous chunk of memory.
|
||||||
|
|
||||||
|
* The driver does not support changing resolution while loaded
|
||||||
|
(displays aren't hotpluggable anyway)
|
||||||
|
|
||||||
|
* Heavy flickering may be observed
|
||||||
|
a) if you're using 15/16bit color modes at >= 640x480 px resolutions,
|
||||||
|
b) during PCMCIA (or any other slow bus) activity.
|
||||||
|
|
||||||
|
* Rotation works only 90degress clockwise, and only if horizontal
|
||||||
|
resolution is <= 320 pixels.
|
||||||
|
|
||||||
|
files: drivers/video/sh7760fb.c
|
||||||
|
include/asm-sh/sh7760fb.h
|
||||||
|
Documentation/fb/sh7760fb.txt
|
||||||
|
|
||||||
|
1. Platform setup
|
||||||
|
-----------------
|
||||||
|
SH7760:
|
||||||
|
Video data is fetched via the DMABRG DMA engine, so you have to
|
||||||
|
configure the SH DMAC for DMABRG mode (write 0x94808080 to the
|
||||||
|
DMARSRA register somewhere at boot).
|
||||||
|
|
||||||
|
PFC registers PCCR and PCDR must be set to peripheral mode.
|
||||||
|
(write zeros to both).
|
||||||
|
|
||||||
|
The driver does NOT do the above for you since board setup is, well, job
|
||||||
|
of the board setup code.
|
||||||
|
|
||||||
|
2. Panel definitions
|
||||||
|
--------------------
|
||||||
|
The LCDC must explicitly be told about the type of LCD panel
|
||||||
|
attached. Data must be wrapped in a "struct sh7760fb_platdata" and
|
||||||
|
passed to the driver as platform_data.
|
||||||
|
|
||||||
|
Suggest you take a closer look at the SH7760 Manual, Section 30.
|
||||||
|
(http://documentation.renesas.com/eng/products/mpumcu/e602291_sh7760.pdf)
|
||||||
|
|
||||||
|
The following code illustrates what needs to be done to
|
||||||
|
get the framebuffer working on a 640x480 TFT:
|
||||||
|
|
||||||
|
====================== cut here ======================================
|
||||||
|
|
||||||
|
#include <linux/fb.h>
|
||||||
|
#include <asm/sh7760fb.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NEC NL6440bc26-01 640x480 TFT
|
||||||
|
* dotclock 25175 kHz
|
||||||
|
* Xres 640 Yres 480
|
||||||
|
* Htotal 800 Vtotal 525
|
||||||
|
* HsynStart 656 VsynStart 490
|
||||||
|
* HsynLenn 30 VsynLenn 2
|
||||||
|
*
|
||||||
|
* The linux framebuffer layer does not use the syncstart/synclen
|
||||||
|
* values but right/left/upper/lower margin values. The comments
|
||||||
|
* for the x_margin explain how to calculate those from given
|
||||||
|
* panel sync timings.
|
||||||
|
*/
|
||||||
|
static struct fb_videomode nl6448bc26 = {
|
||||||
|
.name = "NL6448BC26",
|
||||||
|
.refresh = 60,
|
||||||
|
.xres = 640,
|
||||||
|
.yres = 480,
|
||||||
|
.pixclock = 39683, /* in picoseconds! */
|
||||||
|
.hsync_len = 30,
|
||||||
|
.vsync_len = 2,
|
||||||
|
.left_margin = 114, /* HTOT - (HSYNSLEN + HSYNSTART) */
|
||||||
|
.right_margin = 16, /* HSYNSTART - XRES */
|
||||||
|
.upper_margin = 33, /* VTOT - (VSYNLEN + VSYNSTART) */
|
||||||
|
.lower_margin = 10, /* VSYNSTART - YRES */
|
||||||
|
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||||
|
.vmode = FB_VMODE_NONINTERLACED,
|
||||||
|
.flag = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct sh7760fb_platdata sh7760fb_nl6448 = {
|
||||||
|
.def_mode = &nl6448bc26,
|
||||||
|
.ldmtr = LDMTR_TFT_COLOR_16, /* 16bit TFT panel */
|
||||||
|
.lddfr = LDDFR_8BPP, /* we want 8bit output */
|
||||||
|
.ldpmmr = 0x0070,
|
||||||
|
.ldpspr = 0x0500,
|
||||||
|
.ldaclnr = 0,
|
||||||
|
.ldickr = LDICKR_CLKSRC(LCDC_CLKSRC_EXTERNAL) |
|
||||||
|
LDICKR_CLKDIV(1),
|
||||||
|
.rotate = 0,
|
||||||
|
.novsync = 1,
|
||||||
|
.blank = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SH7760:
|
||||||
|
* 0xFE300800: 256 * 4byte xRGB palette ram
|
||||||
|
* 0xFE300C00: 42 bytes ctrl registers
|
||||||
|
*/
|
||||||
|
static struct resource sh7760_lcdc_res[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = 0xFE300800,
|
||||||
|
.end = 0xFE300CFF,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 65,
|
||||||
|
.end = 65,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device sh7760_lcdc_dev = {
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &sh7760fb_nl6448,
|
||||||
|
},
|
||||||
|
.name = "sh7760-lcdc",
|
||||||
|
.id = -1,
|
||||||
|
.resource = sh7760_lcdc_res,
|
||||||
|
.num_resources = ARRAY_SIZE(sh7760_lcdc_res),
|
||||||
|
};
|
||||||
|
|
||||||
|
====================== cut here ======================================
|
|
@ -3,11 +3,25 @@ Tridentfb is a framebuffer driver for some Trident chip based cards.
|
||||||
The following list of chips is thought to be supported although not all are
|
The following list of chips is thought to be supported although not all are
|
||||||
tested:
|
tested:
|
||||||
|
|
||||||
those from the Image series with Cyber in their names - accelerated
|
those from the TGUI series 9440/96XX and with Cyber in their names
|
||||||
those with Blade in their names (Blade3D,CyberBlade...) - accelerated
|
those from the Image series and with Cyber in their names
|
||||||
the newer CyberBladeXP family - nonaccelerated
|
those with Blade in their names (Blade3D,CyberBlade...)
|
||||||
|
the newer CyberBladeXP family
|
||||||
|
|
||||||
Only PCI/AGP based cards are supported, none of the older Tridents.
|
All families are accelerated. Only PCI/AGP based cards are supported,
|
||||||
|
none of the older Tridents.
|
||||||
|
The driver supports 8, 16 and 32 bits per pixel depths.
|
||||||
|
The TGUI family requires a line length to be power of 2 if acceleration
|
||||||
|
is enabled. This means that range of possible resolutions and bpp is
|
||||||
|
limited comparing to the range if acceleration is disabled (see list
|
||||||
|
of parameters below).
|
||||||
|
|
||||||
|
Known bugs:
|
||||||
|
1. The driver randomly locks up on 3DImage975 chip with acceleration
|
||||||
|
enabled. The same happens in X11 (Xorg).
|
||||||
|
2. The ramdac speeds require some more fine tuning. It is possible to
|
||||||
|
switch resolution which the chip does not support at some depths for
|
||||||
|
older chips.
|
||||||
|
|
||||||
How to use it?
|
How to use it?
|
||||||
==============
|
==============
|
||||||
|
@ -17,12 +31,11 @@ video=tridentfb
|
||||||
|
|
||||||
The parameters for tridentfb are concatenated with a ':' as in this example.
|
The parameters for tridentfb are concatenated with a ':' as in this example.
|
||||||
|
|
||||||
video=tridentfb:800x600,bpp=16,noaccel
|
video=tridentfb:800x600-16@75,noaccel
|
||||||
|
|
||||||
The second level parameters that tridentfb understands are:
|
The second level parameters that tridentfb understands are:
|
||||||
|
|
||||||
noaccel - turns off acceleration (when it doesn't work for your card)
|
noaccel - turns off acceleration (when it doesn't work for your card)
|
||||||
accel - force text acceleration (for boards which by default are noacceled)
|
|
||||||
|
|
||||||
fp - use flat panel related stuff
|
fp - use flat panel related stuff
|
||||||
crt - assume monitor is present instead of fp
|
crt - assume monitor is present instead of fp
|
||||||
|
@ -31,21 +44,24 @@ center - for flat panels and resolutions smaller than native size center the
|
||||||
image, otherwise use
|
image, otherwise use
|
||||||
stretch
|
stretch
|
||||||
|
|
||||||
memsize - integer value in Kb, use if your card's memory size is misdetected.
|
memsize - integer value in KB, use if your card's memory size is misdetected.
|
||||||
look at the driver output to see what it says when initializing.
|
look at the driver output to see what it says when initializing.
|
||||||
memdiff - integer value in Kb,should be nonzero if your card reports
|
|
||||||
more memory than it actually has.For instance mine is 192K less than
|
memdiff - integer value in KB, should be nonzero if your card reports
|
||||||
|
more memory than it actually has. For instance mine is 192K less than
|
||||||
detection says in all three BIOS selectable situations 2M, 4M, 8M.
|
detection says in all three BIOS selectable situations 2M, 4M, 8M.
|
||||||
Only use if your video memory is taken from main memory hence of
|
Only use if your video memory is taken from main memory hence of
|
||||||
configurable size.Otherwise use memsize.
|
configurable size. Otherwise use memsize.
|
||||||
If in some modes which barely fit the memory you see garbage at the bottom
|
If in some modes which barely fit the memory you see garbage
|
||||||
this might help by not letting change to that mode anymore.
|
at the bottom this might help by not letting change to that mode
|
||||||
|
anymore.
|
||||||
|
|
||||||
nativex - the width in pixels of the flat panel.If you know it (usually 1024
|
nativex - the width in pixels of the flat panel.If you know it (usually 1024
|
||||||
800 or 1280) and it is not what the driver seems to detect use it.
|
800 or 1280) and it is not what the driver seems to detect use it.
|
||||||
|
|
||||||
bpp - bits per pixel (8,16 or 32)
|
bpp - bits per pixel (8,16 or 32)
|
||||||
mode - a mode name like 800x600 (as described in Documentation/fb/modedb.txt)
|
mode - a mode name like 800x600-8@75 as described in
|
||||||
|
Documentation/fb/modedb.txt
|
||||||
|
|
||||||
Using insane values for the above parameters will probably result in driver
|
Using insane values for the above parameters will probably result in driver
|
||||||
misbehaviour so take care(for instance memsize=12345678 or memdiff=23784 or
|
misbehaviour so take care(for instance memsize=12345678 or memdiff=23784 or
|
||||||
|
|
|
@ -47,6 +47,30 @@ Who: Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
What: old tuner-3036 i2c driver
|
||||||
|
When: 2.6.28
|
||||||
|
Why: This driver is for VERY old i2c-over-parallel port teletext receiver
|
||||||
|
boxes. Rather then spending effort on converting this driver to V4L2,
|
||||||
|
and since it is extremely unlikely that anyone still uses one of these
|
||||||
|
devices, it was decided to drop it.
|
||||||
|
Who: Hans Verkuil <hverkuil@xs4all.nl>
|
||||||
|
Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: V4L2 dpc7146 driver
|
||||||
|
When: 2.6.28
|
||||||
|
Why: Old driver for the dpc7146 demonstration board that is no longer
|
||||||
|
relevant. The last time this was tested on actual hardware was
|
||||||
|
probably around 2002. Since this is a driver for a demonstration
|
||||||
|
board the decision was made to remove it rather than spending a
|
||||||
|
lot of effort continually updating this driver to stay in sync
|
||||||
|
with the latest internal V4L2 or I2C API.
|
||||||
|
Who: Hans Verkuil <hverkuil@xs4all.nl>
|
||||||
|
Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
|
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
|
||||||
When: November 2005
|
When: November 2005
|
||||||
Files: drivers/pcmcia/: pcmcia_ioctl.c
|
Files: drivers/pcmcia/: pcmcia_ioctl.c
|
||||||
|
@ -138,24 +162,6 @@ Who: Kay Sievers <kay.sievers@suse.de>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: find_task_by_pid
|
|
||||||
When: 2.6.26
|
|
||||||
Why: With pid namespaces, calling this funciton will return the
|
|
||||||
wrong task when called from inside a namespace.
|
|
||||||
|
|
||||||
The best way to save a task pid and find a task by this
|
|
||||||
pid later, is to find this task's struct pid pointer (or get
|
|
||||||
it directly from the task) and call pid_task() later.
|
|
||||||
|
|
||||||
If someone really needs to get a task by its pid_t, then
|
|
||||||
he most likely needs the find_task_by_vpid() to get the
|
|
||||||
task from the same namespace as the current task is in, but
|
|
||||||
this may be not so in general.
|
|
||||||
|
|
||||||
Who: Pavel Emelyanov <xemul@openvz.org>
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: ACPI procfs interface
|
What: ACPI procfs interface
|
||||||
When: July 2008
|
When: July 2008
|
||||||
Why: ACPI sysfs conversion should be finished by January 2008.
|
Why: ACPI sysfs conversion should be finished by January 2008.
|
||||||
|
@ -300,11 +306,15 @@ Who: ocfs2-devel@oss.oracle.com
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: asm/semaphore.h
|
What: SCTP_GET_PEER_ADDRS_NUM_OLD, SCTP_GET_PEER_ADDRS_OLD,
|
||||||
When: 2.6.26
|
SCTP_GET_LOCAL_ADDRS_NUM_OLD, SCTP_GET_LOCAL_ADDRS_OLD
|
||||||
Why: Implementation became generic; users should now include
|
When: June 2009
|
||||||
linux/semaphore.h instead.
|
Why: A newer version of the options have been introduced in 2005 that
|
||||||
Who: Matthew Wilcox <willy@linux.intel.com>
|
removes the limitions of the old API. The sctp library has been
|
||||||
|
converted to use these new options at the same time. Any user
|
||||||
|
space app that directly uses the old options should convert to using
|
||||||
|
the new options.
|
||||||
|
Who: Vlad Yasevich <vladislav.yasevich@hp.com>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
@ -314,3 +324,23 @@ Why: This option was introduced just to allow older lm-sensors userspace
|
||||||
to keep working over the upgrade to 2.6.26. At the scheduled time of
|
to keep working over the upgrade to 2.6.26. At the scheduled time of
|
||||||
removal fixed lm-sensors (2.x or 3.x) should be readily available.
|
removal fixed lm-sensors (2.x or 3.x) should be readily available.
|
||||||
Who: Rene Herman <rene.herman@gmail.com>
|
Who: Rene Herman <rene.herman@gmail.com>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: Code that is now under CONFIG_WIRELESS_EXT_SYSFS
|
||||||
|
(in net/core/net-sysfs.c)
|
||||||
|
When: After the only user (hal) has seen a release with the patches
|
||||||
|
for enough time, probably some time in 2010.
|
||||||
|
Why: Over 1K .text/.data size reduction, data is available in other
|
||||||
|
ways (ioctls)
|
||||||
|
Who: Johannes Berg <johannes@sipsolutions.net>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: CONFIG_NF_CT_ACCT
|
||||||
|
When: 2.6.29
|
||||||
|
Why: Accounting can now be enabled/disabled without kernel recompilation.
|
||||||
|
Currently used only to set a default value for a feature that is also
|
||||||
|
controlled by a kernel/module/sysfs/sysctl parameter.
|
||||||
|
Who: Krzysztof Piotr Oledzki <ole@ans.pl>
|
||||||
|
|
||||||
|
|
|
@ -510,6 +510,7 @@ prototypes:
|
||||||
void (*close)(struct vm_area_struct*);
|
void (*close)(struct vm_area_struct*);
|
||||||
int (*fault)(struct vm_area_struct*, struct vm_fault *);
|
int (*fault)(struct vm_area_struct*, struct vm_fault *);
|
||||||
int (*page_mkwrite)(struct vm_area_struct *, struct page *);
|
int (*page_mkwrite)(struct vm_area_struct *, struct page *);
|
||||||
|
int (*access)(struct vm_area_struct *, unsigned long, void*, int, int);
|
||||||
|
|
||||||
locking rules:
|
locking rules:
|
||||||
BKL mmap_sem PageLocked(page)
|
BKL mmap_sem PageLocked(page)
|
||||||
|
@ -517,6 +518,7 @@ open: no yes
|
||||||
close: no yes
|
close: no yes
|
||||||
fault: no yes
|
fault: no yes
|
||||||
page_mkwrite: no yes no
|
page_mkwrite: no yes no
|
||||||
|
access: no yes
|
||||||
|
|
||||||
->page_mkwrite() is called when a previously read-only page is
|
->page_mkwrite() is called when a previously read-only page is
|
||||||
about to become writeable. The file system is responsible for
|
about to become writeable. The file system is responsible for
|
||||||
|
@ -525,6 +527,11 @@ taking to lock out truncate, the page range should be verified to be
|
||||||
within i_size. The page mapping should also be checked that it is not
|
within i_size. The page mapping should also be checked that it is not
|
||||||
NULL.
|
NULL.
|
||||||
|
|
||||||
|
->access() is called when get_user_pages() fails in
|
||||||
|
acces_process_vm(), typically used to debug a process through
|
||||||
|
/proc/pid/mem or ptrace. This function is needed only for
|
||||||
|
VM_IO | VM_PFNMAP VMAs.
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
Dubious stuff
|
Dubious stuff
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,11 @@ You can simplify mounting by just typing:
|
||||||
|
|
||||||
this will allocate the first available loopback device (and load loop.o
|
this will allocate the first available loopback device (and load loop.o
|
||||||
kernel module if necessary) automatically. If the loopback driver is not
|
kernel module if necessary) automatically. If the loopback driver is not
|
||||||
loaded automatically, make sure that your kernel is compiled with kmod
|
loaded automatically, make sure that you have compiled the module and
|
||||||
support (CONFIG_KMOD) enabled. Beware that umount will not
|
that modprobe is functioning. Beware that umount will not deallocate
|
||||||
deallocate /dev/loopN device if /etc/mtab file on your system is a
|
/dev/loopN device if /etc/mtab file on your system is a symbolic link to
|
||||||
symbolic link to /proc/mounts. You will need to do it manually using
|
/proc/mounts. You will need to do it manually using "-d" switch of
|
||||||
"-d" switch of losetup(8). Read losetup(8) manpage for more info.
|
losetup(8). Read losetup(8) manpage for more info.
|
||||||
|
|
||||||
To create the BFS image under UnixWare you need to find out first which
|
To create the BFS image under UnixWare you need to find out first which
|
||||||
slice contains it. The command prtvtoc(1M) is your friend:
|
slice contains it. The command prtvtoc(1M) is your friend:
|
||||||
|
|
|
@ -233,12 +233,10 @@ accomplished via the group operations specified on the group's
|
||||||
config_item_type.
|
config_item_type.
|
||||||
|
|
||||||
struct configfs_group_operations {
|
struct configfs_group_operations {
|
||||||
int (*make_item)(struct config_group *group,
|
struct config_item *(*make_item)(struct config_group *group,
|
||||||
const char *name,
|
const char *name);
|
||||||
struct config_item **new_item);
|
struct config_group *(*make_group)(struct config_group *group,
|
||||||
int (*make_group)(struct config_group *group,
|
const char *name);
|
||||||
const char *name,
|
|
||||||
struct config_group **new_group);
|
|
||||||
int (*commit_item)(struct config_item *item);
|
int (*commit_item)(struct config_item *item);
|
||||||
void (*disconnect_notify)(struct config_group *group,
|
void (*disconnect_notify)(struct config_group *group,
|
||||||
struct config_item *item);
|
struct config_item *item);
|
||||||
|
|
|
@ -273,13 +273,13 @@ static inline struct simple_children *to_simple_children(struct config_item *ite
|
||||||
return item ? container_of(to_config_group(item), struct simple_children, group) : NULL;
|
return item ? container_of(to_config_group(item), struct simple_children, group) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int simple_children_make_item(struct config_group *group, const char *name, struct config_item **new_item)
|
static struct config_item *simple_children_make_item(struct config_group *group, const char *name)
|
||||||
{
|
{
|
||||||
struct simple_child *simple_child;
|
struct simple_child *simple_child;
|
||||||
|
|
||||||
simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL);
|
simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL);
|
||||||
if (!simple_child)
|
if (!simple_child)
|
||||||
return -ENOMEM;
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
|
||||||
config_item_init_type_name(&simple_child->item, name,
|
config_item_init_type_name(&simple_child->item, name,
|
||||||
|
@ -287,8 +287,7 @@ static int simple_children_make_item(struct config_group *group, const char *nam
|
||||||
|
|
||||||
simple_child->storeme = 0;
|
simple_child->storeme = 0;
|
||||||
|
|
||||||
*new_item = &simple_child->item;
|
return &simple_child->item;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct configfs_attribute simple_children_attr_description = {
|
static struct configfs_attribute simple_children_attr_description = {
|
||||||
|
@ -360,21 +359,20 @@ static struct configfs_subsystem simple_children_subsys = {
|
||||||
* children of its own.
|
* children of its own.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int group_children_make_group(struct config_group *group, const char *name, struct config_group **new_group)
|
static struct config_group *group_children_make_group(struct config_group *group, const char *name)
|
||||||
{
|
{
|
||||||
struct simple_children *simple_children;
|
struct simple_children *simple_children;
|
||||||
|
|
||||||
simple_children = kzalloc(sizeof(struct simple_children),
|
simple_children = kzalloc(sizeof(struct simple_children),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!simple_children)
|
if (!simple_children)
|
||||||
return -ENOMEM;
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
|
||||||
config_group_init_type_name(&simple_children->group, name,
|
config_group_init_type_name(&simple_children->group, name,
|
||||||
&simple_children_type);
|
&simple_children_type);
|
||||||
|
|
||||||
*new_group = &simple_children->group;
|
return &simple_children->group;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct configfs_attribute group_children_attr_description = {
|
static struct configfs_attribute group_children_attr_description = {
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
Author: NetApp and Open Grid Computing
|
Author: NetApp and Open Grid Computing
|
||||||
Date: April 15, 2008
|
Date: May 29, 2008
|
||||||
|
|
||||||
Table of Contents
|
Table of Contents
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
@ -60,16 +60,18 @@ Installation
|
||||||
The procedures described in this document have been tested with
|
The procedures described in this document have been tested with
|
||||||
distributions from Red Hat's Fedora Project (http://fedora.redhat.com/).
|
distributions from Red Hat's Fedora Project (http://fedora.redhat.com/).
|
||||||
|
|
||||||
- Install nfs-utils-1.1.1 or greater on the client
|
- Install nfs-utils-1.1.2 or greater on the client
|
||||||
|
|
||||||
An NFS/RDMA mount point can only be obtained by using the mount.nfs
|
An NFS/RDMA mount point can be obtained by using the mount.nfs command in
|
||||||
command in nfs-utils-1.1.1 or greater. To see which version of mount.nfs
|
nfs-utils-1.1.2 or greater (nfs-utils-1.1.1 was the first nfs-utils
|
||||||
you are using, type:
|
version with support for NFS/RDMA mounts, but for various reasons we
|
||||||
|
recommend using nfs-utils-1.1.2 or greater). To see which version of
|
||||||
|
mount.nfs you are using, type:
|
||||||
|
|
||||||
> /sbin/mount.nfs -V
|
$ /sbin/mount.nfs -V
|
||||||
|
|
||||||
If the version is less than 1.1.1 or the command does not exist,
|
If the version is less than 1.1.2 or the command does not exist,
|
||||||
then you will need to install the latest version of nfs-utils.
|
you should install the latest version of nfs-utils.
|
||||||
|
|
||||||
Download the latest package from:
|
Download the latest package from:
|
||||||
|
|
||||||
|
@ -77,22 +79,33 @@ Installation
|
||||||
|
|
||||||
Uncompress the package and follow the installation instructions.
|
Uncompress the package and follow the installation instructions.
|
||||||
|
|
||||||
If you will not be using GSS and NFSv4, the installation process
|
If you will not need the idmapper and gssd executables (you do not need
|
||||||
can be simplified by disabling these features when running configure:
|
these to create an NFS/RDMA enabled mount command), the installation
|
||||||
|
process can be simplified by disabling these features when running
|
||||||
|
configure:
|
||||||
|
|
||||||
> ./configure --disable-gss --disable-nfsv4
|
$ ./configure --disable-gss --disable-nfsv4
|
||||||
|
|
||||||
For more information on this see the package's README and INSTALL files.
|
To build nfs-utils you will need the tcp_wrappers package installed. For
|
||||||
|
more information on this see the package's README and INSTALL files.
|
||||||
|
|
||||||
After building the nfs-utils package, there will be a mount.nfs binary in
|
After building the nfs-utils package, there will be a mount.nfs binary in
|
||||||
the utils/mount directory. This binary can be used to initiate NFS v2, v3,
|
the utils/mount directory. This binary can be used to initiate NFS v2, v3,
|
||||||
or v4 mounts. To initiate a v4 mount, the binary must be called mount.nfs4.
|
or v4 mounts. To initiate a v4 mount, the binary must be called
|
||||||
The standard technique is to create a symlink called mount.nfs4 to mount.nfs.
|
mount.nfs4. The standard technique is to create a symlink called
|
||||||
|
mount.nfs4 to mount.nfs.
|
||||||
|
|
||||||
NOTE: mount.nfs and therefore nfs-utils-1.1.1 or greater is only needed
|
This mount.nfs binary should be installed at /sbin/mount.nfs as follows:
|
||||||
|
|
||||||
|
$ sudo cp utils/mount/mount.nfs /sbin/mount.nfs
|
||||||
|
|
||||||
|
In this location, mount.nfs will be invoked automatically for NFS mounts
|
||||||
|
by the system mount commmand.
|
||||||
|
|
||||||
|
NOTE: mount.nfs and therefore nfs-utils-1.1.2 or greater is only needed
|
||||||
on the NFS client machine. You do not need this specific version of
|
on the NFS client machine. You do not need this specific version of
|
||||||
nfs-utils on the server. Furthermore, only the mount.nfs command from
|
nfs-utils on the server. Furthermore, only the mount.nfs command from
|
||||||
nfs-utils-1.1.1 is needed on the client.
|
nfs-utils-1.1.2 is needed on the client.
|
||||||
|
|
||||||
- Install a Linux kernel with NFS/RDMA
|
- Install a Linux kernel with NFS/RDMA
|
||||||
|
|
||||||
|
@ -156,8 +169,8 @@ Check RDMA and NFS Setup
|
||||||
this time. For example, if you are using a Mellanox Tavor/Sinai/Arbel
|
this time. For example, if you are using a Mellanox Tavor/Sinai/Arbel
|
||||||
card:
|
card:
|
||||||
|
|
||||||
> modprobe ib_mthca
|
$ modprobe ib_mthca
|
||||||
> modprobe ib_ipoib
|
$ modprobe ib_ipoib
|
||||||
|
|
||||||
If you are using InfiniBand, make sure there is a Subnet Manager (SM)
|
If you are using InfiniBand, make sure there is a Subnet Manager (SM)
|
||||||
running on the network. If your IB switch has an embedded SM, you can
|
running on the network. If your IB switch has an embedded SM, you can
|
||||||
|
@ -166,7 +179,7 @@ Check RDMA and NFS Setup
|
||||||
|
|
||||||
If an SM is running on your network, you should see the following:
|
If an SM is running on your network, you should see the following:
|
||||||
|
|
||||||
> cat /sys/class/infiniband/driverX/ports/1/state
|
$ cat /sys/class/infiniband/driverX/ports/1/state
|
||||||
4: ACTIVE
|
4: ACTIVE
|
||||||
|
|
||||||
where driverX is mthca0, ipath5, ehca3, etc.
|
where driverX is mthca0, ipath5, ehca3, etc.
|
||||||
|
@ -174,10 +187,10 @@ Check RDMA and NFS Setup
|
||||||
To further test the InfiniBand software stack, use IPoIB (this
|
To further test the InfiniBand software stack, use IPoIB (this
|
||||||
assumes you have two IB hosts named host1 and host2):
|
assumes you have two IB hosts named host1 and host2):
|
||||||
|
|
||||||
host1> ifconfig ib0 a.b.c.x
|
host1$ ifconfig ib0 a.b.c.x
|
||||||
host2> ifconfig ib0 a.b.c.y
|
host2$ ifconfig ib0 a.b.c.y
|
||||||
host1> ping a.b.c.y
|
host1$ ping a.b.c.y
|
||||||
host2> ping a.b.c.x
|
host2$ ping a.b.c.x
|
||||||
|
|
||||||
For other device types, follow the appropriate procedures.
|
For other device types, follow the appropriate procedures.
|
||||||
|
|
||||||
|
@ -202,11 +215,11 @@ NFS/RDMA Setup
|
||||||
/vol0 192.168.0.47(fsid=0,rw,async,insecure,no_root_squash)
|
/vol0 192.168.0.47(fsid=0,rw,async,insecure,no_root_squash)
|
||||||
/vol0 192.168.0.0/255.255.255.0(fsid=0,rw,async,insecure,no_root_squash)
|
/vol0 192.168.0.0/255.255.255.0(fsid=0,rw,async,insecure,no_root_squash)
|
||||||
|
|
||||||
The IP address(es) is(are) the client's IPoIB address for an InfiniBand HCA or the
|
The IP address(es) is(are) the client's IPoIB address for an InfiniBand
|
||||||
cleint's iWARP address(es) for an RNIC.
|
HCA or the cleint's iWARP address(es) for an RNIC.
|
||||||
|
|
||||||
NOTE: The "insecure" option must be used because the NFS/RDMA client does not
|
NOTE: The "insecure" option must be used because the NFS/RDMA client does
|
||||||
use a reserved port.
|
not use a reserved port.
|
||||||
|
|
||||||
Each time a machine boots:
|
Each time a machine boots:
|
||||||
|
|
||||||
|
@ -214,43 +227,45 @@ NFS/RDMA Setup
|
||||||
|
|
||||||
For InfiniBand using a Mellanox adapter:
|
For InfiniBand using a Mellanox adapter:
|
||||||
|
|
||||||
> modprobe ib_mthca
|
$ modprobe ib_mthca
|
||||||
> modprobe ib_ipoib
|
$ modprobe ib_ipoib
|
||||||
> ifconfig ib0 a.b.c.d
|
$ ifconfig ib0 a.b.c.d
|
||||||
|
|
||||||
NOTE: use unique addresses for the client and server
|
NOTE: use unique addresses for the client and server
|
||||||
|
|
||||||
- Start the NFS server
|
- Start the NFS server
|
||||||
|
|
||||||
If the NFS/RDMA server was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in kernel config),
|
If the NFS/RDMA server was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in
|
||||||
load the RDMA transport module:
|
kernel config), load the RDMA transport module:
|
||||||
|
|
||||||
> modprobe svcrdma
|
$ modprobe svcrdma
|
||||||
|
|
||||||
Regardless of how the server was built (module or built-in), start the server:
|
Regardless of how the server was built (module or built-in), start the
|
||||||
|
server:
|
||||||
|
|
||||||
> /etc/init.d/nfs start
|
$ /etc/init.d/nfs start
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
> service nfs start
|
$ service nfs start
|
||||||
|
|
||||||
Instruct the server to listen on the RDMA transport:
|
Instruct the server to listen on the RDMA transport:
|
||||||
|
|
||||||
> echo rdma 2050 > /proc/fs/nfsd/portlist
|
$ echo rdma 2050 > /proc/fs/nfsd/portlist
|
||||||
|
|
||||||
- On the client system
|
- On the client system
|
||||||
|
|
||||||
If the NFS/RDMA client was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in kernel config),
|
If the NFS/RDMA client was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in
|
||||||
load the RDMA client module:
|
kernel config), load the RDMA client module:
|
||||||
|
|
||||||
> modprobe xprtrdma.ko
|
$ modprobe xprtrdma.ko
|
||||||
|
|
||||||
Regardless of how the client was built (module or built-in), issue the mount.nfs command:
|
Regardless of how the client was built (module or built-in), use this
|
||||||
|
command to mount the NFS/RDMA server:
|
||||||
|
|
||||||
> /path/to/your/mount.nfs <IPoIB-server-name-or-address>:/<export> /mnt -i -o rdma,port=2050
|
$ mount -o rdma,port=2050 <IPoIB-server-name-or-address>:/<export> /mnt
|
||||||
|
|
||||||
To verify that the mount is using RDMA, run "cat /proc/mounts" and check the
|
To verify that the mount is using RDMA, run "cat /proc/mounts" and check
|
||||||
"proto" field for the given mount.
|
the "proto" field for the given mount.
|
||||||
|
|
||||||
Congratulations! You're using NFS/RDMA!
|
Congratulations! You're using NFS/RDMA!
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
Optimized MPEG Filesystem (OMFS)
|
||||||
|
|
||||||
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
OMFS is a filesystem created by SonicBlue for use in the ReplayTV DVR
|
||||||
|
and Rio Karma MP3 player. The filesystem is extent-based, utilizing
|
||||||
|
block sizes from 2k to 8k, with hash-based directories. This
|
||||||
|
filesystem driver may be used to read and write disks from these
|
||||||
|
devices.
|
||||||
|
|
||||||
|
Note, it is not recommended that this FS be used in place of a general
|
||||||
|
filesystem for your own streaming media device. Native Linux filesystems
|
||||||
|
will likely perform better.
|
||||||
|
|
||||||
|
More information is available at:
|
||||||
|
|
||||||
|
http://linux-karma.sf.net/
|
||||||
|
|
||||||
|
Various utilities, including mkomfs and omfsck, are included with
|
||||||
|
omfsprogs, available at:
|
||||||
|
|
||||||
|
http://bobcopeland.com/karma/
|
||||||
|
|
||||||
|
Instructions are included in its README.
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
OMFS supports the following mount-time options:
|
||||||
|
|
||||||
|
uid=n - make all files owned by specified user
|
||||||
|
gid=n - make all files owned by specified group
|
||||||
|
umask=xxx - set permission umask to xxx
|
||||||
|
fmask=xxx - set umask to xxx for files
|
||||||
|
dmask=xxx - set umask to xxx for directories
|
||||||
|
|
||||||
|
Disk format
|
||||||
|
===========
|
||||||
|
|
||||||
|
OMFS discriminates between "sysblocks" and normal data blocks. The sysblock
|
||||||
|
group consists of super block information, file metadata, directory structures,
|
||||||
|
and extents. Each sysblock has a header containing CRCs of the entire
|
||||||
|
sysblock, and may be mirrored in successive blocks on the disk. A sysblock may
|
||||||
|
have a smaller size than a data block, but since they are both addressed by the
|
||||||
|
same 64-bit block number, any remaining space in the smaller sysblock is
|
||||||
|
unused.
|
||||||
|
|
||||||
|
Sysblock header information:
|
||||||
|
|
||||||
|
struct omfs_header {
|
||||||
|
__be64 h_self; /* FS block where this is located */
|
||||||
|
__be32 h_body_size; /* size of useful data after header */
|
||||||
|
__be16 h_crc; /* crc-ccitt of body_size bytes */
|
||||||
|
char h_fill1[2];
|
||||||
|
u8 h_version; /* version, always 1 */
|
||||||
|
char h_type; /* OMFS_INODE_X */
|
||||||
|
u8 h_magic; /* OMFS_IMAGIC */
|
||||||
|
u8 h_check_xor; /* XOR of header bytes before this */
|
||||||
|
__be32 h_fill2;
|
||||||
|
};
|
||||||
|
|
||||||
|
Files and directories are both represented by omfs_inode:
|
||||||
|
|
||||||
|
struct omfs_inode {
|
||||||
|
struct omfs_header i_head; /* header */
|
||||||
|
__be64 i_parent; /* parent containing this inode */
|
||||||
|
__be64 i_sibling; /* next inode in hash bucket */
|
||||||
|
__be64 i_ctime; /* ctime, in milliseconds */
|
||||||
|
char i_fill1[35];
|
||||||
|
char i_type; /* OMFS_[DIR,FILE] */
|
||||||
|
__be32 i_fill2;
|
||||||
|
char i_fill3[64];
|
||||||
|
char i_name[OMFS_NAMELEN]; /* filename */
|
||||||
|
__be64 i_size; /* size of file, in bytes */
|
||||||
|
};
|
||||||
|
|
||||||
|
Directories in OMFS are implemented as a large hash table. Filenames are
|
||||||
|
hashed then prepended into the bucket list beginning at OMFS_DIR_START.
|
||||||
|
Lookup requires hashing the filename, then seeking across i_sibling pointers
|
||||||
|
until a match is found on i_name. Empty buckets are represented by block
|
||||||
|
pointers with all-1s (~0).
|
||||||
|
|
||||||
|
A file is an omfs_inode structure followed by an extent table beginning at
|
||||||
|
OMFS_EXTENT_START:
|
||||||
|
|
||||||
|
struct omfs_extent_entry {
|
||||||
|
__be64 e_cluster; /* start location of a set of blocks */
|
||||||
|
__be64 e_blocks; /* number of blocks after e_cluster */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct omfs_extent {
|
||||||
|
__be64 e_next; /* next extent table location */
|
||||||
|
__be32 e_extent_count; /* total # extents in this table */
|
||||||
|
__be32 e_fill;
|
||||||
|
struct omfs_extent_entry e_entry; /* start of extent entries */
|
||||||
|
};
|
||||||
|
|
||||||
|
Each extent holds the block offset followed by number of blocks allocated to
|
||||||
|
the extent. The final extent in each table is a terminator with e_cluster
|
||||||
|
being ~0 and e_blocks being ones'-complement of the total number of blocks
|
||||||
|
in the table.
|
||||||
|
|
||||||
|
If this table overflows, a continuation inode is written and pointed to by
|
||||||
|
e_next. These have a header but lack the rest of the inode structure.
|
||||||
|
|
|
@ -296,6 +296,7 @@ Table 1-4: Kernel info in /proc
|
||||||
uptime System uptime
|
uptime System uptime
|
||||||
version Kernel version
|
version Kernel version
|
||||||
video bttv info of video resources (2.4)
|
video bttv info of video resources (2.4)
|
||||||
|
vmallocinfo Show vmalloced areas
|
||||||
..............................................................................
|
..............................................................................
|
||||||
|
|
||||||
You can, for example, check which interrupts are currently in use and what
|
You can, for example, check which interrupts are currently in use and what
|
||||||
|
@ -557,6 +558,49 @@ VmallocTotal: total size of vmalloc memory area
|
||||||
VmallocUsed: amount of vmalloc area which is used
|
VmallocUsed: amount of vmalloc area which is used
|
||||||
VmallocChunk: largest contigious block of vmalloc area which is free
|
VmallocChunk: largest contigious block of vmalloc area which is free
|
||||||
|
|
||||||
|
..............................................................................
|
||||||
|
|
||||||
|
vmallocinfo:
|
||||||
|
|
||||||
|
Provides information about vmalloced/vmaped areas. One line per area,
|
||||||
|
containing the virtual address range of the area, size in bytes,
|
||||||
|
caller information of the creator, and optional information depending
|
||||||
|
on the kind of area :
|
||||||
|
|
||||||
|
pages=nr number of pages
|
||||||
|
phys=addr if a physical address was specified
|
||||||
|
ioremap I/O mapping (ioremap() and friends)
|
||||||
|
vmalloc vmalloc() area
|
||||||
|
vmap vmap()ed pages
|
||||||
|
user VM_USERMAP area
|
||||||
|
vpages buffer for pages pointers was vmalloced (huge area)
|
||||||
|
N<node>=nr (Only on NUMA kernels)
|
||||||
|
Number of pages allocated on memory node <node>
|
||||||
|
|
||||||
|
> cat /proc/vmallocinfo
|
||||||
|
0xffffc20000000000-0xffffc20000201000 2101248 alloc_large_system_hash+0x204 ...
|
||||||
|
/0x2c0 pages=512 vmalloc N0=128 N1=128 N2=128 N3=128
|
||||||
|
0xffffc20000201000-0xffffc20000302000 1052672 alloc_large_system_hash+0x204 ...
|
||||||
|
/0x2c0 pages=256 vmalloc N0=64 N1=64 N2=64 N3=64
|
||||||
|
0xffffc20000302000-0xffffc20000304000 8192 acpi_tb_verify_table+0x21/0x4f...
|
||||||
|
phys=7fee8000 ioremap
|
||||||
|
0xffffc20000304000-0xffffc20000307000 12288 acpi_tb_verify_table+0x21/0x4f...
|
||||||
|
phys=7fee7000 ioremap
|
||||||
|
0xffffc2000031d000-0xffffc2000031f000 8192 init_vdso_vars+0x112/0x210
|
||||||
|
0xffffc2000031f000-0xffffc2000032b000 49152 cramfs_uncompress_init+0x2e ...
|
||||||
|
/0x80 pages=11 vmalloc N0=3 N1=3 N2=2 N3=3
|
||||||
|
0xffffc2000033a000-0xffffc2000033d000 12288 sys_swapon+0x640/0xac0 ...
|
||||||
|
pages=2 vmalloc N1=2
|
||||||
|
0xffffc20000347000-0xffffc2000034c000 20480 xt_alloc_table_info+0xfe ...
|
||||||
|
/0x130 [x_tables] pages=4 vmalloc N0=4
|
||||||
|
0xffffffffa0000000-0xffffffffa000f000 61440 sys_init_module+0xc27/0x1d00 ...
|
||||||
|
pages=14 vmalloc N2=14
|
||||||
|
0xffffffffa000f000-0xffffffffa0014000 20480 sys_init_module+0xc27/0x1d00 ...
|
||||||
|
pages=4 vmalloc N1=4
|
||||||
|
0xffffffffa0014000-0xffffffffa0017000 12288 sys_init_module+0xc27/0x1d00 ...
|
||||||
|
pages=2 vmalloc N1=2
|
||||||
|
0xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ...
|
||||||
|
pages=10 vmalloc N0=10
|
||||||
|
|
||||||
1.3 IDE devices in /proc/ide
|
1.3 IDE devices in /proc/ide
|
||||||
----------------------------
|
----------------------------
|
||||||
|
@ -887,7 +931,7 @@ group_prealloc max_to_scan mb_groups mb_history min_to_scan order2_req
|
||||||
stats stream_req
|
stats stream_req
|
||||||
|
|
||||||
mb_groups:
|
mb_groups:
|
||||||
This file gives the details of mutiblock allocator buddy cache of free blocks
|
This file gives the details of multiblock allocator buddy cache of free blocks
|
||||||
|
|
||||||
mb_history:
|
mb_history:
|
||||||
Multiblock allocation history.
|
Multiblock allocation history.
|
||||||
|
@ -1430,7 +1474,7 @@ used because pages_free(1355) is smaller than watermark + protection[2]
|
||||||
normal page requirement. If requirement is DMA zone(index=0), protection[0]
|
normal page requirement. If requirement is DMA zone(index=0), protection[0]
|
||||||
(=0) is used.
|
(=0) is used.
|
||||||
|
|
||||||
zone[i]'s protection[j] is calculated by following exprssion.
|
zone[i]'s protection[j] is calculated by following expression.
|
||||||
|
|
||||||
(i < j):
|
(i < j):
|
||||||
zone[i]->protection[j]
|
zone[i]->protection[j]
|
||||||
|
|
|
@ -294,6 +294,16 @@ user-defined data with a channel, and is immediately available
|
||||||
(including in create_buf_file()) via chan->private_data or
|
(including in create_buf_file()) via chan->private_data or
|
||||||
buf->chan->private_data.
|
buf->chan->private_data.
|
||||||
|
|
||||||
|
Buffer-only channels
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
These channels have no files associated and can be created with
|
||||||
|
relay_open(NULL, NULL, ...). Such channels are useful in scenarios such
|
||||||
|
as when doing early tracing in the kernel, before the VFS is up. In these
|
||||||
|
cases, one may open a buffer-only channel and then call
|
||||||
|
relay_late_setup_files() when the kernel is ready to handle files,
|
||||||
|
to expose the buffered data to the userspace.
|
||||||
|
|
||||||
Channel 'modes'
|
Channel 'modes'
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
|
@ -248,6 +248,7 @@ The top level sysfs directory looks like:
|
||||||
block/
|
block/
|
||||||
bus/
|
bus/
|
||||||
class/
|
class/
|
||||||
|
dev/
|
||||||
devices/
|
devices/
|
||||||
firmware/
|
firmware/
|
||||||
net/
|
net/
|
||||||
|
@ -274,6 +275,11 @@ fs/ contains a directory for some filesystems. Currently each
|
||||||
filesystem wanting to export attributes must create its own hierarchy
|
filesystem wanting to export attributes must create its own hierarchy
|
||||||
below fs/ (see ./fuse.txt for an example).
|
below fs/ (see ./fuse.txt for an example).
|
||||||
|
|
||||||
|
dev/ contains two directories char/ and block/. Inside these two
|
||||||
|
directories there are symlinks named <major>:<minor>. These symlinks
|
||||||
|
point to the sysfs directory for the given device. /sys/dev provides a
|
||||||
|
quick way to lookup the sysfs interface for a device from the result of
|
||||||
|
a stat(2) operation.
|
||||||
|
|
||||||
More information can driver-model specific features can be found in
|
More information can driver-model specific features can be found in
|
||||||
Documentation/driver-model/.
|
Documentation/driver-model/.
|
||||||
|
|
|
@ -96,6 +96,14 @@ shortname=lower|win95|winnt|mixed
|
||||||
emulate the Windows 95 rule for create.
|
emulate the Windows 95 rule for create.
|
||||||
Default setting is `lower'.
|
Default setting is `lower'.
|
||||||
|
|
||||||
|
tz=UTC -- Interpret timestamps as UTC rather than local time.
|
||||||
|
This option disables the conversion of timestamps
|
||||||
|
between local time (as used by Windows on FAT) and UTC
|
||||||
|
(which Linux uses internally). This is particuluarly
|
||||||
|
useful when mounting devices (like digital cameras)
|
||||||
|
that are set to UTC in order to avoid the pitfalls of
|
||||||
|
local time.
|
||||||
|
|
||||||
<bool>: 0,1,yes,no,true,false
|
<bool>: 0,1,yes,no,true,false
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
|
|
|
@ -143,7 +143,7 @@ struct file_system_type {
|
||||||
|
|
||||||
The get_sb() method has the following arguments:
|
The get_sb() method has the following arguments:
|
||||||
|
|
||||||
struct file_system_type *fs_type: decribes the filesystem, partly initialized
|
struct file_system_type *fs_type: describes the filesystem, partly initialized
|
||||||
by the specific filesystem code
|
by the specific filesystem code
|
||||||
|
|
||||||
int flags: mount flags
|
int flags: mount flags
|
||||||
|
@ -895,9 +895,9 @@ struct dentry_operations {
|
||||||
iput() yourself
|
iput() yourself
|
||||||
|
|
||||||
d_dname: called when the pathname of a dentry should be generated.
|
d_dname: called when the pathname of a dentry should be generated.
|
||||||
Usefull for some pseudo filesystems (sockfs, pipefs, ...) to delay
|
Useful for some pseudo filesystems (sockfs, pipefs, ...) to delay
|
||||||
pathname generation. (Instead of doing it when dentry is created,
|
pathname generation. (Instead of doing it when dentry is created,
|
||||||
its done only when the path is needed.). Real filesystems probably
|
it's done only when the path is needed.). Real filesystems probably
|
||||||
dont want to use it, because their dentries are present in global
|
dont want to use it, because their dentries are present in global
|
||||||
dcache hash, so their hash should be an invariant. As no lock is
|
dcache hash, so their hash should be an invariant. As no lock is
|
||||||
held, d_dname() should not try to modify the dentry itself, unless
|
held, d_dname() should not try to modify the dentry itself, unless
|
||||||
|
|
|
@ -347,15 +347,12 @@ necessarily be nonportable.
|
||||||
Dynamic definition of GPIOs is not currently standard; for example, as
|
Dynamic definition of GPIOs is not currently standard; for example, as
|
||||||
a side effect of configuring an add-on board with some GPIO expanders.
|
a side effect of configuring an add-on board with some GPIO expanders.
|
||||||
|
|
||||||
These calls are purely for kernel space, but a userspace API could be built
|
|
||||||
on top of them.
|
|
||||||
|
|
||||||
|
|
||||||
GPIO implementor's framework (OPTIONAL)
|
GPIO implementor's framework (OPTIONAL)
|
||||||
=======================================
|
=======================================
|
||||||
As noted earlier, there is an optional implementation framework making it
|
As noted earlier, there is an optional implementation framework making it
|
||||||
easier for platforms to support different kinds of GPIO controller using
|
easier for platforms to support different kinds of GPIO controller using
|
||||||
the same programming interface.
|
the same programming interface. This framework is called "gpiolib".
|
||||||
|
|
||||||
As a debugging aid, if debugfs is available a /sys/kernel/debug/gpio file
|
As a debugging aid, if debugfs is available a /sys/kernel/debug/gpio file
|
||||||
will be found there. That will list all the controllers registered through
|
will be found there. That will list all the controllers registered through
|
||||||
|
@ -392,11 +389,21 @@ either NULL or the label associated with that GPIO when it was requested.
|
||||||
|
|
||||||
Platform Support
|
Platform Support
|
||||||
----------------
|
----------------
|
||||||
To support this framework, a platform's Kconfig will "select HAVE_GPIO_LIB"
|
To support this framework, a platform's Kconfig will "select" either
|
||||||
|
ARCH_REQUIRE_GPIOLIB or ARCH_WANT_OPTIONAL_GPIOLIB
|
||||||
and arrange that its <asm/gpio.h> includes <asm-generic/gpio.h> and defines
|
and arrange that its <asm/gpio.h> includes <asm-generic/gpio.h> and defines
|
||||||
three functions: gpio_get_value(), gpio_set_value(), and gpio_cansleep().
|
three functions: gpio_get_value(), gpio_set_value(), and gpio_cansleep().
|
||||||
They may also want to provide a custom value for ARCH_NR_GPIOS.
|
They may also want to provide a custom value for ARCH_NR_GPIOS.
|
||||||
|
|
||||||
|
ARCH_REQUIRE_GPIOLIB means that the gpio-lib code will always get compiled
|
||||||
|
into the kernel on that architecture.
|
||||||
|
|
||||||
|
ARCH_WANT_OPTIONAL_GPIOLIB means the gpio-lib code defaults to off and the user
|
||||||
|
can enable it and build it into the kernel optionally.
|
||||||
|
|
||||||
|
If neither of these options are selected, the platform does not support
|
||||||
|
GPIOs through GPIO-lib and the code cannot be enabled by the user.
|
||||||
|
|
||||||
Trivial implementations of those functions can directly use framework
|
Trivial implementations of those functions can directly use framework
|
||||||
code, which always dispatches through the gpio_chip:
|
code, which always dispatches through the gpio_chip:
|
||||||
|
|
||||||
|
@ -439,4 +446,120 @@ becomes available. That may mean the device should not be registered until
|
||||||
calls for that GPIO can work. One way to address such dependencies is for
|
calls for that GPIO can work. One way to address such dependencies is for
|
||||||
such gpio_chip controllers to provide setup() and teardown() callbacks to
|
such gpio_chip controllers to provide setup() and teardown() callbacks to
|
||||||
board specific code; those board specific callbacks would register devices
|
board specific code; those board specific callbacks would register devices
|
||||||
once all the necessary resources are available.
|
once all the necessary resources are available, and remove them later when
|
||||||
|
the GPIO controller device becomes unavailable.
|
||||||
|
|
||||||
|
|
||||||
|
Sysfs Interface for Userspace (OPTIONAL)
|
||||||
|
========================================
|
||||||
|
Platforms which use the "gpiolib" implementors framework may choose to
|
||||||
|
configure a sysfs user interface to GPIOs. This is different from the
|
||||||
|
debugfs interface, since it provides control over GPIO direction and
|
||||||
|
value instead of just showing a gpio state summary. Plus, it could be
|
||||||
|
present on production systems without debugging support.
|
||||||
|
|
||||||
|
Given approprate hardware documentation for the system, userspace could
|
||||||
|
know for example that GPIO #23 controls the write protect line used to
|
||||||
|
protect boot loader segments in flash memory. System upgrade procedures
|
||||||
|
may need to temporarily remove that protection, first importing a GPIO,
|
||||||
|
then changing its output state, then updating the code before re-enabling
|
||||||
|
the write protection. In normal use, GPIO #23 would never be touched,
|
||||||
|
and the kernel would have no need to know about it.
|
||||||
|
|
||||||
|
Again depending on appropriate hardware documentation, on some systems
|
||||||
|
userspace GPIO can be used to determine system configuration data that
|
||||||
|
standard kernels won't know about. And for some tasks, simple userspace
|
||||||
|
GPIO drivers could be all that the system really needs.
|
||||||
|
|
||||||
|
Note that standard kernel drivers exist for common "LEDs and Buttons"
|
||||||
|
GPIO tasks: "leds-gpio" and "gpio_keys", respectively. Use those
|
||||||
|
instead of talking directly to the GPIOs; they integrate with kernel
|
||||||
|
frameworks better than your userspace code could.
|
||||||
|
|
||||||
|
|
||||||
|
Paths in Sysfs
|
||||||
|
--------------
|
||||||
|
There are three kinds of entry in /sys/class/gpio:
|
||||||
|
|
||||||
|
- Control interfaces used to get userspace control over GPIOs;
|
||||||
|
|
||||||
|
- GPIOs themselves; and
|
||||||
|
|
||||||
|
- GPIO controllers ("gpio_chip" instances).
|
||||||
|
|
||||||
|
That's in addition to standard files including the "device" symlink.
|
||||||
|
|
||||||
|
The control interfaces are write-only:
|
||||||
|
|
||||||
|
/sys/class/gpio/
|
||||||
|
|
||||||
|
"export" ... Userspace may ask the kernel to export control of
|
||||||
|
a GPIO to userspace by writing its number to this file.
|
||||||
|
|
||||||
|
Example: "echo 19 > export" will create a "gpio19" node
|
||||||
|
for GPIO #19, if that's not requested by kernel code.
|
||||||
|
|
||||||
|
"unexport" ... Reverses the effect of exporting to userspace.
|
||||||
|
|
||||||
|
Example: "echo 19 > unexport" will remove a "gpio19"
|
||||||
|
node exported using the "export" file.
|
||||||
|
|
||||||
|
GPIO signals have paths like /sys/class/gpio/gpio42/ (for GPIO #42)
|
||||||
|
and have the following read/write attributes:
|
||||||
|
|
||||||
|
/sys/class/gpio/gpioN/
|
||||||
|
|
||||||
|
"direction" ... reads as either "in" or "out". This value may
|
||||||
|
normally be written. Writing as "out" defaults to
|
||||||
|
initializing the value as low. To ensure glitch free
|
||||||
|
operation, values "low" and "high" may be written to
|
||||||
|
configure the GPIO as an output with that initial value.
|
||||||
|
|
||||||
|
Note that this attribute *will not exist* if the kernel
|
||||||
|
doesn't support changing the direction of a GPIO, or
|
||||||
|
it was exported by kernel code that didn't explicitly
|
||||||
|
allow userspace to reconfigure this GPIO's direction.
|
||||||
|
|
||||||
|
"value" ... reads as either 0 (low) or 1 (high). If the GPIO
|
||||||
|
is configured as an output, this value may be written;
|
||||||
|
any nonzero value is treated as high.
|
||||||
|
|
||||||
|
GPIO controllers have paths like /sys/class/gpio/chipchip42/ (for the
|
||||||
|
controller implementing GPIOs starting at #42) and have the following
|
||||||
|
read-only attributes:
|
||||||
|
|
||||||
|
/sys/class/gpio/gpiochipN/
|
||||||
|
|
||||||
|
"base" ... same as N, the first GPIO managed by this chip
|
||||||
|
|
||||||
|
"label" ... provided for diagnostics (not always unique)
|
||||||
|
|
||||||
|
"ngpio" ... how many GPIOs this manges (N to N + ngpio - 1)
|
||||||
|
|
||||||
|
Board documentation should in most cases cover what GPIOs are used for
|
||||||
|
what purposes. However, those numbers are not always stable; GPIOs on
|
||||||
|
a daughtercard might be different depending on the base board being used,
|
||||||
|
or other cards in the stack. In such cases, you may need to use the
|
||||||
|
gpiochip nodes (possibly in conjunction with schematics) to determine
|
||||||
|
the correct GPIO number to use for a given signal.
|
||||||
|
|
||||||
|
|
||||||
|
Exporting from Kernel code
|
||||||
|
--------------------------
|
||||||
|
Kernel code can explicitly manage exports of GPIOs which have already been
|
||||||
|
requested using gpio_request():
|
||||||
|
|
||||||
|
/* export the GPIO to userspace */
|
||||||
|
int gpio_export(unsigned gpio, bool direction_may_change);
|
||||||
|
|
||||||
|
/* reverse gpio_export() */
|
||||||
|
void gpio_unexport();
|
||||||
|
|
||||||
|
After a kernel driver requests a GPIO, it may only be made available in
|
||||||
|
the sysfs interface by gpio_export(). The driver can control whether the
|
||||||
|
signal direction may change. This helps drivers prevent userspace code
|
||||||
|
from accidentally clobbering important system state.
|
||||||
|
|
||||||
|
This explicit exporting can help with debugging (by making some kinds
|
||||||
|
of experiments easier), or can provide an always-there interface that's
|
||||||
|
suitable for documenting as part of a board support package.
|
||||||
|
|
|
@ -0,0 +1,281 @@
|
||||||
|
Upgrading I2C Drivers to the new 2.6 Driver Model
|
||||||
|
=================================================
|
||||||
|
|
||||||
|
Ben Dooks <ben-linux@fluff.org>
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
This guide outlines how to alter existing Linux 2.6 client drivers from
|
||||||
|
the old to the new new binding methods.
|
||||||
|
|
||||||
|
|
||||||
|
Example old-style driver
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
|
||||||
|
struct example_state {
|
||||||
|
struct i2c_client client;
|
||||||
|
....
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_driver example_driver;
|
||||||
|
|
||||||
|
static unsigned short ignore[] = { I2C_CLIENT_END };
|
||||||
|
static unsigned short normal_addr[] = { OUR_ADDR, I2C_CLIENT_END };
|
||||||
|
|
||||||
|
I2C_CLIENT_INSMOD;
|
||||||
|
|
||||||
|
static int example_attach(struct i2c_adapter *adap, int addr, int kind)
|
||||||
|
{
|
||||||
|
struct example_state *state;
|
||||||
|
struct device *dev = &adap->dev; /* to use for dev_ reports */
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
state = kzalloc(sizeof(struct example_state), GFP_KERNEL);
|
||||||
|
if (state == NULL) {
|
||||||
|
dev_err(dev, "failed to create our state\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
example->client.addr = addr;
|
||||||
|
example->client.flags = 0;
|
||||||
|
example->client.adapter = adap;
|
||||||
|
|
||||||
|
i2c_set_clientdata(&state->i2c_client, state);
|
||||||
|
strlcpy(client->i2c_client.name, "example", I2C_NAME_SIZE);
|
||||||
|
|
||||||
|
ret = i2c_attach_client(&state->i2c_client);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(dev, "failed to attach client\n");
|
||||||
|
kfree(state);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev = &state->i2c_client.dev;
|
||||||
|
|
||||||
|
/* rest of the initialisation goes here. */
|
||||||
|
|
||||||
|
dev_info(dev, "example client created\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __devexit example_detach(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
struct example_state *state = i2c_get_clientdata(client);
|
||||||
|
|
||||||
|
i2c_detach_client(client);
|
||||||
|
kfree(state);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int example_attach_adapter(struct i2c_adapter *adap)
|
||||||
|
{
|
||||||
|
return i2c_probe(adap, &addr_data, example_attach);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct i2c_driver example_driver = {
|
||||||
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = "example",
|
||||||
|
},
|
||||||
|
.attach_adapter = example_attach_adapter,
|
||||||
|
.detach_client = __devexit_p(example_detach),
|
||||||
|
.suspend = example_suspend,
|
||||||
|
.resume = example_resume,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Updating the client
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The new style binding model will check against a list of supported
|
||||||
|
devices and their associated address supplied by the code registering
|
||||||
|
the busses. This means that the driver .attach_adapter and
|
||||||
|
.detach_adapter methods can be removed, along with the addr_data,
|
||||||
|
as follows:
|
||||||
|
|
||||||
|
- static struct i2c_driver example_driver;
|
||||||
|
|
||||||
|
- static unsigned short ignore[] = { I2C_CLIENT_END };
|
||||||
|
- static unsigned short normal_addr[] = { OUR_ADDR, I2C_CLIENT_END };
|
||||||
|
|
||||||
|
- I2C_CLIENT_INSMOD;
|
||||||
|
|
||||||
|
- static int example_attach_adapter(struct i2c_adapter *adap)
|
||||||
|
- {
|
||||||
|
- return i2c_probe(adap, &addr_data, example_attach);
|
||||||
|
- }
|
||||||
|
|
||||||
|
static struct i2c_driver example_driver = {
|
||||||
|
- .attach_adapter = example_attach_adapter,
|
||||||
|
- .detach_client = __devexit_p(example_detach),
|
||||||
|
}
|
||||||
|
|
||||||
|
Add the probe and remove methods to the i2c_driver, as so:
|
||||||
|
|
||||||
|
static struct i2c_driver example_driver = {
|
||||||
|
+ .probe = example_probe,
|
||||||
|
+ .remove = __devexit_p(example_remove),
|
||||||
|
}
|
||||||
|
|
||||||
|
Change the example_attach method to accept the new parameters
|
||||||
|
which include the i2c_client that it will be working with:
|
||||||
|
|
||||||
|
- static int example_attach(struct i2c_adapter *adap, int addr, int kind)
|
||||||
|
+ static int example_probe(struct i2c_client *client,
|
||||||
|
+ const struct i2c_device_id *id)
|
||||||
|
|
||||||
|
Change the name of example_attach to example_probe to align it with the
|
||||||
|
i2c_driver entry names. The rest of the probe routine will now need to be
|
||||||
|
changed as the i2c_client has already been setup for use.
|
||||||
|
|
||||||
|
The necessary client fields have already been setup before
|
||||||
|
the probe function is called, so the following client setup
|
||||||
|
can be removed:
|
||||||
|
|
||||||
|
- example->client.addr = addr;
|
||||||
|
- example->client.flags = 0;
|
||||||
|
- example->client.adapter = adap;
|
||||||
|
-
|
||||||
|
- strlcpy(client->i2c_client.name, "example", I2C_NAME_SIZE);
|
||||||
|
|
||||||
|
The i2c_set_clientdata is now:
|
||||||
|
|
||||||
|
- i2c_set_clientdata(&state->client, state);
|
||||||
|
+ i2c_set_clientdata(client, state);
|
||||||
|
|
||||||
|
The call to i2c_attach_client is no longer needed, if the probe
|
||||||
|
routine exits successfully, then the driver will be automatically
|
||||||
|
attached by the core. Change the probe routine as so:
|
||||||
|
|
||||||
|
- ret = i2c_attach_client(&state->i2c_client);
|
||||||
|
- if (ret < 0) {
|
||||||
|
- dev_err(dev, "failed to attach client\n");
|
||||||
|
- kfree(state);
|
||||||
|
- return ret;
|
||||||
|
- }
|
||||||
|
|
||||||
|
|
||||||
|
Remove the storage of 'struct i2c_client' from the 'struct example_state'
|
||||||
|
as we are provided with the i2c_client in our example_probe. Instead we
|
||||||
|
store a pointer to it for when it is needed.
|
||||||
|
|
||||||
|
struct example_state {
|
||||||
|
- struct i2c_client client;
|
||||||
|
+ struct i2c_client *client;
|
||||||
|
|
||||||
|
the new i2c client as so:
|
||||||
|
|
||||||
|
- struct device *dev = &adap->dev; /* to use for dev_ reports */
|
||||||
|
+ struct device *dev = &i2c_client->dev; /* to use for dev_ reports */
|
||||||
|
|
||||||
|
And remove the change after our client is attached, as the driver no
|
||||||
|
longer needs to register a new client structure with the core:
|
||||||
|
|
||||||
|
- dev = &state->i2c_client.dev;
|
||||||
|
|
||||||
|
In the probe routine, ensure that the new state has the client stored
|
||||||
|
in it:
|
||||||
|
|
||||||
|
static int example_probe(struct i2c_client *i2c_client,
|
||||||
|
const struct i2c_device_id *id)
|
||||||
|
{
|
||||||
|
struct example_state *state;
|
||||||
|
struct device *dev = &i2c_client->dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
state = kzalloc(sizeof(struct example_state), GFP_KERNEL);
|
||||||
|
if (state == NULL) {
|
||||||
|
dev_err(dev, "failed to create our state\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ state->client = i2c_client;
|
||||||
|
|
||||||
|
Update the detach method, by changing the name to _remove and
|
||||||
|
to delete the i2c_detach_client call. It is possible that you
|
||||||
|
can also remove the ret variable as it is not not needed for
|
||||||
|
any of the core functions.
|
||||||
|
|
||||||
|
- static int __devexit example_detach(struct i2c_client *client)
|
||||||
|
+ static int __devexit example_remove(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
struct example_state *state = i2c_get_clientdata(client);
|
||||||
|
|
||||||
|
- i2c_detach_client(client);
|
||||||
|
|
||||||
|
And finally ensure that we have the correct ID table for the i2c-core
|
||||||
|
and other utilities:
|
||||||
|
|
||||||
|
+ struct i2c_device_id example_idtable[] = {
|
||||||
|
+ { "example", 0 },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+MODULE_DEVICE_TABLE(i2c, example_idtable);
|
||||||
|
|
||||||
|
static struct i2c_driver example_driver = {
|
||||||
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = "example",
|
||||||
|
},
|
||||||
|
+ .id_table = example_ids,
|
||||||
|
|
||||||
|
|
||||||
|
Our driver should now look like this:
|
||||||
|
|
||||||
|
struct example_state {
|
||||||
|
struct i2c_client *client;
|
||||||
|
....
|
||||||
|
};
|
||||||
|
|
||||||
|
static int example_probe(struct i2c_client *client,
|
||||||
|
const struct i2c_device_id *id)
|
||||||
|
{
|
||||||
|
struct example_state *state;
|
||||||
|
struct device *dev = &client->dev;
|
||||||
|
|
||||||
|
state = kzalloc(sizeof(struct example_state), GFP_KERNEL);
|
||||||
|
if (state == NULL) {
|
||||||
|
dev_err(dev, "failed to create our state\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->client = client;
|
||||||
|
i2c_set_clientdata(client, state);
|
||||||
|
|
||||||
|
/* rest of the initialisation goes here. */
|
||||||
|
|
||||||
|
dev_info(dev, "example client created\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __devexit example_remove(struct i2c_client *client)
|
||||||
|
{
|
||||||
|
struct example_state *state = i2c_get_clientdata(client);
|
||||||
|
|
||||||
|
kfree(state);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct i2c_device_id example_idtable[] = {
|
||||||
|
{ "example", 0 },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_DEVICE_TABLE(i2c, example_idtable);
|
||||||
|
|
||||||
|
static struct i2c_driver example_driver = {
|
||||||
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = "example",
|
||||||
|
},
|
||||||
|
.id_table = example_idtable,
|
||||||
|
.probe = example_probe,
|
||||||
|
.remove = __devexit_p(example_remove),
|
||||||
|
.suspend = example_suspend,
|
||||||
|
.resume = example_resume,
|
||||||
|
};
|
|
@ -50,9 +50,9 @@ Note: For step 2, please make sure that host page size == TARGET_PAGE_SIZE of qe
|
||||||
/usr/local/bin/qemu-system-ia64 -smp xx -m 512 -hda $your_image
|
/usr/local/bin/qemu-system-ia64 -smp xx -m 512 -hda $your_image
|
||||||
(xx is the number of virtual processors for the guest, now the maximum value is 4)
|
(xx is the number of virtual processors for the guest, now the maximum value is 4)
|
||||||
|
|
||||||
5. Known possibile issue on some platforms with old Firmware.
|
5. Known possible issue on some platforms with old Firmware.
|
||||||
|
|
||||||
If meet strange host crashe issues, try to solve it through either of the following ways:
|
In the event of strange host crash issues, try to solve it through either of the following ways:
|
||||||
|
|
||||||
(1): Upgrade your Firmware to the latest one.
|
(1): Upgrade your Firmware to the latest one.
|
||||||
|
|
||||||
|
@ -65,8 +65,8 @@ index 0b53344..f02b0f7 100644
|
||||||
mov ar.pfs = loc1
|
mov ar.pfs = loc1
|
||||||
mov rp = loc0
|
mov rp = loc0
|
||||||
;;
|
;;
|
||||||
- srlz.d // seralize restoration of psr.l
|
- srlz.d // serialize restoration of psr.l
|
||||||
+ srlz.i // seralize restoration of psr.l
|
+ srlz.i // serialize restoration of psr.l
|
||||||
+ ;;
|
+ ;;
|
||||||
br.ret.sptk.many b0
|
br.ret.sptk.many b0
|
||||||
END(ia64_pal_call_static)
|
END(ia64_pal_call_static)
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
Paravirt_ops on IA64
|
||||||
|
====================
|
||||||
|
21 May 2008, Isaku Yamahata <yamahata@valinux.co.jp>
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
The aim of this documentation is to help with maintainability and/or to
|
||||||
|
encourage people to use paravirt_ops/IA64.
|
||||||
|
|
||||||
|
paravirt_ops (pv_ops in short) is a way for virtualization support of
|
||||||
|
Linux kernel on x86. Several ways for virtualization support were
|
||||||
|
proposed, paravirt_ops is the winner.
|
||||||
|
On the other hand, now there are also several IA64 virtualization
|
||||||
|
technologies like kvm/IA64, xen/IA64 and many other academic IA64
|
||||||
|
hypervisors so that it is good to add generic virtualization
|
||||||
|
infrastructure on Linux/IA64.
|
||||||
|
|
||||||
|
|
||||||
|
What is paravirt_ops?
|
||||||
|
---------------------
|
||||||
|
It has been developed on x86 as virtualization support via API, not ABI.
|
||||||
|
It allows each hypervisor to override operations which are important for
|
||||||
|
hypervisors at API level. And it allows a single kernel binary to run on
|
||||||
|
all supported execution environments including native machine.
|
||||||
|
Essentially paravirt_ops is a set of function pointers which represent
|
||||||
|
operations corresponding to low level sensitive instructions and high
|
||||||
|
level functionalities in various area. But one significant difference
|
||||||
|
from usual function pointer table is that it allows optimization with
|
||||||
|
binary patch. It is because some of these operations are very
|
||||||
|
performance sensitive and indirect call overhead is not negligible.
|
||||||
|
With binary patch, indirect C function call can be transformed into
|
||||||
|
direct C function call or in-place execution to eliminate the overhead.
|
||||||
|
|
||||||
|
Thus, operations of paravirt_ops are classified into three categories.
|
||||||
|
- simple indirect call
|
||||||
|
These operations correspond to high level functionality so that the
|
||||||
|
overhead of indirect call isn't very important.
|
||||||
|
|
||||||
|
- indirect call which allows optimization with binary patch
|
||||||
|
Usually these operations correspond to low level instructions. They
|
||||||
|
are called frequently and performance critical. So the overhead is
|
||||||
|
very important.
|
||||||
|
|
||||||
|
- a set of macros for hand written assembly code
|
||||||
|
Hand written assembly codes (.S files) also need paravirtualization
|
||||||
|
because they include sensitive instructions or some of code paths in
|
||||||
|
them are very performance critical.
|
||||||
|
|
||||||
|
|
||||||
|
The relation to the IA64 machine vector
|
||||||
|
---------------------------------------
|
||||||
|
Linux/IA64 has the IA64 machine vector functionality which allows the
|
||||||
|
kernel to switch implementations (e.g. initialization, ipi, dma api...)
|
||||||
|
depending on executing platform.
|
||||||
|
We can replace some implementations very easily defining a new machine
|
||||||
|
vector. Thus another approach for virtualization support would be
|
||||||
|
enhancing the machine vector functionality.
|
||||||
|
But paravirt_ops approach was taken because
|
||||||
|
- virtualization support needs wider support than machine vector does.
|
||||||
|
e.g. low level instruction paravirtualization. It must be
|
||||||
|
initialized very early before platform detection.
|
||||||
|
|
||||||
|
- virtualization support needs more functionality like binary patch.
|
||||||
|
Probably the calling overhead might not be very large compared to the
|
||||||
|
emulation overhead of virtualization. However in the native case, the
|
||||||
|
overhead should be eliminated completely.
|
||||||
|
A single kernel binary should run on each environment including native,
|
||||||
|
and the overhead of paravirt_ops on native environment should be as
|
||||||
|
small as possible.
|
||||||
|
|
||||||
|
- for full virtualization technology, e.g. KVM/IA64 or
|
||||||
|
Xen/IA64 HVM domain, the result would be
|
||||||
|
(the emulated platform machine vector. probably dig) + (pv_ops).
|
||||||
|
This means that the virtualization support layer should be under
|
||||||
|
the machine vector layer.
|
||||||
|
|
||||||
|
Possibly it might be better to move some function pointers from
|
||||||
|
paravirt_ops to machine vector. In fact, Xen domU case utilizes both
|
||||||
|
pv_ops and machine vector.
|
||||||
|
|
||||||
|
|
||||||
|
IA64 paravirt_ops
|
||||||
|
-----------------
|
||||||
|
In this section, the concrete paravirt_ops will be discussed.
|
||||||
|
Because of the architecture difference between ia64 and x86, the
|
||||||
|
resulting set of functions is very different from x86 pv_ops.
|
||||||
|
|
||||||
|
- C function pointer tables
|
||||||
|
They are not very performance critical so that simple C indirect
|
||||||
|
function call is acceptable. The following structures are defined at
|
||||||
|
this moment. For details see linux/include/asm-ia64/paravirt.h
|
||||||
|
- struct pv_info
|
||||||
|
This structure describes the execution environment.
|
||||||
|
- struct pv_init_ops
|
||||||
|
This structure describes the various initialization hooks.
|
||||||
|
- struct pv_iosapic_ops
|
||||||
|
This structure describes hooks to iosapic operations.
|
||||||
|
- struct pv_irq_ops
|
||||||
|
This structure describes hooks to irq related operations
|
||||||
|
- struct pv_time_op
|
||||||
|
This structure describes hooks to steal time accounting.
|
||||||
|
|
||||||
|
- a set of indirect calls which need optimization
|
||||||
|
Currently this class of functions correspond to a subset of IA64
|
||||||
|
intrinsics. At this moment the optimization with binary patch isn't
|
||||||
|
implemented yet.
|
||||||
|
struct pv_cpu_op is defined. For details see
|
||||||
|
linux/include/asm-ia64/paravirt_privop.h
|
||||||
|
Mostly they correspond to ia64 intrinsics 1-to-1.
|
||||||
|
Caveat: Now they are defined as C indirect function pointers, but in
|
||||||
|
order to support binary patch optimization, they will be changed
|
||||||
|
using GCC extended inline assembly code.
|
||||||
|
|
||||||
|
- a set of macros for hand written assembly code (.S files)
|
||||||
|
For maintenance purpose, the taken approach for .S files is single
|
||||||
|
source code and compile multiple times with different macros definitions.
|
||||||
|
Each pv_ops instance must define those macros to compile.
|
||||||
|
The important thing here is that sensitive, but non-privileged
|
||||||
|
instructions must be paravirtualized and that some privileged
|
||||||
|
instructions also need paravirtualization for reasonable performance.
|
||||||
|
Developers who modify .S files must be aware of that. At this moment
|
||||||
|
an easy checker is implemented to detect paravirtualization breakage.
|
||||||
|
But it doesn't cover all the cases.
|
||||||
|
|
||||||
|
Sometimes this set of macros is called pv_cpu_asm_op. But there is no
|
||||||
|
corresponding structure in the source code.
|
||||||
|
Those macros mostly 1:1 correspond to a subset of privileged
|
||||||
|
instructions. See linux/include/asm-ia64/native/inst.h.
|
||||||
|
And some functions written in assembly also need to be overrided so
|
||||||
|
that each pv_ops instance have to define some macros. Again see
|
||||||
|
linux/include/asm-ia64/native/inst.h.
|
||||||
|
|
||||||
|
|
||||||
|
Those structures must be initialized very early before start_kernel.
|
||||||
|
Probably initialized in head.S using multi entry point or some other trick.
|
||||||
|
For native case implementation see linux/arch/ia64/kernel/paravirt.c.
|
|
@ -31,7 +31,7 @@ The driver works with ALSA drivers simultaneously. For example, the xracer
|
||||||
uses joystick as input device and PCM device as sound output in one time.
|
uses joystick as input device and PCM device as sound output in one time.
|
||||||
There are no sound or input collisions detected. The source code have
|
There are no sound or input collisions detected. The source code have
|
||||||
comments about them; but I've found the joystick can be initialized
|
comments about them; but I've found the joystick can be initialized
|
||||||
separately of ALSA modules. So, you canm use only one joystick driver
|
separately of ALSA modules. So, you can use only one joystick driver
|
||||||
without ALSA drivers. The ALSA drivers are not needed to compile or
|
without ALSA drivers. The ALSA drivers are not needed to compile or
|
||||||
run this driver.
|
run this driver.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
$Id: gameport-programming.txt,v 1.3 2001/04/24 13:51:37 vojtech Exp $
|
|
||||||
|
|
||||||
Programming gameport drivers
|
Programming gameport drivers
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
Linux Input drivers v1.0
|
Linux Input drivers v1.0
|
||||||
(c) 1999-2001 Vojtech Pavlik <vojtech@ucw.cz>
|
(c) 1999-2001 Vojtech Pavlik <vojtech@ucw.cz>
|
||||||
Sponsored by SuSE
|
Sponsored by SuSE
|
||||||
$Id: input.txt,v 1.8 2002/05/29 03:15:01 bradleym Exp $
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
0. Disclaimer
|
0. Disclaimer
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
|
|
||||||
7 Aug 1998
|
7 Aug 1998
|
||||||
|
|
||||||
$Id: joystick-api.txt,v 1.2 2001/05/08 21:21:23 vojtech Exp $
|
|
||||||
|
|
||||||
1. Initialization
|
1. Initialization
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
(c) 1998-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
(c) 1998-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
||||||
(c) 1998 Andree Borrmann <a.borrmann@tu-bs.de>
|
(c) 1998 Andree Borrmann <a.borrmann@tu-bs.de>
|
||||||
Sponsored by SuSE
|
Sponsored by SuSE
|
||||||
$Id: joystick-parport.txt,v 1.6 2001/09/25 09:31:32 vojtech Exp $
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
0. Disclaimer
|
0. Disclaimer
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
Linux Joystick driver v2.0.0
|
Linux Joystick driver v2.0.0
|
||||||
(c) 1996-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
(c) 1996-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
||||||
Sponsored by SuSE
|
Sponsored by SuSE
|
||||||
$Id: joystick.txt,v 1.12 2002/03/03 12:13:07 jdeneux Exp $
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
0. Disclaimer
|
0. Disclaimer
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
To decode a hex IOCTL code:
|
To decode a hex IOCTL code:
|
||||||
|
|
||||||
Most architecures use this generic format, but check
|
Most architectures use this generic format, but check
|
||||||
include/ARCH/ioctl.h for specifics, e.g. powerpc
|
include/ARCH/ioctl.h for specifics, e.g. powerpc
|
||||||
uses 3 bits to encode read/write and 13 bits for size.
|
uses 3 bits to encode read/write and 13 bits for size.
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ uses 3 bits to encode read/write and 13 bits for size.
|
||||||
7-0 function #
|
7-0 function #
|
||||||
|
|
||||||
|
|
||||||
So for example 0x82187201 is a read with arg length of 0x218,
|
So for example 0x82187201 is a read with arg length of 0x218,
|
||||||
character 'r' function 1. Grepping the source reveals this is:
|
character 'r' function 1. Grepping the source reveals this is:
|
||||||
|
|
||||||
#define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct dirent [2])
|
#define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct dirent [2])
|
||||||
|
|
|
@ -143,7 +143,7 @@ disk and partition statistics are consistent again. Since we still don't
|
||||||
keep record of the partition-relative address, an operation is attributed to
|
keep record of the partition-relative address, an operation is attributed to
|
||||||
the partition which contains the first sector of the request after the
|
the partition which contains the first sector of the request after the
|
||||||
eventual merges. As requests can be merged across partition, this could lead
|
eventual merges. As requests can be merged across partition, this could lead
|
||||||
to some (probably insignificant) innacuracy.
|
to some (probably insignificant) inaccuracy.
|
||||||
|
|
||||||
Additional notes
|
Additional notes
|
||||||
----------------
|
----------------
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
mISDN is a new modular ISDN driver, in the long term it should replace
|
||||||
|
the old I4L driver architecture for passiv ISDN cards.
|
||||||
|
It was designed to allow a broad range of applications and interfaces
|
||||||
|
but only have the basic function in kernel, the interface to the user
|
||||||
|
space is based on sockets with a own address family AF_ISDN.
|
||||||
|
|
|
@ -87,7 +87,8 @@ parameter is applicable:
|
||||||
SH SuperH architecture is enabled.
|
SH SuperH architecture is enabled.
|
||||||
SMP The kernel is an SMP kernel.
|
SMP The kernel is an SMP kernel.
|
||||||
SPARC Sparc architecture is enabled.
|
SPARC Sparc architecture is enabled.
|
||||||
SWSUSP Software suspend is enabled.
|
SWSUSP Software suspend (hibernation) is enabled.
|
||||||
|
SUSPEND System suspend states are enabled.
|
||||||
TS Appropriate touchscreen support is enabled.
|
TS Appropriate touchscreen support is enabled.
|
||||||
USB USB support is enabled.
|
USB USB support is enabled.
|
||||||
USBHID USB Human Interface Device support is enabled.
|
USBHID USB Human Interface Device support is enabled.
|
||||||
|
@ -147,10 +148,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
default: 0
|
default: 0
|
||||||
|
|
||||||
acpi_sleep= [HW,ACPI] Sleep options
|
acpi_sleep= [HW,ACPI] Sleep options
|
||||||
Format: { s3_bios, s3_mode, s3_beep, old_ordering }
|
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, old_ordering }
|
||||||
See Documentation/power/video.txt for s3_bios and s3_mode.
|
See Documentation/power/video.txt for s3_bios and s3_mode.
|
||||||
s3_beep is for debugging; it makes the PC's speaker beep
|
s3_beep is for debugging; it makes the PC's speaker beep
|
||||||
as soon as the kernel's real-mode entry point is called.
|
as soon as the kernel's real-mode entry point is called.
|
||||||
|
s4_nohwsig prevents ACPI hardware signature from being
|
||||||
|
used during resume from hibernation.
|
||||||
old_ordering causes the ACPI 1.0 ordering of the _PTS
|
old_ordering causes the ACPI 1.0 ordering of the _PTS
|
||||||
control method, wrt putting devices into low power
|
control method, wrt putting devices into low power
|
||||||
states, to be enforced (the ACPI 2.0 ordering of _PTS is
|
states, to be enforced (the ACPI 2.0 ordering of _PTS is
|
||||||
|
@ -774,8 +777,22 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
hisax= [HW,ISDN]
|
hisax= [HW,ISDN]
|
||||||
See Documentation/isdn/README.HiSax.
|
See Documentation/isdn/README.HiSax.
|
||||||
|
|
||||||
hugepages= [HW,X86-32,IA-64] Maximal number of HugeTLB pages.
|
hugepages= [HW,X86-32,IA-64] HugeTLB pages to allocate at boot.
|
||||||
hugepagesz= [HW,IA-64,PPC] The size of the HugeTLB pages.
|
hugepagesz= [HW,IA-64,PPC,X86-64] The size of the HugeTLB pages.
|
||||||
|
On x86-64 and powerpc, this option can be specified
|
||||||
|
multiple times interleaved with hugepages= to reserve
|
||||||
|
huge pages of different sizes. Valid pages sizes on
|
||||||
|
x86-64 are 2M (when the CPU supports "pse") and 1G
|
||||||
|
(when the CPU supports the "pdpe1gb" cpuinfo flag)
|
||||||
|
Note that 1GB pages can only be allocated at boot time
|
||||||
|
using hugepages= and not freed afterwards.
|
||||||
|
default_hugepagesz=
|
||||||
|
[same as hugepagesz=] The size of the default
|
||||||
|
HugeTLB page size. This is the size represented by
|
||||||
|
the legacy /proc/ hugepages APIs, used for SHM, and
|
||||||
|
default size when mounting hugetlbfs filesystems.
|
||||||
|
Defaults to the default architecture's huge page size
|
||||||
|
if not specified.
|
||||||
|
|
||||||
i8042.direct [HW] Put keyboard port into non-translated mode
|
i8042.direct [HW] Put keyboard port into non-translated mode
|
||||||
i8042.dumbkbd [HW] Pretend that controller can only read data from
|
i8042.dumbkbd [HW] Pretend that controller can only read data from
|
||||||
|
@ -1206,7 +1223,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
or
|
or
|
||||||
memmap=0x10000$0x18690000
|
memmap=0x10000$0x18690000
|
||||||
|
|
||||||
memtest= [KNL,X86_64] Enable memtest
|
memtest= [KNL,X86] Enable memtest
|
||||||
Format: <integer>
|
Format: <integer>
|
||||||
range: 0,4 : pattern number
|
range: 0,4 : pattern number
|
||||||
default : 0 <disable>
|
default : 0 <disable>
|
||||||
|
@ -1225,6 +1242,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
mga= [HW,DRM]
|
mga= [HW,DRM]
|
||||||
|
|
||||||
|
mminit_loglevel=
|
||||||
|
[KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this
|
||||||
|
parameter allows control of the logging verbosity for
|
||||||
|
the additional memory initialisation checks. A value
|
||||||
|
of 0 disables mminit logging and a level of 4 will
|
||||||
|
log everything. Information is printed at KERN_DEBUG
|
||||||
|
so loglevel=8 may also need to be specified.
|
||||||
|
|
||||||
mousedev.tap_time=
|
mousedev.tap_time=
|
||||||
[MOUSE] Maximum time between finger touching and
|
[MOUSE] Maximum time between finger touching and
|
||||||
leaving touchpad surface for touch to be considered
|
leaving touchpad surface for touch to be considered
|
||||||
|
@ -1279,6 +1304,13 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
This usage is only documented in each driver source
|
This usage is only documented in each driver source
|
||||||
file if at all.
|
file if at all.
|
||||||
|
|
||||||
|
nf_conntrack.acct=
|
||||||
|
[NETFILTER] Enable connection tracking flow accounting
|
||||||
|
0 to disable accounting
|
||||||
|
1 to enable accounting
|
||||||
|
Default value depends on CONFIG_NF_CT_ACCT that is
|
||||||
|
going to be removed in 2.6.29.
|
||||||
|
|
||||||
nfsaddrs= [NFS]
|
nfsaddrs= [NFS]
|
||||||
See Documentation/filesystems/nfsroot.txt.
|
See Documentation/filesystems/nfsroot.txt.
|
||||||
|
|
||||||
|
@ -2027,6 +2059,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
snd-ymfpci= [HW,ALSA]
|
snd-ymfpci= [HW,ALSA]
|
||||||
|
|
||||||
|
softlockup_panic=
|
||||||
|
[KNL] Should the soft-lockup detector generate panics.
|
||||||
|
|
||||||
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
||||||
See Documentation/sonypi.txt
|
See Documentation/sonypi.txt
|
||||||
|
|
||||||
|
@ -2091,6 +2126,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
tdfx= [HW,DRM]
|
tdfx= [HW,DRM]
|
||||||
|
|
||||||
|
test_suspend= [SUSPEND]
|
||||||
|
Specify "mem" (for Suspend-to-RAM) or "standby" (for
|
||||||
|
standby suspend) as the system sleep state to briefly
|
||||||
|
enter during system startup. The system is woken from
|
||||||
|
this state using a wakeup-capable RTC alarm.
|
||||||
|
|
||||||
thash_entries= [KNL,NET]
|
thash_entries= [KNL,NET]
|
||||||
Set number of hash buckets for TCP connection
|
Set number of hash buckets for TCP connection
|
||||||
|
|
||||||
|
@ -2118,13 +2159,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
<deci-seconds>: poll all this frequency
|
<deci-seconds>: poll all this frequency
|
||||||
0: no polling (default)
|
0: no polling (default)
|
||||||
|
|
||||||
tipar.timeout= [HW,PPT]
|
|
||||||
Set communications timeout in tenths of a second
|
|
||||||
(default 15).
|
|
||||||
|
|
||||||
tipar.delay= [HW,PPT]
|
|
||||||
Set inter-bit delay in microseconds (default 10).
|
|
||||||
|
|
||||||
tmscsim= [HW,SCSI]
|
tmscsim= [HW,SCSI]
|
||||||
See comment before function dc390_setup() in
|
See comment before function dc390_setup() in
|
||||||
drivers/scsi/tmscsim.c.
|
drivers/scsi/tmscsim.c.
|
||||||
|
@ -2158,6 +2192,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
Note that genuine overcurrent events won't be
|
Note that genuine overcurrent events won't be
|
||||||
reported either.
|
reported either.
|
||||||
|
|
||||||
|
unknown_nmi_panic
|
||||||
|
[X86-32,X86-64]
|
||||||
|
Set unknown_nmi_panic=1 early on boot.
|
||||||
|
|
||||||
usbcore.autosuspend=
|
usbcore.autosuspend=
|
||||||
[USB] The autosuspend time delay (in seconds) used
|
[USB] The autosuspend time delay (in seconds) used
|
||||||
for newly-detected USB devices (default 2). This
|
for newly-detected USB devices (default 2). This
|
||||||
|
|
|
@ -864,7 +864,7 @@ payload contents" for more information.
|
||||||
request_key_with_auxdata() respectively.
|
request_key_with_auxdata() respectively.
|
||||||
|
|
||||||
These two functions return with the key potentially still under
|
These two functions return with the key potentially still under
|
||||||
construction. To wait for contruction completion, the following should be
|
construction. To wait for construction completion, the following should be
|
||||||
called:
|
called:
|
||||||
|
|
||||||
int wait_for_key_construction(struct key *key, bool intr);
|
int wait_for_key_construction(struct key *key, bool intr);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
ThinkPad ACPI Extras Driver
|
ThinkPad ACPI Extras Driver
|
||||||
|
|
||||||
Version 0.20
|
Version 0.21
|
||||||
April 09th, 2008
|
May 29th, 2008
|
||||||
|
|
||||||
Borislav Deianov <borislav@users.sf.net>
|
Borislav Deianov <borislav@users.sf.net>
|
||||||
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||||
|
@ -621,7 +621,8 @@ Bluetooth
|
||||||
---------
|
---------
|
||||||
|
|
||||||
procfs: /proc/acpi/ibm/bluetooth
|
procfs: /proc/acpi/ibm/bluetooth
|
||||||
sysfs device attribute: bluetooth_enable
|
sysfs device attribute: bluetooth_enable (deprecated)
|
||||||
|
sysfs rfkill class: switch "tpacpi_bluetooth_sw"
|
||||||
|
|
||||||
This feature shows the presence and current state of a ThinkPad
|
This feature shows the presence and current state of a ThinkPad
|
||||||
Bluetooth device in the internal ThinkPad CDC slot.
|
Bluetooth device in the internal ThinkPad CDC slot.
|
||||||
|
@ -643,8 +644,12 @@ Sysfs notes:
|
||||||
0: disables Bluetooth / Bluetooth is disabled
|
0: disables Bluetooth / Bluetooth is disabled
|
||||||
1: enables Bluetooth / Bluetooth is enabled.
|
1: enables Bluetooth / Bluetooth is enabled.
|
||||||
|
|
||||||
Note: this interface will be probably be superseded by the
|
Note: this interface has been superseded by the generic rfkill
|
||||||
generic rfkill class, so it is NOT to be considered stable yet.
|
class. It has been deprecated, and it will be removed in year
|
||||||
|
2010.
|
||||||
|
|
||||||
|
rfkill controller switch "tpacpi_bluetooth_sw": refer to
|
||||||
|
Documentation/rfkill.txt for details.
|
||||||
|
|
||||||
Video output control -- /proc/acpi/ibm/video
|
Video output control -- /proc/acpi/ibm/video
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
@ -1374,7 +1379,8 @@ EXPERIMENTAL: WAN
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
procfs: /proc/acpi/ibm/wan
|
procfs: /proc/acpi/ibm/wan
|
||||||
sysfs device attribute: wwan_enable
|
sysfs device attribute: wwan_enable (deprecated)
|
||||||
|
sysfs rfkill class: switch "tpacpi_wwan_sw"
|
||||||
|
|
||||||
This feature is marked EXPERIMENTAL because the implementation
|
This feature is marked EXPERIMENTAL because the implementation
|
||||||
directly accesses hardware registers and may not work as expected. USE
|
directly accesses hardware registers and may not work as expected. USE
|
||||||
|
@ -1404,8 +1410,12 @@ Sysfs notes:
|
||||||
0: disables WWAN card / WWAN card is disabled
|
0: disables WWAN card / WWAN card is disabled
|
||||||
1: enables WWAN card / WWAN card is enabled.
|
1: enables WWAN card / WWAN card is enabled.
|
||||||
|
|
||||||
Note: this interface will be probably be superseded by the
|
Note: this interface has been superseded by the generic rfkill
|
||||||
generic rfkill class, so it is NOT to be considered stable yet.
|
class. It has been deprecated, and it will be removed in year
|
||||||
|
2010.
|
||||||
|
|
||||||
|
rfkill controller switch "tpacpi_wwan_sw": refer to
|
||||||
|
Documentation/rfkill.txt for details.
|
||||||
|
|
||||||
Multiple Commands, Module Parameters
|
Multiple Commands, Module Parameters
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
|
|
@ -59,7 +59,7 @@ Hardware accelerated blink of LEDs
|
||||||
|
|
||||||
Some LEDs can be programmed to blink without any CPU interaction. To
|
Some LEDs can be programmed to blink without any CPU interaction. To
|
||||||
support this feature, a LED driver can optionally implement the
|
support this feature, a LED driver can optionally implement the
|
||||||
blink_set() function (see <linux/leds.h>). If implemeted, triggers can
|
blink_set() function (see <linux/leds.h>). If implemented, triggers can
|
||||||
attempt to use it before falling back to software timers. The blink_set()
|
attempt to use it before falling back to software timers. The blink_set()
|
||||||
function should return 0 if the blink setting is supported, or -EINVAL
|
function should return 0 if the blink setting is supported, or -EINVAL
|
||||||
otherwise, which means that LED blinking will be handled by software.
|
otherwise, which means that LED blinking will be handled by software.
|
||||||
|
|
|
@ -36,7 +36,7 @@ It can be done by slightly modifying the standard atomic operations : only
|
||||||
their UP variant must be kept. It typically means removing LOCK prefix (on
|
their UP variant must be kept. It typically means removing LOCK prefix (on
|
||||||
i386 and x86_64) and any SMP sychronization barrier. If the architecture does
|
i386 and x86_64) and any SMP sychronization barrier. If the architecture does
|
||||||
not have a different behavior between SMP and UP, including asm-generic/local.h
|
not have a different behavior between SMP and UP, including asm-generic/local.h
|
||||||
in your archtecture's local.h is sufficient.
|
in your architecture's local.h is sufficient.
|
||||||
|
|
||||||
The local_t type is defined as an opaque signed long by embedding an
|
The local_t type is defined as an opaque signed long by embedding an
|
||||||
atomic_long_t inside a structure. This is made so a cast from this type to a
|
atomic_long_t inside a structure. This is made so a cast from this type to a
|
||||||
|
|
|
@ -236,6 +236,11 @@ All md devices contain:
|
||||||
writing the word for the desired state, however some states
|
writing the word for the desired state, however some states
|
||||||
cannot be explicitly set, and some transitions are not allowed.
|
cannot be explicitly set, and some transitions are not allowed.
|
||||||
|
|
||||||
|
Select/poll works on this file. All changes except between
|
||||||
|
active_idle and active (which can be frequent and are not
|
||||||
|
very interesting) are notified. active->active_idle is
|
||||||
|
reported if the metadata is externally managed.
|
||||||
|
|
||||||
clear
|
clear
|
||||||
No devices, no size, no level
|
No devices, no size, no level
|
||||||
Writing is equivalent to STOP_ARRAY ioctl
|
Writing is equivalent to STOP_ARRAY ioctl
|
||||||
|
@ -292,6 +297,10 @@ Each directory contains:
|
||||||
writemostly - device will only be subject to read
|
writemostly - device will only be subject to read
|
||||||
requests if there are no other options.
|
requests if there are no other options.
|
||||||
This applies only to raid1 arrays.
|
This applies only to raid1 arrays.
|
||||||
|
blocked - device has failed, metadata is "external",
|
||||||
|
and the failure hasn't been acknowledged yet.
|
||||||
|
Writes that would write to this device if
|
||||||
|
it were not faulty are blocked.
|
||||||
spare - device is working, but not a full member.
|
spare - device is working, but not a full member.
|
||||||
This includes spares that are in the process
|
This includes spares that are in the process
|
||||||
of being recovered to
|
of being recovered to
|
||||||
|
@ -301,6 +310,12 @@ Each directory contains:
|
||||||
Writing "remove" removes the device from the array.
|
Writing "remove" removes the device from the array.
|
||||||
Writing "writemostly" sets the writemostly flag.
|
Writing "writemostly" sets the writemostly flag.
|
||||||
Writing "-writemostly" clears the writemostly flag.
|
Writing "-writemostly" clears the writemostly flag.
|
||||||
|
Writing "blocked" sets the "blocked" flag.
|
||||||
|
Writing "-blocked" clear the "blocked" flag and allows writes
|
||||||
|
to complete.
|
||||||
|
|
||||||
|
This file responds to select/poll. Any change to 'faulty'
|
||||||
|
or 'blocked' causes an event.
|
||||||
|
|
||||||
errors
|
errors
|
||||||
An approximate count of read errors that have been detected on
|
An approximate count of read errors that have been detected on
|
||||||
|
@ -332,7 +347,7 @@ Each directory contains:
|
||||||
for storage of data. This will normally be the same as the
|
for storage of data. This will normally be the same as the
|
||||||
component_size. This can be written while assembling an
|
component_size. This can be written while assembling an
|
||||||
array. If a value less than the current component_size is
|
array. If a value less than the current component_size is
|
||||||
written, component_size will be reduced to this value.
|
written, it will be rejected.
|
||||||
|
|
||||||
|
|
||||||
An active md device will also contain and entry for each active device
|
An active md device will also contain and entry for each active device
|
||||||
|
@ -381,6 +396,19 @@ also have
|
||||||
'check' and 'repair' will start the appropriate process
|
'check' and 'repair' will start the appropriate process
|
||||||
providing the current state is 'idle'.
|
providing the current state is 'idle'.
|
||||||
|
|
||||||
|
This file responds to select/poll. Any important change in the value
|
||||||
|
triggers a poll event. Sometimes the value will briefly be
|
||||||
|
"recover" if a recovery seems to be needed, but cannot be
|
||||||
|
achieved. In that case, the transition to "recover" isn't
|
||||||
|
notified, but the transition away is.
|
||||||
|
|
||||||
|
degraded
|
||||||
|
This contains a count of the number of devices by which the
|
||||||
|
arrays is degraded. So an optimal array with show '0'. A
|
||||||
|
single failed/missing drive will show '1', etc.
|
||||||
|
This file responds to select/poll, any increase or decrease
|
||||||
|
in the count of missing devices will trigger an event.
|
||||||
|
|
||||||
mismatch_count
|
mismatch_count
|
||||||
When performing 'check' and 'repair', and possibly when
|
When performing 'check' and 'repair', and possibly when
|
||||||
performing 'resync', md will count the number of errors that are
|
performing 'resync', md will count the number of errors that are
|
||||||
|
|
|
@ -1,14 +1,22 @@
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
MOXA Smartio/Industio Family Device Driver Installation Guide
|
||||||
|
for Linux Kernel 2.4.x, 2.6.x
|
||||||
|
Copyright (C) 2008, Moxa Inc.
|
||||||
|
=============================================================================
|
||||||
|
Date: 01/21/2008
|
||||||
|
|
||||||
MOXA Smartio Family Device Driver Ver 1.1 Installation Guide
|
|
||||||
for Linux Kernel 2.2.x and 2.0.3x
|
|
||||||
Copyright (C) 1999, Moxa Technologies Co, Ltd.
|
|
||||||
=============================================================================
|
|
||||||
Content
|
Content
|
||||||
|
|
||||||
1. Introduction
|
1. Introduction
|
||||||
2. System Requirement
|
2. System Requirement
|
||||||
3. Installation
|
3. Installation
|
||||||
|
3.1 Hardware installation
|
||||||
|
3.2 Driver files
|
||||||
|
3.3 Device naming convention
|
||||||
|
3.4 Module driver configuration
|
||||||
|
3.5 Static driver configuration for Linux kernel 2.4.x and 2.6.x.
|
||||||
|
3.6 Custom configuration
|
||||||
|
3.7 Verify driver installation
|
||||||
4. Utilities
|
4. Utilities
|
||||||
5. Setserial
|
5. Setserial
|
||||||
6. Troubleshooting
|
6. Troubleshooting
|
||||||
|
@ -16,27 +24,48 @@ Content
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
1. Introduction
|
1. Introduction
|
||||||
|
|
||||||
The Smartio family Linux driver, Ver. 1.1, supports following multiport
|
The Smartio/Industio/UPCI family Linux driver supports following multiport
|
||||||
boards.
|
boards.
|
||||||
|
|
||||||
-C104P/H/HS, C104H/PCI, C104HS/PCI, CI-104J 4 port multiport board.
|
- 2 ports multiport board
|
||||||
-C168P/H/HS, C168H/PCI 8 port multiport board.
|
CP-102U, CP-102UL, CP-102UF
|
||||||
|
CP-132U-I, CP-132UL,
|
||||||
|
CP-132, CP-132I, CP132S, CP-132IS,
|
||||||
|
CI-132, CI-132I, CI-132IS,
|
||||||
|
(C102H, C102HI, C102HIS, C102P, CP-102, CP-102S)
|
||||||
|
|
||||||
This driver has been modified a little and cleaned up from the Moxa
|
- 4 ports multiport board
|
||||||
contributed driver code and merged into Linux 2.2.14pre. In particular
|
CP-104EL,
|
||||||
official major/minor numbers have been assigned which are different to
|
CP-104UL, CP-104JU,
|
||||||
those the original Moxa supplied driver used.
|
CP-134U, CP-134U-I,
|
||||||
|
C104H/PCI, C104HS/PCI,
|
||||||
|
CP-114, CP-114I, CP-114S, CP-114IS, CP-114UL,
|
||||||
|
C104H, C104HS,
|
||||||
|
CI-104J, CI-104JS,
|
||||||
|
CI-134, CI-134I, CI-134IS,
|
||||||
|
(C114HI, CT-114I, C104P)
|
||||||
|
POS-104UL,
|
||||||
|
CB-114,
|
||||||
|
CB-134I
|
||||||
|
|
||||||
|
- 8 ports multiport board
|
||||||
|
CP-118EL, CP-168EL,
|
||||||
|
CP-118U, CP-168U,
|
||||||
|
C168H/PCI,
|
||||||
|
C168H, C168HS,
|
||||||
|
(C168P),
|
||||||
|
CB-108
|
||||||
|
|
||||||
This driver and installation procedure have been developed upon Linux Kernel
|
This driver and installation procedure have been developed upon Linux Kernel
|
||||||
2.2.5 and backward compatible to 2.0.3x. This driver supports Intel x86 and
|
2.4.x and 2.6.x. This driver supports Intel x86 hardware platform. In order
|
||||||
Alpha hardware platform. In order to maintain compatibility, this version
|
to maintain compatibility, this version has also been properly tested with
|
||||||
has also been properly tested with RedHat, OpenLinux, TurboLinux and
|
RedHat, Mandrake, Fedora and S.u.S.E Linux. However, if compatibility problem
|
||||||
S.u.S.E Linux. However, if compatibility problem occurs, please contact
|
occurs, please contact Moxa at support@moxa.com.tw.
|
||||||
Moxa at support@moxa.com.tw.
|
|
||||||
|
|
||||||
In addition to device driver, useful utilities are also provided in this
|
In addition to device driver, useful utilities are also provided in this
|
||||||
version. They are
|
version. They are
|
||||||
- msdiag Diagnostic program for detecting installed Moxa Smartio boards.
|
- msdiag Diagnostic program for displaying installed Moxa
|
||||||
|
Smartio/Industio boards.
|
||||||
- msmon Monitor program to observe data count and line status signals.
|
- msmon Monitor program to observe data count and line status signals.
|
||||||
- msterm A simple terminal program which is useful in testing serial
|
- msterm A simple terminal program which is useful in testing serial
|
||||||
ports.
|
ports.
|
||||||
|
@ -47,8 +76,7 @@ Content
|
||||||
GNU General Public License in this version. Please refer to GNU General
|
GNU General Public License in this version. Please refer to GNU General
|
||||||
Public License announcement in each source code file for more detail.
|
Public License announcement in each source code file for more detail.
|
||||||
|
|
||||||
In Moxa's ftp sites, you may always find latest driver at
|
In Moxa's Web sites, you may always find latest driver at http://web.moxa.com.
|
||||||
ftp://ftp.moxa.com or ftp://ftp.moxa.com.tw.
|
|
||||||
|
|
||||||
This version of driver can be installed as Loadable Module (Module driver)
|
This version of driver can be installed as Loadable Module (Module driver)
|
||||||
or built-in into kernel (Static driver). You may refer to following
|
or built-in into kernel (Static driver). You may refer to following
|
||||||
|
@ -61,8 +89,8 @@ Content
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
2. System Requirement
|
2. System Requirement
|
||||||
- Hardware platform: Intel x86 or Alpha machine
|
- Hardware platform: Intel x86 machine
|
||||||
- Kernel version: 2.0.3x or 2.2.x
|
- Kernel version: 2.4.x or 2.6.x
|
||||||
- gcc version 2.72 or later
|
- gcc version 2.72 or later
|
||||||
- Maximum 4 boards can be installed in combination
|
- Maximum 4 boards can be installed in combination
|
||||||
|
|
||||||
|
@ -70,9 +98,18 @@ Content
|
||||||
3. Installation
|
3. Installation
|
||||||
|
|
||||||
3.1 Hardware installation
|
3.1 Hardware installation
|
||||||
|
3.2 Driver files
|
||||||
|
3.3 Device naming convention
|
||||||
|
3.4 Module driver configuration
|
||||||
|
3.5 Static driver configuration for Linux kernel 2.4.x, 2.6.x.
|
||||||
|
3.6 Custom configuration
|
||||||
|
3.7 Verify driver installation
|
||||||
|
|
||||||
There are two types of buses, ISA and PCI, for Smartio family multiport
|
|
||||||
board.
|
3.1 Hardware installation
|
||||||
|
|
||||||
|
There are two types of buses, ISA and PCI, for Smartio/Industio
|
||||||
|
family multiport board.
|
||||||
|
|
||||||
ISA board
|
ISA board
|
||||||
---------
|
---------
|
||||||
|
@ -81,47 +118,57 @@ Content
|
||||||
installation procedure in User's Manual before proceed any further.
|
installation procedure in User's Manual before proceed any further.
|
||||||
Please make sure the JP1 is open after the ISA board is set properly.
|
Please make sure the JP1 is open after the ISA board is set properly.
|
||||||
|
|
||||||
PCI board
|
PCI/UPCI board
|
||||||
---------
|
--------------
|
||||||
You may need to adjust IRQ usage in BIOS to avoid from IRQ conflict
|
You may need to adjust IRQ usage in BIOS to avoid from IRQ conflict
|
||||||
with other ISA devices. Please refer to hardware installation
|
with other ISA devices. Please refer to hardware installation
|
||||||
procedure in User's Manual in advance.
|
procedure in User's Manual in advance.
|
||||||
|
|
||||||
IRQ Sharing
|
PCI IRQ Sharing
|
||||||
-----------
|
-----------
|
||||||
Each port within the same multiport board shares the same IRQ. Up to
|
Each port within the same multiport board shares the same IRQ. Up to
|
||||||
4 Moxa Smartio Family multiport boards can be installed together on
|
4 Moxa Smartio/Industio PCI Family multiport boards can be installed
|
||||||
one system and they can share the same IRQ.
|
together on one system and they can share the same IRQ.
|
||||||
|
|
||||||
3.2 Driver files and device naming convention
|
|
||||||
|
3.2 Driver files
|
||||||
|
|
||||||
The driver file may be obtained from ftp, CD-ROM or floppy disk. The
|
The driver file may be obtained from ftp, CD-ROM or floppy disk. The
|
||||||
first step, anyway, is to copy driver file "mxser.tgz" into specified
|
first step, anyway, is to copy driver file "mxser.tgz" into specified
|
||||||
directory. e.g. /moxa. The execute commands as below.
|
directory. e.g. /moxa. The execute commands as below.
|
||||||
|
|
||||||
|
# cd /
|
||||||
|
# mkdir moxa
|
||||||
# cd /moxa
|
# cd /moxa
|
||||||
# tar xvf /dev/fd0
|
# tar xvf /dev/fd0
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
|
# cd /
|
||||||
|
# mkdir moxa
|
||||||
# cd /moxa
|
# cd /moxa
|
||||||
# cp /mnt/cdrom/<driver directory>/mxser.tgz .
|
# cp /mnt/cdrom/<driver directory>/mxser.tgz .
|
||||||
# tar xvfz mxser.tgz
|
# tar xvfz mxser.tgz
|
||||||
|
|
||||||
|
|
||||||
|
3.3 Device naming convention
|
||||||
|
|
||||||
You may find all the driver and utilities files in /moxa/mxser.
|
You may find all the driver and utilities files in /moxa/mxser.
|
||||||
Following installation procedure depends on the model you'd like to
|
Following installation procedure depends on the model you'd like to
|
||||||
run the driver. If you prefer module driver, please refer to 3.3.
|
run the driver. If you prefer module driver, please refer to 3.4.
|
||||||
If static driver is required, please refer to 3.4.
|
If static driver is required, please refer to 3.5.
|
||||||
|
|
||||||
Dialin and callout port
|
Dialin and callout port
|
||||||
-----------------------
|
-----------------------
|
||||||
This driver remains traditional serial device properties. There're
|
This driver remains traditional serial device properties. There are
|
||||||
two special file name for each serial port. One is dial-in port
|
two special file name for each serial port. One is dial-in port
|
||||||
which is named "ttyMxx". For callout port, the naming convention
|
which is named "ttyMxx". For callout port, the naming convention
|
||||||
is "cumxx".
|
is "cumxx".
|
||||||
|
|
||||||
Device naming when more than 2 boards installed
|
Device naming when more than 2 boards installed
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
Naming convention for each Smartio multiport board is pre-defined
|
Naming convention for each Smartio/Industio multiport board is
|
||||||
as below.
|
pre-defined as below.
|
||||||
|
|
||||||
Board Num. Dial-in Port Callout port
|
Board Num. Dial-in Port Callout port
|
||||||
1st board ttyM0 - ttyM7 cum0 - cum7
|
1st board ttyM0 - ttyM7 cum0 - cum7
|
||||||
|
@ -129,6 +176,12 @@ Content
|
||||||
3rd board ttyM16 - ttyM23 cum16 - cum23
|
3rd board ttyM16 - ttyM23 cum16 - cum23
|
||||||
4th board ttyM24 - ttym31 cum24 - cum31
|
4th board ttyM24 - ttym31 cum24 - cum31
|
||||||
|
|
||||||
|
|
||||||
|
!!!!!!!!!!!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
Under Kernel 2.6 the cum Device is Obsolete. So use ttyM*
|
||||||
|
device instead.
|
||||||
|
!!!!!!!!!!!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
Board sequence
|
Board sequence
|
||||||
--------------
|
--------------
|
||||||
This driver will activate ISA boards according to the parameter set
|
This driver will activate ISA boards according to the parameter set
|
||||||
|
@ -138,69 +191,131 @@ Content
|
||||||
For PCI boards, their sequence will be after ISA boards and C168H/PCI
|
For PCI boards, their sequence will be after ISA boards and C168H/PCI
|
||||||
has higher priority than C104H/PCI boards.
|
has higher priority than C104H/PCI boards.
|
||||||
|
|
||||||
3.3 Module driver configuration
|
3.4 Module driver configuration
|
||||||
Module driver is easiest way to install. If you prefer static driver
|
Module driver is easiest way to install. If you prefer static driver
|
||||||
installation, please skip this paragraph.
|
installation, please skip this paragraph.
|
||||||
1. Find "Makefile" in /moxa/mxser, then run
|
|
||||||
|
|
||||||
# make install
|
|
||||||
|
|
||||||
The driver files "mxser.o" and utilities will be properly compiled
|
------------- Prepare to use the MOXA driver--------------------
|
||||||
and copied to system directories respectively.Then run
|
3.4.1 Create tty device with correct major number
|
||||||
|
Before using MOXA driver, your system must have the tty devices
|
||||||
|
which are created with driver's major number. We offer one shell
|
||||||
|
script "msmknod" to simplify the procedure.
|
||||||
|
This step is only needed to be executed once. But you still
|
||||||
|
need to do this procedure when:
|
||||||
|
a. You change the driver's major number. Please refer the "3.7"
|
||||||
|
section.
|
||||||
|
b. Your total installed MOXA boards number is changed. Maybe you
|
||||||
|
add/delete one MOXA board.
|
||||||
|
c. You want to change the tty name. This needs to modify the
|
||||||
|
shell script "msmknod"
|
||||||
|
|
||||||
# insmod mxser
|
The procedure is:
|
||||||
|
|
||||||
to activate the modular driver. You may run "lsmod" to check
|
|
||||||
if "mxser.o" is activated.
|
|
||||||
|
|
||||||
2. Create special files by executing "msmknod".
|
|
||||||
# cd /moxa/mxser/driver
|
# cd /moxa/mxser/driver
|
||||||
# ./msmknod
|
# ./msmknod
|
||||||
|
|
||||||
Default major numbers for dial-in device and callout device are
|
This shell script will require the major number for dial-in
|
||||||
174, 175. Msmknod will delete any special files occupying the same
|
device and callout device to create tty device. You also need
|
||||||
device naming.
|
to specify the total installed MOXA board number. Default major
|
||||||
|
numbers for dial-in device and callout device are 30, 35. If
|
||||||
|
you need to change to other number, please refer section "3.7"
|
||||||
|
for more detailed procedure.
|
||||||
|
Msmknod will delete any special files occupying the same device
|
||||||
|
naming.
|
||||||
|
|
||||||
3. Up to now, you may manually execute "insmod mxser" to activate
|
3.4.2 Build the MOXA driver and utilities
|
||||||
this driver and run "rmmod mxser" to remove it. However, it's
|
Before using the MOXA driver and utilities, you need compile the
|
||||||
better to have a boot time configuration to eliminate manual
|
all the source code. This step is only need to be executed once.
|
||||||
operation.
|
But you still re-compile the source code if you modify the source
|
||||||
Boot time configuration can be achieved by rc file. Run following
|
code. For example, if you change the driver's major number (see
|
||||||
command for setting rc files.
|
"3.7" section), then you need to do this step again.
|
||||||
|
|
||||||
|
Find "Makefile" in /moxa/mxser, then run
|
||||||
|
|
||||||
|
# make clean; make install
|
||||||
|
|
||||||
|
!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!
|
||||||
|
For Red Hat 9, Red Hat Enterprise Linux AS3/ES3/WS3 & Fedora Core1:
|
||||||
|
# make clean; make installsp1
|
||||||
|
|
||||||
|
For Red Hat Enterprise Linux AS4/ES4/WS4:
|
||||||
|
# make clean; make installsp2
|
||||||
|
!!!!!!!!!! NOTE !!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
|
The driver files "mxser.o" and utilities will be properly compiled
|
||||||
|
and copied to system directories respectively.
|
||||||
|
|
||||||
|
------------- Load MOXA driver--------------------
|
||||||
|
3.4.3 Load the MOXA driver
|
||||||
|
|
||||||
|
# modprobe mxser <argument>
|
||||||
|
|
||||||
|
will activate the module driver. You may run "lsmod" to check
|
||||||
|
if "mxser" is activated. If the MOXA board is ISA board, the
|
||||||
|
<argument> is needed. Please refer to section "3.4.5" for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
|
||||||
|
------------- Load MOXA driver on boot --------------------
|
||||||
|
3.4.4 For the above description, you may manually execute
|
||||||
|
"modprobe mxser" to activate this driver and run
|
||||||
|
"rmmod mxser" to remove it.
|
||||||
|
However, it's better to have a boot time configuration to
|
||||||
|
eliminate manual operation. Boot time configuration can be
|
||||||
|
achieved by rc file. We offer one "rc.mxser" file to simplify
|
||||||
|
the procedure under "moxa/mxser/driver".
|
||||||
|
|
||||||
|
But if you use ISA board, please modify the "modprobe ..." command
|
||||||
|
to add the argument (see "3.4.5" section). After modifying the
|
||||||
|
rc.mxser, please try to execute "/moxa/mxser/driver/rc.mxser"
|
||||||
|
manually to make sure the modification is ok. If any error
|
||||||
|
encountered, please try to modify again. If the modification is
|
||||||
|
completed, follow the below step.
|
||||||
|
|
||||||
|
Run following command for setting rc files.
|
||||||
|
|
||||||
# cd /moxa/mxser/driver
|
# cd /moxa/mxser/driver
|
||||||
# cp ./rc.mxser /etc/rc.d
|
# cp ./rc.mxser /etc/rc.d
|
||||||
# cd /etc/rc.d
|
# cd /etc/rc.d
|
||||||
|
|
||||||
You may have to modify part of the content in rc.mxser to specify
|
Check "rc.serial" is existed or not. If "rc.serial" doesn't exist,
|
||||||
parameters for ISA board. Please refer to rc.mxser for more detail.
|
create it by vi, run "chmod 755 rc.serial" to change the permission.
|
||||||
Find "rc.serial". If "rc.serial" doesn't exist, create it by vi.
|
Add "/etc/rc.d/rc.mxser" in last line,
|
||||||
Add "rc.mxser" in last line. Next, open rc.local by vi
|
|
||||||
and append following content.
|
|
||||||
|
|
||||||
if [ -f /etc/rc.d/rc.serial ]; then
|
Reboot and check if moxa.o activated by "lsmod" command.
|
||||||
sh /etc/rc.d/rc.serial
|
|
||||||
fi
|
|
||||||
|
|
||||||
4. Reboot and check if mxser.o activated by "lsmod" command.
|
3.4.5. If you'd like to drive Smartio/Industio ISA boards in the system,
|
||||||
5. If you'd like to drive Smartio ISA boards in the system, you'll
|
you'll have to add parameter to specify CAP address of given
|
||||||
have to add parameter to specify CAP address of given board while
|
board while activating "mxser.o". The format for parameters are
|
||||||
activating "mxser.o". The format for parameters are as follows.
|
as follows.
|
||||||
|
|
||||||
insmod mxser ioaddr=0x???,0x???,0x???,0x???
|
modprobe mxser ioaddr=0x???,0x???,0x???,0x???
|
||||||
| | | |
|
| | | |
|
||||||
| | | +- 4th ISA board
|
| | | +- 4th ISA board
|
||||||
| | +------ 3rd ISA board
|
| | +------ 3rd ISA board
|
||||||
| +------------ 2nd ISA board
|
| +------------ 2nd ISA board
|
||||||
+------------------- 1st ISA board
|
+------------------- 1st ISA board
|
||||||
|
|
||||||
3.4 Static driver configuration
|
3.5 Static driver configuration for Linux kernel 2.4.x and 2.6.x
|
||||||
|
|
||||||
1. Create link
|
Note: To use static driver, you must install the linux kernel
|
||||||
|
source package.
|
||||||
|
|
||||||
|
3.5.1 Backup the built-in driver in the kernel.
|
||||||
|
# cd /usr/src/linux/drivers/char
|
||||||
|
# mv mxser.c mxser.c.old
|
||||||
|
|
||||||
|
For Red Hat 7.x user, you need to create link:
|
||||||
|
# cd /usr/src
|
||||||
|
# ln -s linux-2.4 linux
|
||||||
|
|
||||||
|
3.5.2 Create link
|
||||||
# cd /usr/src/linux/drivers/char
|
# cd /usr/src/linux/drivers/char
|
||||||
# ln -s /moxa/mxser/driver/mxser.c mxser.c
|
# ln -s /moxa/mxser/driver/mxser.c mxser.c
|
||||||
|
|
||||||
2. Add CAP address list for ISA boards
|
3.5.3 Add CAP address list for ISA boards. For PCI boards user,
|
||||||
|
please skip this step.
|
||||||
|
|
||||||
In module mode, the CAP address for ISA board is given by
|
In module mode, the CAP address for ISA board is given by
|
||||||
parameter. In static driver configuration, you'll have to
|
parameter. In static driver configuration, you'll have to
|
||||||
assign it within driver's source code. If you will not
|
assign it within driver's source code. If you will not
|
||||||
|
@ -222,73 +337,55 @@ Content
|
||||||
static int mxserBoardCAP[]
|
static int mxserBoardCAP[]
|
||||||
= {0x280, 0x180, 0x00, 0x00};
|
= {0x280, 0x180, 0x00, 0x00};
|
||||||
|
|
||||||
3. Modify tty_io.c
|
3.5.4 Setup kernel configuration
|
||||||
# cd /usr/src/linux/drivers/char/
|
|
||||||
# vi tty_io.c
|
|
||||||
Find pty_init(), insert "mxser_init()" as
|
|
||||||
|
|
||||||
pty_init();
|
Configure the kernel:
|
||||||
mxser_init();
|
|
||||||
|
|
||||||
4. Modify tty.h
|
# cd /usr/src/linux
|
||||||
# cd /usr/src/linux/include/linux
|
# make menuconfig
|
||||||
# vi tty.h
|
|
||||||
Find extern int tty_init(void), insert "mxser_init()" as
|
|
||||||
|
|
||||||
extern int tty_init(void);
|
You will go into a menu-driven system. Please select [Character
|
||||||
extern int mxser_init(void);
|
devices][Non-standard serial port support], enable the [Moxa
|
||||||
|
SmartIO support] driver with "[*]" for built-in (not "[M]"), then
|
||||||
5. Modify Makefile
|
select [Exit] to exit this program.
|
||||||
# cd /usr/src/linux/drivers/char
|
|
||||||
# vi Makefile
|
|
||||||
Find L_OBJS := tty_io.o ...... random.o, add
|
|
||||||
"mxser.o" at last of this line as
|
|
||||||
L_OBJS := tty_io.o ....... mxser.o
|
|
||||||
|
|
||||||
6. Rebuild kernel
|
3.5.5 Rebuild kernel
|
||||||
The following are for Linux kernel rebuilding,for your reference only.
|
The following are for Linux kernel rebuilding, for your
|
||||||
|
reference only.
|
||||||
For appropriate details, please refer to the Linux document.
|
For appropriate details, please refer to the Linux document.
|
||||||
|
|
||||||
If 'lilo' utility is installed, please use 'make zlilo' to rebuild
|
|
||||||
kernel. If 'lilo' is not installed, please follow the following steps.
|
|
||||||
|
|
||||||
a. cd /usr/src/linux
|
a. cd /usr/src/linux
|
||||||
b. make clean /* take a few minutes */
|
b. make clean /* take a few minutes */
|
||||||
c. make bzImage /* take probably 10-20 minutes */
|
c. make dep /* take a few minutes */
|
||||||
d. Backup original boot kernel. /* optional step */
|
d. make bzImage /* take probably 10-20 minutes */
|
||||||
e. cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz
|
e. make install /* copy boot image to correct position */
|
||||||
f. Please make sure the boot kernel (vmlinuz) is in the
|
f. Please make sure the boot kernel (vmlinuz) is in the
|
||||||
correct position. If you use 'lilo' utility, you should
|
correct position.
|
||||||
check /etc/lilo.conf 'image' item specified the path
|
g. If you use 'lilo' utility, you should check /etc/lilo.conf
|
||||||
which is the 'vmlinuz' path, or you will load wrong
|
'image' item specified the path which is the 'vmlinuz' path,
|
||||||
(or old) boot kernel image (vmlinuz).
|
or you will load wrong (or old) boot kernel image (vmlinuz).
|
||||||
g. chmod 400 /vmlinuz
|
After checking /etc/lilo.conf, please run "lilo".
|
||||||
h. lilo
|
|
||||||
i. rdev -R /vmlinuz 1
|
|
||||||
j. sync
|
|
||||||
|
|
||||||
Note that if the result of "make zImage" is ERROR, then you have to
|
Note that if the result of "make bzImage" is ERROR, then you have to
|
||||||
go back to Linux configuration Setup. Type "make config" in directory
|
go back to Linux configuration Setup. Type "make menuconfig" in
|
||||||
/usr/src/linux or "setup".
|
directory /usr/src/linux.
|
||||||
|
|
||||||
Since system include file, /usr/src/linux/include/linux/interrupt.h,
|
|
||||||
is modified each time the MOXA driver is installed, kernel rebuilding
|
|
||||||
is inevitable. And it takes about 10 to 20 minutes depends on the
|
|
||||||
machine.
|
|
||||||
|
|
||||||
7. Make utility
|
3.5.6 Make tty device and special file
|
||||||
# cd /moxa/mxser/utility
|
|
||||||
# make install
|
|
||||||
|
|
||||||
8. Make special file
|
|
||||||
# cd /moxa/mxser/driver
|
# cd /moxa/mxser/driver
|
||||||
# ./msmknod
|
# ./msmknod
|
||||||
|
|
||||||
9. Reboot
|
3.5.7 Make utility
|
||||||
|
# cd /moxa/mxser/utility
|
||||||
|
# make clean; make install
|
||||||
|
|
||||||
3.5 Custom configuration
|
3.5.8 Reboot
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
3.6 Custom configuration
|
||||||
Although this driver already provides you default configuration, you
|
Although this driver already provides you default configuration, you
|
||||||
still can change the device name and major number.The instruction to
|
still can change the device name and major number. The instruction to
|
||||||
change these parameters are shown as below.
|
change these parameters are shown as below.
|
||||||
|
|
||||||
Change Device name
|
Change Device name
|
||||||
|
@ -306,33 +403,37 @@ Content
|
||||||
2 free major numbers for this driver. There are 3 steps to change
|
2 free major numbers for this driver. There are 3 steps to change
|
||||||
major numbers.
|
major numbers.
|
||||||
|
|
||||||
1. Find free major numbers
|
3.6.1 Find free major numbers
|
||||||
In /proc/devices, you may find all the major numbers occupied
|
In /proc/devices, you may find all the major numbers occupied
|
||||||
in the system. Please select 2 major numbers that are available.
|
in the system. Please select 2 major numbers that are available.
|
||||||
e.g. 40, 45.
|
e.g. 40, 45.
|
||||||
2. Create special files
|
3.6.2 Create special files
|
||||||
Run /moxa/mxser/driver/msmknod to create special files with
|
Run /moxa/mxser/driver/msmknod to create special files with
|
||||||
specified major numbers.
|
specified major numbers.
|
||||||
3. Modify driver with new major number
|
3.6.3 Modify driver with new major number
|
||||||
Run vi to open /moxa/mxser/driver/mxser.c. Locate the line
|
Run vi to open /moxa/mxser/driver/mxser.c. Locate the line
|
||||||
contains "MXSERMAJOR". Change the content as below.
|
contains "MXSERMAJOR". Change the content as below.
|
||||||
#define MXSERMAJOR 40
|
#define MXSERMAJOR 40
|
||||||
#define MXSERCUMAJOR 45
|
#define MXSERCUMAJOR 45
|
||||||
4. Run # make install in /moxa/mxser/driver.
|
3.6.4 Run "make clean; make install" in /moxa/mxser/driver.
|
||||||
|
|
||||||
3.6 Verify driver installation
|
3.7 Verify driver installation
|
||||||
You may refer to /var/log/messages to check the latest status
|
You may refer to /var/log/messages to check the latest status
|
||||||
log reported by this driver whenever it's activated.
|
log reported by this driver whenever it's activated.
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
4. Utilities
|
4. Utilities
|
||||||
There are 3 utilities contained in this driver. They are msdiag, msmon and
|
There are 3 utilities contained in this driver. They are msdiag, msmon and
|
||||||
msterm. These 3 utilities are released in form of source code. They should
|
msterm. These 3 utilities are released in form of source code. They should
|
||||||
be compiled into executable file and copied into /usr/bin.
|
be compiled into executable file and copied into /usr/bin.
|
||||||
|
|
||||||
|
Before using these utilities, please load driver (refer 3.4 & 3.5) and
|
||||||
|
make sure you had run the "msmknod" utility.
|
||||||
|
|
||||||
msdiag - Diagnostic
|
msdiag - Diagnostic
|
||||||
--------------------
|
--------------------
|
||||||
This utility provides the function to detect what Moxa Smartio multiport
|
This utility provides the function to display what Moxa Smartio/Industio
|
||||||
board exists in the system.
|
board found by driver in the system.
|
||||||
|
|
||||||
msmon - Port Monitoring
|
msmon - Port Monitoring
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -353,12 +454,13 @@ Content
|
||||||
application, for example, sending AT command to a modem connected to the
|
application, for example, sending AT command to a modem connected to the
|
||||||
port or used as a terminal for login purpose. Note that this is only a
|
port or used as a terminal for login purpose. Note that this is only a
|
||||||
dumb terminal emulation without handling full screen operation.
|
dumb terminal emulation without handling full screen operation.
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
5. Setserial
|
5. Setserial
|
||||||
|
|
||||||
Supported Setserial parameters are listed as below.
|
Supported Setserial parameters are listed as below.
|
||||||
|
|
||||||
uart set UART type(16450-->disable FIFO, 16550A-->enable FIFO)
|
uart set UART type(16450-->disable FIFO, 16550A-->enable FIFO)
|
||||||
close_delay set the amount of time(in 1/100 of a second) that DTR
|
close_delay set the amount of time(in 1/100 of a second) that DTR
|
||||||
should be kept low while being closed.
|
should be kept low while being closed.
|
||||||
closing_wait set the amount of time(in 1/100 of a second) that the
|
closing_wait set the amount of time(in 1/100 of a second) that the
|
||||||
|
@ -366,7 +468,13 @@ Content
|
||||||
being closed, before the receiver is disable.
|
being closed, before the receiver is disable.
|
||||||
spd_hi Use 57.6kb when the application requests 38.4kb.
|
spd_hi Use 57.6kb when the application requests 38.4kb.
|
||||||
spd_vhi Use 115.2kb when the application requests 38.4kb.
|
spd_vhi Use 115.2kb when the application requests 38.4kb.
|
||||||
|
spd_shi Use 230.4kb when the application requests 38.4kb.
|
||||||
|
spd_warp Use 460.8kb when the application requests 38.4kb.
|
||||||
spd_normal Use 38.4kb when the application requests 38.4kb.
|
spd_normal Use 38.4kb when the application requests 38.4kb.
|
||||||
|
spd_cust Use the custom divisor to set the speed when the
|
||||||
|
application requests 38.4kb.
|
||||||
|
divisor This option set the custom divison.
|
||||||
|
baud_base This option set the base baud rate.
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
6. Troubleshooting
|
6. Troubleshooting
|
||||||
|
@ -375,8 +483,9 @@ Content
|
||||||
possible. If all the possible solutions fail, please contact our technical
|
possible. If all the possible solutions fail, please contact our technical
|
||||||
support team to get more help.
|
support team to get more help.
|
||||||
|
|
||||||
Error msg: More than 4 Moxa Smartio family boards found. Fifth board and
|
|
||||||
after are ignored.
|
Error msg: More than 4 Moxa Smartio/Industio family boards found. Fifth board
|
||||||
|
and after are ignored.
|
||||||
Solution:
|
Solution:
|
||||||
To avoid this problem, please unplug fifth and after board, because Moxa
|
To avoid this problem, please unplug fifth and after board, because Moxa
|
||||||
driver supports up to 4 boards.
|
driver supports up to 4 boards.
|
||||||
|
@ -384,7 +493,7 @@ Content
|
||||||
Error msg: Request_irq fail, IRQ(?) may be conflict with another device.
|
Error msg: Request_irq fail, IRQ(?) may be conflict with another device.
|
||||||
Solution:
|
Solution:
|
||||||
Other PCI or ISA devices occupy the assigned IRQ. If you are not sure
|
Other PCI or ISA devices occupy the assigned IRQ. If you are not sure
|
||||||
which device causes the situation,please check /proc/interrupts to find
|
which device causes the situation, please check /proc/interrupts to find
|
||||||
free IRQ and simply change another free IRQ for Moxa board.
|
free IRQ and simply change another free IRQ for Moxa board.
|
||||||
|
|
||||||
Error msg: Board #: C1xx Series(CAP=xxx) interrupt number invalid.
|
Error msg: Board #: C1xx Series(CAP=xxx) interrupt number invalid.
|
||||||
|
@ -397,15 +506,18 @@ Content
|
||||||
Moxa ISA board needs an interrupt vector.Please refer to user's manual
|
Moxa ISA board needs an interrupt vector.Please refer to user's manual
|
||||||
"Hardware Installation" chapter to set interrupt vector.
|
"Hardware Installation" chapter to set interrupt vector.
|
||||||
|
|
||||||
Error msg: Couldn't install MOXA Smartio family driver!
|
Error msg: Couldn't install MOXA Smartio/Industio family driver!
|
||||||
Solution:
|
Solution:
|
||||||
Load Moxa driver fail, the major number may conflict with other devices.
|
Load Moxa driver fail, the major number may conflict with other devices.
|
||||||
Please refer to previous section 3.5 to change a free major number for
|
Please refer to previous section 3.7 to change a free major number for
|
||||||
Moxa driver.
|
Moxa driver.
|
||||||
|
|
||||||
Error msg: Couldn't install MOXA Smartio family callout driver!
|
Error msg: Couldn't install MOXA Smartio/Industio family callout driver!
|
||||||
Solution:
|
Solution:
|
||||||
Load Moxa callout driver fail, the callout device major number may
|
Load Moxa callout driver fail, the callout device major number may
|
||||||
conflict with other devices. Please refer to previous section 3.5 to
|
conflict with other devices. Please refer to previous section 3.7 to
|
||||||
change a free callout device major number for Moxa driver.
|
change a free callout device major number for Moxa driver.
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -289,35 +289,73 @@ downdelay
|
||||||
fail_over_mac
|
fail_over_mac
|
||||||
|
|
||||||
Specifies whether active-backup mode should set all slaves to
|
Specifies whether active-backup mode should set all slaves to
|
||||||
the same MAC address (the traditional behavior), or, when
|
the same MAC address at enslavement (the traditional
|
||||||
enabled, change the bond's MAC address when changing the
|
behavior), or, when enabled, perform special handling of the
|
||||||
active interface (i.e., fail over the MAC address itself).
|
bond's MAC address in accordance with the selected policy.
|
||||||
|
|
||||||
Fail over MAC is useful for devices that cannot ever alter
|
Possible values are:
|
||||||
their MAC address, or for devices that refuse incoming
|
|
||||||
broadcasts with their own source MAC (which interferes with
|
|
||||||
the ARP monitor).
|
|
||||||
|
|
||||||
The down side of fail over MAC is that every device on the
|
none or 0
|
||||||
network must be updated via gratuitous ARP, vs. just updating
|
|
||||||
a switch or set of switches (which often takes place for any
|
|
||||||
traffic, not just ARP traffic, if the switch snoops incoming
|
|
||||||
traffic to update its tables) for the traditional method. If
|
|
||||||
the gratuitous ARP is lost, communication may be disrupted.
|
|
||||||
|
|
||||||
When fail over MAC is used in conjuction with the mii monitor,
|
This setting disables fail_over_mac, and causes
|
||||||
devices which assert link up prior to being able to actually
|
bonding to set all slaves of an active-backup bond to
|
||||||
transmit and receive are particularly susecptible to loss of
|
the same MAC address at enslavement time. This is the
|
||||||
the gratuitous ARP, and an appropriate updelay setting may be
|
default.
|
||||||
required.
|
|
||||||
|
|
||||||
A value of 0 disables fail over MAC, and is the default. A
|
active or 1
|
||||||
value of 1 enables fail over MAC. This option is enabled
|
|
||||||
automatically if the first slave added cannot change its MAC
|
|
||||||
address. This option may be modified via sysfs only when no
|
|
||||||
slaves are present in the bond.
|
|
||||||
|
|
||||||
This option was added in bonding version 3.2.0.
|
The "active" fail_over_mac policy indicates that the
|
||||||
|
MAC address of the bond should always be the MAC
|
||||||
|
address of the currently active slave. The MAC
|
||||||
|
address of the slaves is not changed; instead, the MAC
|
||||||
|
address of the bond changes during a failover.
|
||||||
|
|
||||||
|
This policy is useful for devices that cannot ever
|
||||||
|
alter their MAC address, or for devices that refuse
|
||||||
|
incoming broadcasts with their own source MAC (which
|
||||||
|
interferes with the ARP monitor).
|
||||||
|
|
||||||
|
The down side of this policy is that every device on
|
||||||
|
the network must be updated via gratuitous ARP,
|
||||||
|
vs. just updating a switch or set of switches (which
|
||||||
|
often takes place for any traffic, not just ARP
|
||||||
|
traffic, if the switch snoops incoming traffic to
|
||||||
|
update its tables) for the traditional method. If the
|
||||||
|
gratuitous ARP is lost, communication may be
|
||||||
|
disrupted.
|
||||||
|
|
||||||
|
When this policy is used in conjuction with the mii
|
||||||
|
monitor, devices which assert link up prior to being
|
||||||
|
able to actually transmit and receive are particularly
|
||||||
|
susecptible to loss of the gratuitous ARP, and an
|
||||||
|
appropriate updelay setting may be required.
|
||||||
|
|
||||||
|
follow or 2
|
||||||
|
|
||||||
|
The "follow" fail_over_mac policy causes the MAC
|
||||||
|
address of the bond to be selected normally (normally
|
||||||
|
the MAC address of the first slave added to the bond).
|
||||||
|
However, the second and subsequent slaves are not set
|
||||||
|
to this MAC address while they are in a backup role; a
|
||||||
|
slave is programmed with the bond's MAC address at
|
||||||
|
failover time (and the formerly active slave receives
|
||||||
|
the newly active slave's MAC address).
|
||||||
|
|
||||||
|
This policy is useful for multiport devices that
|
||||||
|
either become confused or incur a performance penalty
|
||||||
|
when multiple ports are programmed with the same MAC
|
||||||
|
address.
|
||||||
|
|
||||||
|
|
||||||
|
The default policy is none, unless the first slave cannot
|
||||||
|
change its MAC address, in which case the active policy is
|
||||||
|
selected by default.
|
||||||
|
|
||||||
|
This option may be modified via sysfs only when no slaves are
|
||||||
|
present in the bond.
|
||||||
|
|
||||||
|
This option was added in bonding version 3.2.0. The "follow"
|
||||||
|
policy was added in bonding version 3.3.0.
|
||||||
|
|
||||||
lacp_rate
|
lacp_rate
|
||||||
|
|
||||||
|
@ -338,7 +376,8 @@ max_bonds
|
||||||
Specifies the number of bonding devices to create for this
|
Specifies the number of bonding devices to create for this
|
||||||
instance of the bonding driver. E.g., if max_bonds is 3, and
|
instance of the bonding driver. E.g., if max_bonds is 3, and
|
||||||
the bonding driver is not already loaded, then bond0, bond1
|
the bonding driver is not already loaded, then bond0, bond1
|
||||||
and bond2 will be created. The default value is 1.
|
and bond2 will be created. The default value is 1. Specifying
|
||||||
|
a value of 0 will load bonding, but will not create any devices.
|
||||||
|
|
||||||
miimon
|
miimon
|
||||||
|
|
||||||
|
@ -501,6 +540,17 @@ mode
|
||||||
swapped with the new curr_active_slave that was
|
swapped with the new curr_active_slave that was
|
||||||
chosen.
|
chosen.
|
||||||
|
|
||||||
|
num_grat_arp
|
||||||
|
|
||||||
|
Specifies the number of gratuitous ARPs to be issued after a
|
||||||
|
failover event. One gratuitous ARP is issued immediately after
|
||||||
|
the failover, subsequent ARPs are sent at a rate of one per link
|
||||||
|
monitor interval (arp_interval or miimon, whichever is active).
|
||||||
|
|
||||||
|
The valid range is 0 - 255; the default value is 1. This option
|
||||||
|
affects only the active-backup mode. This option was added for
|
||||||
|
bonding version 3.3.0.
|
||||||
|
|
||||||
primary
|
primary
|
||||||
|
|
||||||
A string (eth0, eth2, etc) specifying which slave is the
|
A string (eth0, eth2, etc) specifying which slave is the
|
||||||
|
@ -581,7 +631,7 @@ xmit_hash_policy
|
||||||
in environments where a layer3 gateway device is
|
in environments where a layer3 gateway device is
|
||||||
required to reach most destinations.
|
required to reach most destinations.
|
||||||
|
|
||||||
This algorithm is 802.3ad complient.
|
This algorithm is 802.3ad compliant.
|
||||||
|
|
||||||
layer3+4
|
layer3+4
|
||||||
|
|
||||||
|
|
|
@ -186,7 +186,7 @@ solution for a couple of reasons:
|
||||||
|
|
||||||
The Linux network devices (by default) just can handle the
|
The Linux network devices (by default) just can handle the
|
||||||
transmission and reception of media dependent frames. Due to the
|
transmission and reception of media dependent frames. Due to the
|
||||||
arbritration on the CAN bus the transmission of a low prio CAN-ID
|
arbitration on the CAN bus the transmission of a low prio CAN-ID
|
||||||
may be delayed by the reception of a high prio CAN frame. To
|
may be delayed by the reception of a high prio CAN frame. To
|
||||||
reflect the correct* traffic on the node the loopback of the sent
|
reflect the correct* traffic on the node the loopback of the sent
|
||||||
data has to be performed right after a successful transmission. If
|
data has to be performed right after a successful transmission. If
|
||||||
|
@ -481,7 +481,7 @@ solution for a couple of reasons:
|
||||||
- stats_timer: To calculate the Socket CAN core statistics
|
- stats_timer: To calculate the Socket CAN core statistics
|
||||||
(e.g. current/maximum frames per second) this 1 second timer is
|
(e.g. current/maximum frames per second) this 1 second timer is
|
||||||
invoked at can.ko module start time by default. This timer can be
|
invoked at can.ko module start time by default. This timer can be
|
||||||
disabled by using stattimer=0 on the module comandline.
|
disabled by using stattimer=0 on the module commandline.
|
||||||
|
|
||||||
- debug: (removed since SocketCAN SVN r546)
|
- debug: (removed since SocketCAN SVN r546)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,167 @@
|
||||||
|
DM9000 Network driver
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Copyright 2008 Simtec Electronics,
|
||||||
|
Ben Dooks <ben@simtec.co.uk> <ben-linux@fluff.org>
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
This file describes how to use the DM9000 platform-device based network driver
|
||||||
|
that is contained in the files drivers/net/dm9000.c and drivers/net/dm9000.h.
|
||||||
|
|
||||||
|
The driver supports three DM9000 variants, the DM9000E which is the first chip
|
||||||
|
supported as well as the newer DM9000A and DM9000B devices. It is currently
|
||||||
|
maintained and tested by Ben Dooks, who should be CC: to any patches for this
|
||||||
|
driver.
|
||||||
|
|
||||||
|
|
||||||
|
Defining the platform device
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
The minimum set of resources attached to the platform device are as follows:
|
||||||
|
|
||||||
|
1) The physical address of the address register
|
||||||
|
2) The physical address of the data register
|
||||||
|
3) The IRQ line the device's interrupt pin is connected to.
|
||||||
|
|
||||||
|
These resources should be specified in that order, as the ordering of the
|
||||||
|
two address regions is important (the driver expects these to be address
|
||||||
|
and then data).
|
||||||
|
|
||||||
|
An example from arch/arm/mach-s3c2410/mach-bast.c is:
|
||||||
|
|
||||||
|
static struct resource bast_dm9k_resource[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = S3C2410_CS5 + BAST_PA_DM9000,
|
||||||
|
.end = S3C2410_CS5 + BAST_PA_DM9000 + 3,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
|
||||||
|
.end = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = IRQ_DM9000,
|
||||||
|
.end = IRQ_DM9000,
|
||||||
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bast_device_dm9k = {
|
||||||
|
.name = "dm9000",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
|
||||||
|
.resource = bast_dm9k_resource,
|
||||||
|
};
|
||||||
|
|
||||||
|
Note the setting of the IRQ trigger flag in bast_dm9k_resource[2].flags,
|
||||||
|
as this will generate a warning if it is not present. The trigger from
|
||||||
|
the flags field will be passed to request_irq() when registering the IRQ
|
||||||
|
handler to ensure that the IRQ is setup correctly.
|
||||||
|
|
||||||
|
This shows a typical platform device, without the optional configuration
|
||||||
|
platform data supplied. The next example uses the same resources, but adds
|
||||||
|
the optional platform data to pass extra configuration data:
|
||||||
|
|
||||||
|
static struct dm9000_plat_data bast_dm9k_platdata = {
|
||||||
|
.flags = DM9000_PLATF_16BITONLY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device bast_device_dm9k = {
|
||||||
|
.name = "dm9000",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
|
||||||
|
.resource = bast_dm9k_resource,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &bast_dm9k_platdata,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
The platform data is defined in include/linux/dm9000.h and described below.
|
||||||
|
|
||||||
|
|
||||||
|
Platform data
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Extra platform data for the DM9000 can describe the IO bus width to the
|
||||||
|
device, whether or not an external PHY is attached to the device and
|
||||||
|
the availability of an external configuration EEPROM.
|
||||||
|
|
||||||
|
The flags for the platform data .flags field are as follows:
|
||||||
|
|
||||||
|
DM9000_PLATF_8BITONLY
|
||||||
|
|
||||||
|
The IO should be done with 8bit operations.
|
||||||
|
|
||||||
|
DM9000_PLATF_16BITONLY
|
||||||
|
|
||||||
|
The IO should be done with 16bit operations.
|
||||||
|
|
||||||
|
DM9000_PLATF_32BITONLY
|
||||||
|
|
||||||
|
The IO should be done with 32bit operations.
|
||||||
|
|
||||||
|
DM9000_PLATF_EXT_PHY
|
||||||
|
|
||||||
|
The chip is connected to an external PHY.
|
||||||
|
|
||||||
|
DM9000_PLATF_NO_EEPROM
|
||||||
|
|
||||||
|
This can be used to signify that the board does not have an
|
||||||
|
EEPROM, or that the EEPROM should be hidden from the user.
|
||||||
|
|
||||||
|
DM9000_PLATF_SIMPLE_PHY
|
||||||
|
|
||||||
|
Switch to using the simpler PHY polling method which does not
|
||||||
|
try and read the MII PHY state regularly. This is only available
|
||||||
|
when using the internal PHY. See the section on link state polling
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
The config symbol DM9000_FORCE_SIMPLE_PHY_POLL, Kconfig entry
|
||||||
|
"Force simple NSR based PHY polling" allows this flag to be
|
||||||
|
forced on at build time.
|
||||||
|
|
||||||
|
|
||||||
|
PHY Link state polling
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The driver keeps track of the link state and informs the network core
|
||||||
|
about link (carrier) availablilty. This is managed by several methods
|
||||||
|
depending on the version of the chip and on which PHY is being used.
|
||||||
|
|
||||||
|
For the internal PHY, the original (and currently default) method is
|
||||||
|
to read the MII state, either when the status changes if we have the
|
||||||
|
necessary interrupt support in the chip or every two seconds via a
|
||||||
|
periodic timer.
|
||||||
|
|
||||||
|
To reduce the overhead for the internal PHY, there is now the option
|
||||||
|
of using the DM9000_FORCE_SIMPLE_PHY_POLL config, or DM9000_PLATF_SIMPLE_PHY
|
||||||
|
platform data option to read the summary information without the
|
||||||
|
expensive MII accesses. This method is faster, but does not print
|
||||||
|
as much information.
|
||||||
|
|
||||||
|
When using an external PHY, the driver currently has to poll the MII
|
||||||
|
link status as there is no method for getting an interrupt on link change.
|
||||||
|
|
||||||
|
|
||||||
|
DM9000A / DM9000B
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
These chips are functionally similar to the DM9000E and are supported easily
|
||||||
|
by the same driver. The features are:
|
||||||
|
|
||||||
|
1) Interrupt on internal PHY state change. This means that the periodic
|
||||||
|
polling of the PHY status may be disabled on these devices when using
|
||||||
|
the internal PHY.
|
||||||
|
|
||||||
|
2) TCP/UDP checksum offloading, which the driver does not currently support.
|
||||||
|
|
||||||
|
|
||||||
|
ethtool
|
||||||
|
-------
|
||||||
|
|
||||||
|
The driver supports the ethtool interface for access to the driver
|
||||||
|
state information, the PHY state and the EEPROM.
|
|
@ -513,21 +513,11 @@ Additional Configurations
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Connection
|
Intel(R) PRO/1000 PT Dual Port Server Connection
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
||||||
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
||||||
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
||||||
|
|
||||||
NAPI
|
NAPI
|
||||||
----
|
----
|
||||||
NAPI (Rx polling mode) is supported in the e1000 driver. NAPI is enabled
|
NAPI (Rx polling mode) is enabled in the e1000 driver.
|
||||||
or disabled based on the configuration of the kernel. To override
|
|
||||||
the default, use the following compile-time flags.
|
|
||||||
|
|
||||||
To enable NAPI, compile the driver module, passing in a configuration option:
|
|
||||||
|
|
||||||
make CFLAGS_EXTRA=-DE1000_NAPI install
|
|
||||||
|
|
||||||
To disable NAPI, compile the driver module, passing in a configuration option:
|
|
||||||
|
|
||||||
make CFLAGS_EXTRA=-DE1000_NO_NAPI install
|
|
||||||
|
|
||||||
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
||||||
|
|
||||||
|
|
|
@ -551,8 +551,9 @@ icmp_echo_ignore_broadcasts - BOOLEAN
|
||||||
icmp_ratelimit - INTEGER
|
icmp_ratelimit - INTEGER
|
||||||
Limit the maximal rates for sending ICMP packets whose type matches
|
Limit the maximal rates for sending ICMP packets whose type matches
|
||||||
icmp_ratemask (see below) to specific targets.
|
icmp_ratemask (see below) to specific targets.
|
||||||
0 to disable any limiting, otherwise the maximal rate in jiffies(1)
|
0 to disable any limiting,
|
||||||
Default: 100
|
otherwise the minimal space between responses in milliseconds.
|
||||||
|
Default: 1000
|
||||||
|
|
||||||
icmp_ratemask - INTEGER
|
icmp_ratemask - INTEGER
|
||||||
Mask made of ICMP types for which rates are being limited.
|
Mask made of ICMP types for which rates are being limited.
|
||||||
|
@ -1023,11 +1024,23 @@ max_addresses - INTEGER
|
||||||
autoconfigured addresses.
|
autoconfigured addresses.
|
||||||
Default: 16
|
Default: 16
|
||||||
|
|
||||||
|
disable_ipv6 - BOOLEAN
|
||||||
|
Disable IPv6 operation.
|
||||||
|
Default: FALSE (enable IPv6 operation)
|
||||||
|
|
||||||
|
accept_dad - INTEGER
|
||||||
|
Whether to accept DAD (Duplicate Address Detection).
|
||||||
|
0: Disable DAD
|
||||||
|
1: Enable DAD (default)
|
||||||
|
2: Enable DAD, and disable IPv6 operation if MAC-based duplicate
|
||||||
|
link-local address has been found.
|
||||||
|
|
||||||
icmp/*:
|
icmp/*:
|
||||||
ratelimit - INTEGER
|
ratelimit - INTEGER
|
||||||
Limit the maximal rates for sending ICMPv6 packets.
|
Limit the maximal rates for sending ICMPv6 packets.
|
||||||
0 to disable any limiting, otherwise the maximal rate in jiffies(1)
|
0 to disable any limiting,
|
||||||
Default: 100
|
otherwise the minimal space between responses in milliseconds.
|
||||||
|
Default: 1000
|
||||||
|
|
||||||
|
|
||||||
IPv6 Update by:
|
IPv6 Update by:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Linux* Base Driver for the Intel(R) PRO/10GbE Family of Adapters
|
Linux Base Driver for 10 Gigabit Intel(R) Network Connection
|
||||||
================================================================
|
=============================================================
|
||||||
|
|
||||||
November 17, 2004
|
October 9, 2007
|
||||||
|
|
||||||
|
|
||||||
Contents
|
Contents
|
||||||
|
@ -9,94 +9,151 @@ Contents
|
||||||
|
|
||||||
- In This Release
|
- In This Release
|
||||||
- Identifying Your Adapter
|
- Identifying Your Adapter
|
||||||
|
- Building and Installation
|
||||||
- Command Line Parameters
|
- Command Line Parameters
|
||||||
- Improving Performance
|
- Improving Performance
|
||||||
|
- Additional Configurations
|
||||||
|
- Known Issues/Troubleshooting
|
||||||
- Support
|
- Support
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
In This Release
|
In This Release
|
||||||
===============
|
===============
|
||||||
|
|
||||||
This file describes the Linux* Base Driver for the Intel(R) PRO/10GbE Family
|
This file describes the ixgb Linux Base Driver for the 10 Gigabit Intel(R)
|
||||||
of Adapters, version 1.0.x.
|
Network Connection. This driver includes support for Itanium(R)2-based
|
||||||
|
systems.
|
||||||
|
|
||||||
|
For questions related to hardware requirements, refer to the documentation
|
||||||
|
supplied with your 10 Gigabit adapter. All hardware requirements listed apply
|
||||||
|
to use with Linux.
|
||||||
|
|
||||||
|
The following features are available in this kernel:
|
||||||
|
- Native VLANs
|
||||||
|
- Channel Bonding (teaming)
|
||||||
|
- SNMP
|
||||||
|
|
||||||
|
Channel Bonding documentation can be found in the Linux kernel source:
|
||||||
|
/Documentation/networking/bonding.txt
|
||||||
|
|
||||||
|
The driver information previously displayed in the /proc filesystem is not
|
||||||
|
supported in this release. Alternatively, you can use ethtool (version 1.6
|
||||||
|
or later), lspci, and ifconfig to obtain the same information.
|
||||||
|
|
||||||
|
Instructions on updating ethtool can be found in the section "Additional
|
||||||
|
Configurations" later in this document.
|
||||||
|
|
||||||
For questions related to hardware requirements, refer to the documentation
|
|
||||||
supplied with your Intel PRO/10GbE adapter. All hardware requirements listed
|
|
||||||
apply to use with Linux.
|
|
||||||
|
|
||||||
Identifying Your Adapter
|
Identifying Your Adapter
|
||||||
========================
|
========================
|
||||||
|
|
||||||
To verify your Intel adapter is supported, find the board ID number on the
|
The following Intel network adapters are compatible with the drivers in this
|
||||||
adapter. Look for a label that has a barcode and a number in the format
|
release:
|
||||||
A12345-001.
|
|
||||||
|
|
||||||
Use the above information and the Adapter & Driver ID Guide at:
|
Controller Adapter Name Physical Layer
|
||||||
|
---------- ------------ --------------
|
||||||
|
82597EX Intel(R) PRO/10GbE LR/SR/CX4 10G Base-LR (1310 nm optical fiber)
|
||||||
|
Server Adapters 10G Base-SR (850 nm optical fiber)
|
||||||
|
10G Base-CX4(twin-axial copper cabling)
|
||||||
|
|
||||||
http://support.intel.com/support/network/adapter/pro100/21397.htm
|
For more information on how to identify your adapter, go to the Adapter &
|
||||||
|
Driver ID Guide at:
|
||||||
|
|
||||||
For the latest Intel network drivers for Linux, go to:
|
http://support.intel.com/support/network/sb/CS-012904.htm
|
||||||
|
|
||||||
|
|
||||||
|
Building and Installation
|
||||||
|
=========================
|
||||||
|
|
||||||
|
select m for "Intel(R) PRO/10GbE support" located at:
|
||||||
|
Location:
|
||||||
|
-> Device Drivers
|
||||||
|
-> Network device support (NETDEVICES [=y])
|
||||||
|
-> Ethernet (10000 Mbit) (NETDEV_10000 [=y])
|
||||||
|
1. make modules && make modules_install
|
||||||
|
|
||||||
|
2. Load the module:
|
||||||
|
|
||||||
|
modprobe ixgb <parameter>=<value>
|
||||||
|
|
||||||
|
The insmod command can be used if the full
|
||||||
|
path to the driver module is specified. For example:
|
||||||
|
|
||||||
|
insmod /lib/modules/<KERNEL VERSION>/kernel/drivers/net/ixgb/ixgb.ko
|
||||||
|
|
||||||
|
With 2.6 based kernels also make sure that older ixgb drivers are
|
||||||
|
removed from the kernel, before loading the new module:
|
||||||
|
|
||||||
|
rmmod ixgb; modprobe ixgb
|
||||||
|
|
||||||
|
3. Assign an IP address to the interface by entering the following, where
|
||||||
|
x is the interface number:
|
||||||
|
|
||||||
|
ifconfig ethx <IP_address>
|
||||||
|
|
||||||
|
4. Verify that the interface works. Enter the following, where <IP_address>
|
||||||
|
is the IP address for another machine on the same subnet as the interface
|
||||||
|
that is being tested:
|
||||||
|
|
||||||
|
ping <IP_address>
|
||||||
|
|
||||||
http://downloadfinder.intel.com/scripts-df/support_intel.asp
|
|
||||||
|
|
||||||
Command Line Parameters
|
Command Line Parameters
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
If the driver is built as a module, the following optional parameters are
|
If the driver is built as a module, the following optional parameters are
|
||||||
used by entering them on the command line with the modprobe or insmod command
|
used by entering them on the command line with the modprobe command using
|
||||||
using this syntax:
|
this syntax:
|
||||||
|
|
||||||
modprobe ixgb [<option>=<VAL1>,<VAL2>,...]
|
modprobe ixgb [<option>=<VAL1>,<VAL2>,...]
|
||||||
|
|
||||||
insmod ixgb [<option>=<VAL1>,<VAL2>,...]
|
For example, with two 10GbE PCI adapters, entering:
|
||||||
|
|
||||||
For example, with two PRO/10GbE PCI adapters, entering:
|
modprobe ixgb TxDescriptors=80,128
|
||||||
|
|
||||||
insmod ixgb TxDescriptors=80,128
|
loads the ixgb driver with 80 TX resources for the first adapter and 128 TX
|
||||||
|
|
||||||
loads the ixgb driver with 80 TX resources for the first adapter and 128 TX
|
|
||||||
resources for the second adapter.
|
resources for the second adapter.
|
||||||
|
|
||||||
The default value for each parameter is generally the recommended setting,
|
The default value for each parameter is generally the recommended setting,
|
||||||
unless otherwise noted. Also, if the driver is statically built into the
|
unless otherwise noted.
|
||||||
kernel, the driver is loaded with the default values for all the parameters.
|
|
||||||
Ethtool can be used to change some of the parameters at runtime.
|
|
||||||
|
|
||||||
FlowControl
|
FlowControl
|
||||||
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
|
||||||
Default: Read from the EEPROM
|
Default: Read from the EEPROM
|
||||||
If EEPROM is not detected, default is 3
|
If EEPROM is not detected, default is 1
|
||||||
This parameter controls the automatic generation(Tx) and response(Rx) to
|
This parameter controls the automatic generation(Tx) and response(Rx) to
|
||||||
Ethernet PAUSE frames.
|
Ethernet PAUSE frames. There are hardware bugs associated with enabling
|
||||||
|
Tx flow control so beware.
|
||||||
|
|
||||||
RxDescriptors
|
RxDescriptors
|
||||||
Valid Range: 64-512
|
Valid Range: 64-512
|
||||||
Default Value: 512
|
Default Value: 512
|
||||||
This value is the number of receive descriptors allocated by the driver.
|
This value is the number of receive descriptors allocated by the driver.
|
||||||
Increasing this value allows the driver to buffer more incoming packets.
|
Increasing this value allows the driver to buffer more incoming packets.
|
||||||
Each descriptor is 16 bytes. A receive buffer is also allocated for
|
Each descriptor is 16 bytes. A receive buffer is also allocated for
|
||||||
each descriptor and can be either 2048, 4056, 8192, or 16384 bytes,
|
each descriptor and can be either 2048, 4056, 8192, or 16384 bytes,
|
||||||
depending on the MTU setting. When the MTU size is 1500 or less, the
|
depending on the MTU setting. When the MTU size is 1500 or less, the
|
||||||
receive buffer size is 2048 bytes. When the MTU is greater than 1500 the
|
receive buffer size is 2048 bytes. When the MTU is greater than 1500 the
|
||||||
receive buffer size will be either 4056, 8192, or 16384 bytes. The
|
receive buffer size will be either 4056, 8192, or 16384 bytes. The
|
||||||
maximum MTU size is 16114.
|
maximum MTU size is 16114.
|
||||||
|
|
||||||
RxIntDelay
|
RxIntDelay
|
||||||
Valid Range: 0-65535 (0=off)
|
Valid Range: 0-65535 (0=off)
|
||||||
Default Value: 6
|
Default Value: 72
|
||||||
This value delays the generation of receive interrupts in units of
|
This value delays the generation of receive interrupts in units of
|
||||||
0.8192 microseconds. Receive interrupt reduction can improve CPU
|
0.8192 microseconds. Receive interrupt reduction can improve CPU
|
||||||
efficiency if properly tuned for specific network traffic. Increasing
|
efficiency if properly tuned for specific network traffic. Increasing
|
||||||
this value adds extra latency to frame reception and can end up
|
this value adds extra latency to frame reception and can end up
|
||||||
decreasing the throughput of TCP traffic. If the system is reporting
|
decreasing the throughput of TCP traffic. If the system is reporting
|
||||||
dropped receives, this value may be set too high, causing the driver to
|
dropped receives, this value may be set too high, causing the driver to
|
||||||
run out of available receive descriptors.
|
run out of available receive descriptors.
|
||||||
|
|
||||||
TxDescriptors
|
TxDescriptors
|
||||||
Valid Range: 64-4096
|
Valid Range: 64-4096
|
||||||
Default Value: 256
|
Default Value: 256
|
||||||
This value is the number of transmit descriptors allocated by the driver.
|
This value is the number of transmit descriptors allocated by the driver.
|
||||||
Increasing this value allows the driver to queue more transmits. Each
|
Increasing this value allows the driver to queue more transmits. Each
|
||||||
descriptor is 16 bytes.
|
descriptor is 16 bytes.
|
||||||
|
|
||||||
XsumRX
|
XsumRX
|
||||||
|
@ -105,51 +162,49 @@ Default Value: 1
|
||||||
A value of '1' indicates that the driver should enable IP checksum
|
A value of '1' indicates that the driver should enable IP checksum
|
||||||
offload for received packets (both UDP and TCP) to the adapter hardware.
|
offload for received packets (both UDP and TCP) to the adapter hardware.
|
||||||
|
|
||||||
XsumTX
|
|
||||||
Valid Range: 0-1
|
|
||||||
Default Value: 1
|
|
||||||
A value of '1' indicates that the driver should enable IP checksum
|
|
||||||
offload for transmitted packets (both UDP and TCP) to the adapter
|
|
||||||
hardware.
|
|
||||||
|
|
||||||
Improving Performance
|
Improving Performance
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
With the Intel PRO/10 GbE adapter, the default Linux configuration will very
|
With the 10 Gigabit server adapters, the default Linux configuration will
|
||||||
likely limit the total available throughput artificially. There is a set of
|
very likely limit the total available throughput artificially. There is a set
|
||||||
things that when applied together increase the ability of Linux to transmit
|
of configuration changes that, when applied together, will increase the ability
|
||||||
and receive data. The following enhancements were originally acquired from
|
of Linux to transmit and receive data. The following enhancements were
|
||||||
settings published at http://www.spec.org/web99 for various submitted results
|
originally acquired from settings published at http://www.spec.org/web99/ for
|
||||||
using Linux.
|
various submitted results using Linux.
|
||||||
|
|
||||||
NOTE: These changes are only suggestions, and serve as a starting point for
|
NOTE: These changes are only suggestions, and serve as a starting point for
|
||||||
tuning your network performance.
|
tuning your network performance.
|
||||||
|
|
||||||
The changes are made in three major ways, listed in order of greatest effect:
|
The changes are made in three major ways, listed in order of greatest effect:
|
||||||
- Use ifconfig to modify the mtu (maximum transmission unit) and the txqueuelen
|
- Use ifconfig to modify the mtu (maximum transmission unit) and the txqueuelen
|
||||||
parameter.
|
parameter.
|
||||||
- Use sysctl to modify /proc parameters (essentially kernel tuning)
|
- Use sysctl to modify /proc parameters (essentially kernel tuning)
|
||||||
- Use setpci to modify the MMRBC field in PCI-X configuration space to increase
|
- Use setpci to modify the MMRBC field in PCI-X configuration space to increase
|
||||||
transmit burst lengths on the bus.
|
transmit burst lengths on the bus.
|
||||||
|
|
||||||
NOTE: setpci modifies the adapter's configuration registers to allow it to read
|
NOTE: setpci modifies the adapter's configuration registers to allow it to read
|
||||||
up to 4k bytes at a time (for transmits). However, for some systems the
|
up to 4k bytes at a time (for transmits). However, for some systems the
|
||||||
behavior after modifying this register may be undefined (possibly errors of some
|
behavior after modifying this register may be undefined (possibly errors of
|
||||||
kind). A power-cycle, hard reset or explicitly setting the e6 register back to
|
some kind). A power-cycle, hard reset or explicitly setting the e6 register
|
||||||
22 (setpci -d 8086:1048 e6.b=22) may be required to get back to a stable
|
back to 22 (setpci -d 8086:1a48 e6.b=22) may be required to get back to a
|
||||||
configuration.
|
stable configuration.
|
||||||
|
|
||||||
- COPY these lines and paste them into ixgb_perf.sh:
|
- COPY these lines and paste them into ixgb_perf.sh:
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
echo "configuring network performance , edit this file to change the interface"
|
echo "configuring network performance , edit this file to change the interface
|
||||||
|
or device ID of 10GbE card"
|
||||||
# set mmrbc to 4k reads, modify only Intel 10GbE device IDs
|
# set mmrbc to 4k reads, modify only Intel 10GbE device IDs
|
||||||
setpci -d 8086:1048 e6.b=2e
|
# replace 1a48 with appropriate 10GbE device's ID installed on the system,
|
||||||
# set the MTU (max transmission unit) - it requires your switch and clients to change too!
|
# if needed.
|
||||||
|
setpci -d 8086:1a48 e6.b=2e
|
||||||
|
# set the MTU (max transmission unit) - it requires your switch and clients
|
||||||
|
# to change as well.
|
||||||
# set the txqueuelen
|
# set the txqueuelen
|
||||||
# your ixgb adapter should be loaded as eth1 for this to work, change if needed
|
# your ixgb adapter should be loaded as eth1 for this to work, change if needed
|
||||||
ifconfig eth1 mtu 9000 txqueuelen 1000 up
|
ifconfig eth1 mtu 9000 txqueuelen 1000 up
|
||||||
# call the sysctl utility to modify /proc/sys entries
|
# call the sysctl utility to modify /proc/sys entries
|
||||||
sysctl -p ./sysctl_ixgb.conf
|
sysctl -p ./sysctl_ixgb.conf
|
||||||
- END ixgb_perf.sh
|
- END ixgb_perf.sh
|
||||||
|
|
||||||
- COPY these lines and paste them into sysctl_ixgb.conf:
|
- COPY these lines and paste them into sysctl_ixgb.conf:
|
||||||
|
@ -159,54 +214,220 @@ sysctl -p ./sysctl_ixgb.conf
|
||||||
# several network benchmark tests, your mileage may vary
|
# several network benchmark tests, your mileage may vary
|
||||||
|
|
||||||
### IPV4 specific settings
|
### IPV4 specific settings
|
||||||
net.ipv4.tcp_timestamps = 0 # turns TCP timestamp support off, default 1, reduces CPU use
|
# turn TCP timestamp support off, default 1, reduces CPU use
|
||||||
net.ipv4.tcp_sack = 0 # turn SACK support off, default on
|
net.ipv4.tcp_timestamps = 0
|
||||||
# on systems with a VERY fast bus -> memory interface this is the big gainer
|
# turn SACK support off, default on
|
||||||
net.ipv4.tcp_rmem = 10000000 10000000 10000000 # sets min/default/max TCP read buffer, default 4096 87380 174760
|
# on systems with a VERY fast bus -> memory interface this is the big gainer
|
||||||
net.ipv4.tcp_wmem = 10000000 10000000 10000000 # sets min/pressure/max TCP write buffer, default 4096 16384 131072
|
net.ipv4.tcp_sack = 0
|
||||||
net.ipv4.tcp_mem = 10000000 10000000 10000000 # sets min/pressure/max TCP buffer space, default 31744 32256 32768
|
# set min/default/max TCP read buffer, default 4096 87380 174760
|
||||||
|
net.ipv4.tcp_rmem = 10000000 10000000 10000000
|
||||||
|
# set min/pressure/max TCP write buffer, default 4096 16384 131072
|
||||||
|
net.ipv4.tcp_wmem = 10000000 10000000 10000000
|
||||||
|
# set min/pressure/max TCP buffer space, default 31744 32256 32768
|
||||||
|
net.ipv4.tcp_mem = 10000000 10000000 10000000
|
||||||
|
|
||||||
### CORE settings (mostly for socket and UDP effect)
|
### CORE settings (mostly for socket and UDP effect)
|
||||||
net.core.rmem_max = 524287 # maximum receive socket buffer size, default 131071
|
# set maximum receive socket buffer size, default 131071
|
||||||
net.core.wmem_max = 524287 # maximum send socket buffer size, default 131071
|
net.core.rmem_max = 524287
|
||||||
net.core.rmem_default = 524287 # default receive socket buffer size, default 65535
|
# set maximum send socket buffer size, default 131071
|
||||||
net.core.wmem_default = 524287 # default send socket buffer size, default 65535
|
net.core.wmem_max = 524287
|
||||||
net.core.optmem_max = 524287 # maximum amount of option memory buffers, default 10240
|
# set default receive socket buffer size, default 65535
|
||||||
net.core.netdev_max_backlog = 300000 # number of unprocessed input packets before kernel starts dropping them, default 300
|
net.core.rmem_default = 524287
|
||||||
|
# set default send socket buffer size, default 65535
|
||||||
|
net.core.wmem_default = 524287
|
||||||
|
# set maximum amount of option memory buffers, default 10240
|
||||||
|
net.core.optmem_max = 524287
|
||||||
|
# set number of unprocessed input packets before kernel starts dropping them; default 300
|
||||||
|
net.core.netdev_max_backlog = 300000
|
||||||
- END sysctl_ixgb.conf
|
- END sysctl_ixgb.conf
|
||||||
|
|
||||||
Edit the ixgb_perf.sh script if necessary to change eth1 to whatever interface
|
Edit the ixgb_perf.sh script if necessary to change eth1 to whatever interface
|
||||||
your ixgb driver is using.
|
your ixgb driver is using and/or replace '1a48' with appropriate 10GbE device's
|
||||||
|
ID installed on the system.
|
||||||
|
|
||||||
NOTE: Unless these scripts are added to the boot process, these changes will
|
NOTE: Unless these scripts are added to the boot process, these changes will
|
||||||
only last only until the next system reboot.
|
only last only until the next system reboot.
|
||||||
|
|
||||||
|
|
||||||
Resolving Slow UDP Traffic
|
Resolving Slow UDP Traffic
|
||||||
--------------------------
|
--------------------------
|
||||||
|
If your server does not seem to be able to receive UDP traffic as fast as it
|
||||||
|
can receive TCP traffic, it could be because Linux, by default, does not set
|
||||||
|
the network stack buffers as large as they need to be to support high UDP
|
||||||
|
transfer rates. One way to alleviate this problem is to allow more memory to
|
||||||
|
be used by the IP stack to store incoming data.
|
||||||
|
|
||||||
If your server does not seem to be able to receive UDP traffic as fast as it
|
For instance, use the commands:
|
||||||
can receive TCP traffic, it could be because Linux, by default, does not set
|
|
||||||
the network stack buffers as large as they need to be to support high UDP
|
|
||||||
transfer rates. One way to alleviate this problem is to allow more memory to
|
|
||||||
be used by the IP stack to store incoming data.
|
|
||||||
|
|
||||||
For instance, use the commands:
|
|
||||||
sysctl -w net.core.rmem_max=262143
|
sysctl -w net.core.rmem_max=262143
|
||||||
and
|
and
|
||||||
sysctl -w net.core.rmem_default=262143
|
sysctl -w net.core.rmem_default=262143
|
||||||
to increase the read buffer memory max and default to 262143 (256k - 1) from
|
to increase the read buffer memory max and default to 262143 (256k - 1) from
|
||||||
defaults of max=131071 (128k - 1) and default=65535 (64k - 1). These variables
|
defaults of max=131071 (128k - 1) and default=65535 (64k - 1). These variables
|
||||||
will increase the amount of memory used by the network stack for receives, and
|
will increase the amount of memory used by the network stack for receives, and
|
||||||
can be increased significantly more if necessary for your application.
|
can be increased significantly more if necessary for your application.
|
||||||
|
|
||||||
|
|
||||||
|
Additional Configurations
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Configuring the Driver on Different Distributions
|
||||||
|
-------------------------------------------------
|
||||||
|
Configuring a network driver to load properly when the system is started is
|
||||||
|
distribution dependent. Typically, the configuration process involves adding
|
||||||
|
an alias line to /etc/modprobe.conf as well as editing other system startup
|
||||||
|
scripts and/or configuration files. Many popular Linux distributions ship
|
||||||
|
with tools to make these changes for you. To learn the proper way to
|
||||||
|
configure a network device for your system, refer to your distribution
|
||||||
|
documentation. If during this process you are asked for the driver or module
|
||||||
|
name, the name for the Linux Base Driver for the Intel 10GbE Family of
|
||||||
|
Adapters is ixgb.
|
||||||
|
|
||||||
|
Viewing Link Messages
|
||||||
|
---------------------
|
||||||
|
Link messages will not be displayed to the console if the distribution is
|
||||||
|
restricting system messages. In order to see network driver link messages on
|
||||||
|
your console, set dmesg to eight by entering the following:
|
||||||
|
|
||||||
|
dmesg -n 8
|
||||||
|
|
||||||
|
NOTE: This setting is not saved across reboots.
|
||||||
|
|
||||||
|
|
||||||
|
Jumbo Frames
|
||||||
|
------------
|
||||||
|
The driver supports Jumbo Frames for all adapters. Jumbo Frames support is
|
||||||
|
enabled by changing the MTU to a value larger than the default of 1500.
|
||||||
|
The maximum value for the MTU is 16114. Use the ifconfig command to
|
||||||
|
increase the MTU size. For example:
|
||||||
|
|
||||||
|
ifconfig ethx mtu 9000 up
|
||||||
|
|
||||||
|
The maximum MTU setting for Jumbo Frames is 16114. This value coincides
|
||||||
|
with the maximum Jumbo Frames size of 16128.
|
||||||
|
|
||||||
|
|
||||||
|
Ethtool
|
||||||
|
-------
|
||||||
|
The driver utilizes the ethtool interface for driver configuration and
|
||||||
|
diagnostics, as well as displaying statistical information. Ethtool
|
||||||
|
version 1.6 or later is required for this functionality.
|
||||||
|
|
||||||
|
The latest release of ethtool can be found from
|
||||||
|
http://sourceforge.net/projects/gkernel
|
||||||
|
|
||||||
|
NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support
|
||||||
|
for a more complete ethtool feature set can be enabled by upgrading
|
||||||
|
to the latest version.
|
||||||
|
|
||||||
|
|
||||||
|
NAPI
|
||||||
|
----
|
||||||
|
|
||||||
|
NAPI (Rx polling mode) is supported in the ixgb driver. NAPI is enabled
|
||||||
|
or disabled based on the configuration of the kernel. see CONFIG_IXGB_NAPI
|
||||||
|
|
||||||
|
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
||||||
|
|
||||||
|
|
||||||
|
Known Issues/Troubleshooting
|
||||||
|
============================
|
||||||
|
|
||||||
|
NOTE: After installing the driver, if your Intel Network Connection is not
|
||||||
|
working, verify in the "In This Release" section of the readme that you have
|
||||||
|
installed the correct driver.
|
||||||
|
|
||||||
|
Intel(R) PRO/10GbE CX4 Server Adapter Cable Interoperability Issue with
|
||||||
|
Fujitsu XENPAK Module in SmartBits Chassis
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Excessive CRC errors may be observed if the Intel(R) PRO/10GbE CX4
|
||||||
|
Server adapter is connected to a Fujitsu XENPAK CX4 module in a SmartBits
|
||||||
|
chassis using 15 m/24AWG cable assemblies manufactured by Fujitsu or Leoni.
|
||||||
|
The CRC errors may be received either by the Intel(R) PRO/10GbE CX4
|
||||||
|
Server adapter or the SmartBits. If this situation occurs using a different
|
||||||
|
cable assembly may resolve the issue.
|
||||||
|
|
||||||
|
CX4 Server Adapter Cable Interoperability Issues with HP Procurve 3400cl
|
||||||
|
Switch Port
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Excessive CRC errors may be observed if the Intel(R) PRO/10GbE CX4 Server
|
||||||
|
adapter is connected to an HP Procurve 3400cl switch port using short cables
|
||||||
|
(1 m or shorter). If this situation occurs, using a longer cable may resolve
|
||||||
|
the issue.
|
||||||
|
|
||||||
|
Excessive CRC errors may be observed using Fujitsu 24AWG cable assemblies that
|
||||||
|
Are 10 m or longer or where using a Leoni 15 m/24AWG cable assembly. The CRC
|
||||||
|
errors may be received either by the CX4 Server adapter or at the switch. If
|
||||||
|
this situation occurs, using a different cable assembly may resolve the issue.
|
||||||
|
|
||||||
|
|
||||||
|
Jumbo Frames System Requirement
|
||||||
|
-------------------------------
|
||||||
|
Memory allocation failures have been observed on Linux systems with 64 MB
|
||||||
|
of RAM or less that are running Jumbo Frames. If you are using Jumbo
|
||||||
|
Frames, your system may require more than the advertised minimum
|
||||||
|
requirement of 64 MB of system memory.
|
||||||
|
|
||||||
|
|
||||||
|
Performance Degradation with Jumbo Frames
|
||||||
|
-----------------------------------------
|
||||||
|
Degradation in throughput performance may be observed in some Jumbo frames
|
||||||
|
environments. If this is observed, increasing the application's socket buffer
|
||||||
|
size and/or increasing the /proc/sys/net/ipv4/tcp_*mem entry values may help.
|
||||||
|
See the specific application manual and /usr/src/linux*/Documentation/
|
||||||
|
networking/ip-sysctl.txt for more details.
|
||||||
|
|
||||||
|
|
||||||
|
Allocating Rx Buffers when Using Jumbo Frames
|
||||||
|
---------------------------------------------
|
||||||
|
Allocating Rx buffers when using Jumbo Frames on 2.6.x kernels may fail if
|
||||||
|
the available memory is heavily fragmented. This issue may be seen with PCI-X
|
||||||
|
adapters or with packet split disabled. This can be reduced or eliminated
|
||||||
|
by changing the amount of available memory for receive buffer allocation, by
|
||||||
|
increasing /proc/sys/vm/min_free_kbytes.
|
||||||
|
|
||||||
|
|
||||||
|
Multiple Interfaces on Same Ethernet Broadcast Network
|
||||||
|
------------------------------------------------------
|
||||||
|
Due to the default ARP behavior on Linux, it is not possible to have
|
||||||
|
one system on two IP networks in the same Ethernet broadcast domain
|
||||||
|
(non-partitioned switch) behave as expected. All Ethernet interfaces
|
||||||
|
will respond to IP traffic for any IP address assigned to the system.
|
||||||
|
This results in unbalanced receive traffic.
|
||||||
|
|
||||||
|
If you have multiple interfaces in a server, do either of the following:
|
||||||
|
|
||||||
|
- Turn on ARP filtering by entering:
|
||||||
|
echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter
|
||||||
|
|
||||||
|
- Install the interfaces in separate broadcast domains - either in
|
||||||
|
different switches or in a switch partitioned to VLANs.
|
||||||
|
|
||||||
|
|
||||||
|
UDP Stress Test Dropped Packet Issue
|
||||||
|
--------------------------------------
|
||||||
|
Under small packets UDP stress test with 10GbE driver, the Linux system
|
||||||
|
may drop UDP packets due to the fullness of socket buffers. You may want
|
||||||
|
to change the driver's Flow Control variables to the minimum value for
|
||||||
|
controlling packet reception.
|
||||||
|
|
||||||
|
|
||||||
|
Tx Hangs Possible Under Stress
|
||||||
|
------------------------------
|
||||||
|
Under stress conditions, if TX hangs occur, turning off TSO
|
||||||
|
"ethtool -K eth0 tso off" may resolve the problem.
|
||||||
|
|
||||||
|
|
||||||
Support
|
Support
|
||||||
=======
|
=======
|
||||||
|
|
||||||
For general information and support, go to the Intel support website at:
|
For general information, go to the Intel support website at:
|
||||||
|
|
||||||
http://support.intel.com
|
http://support.intel.com
|
||||||
|
|
||||||
|
or the Intel Wired Networking project hosted by Sourceforge at:
|
||||||
|
|
||||||
|
http://sourceforge.net/projects/e1000
|
||||||
|
|
||||||
If an issue is identified with the released source code on the supported
|
If an issue is identified with the released source code on the supported
|
||||||
kernel with a supported adapter, email the specific information related to
|
kernel with a supported adapter, email the specific information related
|
||||||
the issue to linux.nics@intel.com.
|
to the issue to e1000-devel@lists.sf.net
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211
|
||||||
|
Copyright (c) 2008, Jouni Malinen <j@w1.fi>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
|
||||||
|
mac80211_hwsim is a Linux kernel module that can be used to simulate
|
||||||
|
arbitrary number of IEEE 802.11 radios for mac80211. It can be used to
|
||||||
|
test most of the mac80211 functionality and user space tools (e.g.,
|
||||||
|
hostapd and wpa_supplicant) in a way that matches very closely with
|
||||||
|
the normal case of using real WLAN hardware. From the mac80211 view
|
||||||
|
point, mac80211_hwsim is yet another hardware driver, i.e., no changes
|
||||||
|
to mac80211 are needed to use this testing tool.
|
||||||
|
|
||||||
|
The main goal for mac80211_hwsim is to make it easier for developers
|
||||||
|
to test their code and work with new features to mac80211, hostapd,
|
||||||
|
and wpa_supplicant. The simulated radios do not have the limitations
|
||||||
|
of real hardware, so it is easy to generate an arbitrary test setup
|
||||||
|
and always reproduce the same setup for future tests. In addition,
|
||||||
|
since all radio operation is simulated, any channel can be used in
|
||||||
|
tests regardless of regulatory rules.
|
||||||
|
|
||||||
|
mac80211_hwsim kernel module has a parameter 'radios' that can be used
|
||||||
|
to select how many radios are simulated (default 2). This allows
|
||||||
|
configuration of both very simply setups (e.g., just a single access
|
||||||
|
point and a station) or large scale tests (multiple access points with
|
||||||
|
hundreds of stations).
|
||||||
|
|
||||||
|
mac80211_hwsim works by tracking the current channel of each virtual
|
||||||
|
radio and copying all transmitted frames to all other radios that are
|
||||||
|
currently enabled and on the same channel as the transmitting
|
||||||
|
radio. Software encryption in mac80211 is used so that the frames are
|
||||||
|
actually encrypted over the virtual air interface to allow more
|
||||||
|
complete testing of encryption.
|
||||||
|
|
||||||
|
A global monitoring netdev, hwsim#, is created independent of
|
||||||
|
mac80211. This interface can be used to monitor all transmitted frames
|
||||||
|
regardless of channel.
|
||||||
|
|
||||||
|
|
||||||
|
Simple example
|
||||||
|
|
||||||
|
This example shows how to use mac80211_hwsim to simulate two radios:
|
||||||
|
one to act as an access point and the other as a station that
|
||||||
|
associates with the AP. hostapd and wpa_supplicant are used to take
|
||||||
|
care of WPA2-PSK authentication. In addition, hostapd is also
|
||||||
|
processing access point side of association.
|
||||||
|
|
||||||
|
Please note that the current Linux kernel does not enable AP mode, so a
|
||||||
|
simple patch is needed to enable AP mode selection:
|
||||||
|
http://johannes.sipsolutions.net/patches/kernel/all/LATEST/006-allow-ap-vlan-modes.patch
|
||||||
|
|
||||||
|
|
||||||
|
# Build mac80211_hwsim as part of kernel configuration
|
||||||
|
|
||||||
|
# Load the module
|
||||||
|
modprobe mac80211_hwsim
|
||||||
|
|
||||||
|
# Run hostapd (AP) for wlan0
|
||||||
|
hostapd hostapd.conf
|
||||||
|
|
||||||
|
# Run wpa_supplicant (station) for wlan1
|
||||||
|
wpa_supplicant -Dwext -iwlan1 -c wpa_supplicant.conf
|
|
@ -0,0 +1,11 @@
|
||||||
|
interface=wlan0
|
||||||
|
driver=nl80211
|
||||||
|
|
||||||
|
hw_mode=g
|
||||||
|
channel=1
|
||||||
|
ssid=mac80211 test
|
||||||
|
|
||||||
|
wpa=2
|
||||||
|
wpa_key_mgmt=WPA-PSK
|
||||||
|
wpa_pairwise=CCMP
|
||||||
|
wpa_passphrase=12345678
|
|
@ -0,0 +1,10 @@
|
||||||
|
ctrl_interface=/var/run/wpa_supplicant
|
||||||
|
|
||||||
|
network={
|
||||||
|
ssid="mac80211 test"
|
||||||
|
psk="12345678"
|
||||||
|
key_mgmt=WPA-PSK
|
||||||
|
proto=WPA2
|
||||||
|
pairwise=CCMP
|
||||||
|
group=CCMP
|
||||||
|
}
|
|
@ -3,19 +3,11 @@
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
Section 1: Base driver requirements for implementing multiqueue support
|
Section 1: Base driver requirements for implementing multiqueue support
|
||||||
Section 2: Qdisc support for multiqueue devices
|
|
||||||
Section 3: Brief howto using PRIO or RR for multiqueue devices
|
|
||||||
|
|
||||||
|
|
||||||
Intro: Kernel support for multiqueue devices
|
Intro: Kernel support for multiqueue devices
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
Kernel support for multiqueue devices is only an API that is presented to the
|
Kernel support for multiqueue devices is always present.
|
||||||
netdevice layer for base drivers to implement. This feature is part of the
|
|
||||||
core networking stack, and all network devices will be running on the
|
|
||||||
multiqueue-aware stack. If a base driver only has one queue, then these
|
|
||||||
changes are transparent to that driver.
|
|
||||||
|
|
||||||
|
|
||||||
Section 1: Base driver requirements for implementing multiqueue support
|
Section 1: Base driver requirements for implementing multiqueue support
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
@ -32,84 +24,4 @@ netif_{start|stop|wake}_subqueue() functions to manage each queue while the
|
||||||
device is still operational. netdev->queue_lock is still used when the device
|
device is still operational. netdev->queue_lock is still used when the device
|
||||||
comes online or when it's completely shut down (unregister_netdev(), etc.).
|
comes online or when it's completely shut down (unregister_netdev(), etc.).
|
||||||
|
|
||||||
Finally, the base driver should indicate that it is a multiqueue device. The
|
|
||||||
feature flag NETIF_F_MULTI_QUEUE should be added to the netdev->features
|
|
||||||
bitmap on device initialization. Below is an example from e1000:
|
|
||||||
|
|
||||||
#ifdef CONFIG_E1000_MQ
|
|
||||||
if ( (adapter->hw.mac.type == e1000_82571) ||
|
|
||||||
(adapter->hw.mac.type == e1000_82572) ||
|
|
||||||
(adapter->hw.mac.type == e1000_80003es2lan))
|
|
||||||
netdev->features |= NETIF_F_MULTI_QUEUE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
Section 2: Qdisc support for multiqueue devices
|
|
||||||
-----------------------------------------------
|
|
||||||
|
|
||||||
Currently two qdiscs support multiqueue devices. A new round-robin qdisc,
|
|
||||||
sch_rr, and sch_prio. The qdisc is responsible for classifying the skb's to
|
|
||||||
bands and queues, and will store the queue mapping into skb->queue_mapping.
|
|
||||||
Use this field in the base driver to determine which queue to send the skb
|
|
||||||
to.
|
|
||||||
|
|
||||||
sch_rr has been added for hardware that doesn't want scheduling policies from
|
|
||||||
software, so it's a straight round-robin qdisc. It uses the same syntax and
|
|
||||||
classification priomap that sch_prio uses, so it should be intuitive to
|
|
||||||
configure for people who've used sch_prio.
|
|
||||||
|
|
||||||
In order to utilitize the multiqueue features of the qdiscs, the network
|
|
||||||
device layer needs to enable multiple queue support. This can be done by
|
|
||||||
selecting NETDEVICES_MULTIQUEUE under Drivers.
|
|
||||||
|
|
||||||
The PRIO qdisc naturally plugs into a multiqueue device. If
|
|
||||||
NETDEVICES_MULTIQUEUE is selected, then on qdisc load, the number of
|
|
||||||
bands requested is compared to the number of queues on the hardware. If they
|
|
||||||
are equal, it sets a one-to-one mapping up between the queues and bands. If
|
|
||||||
they're not equal, it will not load the qdisc. This is the same behavior
|
|
||||||
for RR. Once the association is made, any skb that is classified will have
|
|
||||||
skb->queue_mapping set, which will allow the driver to properly queue skb's
|
|
||||||
to multiple queues.
|
|
||||||
|
|
||||||
|
|
||||||
Section 3: Brief howto using PRIO and RR for multiqueue devices
|
|
||||||
---------------------------------------------------------------
|
|
||||||
|
|
||||||
The userspace command 'tc,' part of the iproute2 package, is used to configure
|
|
||||||
qdiscs. To add the PRIO qdisc to your network device, assuming the device is
|
|
||||||
called eth0, run the following command:
|
|
||||||
|
|
||||||
# tc qdisc add dev eth0 root handle 1: prio bands 4 multiqueue
|
|
||||||
|
|
||||||
This will create 4 bands, 0 being highest priority, and associate those bands
|
|
||||||
to the queues on your NIC. Assuming eth0 has 4 Tx queues, the band mapping
|
|
||||||
would look like:
|
|
||||||
|
|
||||||
band 0 => queue 0
|
|
||||||
band 1 => queue 1
|
|
||||||
band 2 => queue 2
|
|
||||||
band 3 => queue 3
|
|
||||||
|
|
||||||
Traffic will begin flowing through each queue if your TOS values are assigning
|
|
||||||
traffic across the various bands. For example, ssh traffic will always try to
|
|
||||||
go out band 0 based on TOS -> Linux priority conversion (realtime traffic),
|
|
||||||
so it will be sent out queue 0. ICMP traffic (pings) fall into the "normal"
|
|
||||||
traffic classification, which is band 1. Therefore pings will be send out
|
|
||||||
queue 1 on the NIC.
|
|
||||||
|
|
||||||
Note the use of the multiqueue keyword. This is only in versions of iproute2
|
|
||||||
that support multiqueue networking devices; if this is omitted when loading
|
|
||||||
a qdisc onto a multiqueue device, the qdisc will load and operate the same
|
|
||||||
if it were loaded onto a single-queue device (i.e. - sends all traffic to
|
|
||||||
queue 0).
|
|
||||||
|
|
||||||
Another alternative to multiqueue band allocation can be done by using the
|
|
||||||
multiqueue option and specify 0 bands. If this is the case, the qdisc will
|
|
||||||
allocate the number of bands to equal the number of queues that the device
|
|
||||||
reports, and bring the qdisc online.
|
|
||||||
|
|
||||||
The behavior of tc filters remains the same, where it will override TOS priority
|
|
||||||
classification.
|
|
||||||
|
|
||||||
|
|
||||||
Author: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>
|
Author: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>
|
||||||
|
|
|
@ -326,7 +326,7 @@ just one call to mmap is needed:
|
||||||
mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
|
mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
|
|
||||||
If tp_frame_size is a divisor of tp_block_size frames will be
|
If tp_frame_size is a divisor of tp_block_size frames will be
|
||||||
contiguosly spaced by tp_frame_size bytes. If not, each
|
contiguously spaced by tp_frame_size bytes. If not, each
|
||||||
tp_block_size/tp_frame_size frames there will be a gap between
|
tp_block_size/tp_frame_size frames there will be a gap between
|
||||||
the frames. This is because a frame cannot be spawn across two
|
the frames. This is because a frame cannot be spawn across two
|
||||||
blocks.
|
blocks.
|
||||||
|
|
|
@ -52,13 +52,10 @@ d. MSI/MSI-X. Can be enabled on platforms which support this feature
|
||||||
(IA64, Xeon) resulting in noticeable performance improvement(upto 7%
|
(IA64, Xeon) resulting in noticeable performance improvement(upto 7%
|
||||||
on certain platforms).
|
on certain platforms).
|
||||||
|
|
||||||
e. NAPI. Compile-time option(CONFIG_S2IO_NAPI) for better Rx interrupt
|
e. Statistics. Comprehensive MAC-level and software statistics displayed
|
||||||
moderation.
|
|
||||||
|
|
||||||
f. Statistics. Comprehensive MAC-level and software statistics displayed
|
|
||||||
using "ethtool -S" option.
|
using "ethtool -S" option.
|
||||||
|
|
||||||
g. Multi-FIFO/Ring. Supports up to 8 transmit queues and receive rings,
|
f. Multi-FIFO/Ring. Supports up to 8 transmit queues and receive rings,
|
||||||
with multiple steering options.
|
with multiple steering options.
|
||||||
|
|
||||||
4. Command line parameters
|
4. Command line parameters
|
||||||
|
|
|
@ -4,26 +4,27 @@ The "enviromental" rules for authors of any new tc actions are:
|
||||||
1) If you stealeth or borroweth any packet thou shalt be branching
|
1) If you stealeth or borroweth any packet thou shalt be branching
|
||||||
from the righteous path and thou shalt cloneth.
|
from the righteous path and thou shalt cloneth.
|
||||||
|
|
||||||
For example if your action queues a packet to be processed later
|
For example if your action queues a packet to be processed later,
|
||||||
or intentionaly branches by redirecting a packet then you need to
|
or intentionally branches by redirecting a packet, then you need to
|
||||||
clone the packet.
|
clone the packet.
|
||||||
|
|
||||||
There are certain fields in the skb tc_verd that need to be reset so we
|
There are certain fields in the skb tc_verd that need to be reset so we
|
||||||
avoid loops etc. A few are generic enough so much so that skb_act_clone()
|
avoid loops, etc. A few are generic enough that skb_act_clone()
|
||||||
resets them for you. So invoke skb_act_clone() rather than skb_clone()
|
resets them for you, so invoke skb_act_clone() rather than skb_clone().
|
||||||
|
|
||||||
2) If you munge any packet thou shalt call pskb_expand_head in the case
|
2) If you munge any packet thou shalt call pskb_expand_head in the case
|
||||||
someone else is referencing the skb. After that you "own" the skb.
|
someone else is referencing the skb. After that you "own" the skb.
|
||||||
You must also tell us if it is ok to munge the packet (TC_OK2MUNGE),
|
You must also tell us if it is ok to munge the packet (TC_OK2MUNGE),
|
||||||
this way any action downstream can stomp on the packet.
|
this way any action downstream can stomp on the packet.
|
||||||
|
|
||||||
3) dropping packets you dont own is a nono. You simply return
|
3) Dropping packets you don't own is a no-no. You simply return
|
||||||
TC_ACT_SHOT to the caller and they will drop it.
|
TC_ACT_SHOT to the caller and they will drop it.
|
||||||
|
|
||||||
The "enviromental" rules for callers of actions (qdiscs etc) are:
|
The "enviromental" rules for callers of actions (qdiscs etc) are:
|
||||||
|
|
||||||
*) thou art responsible for freeing anything returned as being
|
*) Thou art responsible for freeing anything returned as being
|
||||||
TC_ACT_SHOT/STOLEN/QUEUED. If none of TC_ACT_SHOT/STOLEN/QUEUED is
|
TC_ACT_SHOT/STOLEN/QUEUED. If none of TC_ACT_SHOT/STOLEN/QUEUED is
|
||||||
returned then all is great and you dont need to do anything.
|
returned, then all is great and you don't need to do anything.
|
||||||
|
|
||||||
Post on netdev if something is unclear.
|
Post on netdev if something is unclear.
|
||||||
|
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
|
getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
|
||||||
|
|
||||||
is meaningless (as in TCP). Packets with a zero checksum field are
|
is meaningless (as in TCP). Packets with a zero checksum field are
|
||||||
illegal (cf. RFC 3828, sec. 3.1) will be silently discarded.
|
illegal (cf. RFC 3828, sec. 3.1) and will be silently discarded.
|
||||||
|
|
||||||
4) Fragmentation
|
4) Fragmentation
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
00-INDEX
|
00-INDEX
|
||||||
- This file
|
- This file
|
||||||
|
apm-acpi.txt
|
||||||
|
- basic info about the APM and ACPI support.
|
||||||
basic-pm-debugging.txt
|
basic-pm-debugging.txt
|
||||||
- Debugging suspend and resume
|
- Debugging suspend and resume
|
||||||
devices.txt
|
devices.txt
|
||||||
|
@ -14,8 +16,6 @@ notifiers.txt
|
||||||
- Registering suspend notifiers in device drivers
|
- Registering suspend notifiers in device drivers
|
||||||
pci.txt
|
pci.txt
|
||||||
- How the PCI Subsystem Does Power Management
|
- How the PCI Subsystem Does Power Management
|
||||||
pm.txt
|
|
||||||
- info on Linux power management support.
|
|
||||||
pm_qos_interface.txt
|
pm_qos_interface.txt
|
||||||
- info on Linux PM Quality of Service interface
|
- info on Linux PM Quality of Service interface
|
||||||
power_supply_class.txt
|
power_supply_class.txt
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
APM or ACPI?
|
||||||
|
------------
|
||||||
|
If you have a relatively recent x86 mobile, desktop, or server system,
|
||||||
|
odds are it supports either Advanced Power Management (APM) or
|
||||||
|
Advanced Configuration and Power Interface (ACPI). ACPI is the newer
|
||||||
|
of the two technologies and puts power management in the hands of the
|
||||||
|
operating system, allowing for more intelligent power management than
|
||||||
|
is possible with BIOS controlled APM.
|
||||||
|
|
||||||
|
The best way to determine which, if either, your system supports is to
|
||||||
|
build a kernel with both ACPI and APM enabled (as of 2.3.x ACPI is
|
||||||
|
enabled by default). If a working ACPI implementation is found, the
|
||||||
|
ACPI driver will override and disable APM, otherwise the APM driver
|
||||||
|
will be used.
|
||||||
|
|
||||||
|
No, sorry, you cannot have both ACPI and APM enabled and running at
|
||||||
|
once. Some people with broken ACPI or broken APM implementations
|
||||||
|
would like to use both to get a full set of working features, but you
|
||||||
|
simply cannot mix and match the two. Only one power management
|
||||||
|
interface can be in control of the machine at once. Think about it..
|
||||||
|
|
||||||
|
User-space Daemons
|
||||||
|
------------------
|
||||||
|
Both APM and ACPI rely on user-space daemons, apmd and acpid
|
||||||
|
respectively, to be completely functional. Obtain both of these
|
||||||
|
daemons from your Linux distribution or from the Internet (see below)
|
||||||
|
and be sure that they are started sometime in the system boot process.
|
||||||
|
Go ahead and start both. If ACPI or APM is not available on your
|
||||||
|
system the associated daemon will exit gracefully.
|
||||||
|
|
||||||
|
apmd: http://worldvisions.ca/~apenwarr/apmd/
|
||||||
|
acpid: http://acpid.sf.net/
|
|
@ -1,257 +0,0 @@
|
||||||
Linux Power Management Support
|
|
||||||
|
|
||||||
This document briefly describes how to use power management with your
|
|
||||||
Linux system and how to add power management support to Linux drivers.
|
|
||||||
|
|
||||||
APM or ACPI?
|
|
||||||
------------
|
|
||||||
If you have a relatively recent x86 mobile, desktop, or server system,
|
|
||||||
odds are it supports either Advanced Power Management (APM) or
|
|
||||||
Advanced Configuration and Power Interface (ACPI). ACPI is the newer
|
|
||||||
of the two technologies and puts power management in the hands of the
|
|
||||||
operating system, allowing for more intelligent power management than
|
|
||||||
is possible with BIOS controlled APM.
|
|
||||||
|
|
||||||
The best way to determine which, if either, your system supports is to
|
|
||||||
build a kernel with both ACPI and APM enabled (as of 2.3.x ACPI is
|
|
||||||
enabled by default). If a working ACPI implementation is found, the
|
|
||||||
ACPI driver will override and disable APM, otherwise the APM driver
|
|
||||||
will be used.
|
|
||||||
|
|
||||||
No, sorry, you cannot have both ACPI and APM enabled and running at
|
|
||||||
once. Some people with broken ACPI or broken APM implementations
|
|
||||||
would like to use both to get a full set of working features, but you
|
|
||||||
simply cannot mix and match the two. Only one power management
|
|
||||||
interface can be in control of the machine at once. Think about it..
|
|
||||||
|
|
||||||
User-space Daemons
|
|
||||||
------------------
|
|
||||||
Both APM and ACPI rely on user-space daemons, apmd and acpid
|
|
||||||
respectively, to be completely functional. Obtain both of these
|
|
||||||
daemons from your Linux distribution or from the Internet (see below)
|
|
||||||
and be sure that they are started sometime in the system boot process.
|
|
||||||
Go ahead and start both. If ACPI or APM is not available on your
|
|
||||||
system the associated daemon will exit gracefully.
|
|
||||||
|
|
||||||
apmd: http://worldvisions.ca/~apenwarr/apmd/
|
|
||||||
acpid: http://acpid.sf.net/
|
|
||||||
|
|
||||||
Driver Interface -- OBSOLETE, DO NOT USE!
|
|
||||||
----------------*************************
|
|
||||||
|
|
||||||
Note: pm_register(), pm_access(), pm_dev_idle() and friends are
|
|
||||||
obsolete. Please do not use them. Instead you should properly hook
|
|
||||||
your driver into the driver model, and use its suspend()/resume()
|
|
||||||
callbacks to do this kind of stuff.
|
|
||||||
|
|
||||||
If you are writing a new driver or maintaining an old driver, it
|
|
||||||
should include power management support. Without power management
|
|
||||||
support, a single driver may prevent a system with power management
|
|
||||||
capabilities from ever being able to suspend (safely).
|
|
||||||
|
|
||||||
Overview:
|
|
||||||
1) Register each instance of a device with "pm_register"
|
|
||||||
2) Call "pm_access" before accessing the hardware.
|
|
||||||
(this will ensure that the hardware is awake and ready)
|
|
||||||
3) Your "pm_callback" is called before going into a
|
|
||||||
suspend state (ACPI D1-D3) or after resuming (ACPI D0)
|
|
||||||
from a suspend.
|
|
||||||
4) Call "pm_dev_idle" when the device is not being used
|
|
||||||
(optional but will improve device idle detection)
|
|
||||||
5) When unloaded, unregister the device with "pm_unregister"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Description: Register a device with the power-management subsystem
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* type - device type (PCI device, system device, ...)
|
|
||||||
* id - instance number or unique identifier
|
|
||||||
* cback - request handler callback (suspend, resume, ...)
|
|
||||||
*
|
|
||||||
* Returns: Registered PM device or NULL on error
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
* dev = pm_register(PM_SYS_DEV, PM_SYS_VGA, vga_callback);
|
|
||||||
*
|
|
||||||
* struct pci_dev *pci_dev = pci_find_dev(...);
|
|
||||||
* dev = pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), callback);
|
|
||||||
*/
|
|
||||||
struct pm_dev *pm_register(pm_dev_t type, unsigned long id, pm_callback cback);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Description: Unregister a device with the power management subsystem
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* dev - PM device previously returned from pm_register
|
|
||||||
*/
|
|
||||||
void pm_unregister(struct pm_dev *dev);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Description: Unregister all devices with a matching callback function
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* cback - previously registered request callback
|
|
||||||
*
|
|
||||||
* Notes: Provided for easier porting from old APM interface
|
|
||||||
*/
|
|
||||||
void pm_unregister_all(pm_callback cback);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Power management request callback
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* dev - PM device previously returned from pm_register
|
|
||||||
* rqst - request type
|
|
||||||
* data - data, if any, associated with the request
|
|
||||||
*
|
|
||||||
* Returns: 0 if the request is successful
|
|
||||||
* EINVAL if the request is not supported
|
|
||||||
* EBUSY if the device is now busy and cannot handle the request
|
|
||||||
* ENOMEM if the device was unable to handle the request due to memory
|
|
||||||
*
|
|
||||||
* Details: The device request callback will be called before the
|
|
||||||
* device/system enters a suspend state (ACPI D1-D3) or
|
|
||||||
* or after the device/system resumes from suspend (ACPI D0).
|
|
||||||
* For PM_SUSPEND, the ACPI D-state being entered is passed
|
|
||||||
* as the "data" argument to the callback. The device
|
|
||||||
* driver should save (PM_SUSPEND) or restore (PM_RESUME)
|
|
||||||
* device context when the request callback is called.
|
|
||||||
*
|
|
||||||
* Once a driver returns 0 (success) from a suspend
|
|
||||||
* request, it should not process any further requests or
|
|
||||||
* access the device hardware until a call to "pm_access" is made.
|
|
||||||
*/
|
|
||||||
typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);
|
|
||||||
|
|
||||||
Driver Details
|
|
||||||
--------------
|
|
||||||
This is just a quick Q&A as a stopgap until a real driver writers'
|
|
||||||
power management guide is available.
|
|
||||||
|
|
||||||
Q: When is a device suspended?
|
|
||||||
|
|
||||||
Devices can be suspended based on direct user request (eg. laptop lid
|
|
||||||
closes), system power policy (eg. sleep after 30 minutes of console
|
|
||||||
inactivity), or device power policy (eg. power down device after 5
|
|
||||||
minutes of inactivity)
|
|
||||||
|
|
||||||
Q: Must a driver honor a suspend request?
|
|
||||||
|
|
||||||
No, a driver can return -EBUSY from a suspend request and this
|
|
||||||
will stop the system from suspending. When a suspend request
|
|
||||||
fails, all suspended devices are resumed and the system continues
|
|
||||||
to run. Suspend can be retried at a later time.
|
|
||||||
|
|
||||||
Q: Can the driver block suspend/resume requests?
|
|
||||||
|
|
||||||
Yes, a driver can delay its return from a suspend or resume
|
|
||||||
request until the device is ready to handle requests. It
|
|
||||||
is advantageous to return as quickly as possible from a
|
|
||||||
request as suspend/resume are done serially.
|
|
||||||
|
|
||||||
Q: What context is a suspend/resume initiated from?
|
|
||||||
|
|
||||||
A suspend or resume is initiated from a kernel thread context.
|
|
||||||
It is safe to block, allocate memory, initiate requests
|
|
||||||
or anything else you can do within the kernel.
|
|
||||||
|
|
||||||
Q: Will requests continue to arrive after a suspend?
|
|
||||||
|
|
||||||
Possibly. It is the driver's responsibility to queue(*),
|
|
||||||
fail, or drop any requests that arrive after returning
|
|
||||||
success to a suspend request. It is important that the
|
|
||||||
driver not access its device until after it receives
|
|
||||||
a resume request as the device's bus may no longer
|
|
||||||
be active.
|
|
||||||
|
|
||||||
(*) If a driver queues requests for processing after
|
|
||||||
resume be aware that the device, network, etc.
|
|
||||||
might be in a different state than at suspend time.
|
|
||||||
It's probably better to drop requests unless
|
|
||||||
the driver is a storage device.
|
|
||||||
|
|
||||||
Q: Do I have to manage bus-specific power management registers
|
|
||||||
|
|
||||||
No. It is the responsibility of the bus driver to manage
|
|
||||||
PCI, USB, etc. power management registers. The bus driver
|
|
||||||
or the power management subsystem will also enable any
|
|
||||||
wake-on functionality that the device has.
|
|
||||||
|
|
||||||
Q: So, really, what do I need to do to support suspend/resume?
|
|
||||||
|
|
||||||
You need to save any device context that would
|
|
||||||
be lost if the device was powered off and then restore
|
|
||||||
it at resume time. When ACPI is active, there are
|
|
||||||
three levels of device suspend states; D1, D2, and D3.
|
|
||||||
(The suspend state is passed as the "data" argument
|
|
||||||
to the device callback.) With D3, the device is powered
|
|
||||||
off and loses all context, D1 and D2 are shallower power
|
|
||||||
states and require less device context to be saved. To
|
|
||||||
play it safe, just save everything at suspend and restore
|
|
||||||
everything at resume.
|
|
||||||
|
|
||||||
Q: Where do I store device context for suspend?
|
|
||||||
|
|
||||||
Anywhere in memory, kmalloc a buffer or store it
|
|
||||||
in the device descriptor. You are guaranteed that the
|
|
||||||
contents of memory will be restored and accessible
|
|
||||||
before resume, even when the system suspends to disk.
|
|
||||||
|
|
||||||
Q: What do I need to do for ACPI vs. APM vs. etc?
|
|
||||||
|
|
||||||
Drivers need not be aware of the specific power management
|
|
||||||
technology that is active. They just need to be aware
|
|
||||||
of when the overlying power management system requests
|
|
||||||
that they suspend or resume.
|
|
||||||
|
|
||||||
Q: What about device dependencies?
|
|
||||||
|
|
||||||
When a driver registers a device, the power management
|
|
||||||
subsystem uses the information provided to build a
|
|
||||||
tree of device dependencies (eg. USB device X is on
|
|
||||||
USB controller Y which is on PCI bus Z) When power
|
|
||||||
management wants to suspend a device, it first sends
|
|
||||||
a suspend request to its driver, then the bus driver,
|
|
||||||
and so on up to the system bus. Device resumes
|
|
||||||
proceed in the opposite direction.
|
|
||||||
|
|
||||||
Q: Who do I contact for additional information about
|
|
||||||
enabling power management for my specific driver/device?
|
|
||||||
|
|
||||||
ACPI Development mailing list: linux-acpi@vger.kernel.org
|
|
||||||
|
|
||||||
System Interface -- OBSOLETE, DO NOT USE!
|
|
||||||
----------------*************************
|
|
||||||
If you are providing new power management support to Linux (ie.
|
|
||||||
adding support for something like APM or ACPI), you should
|
|
||||||
communicate with drivers through the existing generic power
|
|
||||||
management interface.
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send a request to all devices
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* rqst - request type
|
|
||||||
* data - data, if any, associated with the request
|
|
||||||
*
|
|
||||||
* Returns: 0 if the request is successful
|
|
||||||
* See "pm_callback" return for errors
|
|
||||||
*
|
|
||||||
* Details: Walk list of registered devices and call pm_send
|
|
||||||
* for each until complete or an error is encountered.
|
|
||||||
* If an error is encountered for a suspend request,
|
|
||||||
* return all devices to the state they were in before
|
|
||||||
* the suspend request.
|
|
||||||
*/
|
|
||||||
int pm_send_all(pm_request_t rqst, void *data);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find a matching device
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* type - device type (PCI device, system device, or 0 to match all devices)
|
|
||||||
* from - previous match or NULL to start from the beginning
|
|
||||||
*
|
|
||||||
* Returns: Matching device or NULL if none found
|
|
||||||
*/
|
|
||||||
struct pm_dev *pm_find(pm_dev_t type, struct pm_dev *from);
|
|
|
@ -41,12 +41,25 @@ Table of Contents
|
||||||
VI - System-on-a-chip devices and nodes
|
VI - System-on-a-chip devices and nodes
|
||||||
1) Defining child nodes of an SOC
|
1) Defining child nodes of an SOC
|
||||||
2) Representing devices without a current OF specification
|
2) Representing devices without a current OF specification
|
||||||
a) PHY nodes
|
a) MDIO IO device
|
||||||
b) Interrupt controllers
|
b) Gianfar-compatible ethernet nodes
|
||||||
c) CFI or JEDEC memory-mapped NOR flash
|
c) PHY nodes
|
||||||
d) 4xx/Axon EMAC ethernet nodes
|
d) Interrupt controllers
|
||||||
e) Xilinx IP cores
|
e) I2C
|
||||||
f) USB EHCI controllers
|
f) Freescale SOC USB controllers
|
||||||
|
g) Freescale SOC SEC Security Engines
|
||||||
|
h) Board Control and Status (BCSR)
|
||||||
|
i) Freescale QUICC Engine module (QE)
|
||||||
|
j) CFI or JEDEC memory-mapped NOR flash
|
||||||
|
k) Global Utilities Block
|
||||||
|
l) Freescale Communications Processor Module
|
||||||
|
m) Chipselect/Local Bus
|
||||||
|
n) 4xx/Axon EMAC ethernet nodes
|
||||||
|
o) Xilinx IP cores
|
||||||
|
p) Freescale Synchronous Serial Interface
|
||||||
|
q) USB EHCI controllers
|
||||||
|
r) MDIO on GPIOs
|
||||||
|
s) SPI busses
|
||||||
|
|
||||||
VII - Marvell Discovery mv64[345]6x System Controller chips
|
VII - Marvell Discovery mv64[345]6x System Controller chips
|
||||||
1) The /system-controller node
|
1) The /system-controller node
|
||||||
|
@ -77,10 +90,12 @@ Table of Contents
|
||||||
3) OpenPIC Interrupt Controllers
|
3) OpenPIC Interrupt Controllers
|
||||||
4) ISA Interrupt Controllers
|
4) ISA Interrupt Controllers
|
||||||
|
|
||||||
VIII - Specifying GPIO information for devices
|
IX - Specifying GPIO information for devices
|
||||||
1) gpios property
|
1) gpios property
|
||||||
2) gpio-controller nodes
|
2) gpio-controller nodes
|
||||||
|
|
||||||
|
X - Specifying device power management information (sleep property)
|
||||||
|
|
||||||
Appendix A - Sample SOC node for MPC8540
|
Appendix A - Sample SOC node for MPC8540
|
||||||
|
|
||||||
|
|
||||||
|
@ -693,7 +708,7 @@ device or bus to be described by the device tree.
|
||||||
In general, the format of an address for a device is defined by the
|
In general, the format of an address for a device is defined by the
|
||||||
parent bus type, based on the #address-cells and #size-cells
|
parent bus type, based on the #address-cells and #size-cells
|
||||||
properties. Note that the parent's parent definitions of #address-cells
|
properties. Note that the parent's parent definitions of #address-cells
|
||||||
and #size-cells are not inhereted so every node with children must specify
|
and #size-cells are not inherited so every node with children must specify
|
||||||
them. The kernel requires the root node to have those properties defining
|
them. The kernel requires the root node to have those properties defining
|
||||||
addresses format for devices directly mapped on the processor bus.
|
addresses format for devices directly mapped on the processor bus.
|
||||||
|
|
||||||
|
@ -1762,7 +1777,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||||
|
|
||||||
Xilinx uartlite devices are simple fixed speed serial ports.
|
Xilinx uartlite devices are simple fixed speed serial ports.
|
||||||
|
|
||||||
Requred properties:
|
Required properties:
|
||||||
- current-speed : Baud rate of uartlite
|
- current-speed : Baud rate of uartlite
|
||||||
|
|
||||||
v) Xilinx hwicap
|
v) Xilinx hwicap
|
||||||
|
@ -1784,7 +1799,7 @@ platforms are moved over to use the flattened-device-tree model.
|
||||||
Xilinx UART 16550 devices are very similar to the NS16550 but with
|
Xilinx UART 16550 devices are very similar to the NS16550 but with
|
||||||
different register spacing and an offset from the base address.
|
different register spacing and an offset from the base address.
|
||||||
|
|
||||||
Requred properties:
|
Required properties:
|
||||||
- clock-frequency : Frequency of the clock input
|
- clock-frequency : Frequency of the clock input
|
||||||
- reg-offset : A value of 3 is required
|
- reg-offset : A value of 3 is required
|
||||||
- reg-shift : A value of 2 is required
|
- reg-shift : A value of 2 is required
|
||||||
|
@ -1815,6 +1830,116 @@ platforms are moved over to use the flattened-device-tree model.
|
||||||
big-endian;
|
big-endian;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
r) Freescale Display Interface Unit
|
||||||
|
|
||||||
|
The Freescale DIU is a LCD controller, with proper hardware, it can also
|
||||||
|
drive DVI monitors.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : should be "fsl-diu".
|
||||||
|
- reg : should contain at least address and length of the DIU register
|
||||||
|
set.
|
||||||
|
- Interrupts : one DIU interrupt should be describe here.
|
||||||
|
|
||||||
|
Example (MPC8610HPCD)
|
||||||
|
display@2c000 {
|
||||||
|
compatible = "fsl,diu";
|
||||||
|
reg = <0x2c000 100>;
|
||||||
|
interrupts = <72 2>;
|
||||||
|
interrupt-parent = <&mpic>;
|
||||||
|
};
|
||||||
|
|
||||||
|
s) Freescale on board FPGA
|
||||||
|
|
||||||
|
This is the memory-mapped registers for on board FPGA.
|
||||||
|
|
||||||
|
Required properities:
|
||||||
|
- compatible : should be "fsl,fpga-pixis".
|
||||||
|
- reg : should contain the address and the lenght of the FPPGA register
|
||||||
|
set.
|
||||||
|
|
||||||
|
Example (MPC8610HPCD)
|
||||||
|
board-control@e8000000 {
|
||||||
|
compatible = "fsl,fpga-pixis";
|
||||||
|
reg = <0xe8000000 32>;
|
||||||
|
};
|
||||||
|
|
||||||
|
r) MDIO on GPIOs
|
||||||
|
|
||||||
|
Currently defined compatibles:
|
||||||
|
- virtual,gpio-mdio
|
||||||
|
|
||||||
|
MDC and MDIO lines connected to GPIO controllers are listed in the
|
||||||
|
gpios property as described in section VIII.1 in the following order:
|
||||||
|
|
||||||
|
MDC, MDIO.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
mdio {
|
||||||
|
compatible = "virtual,mdio-gpio";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
gpios = <&qe_pio_a 11
|
||||||
|
&qe_pio_c 6>;
|
||||||
|
};
|
||||||
|
|
||||||
|
s) SPI (Serial Peripheral Interface) busses
|
||||||
|
|
||||||
|
SPI busses can be described with a node for the SPI master device
|
||||||
|
and a set of child nodes for each SPI slave on the bus. For this
|
||||||
|
discussion, it is assumed that the system's SPI controller is in
|
||||||
|
SPI master mode. This binding does not describe SPI controllers
|
||||||
|
in slave mode.
|
||||||
|
|
||||||
|
The SPI master node requires the following properties:
|
||||||
|
- #address-cells - number of cells required to define a chip select
|
||||||
|
address on the SPI bus.
|
||||||
|
- #size-cells - should be zero.
|
||||||
|
- compatible - name of SPI bus controller following generic names
|
||||||
|
recommended practice.
|
||||||
|
No other properties are required in the SPI bus node. It is assumed
|
||||||
|
that a driver for an SPI bus device will understand that it is an SPI bus.
|
||||||
|
However, the binding does not attempt to define the specific method for
|
||||||
|
assigning chip select numbers. Since SPI chip select configuration is
|
||||||
|
flexible and non-standardized, it is left out of this binding with the
|
||||||
|
assumption that board specific platform code will be used to manage
|
||||||
|
chip selects. Individual drivers can define additional properties to
|
||||||
|
support describing the chip select layout.
|
||||||
|
|
||||||
|
SPI slave nodes must be children of the SPI master node and can
|
||||||
|
contain the following properties.
|
||||||
|
- reg - (required) chip select address of device.
|
||||||
|
- compatible - (required) name of SPI device following generic names
|
||||||
|
recommended practice
|
||||||
|
- spi-max-frequency - (required) Maximum SPI clocking speed of device in Hz
|
||||||
|
- spi-cpol - (optional) Empty property indicating device requires
|
||||||
|
inverse clock polarity (CPOL) mode
|
||||||
|
- spi-cpha - (optional) Empty property indicating device requires
|
||||||
|
shifted clock phase (CPHA) mode
|
||||||
|
|
||||||
|
SPI example for an MPC5200 SPI bus:
|
||||||
|
spi@f00 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi";
|
||||||
|
reg = <0xf00 0x20>;
|
||||||
|
interrupts = <2 13 0 2 14 0>;
|
||||||
|
interrupt-parent = <&mpc5200_pic>;
|
||||||
|
|
||||||
|
ethernet-switch@0 {
|
||||||
|
compatible = "micrel,ks8995m";
|
||||||
|
spi-max-frequency = <1000000>;
|
||||||
|
reg = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
codec@1 {
|
||||||
|
compatible = "ti,tlv320aic26";
|
||||||
|
spi-max-frequency = <100000>;
|
||||||
|
reg = <1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
VII - Marvell Discovery mv64[345]6x System Controller chips
|
VII - Marvell Discovery mv64[345]6x System Controller chips
|
||||||
===========================================================
|
===========================================================
|
||||||
|
|
||||||
|
@ -1828,7 +1953,7 @@ prefixed with the string "marvell,", for Marvell Technology Group Ltd.
|
||||||
1) The /system-controller node
|
1) The /system-controller node
|
||||||
|
|
||||||
This node is used to represent the system-controller and must be
|
This node is used to represent the system-controller and must be
|
||||||
present when the system uses a system contller chip. The top-level
|
present when the system uses a system controller chip. The top-level
|
||||||
system-controller node contains information that is global to all
|
system-controller node contains information that is global to all
|
||||||
devices within the system controller chip. The node name begins
|
devices within the system controller chip. The node name begins
|
||||||
with "system-controller" followed by the unit address, which is
|
with "system-controller" followed by the unit address, which is
|
||||||
|
@ -2422,8 +2547,8 @@ encodings listed below:
|
||||||
2 = high to low edge sensitive type enabled
|
2 = high to low edge sensitive type enabled
|
||||||
3 = low to high edge sensitive type enabled
|
3 = low to high edge sensitive type enabled
|
||||||
|
|
||||||
VIII - Specifying GPIO information for devices
|
IX - Specifying GPIO information for devices
|
||||||
==============================================
|
============================================
|
||||||
|
|
||||||
1) gpios property
|
1) gpios property
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -2471,116 +2596,151 @@ Example of two SOC GPIO banks defined as gpio-controller nodes:
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
X - Specifying Device Power Management Information (sleep property)
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
Devices on SOCs often have mechanisms for placing devices into low-power
|
||||||
|
states that are decoupled from the devices' own register blocks. Sometimes,
|
||||||
|
this information is more complicated than a cell-index property can
|
||||||
|
reasonably describe. Thus, each device controlled in such a manner
|
||||||
|
may contain a "sleep" property which describes these connections.
|
||||||
|
|
||||||
|
The sleep property consists of one or more sleep resources, each of
|
||||||
|
which consists of a phandle to a sleep controller, followed by a
|
||||||
|
controller-specific sleep specifier of zero or more cells.
|
||||||
|
|
||||||
|
The semantics of what type of low power modes are possible are defined
|
||||||
|
by the sleep controller. Some examples of the types of low power modes
|
||||||
|
that may be supported are:
|
||||||
|
|
||||||
|
- Dynamic: The device may be disabled or enabled at any time.
|
||||||
|
- System Suspend: The device may request to be disabled or remain
|
||||||
|
awake during system suspend, but will not be disabled until then.
|
||||||
|
- Permanent: The device is disabled permanently (until the next hard
|
||||||
|
reset).
|
||||||
|
|
||||||
|
Some devices may share a clock domain with each other, such that they should
|
||||||
|
only be suspended when none of the devices are in use. Where reasonable,
|
||||||
|
such nodes should be placed on a virtual bus, where the bus has the sleep
|
||||||
|
property. If the clock domain is shared among devices that cannot be
|
||||||
|
reasonably grouped in this manner, then create a virtual sleep controller
|
||||||
|
(similar to an interrupt nexus, except that defining a standardized
|
||||||
|
sleep-map should wait until its necessity is demonstrated).
|
||||||
|
|
||||||
Appendix A - Sample SOC node for MPC8540
|
Appendix A - Sample SOC node for MPC8540
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
Note that the #address-cells and #size-cells for the SoC node
|
soc@e0000000 {
|
||||||
in this example have been explicitly listed; these are likely
|
|
||||||
not necessary as they are usually the same as the root node.
|
|
||||||
|
|
||||||
soc8540@e0000000 {
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
#interrupt-cells = <2>;
|
compatible = "fsl,mpc8540-ccsr", "simple-bus";
|
||||||
device_type = "soc";
|
device_type = "soc";
|
||||||
ranges = <00000000 e0000000 00100000>
|
ranges = <0x00000000 0xe0000000 0x00100000>
|
||||||
reg = <e0000000 00003000>;
|
|
||||||
bus-frequency = <0>;
|
bus-frequency = <0>;
|
||||||
|
interrupt-parent = <&pic>;
|
||||||
mdio@24520 {
|
|
||||||
reg = <24520 20>;
|
|
||||||
device_type = "mdio";
|
|
||||||
compatible = "gianfar";
|
|
||||||
|
|
||||||
ethernet-phy@0 {
|
|
||||||
linux,phandle = <2452000>
|
|
||||||
interrupt-parent = <40000>;
|
|
||||||
interrupts = <35 1>;
|
|
||||||
reg = <0>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet-phy@1 {
|
|
||||||
linux,phandle = <2452001>
|
|
||||||
interrupt-parent = <40000>;
|
|
||||||
interrupts = <35 1>;
|
|
||||||
reg = <1>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet-phy@3 {
|
|
||||||
linux,phandle = <2452002>
|
|
||||||
interrupt-parent = <40000>;
|
|
||||||
interrupts = <35 1>;
|
|
||||||
reg = <3>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet@24000 {
|
ethernet@24000 {
|
||||||
#size-cells = <0>;
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "TSEC";
|
model = "TSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar", "simple-bus";
|
||||||
reg = <24000 1000>;
|
reg = <0x24000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 00 ];
|
local-mac-address = [ 00 E0 0C 00 73 00 ];
|
||||||
interrupts = <d 3 e 3 12 3>;
|
interrupts = <29 2 30 2 34 2>;
|
||||||
interrupt-parent = <40000>;
|
phy-handle = <&phy0>;
|
||||||
phy-handle = <2452000>;
|
sleep = <&pmc 00000080>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
mdio@24520 {
|
||||||
|
reg = <0x24520 0x20>;
|
||||||
|
compatible = "fsl,gianfar-mdio";
|
||||||
|
|
||||||
|
phy0: ethernet-phy@0 {
|
||||||
|
interrupts = <5 1>;
|
||||||
|
reg = <0>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
|
||||||
|
phy1: ethernet-phy@1 {
|
||||||
|
interrupts = <5 1>;
|
||||||
|
reg = <1>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
|
||||||
|
phy3: ethernet-phy@3 {
|
||||||
|
interrupts = <7 1>;
|
||||||
|
reg = <3>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@25000 {
|
ethernet@25000 {
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "TSEC";
|
model = "TSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar";
|
||||||
reg = <25000 1000>;
|
reg = <0x25000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 01 ];
|
local-mac-address = [ 00 E0 0C 00 73 01 ];
|
||||||
interrupts = <13 3 14 3 18 3>;
|
interrupts = <13 2 14 2 18 2>;
|
||||||
interrupt-parent = <40000>;
|
phy-handle = <&phy1>;
|
||||||
phy-handle = <2452001>;
|
sleep = <&pmc 00000040>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@26000 {
|
ethernet@26000 {
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "FEC";
|
model = "FEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar";
|
||||||
reg = <26000 1000>;
|
reg = <0x26000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 02 ];
|
local-mac-address = [ 00 E0 0C 00 73 02 ];
|
||||||
interrupts = <19 3>;
|
interrupts = <41 2>;
|
||||||
interrupt-parent = <40000>;
|
phy-handle = <&phy3>;
|
||||||
phy-handle = <2452002>;
|
sleep = <&pmc 00000020>;
|
||||||
};
|
};
|
||||||
|
|
||||||
serial@4500 {
|
serial@4500 {
|
||||||
device_type = "serial";
|
#address-cells = <1>;
|
||||||
compatible = "ns16550";
|
#size-cells = <1>;
|
||||||
reg = <4500 100>;
|
compatible = "fsl,mpc8540-duart", "simple-bus";
|
||||||
clock-frequency = <0>;
|
sleep = <&pmc 00000002>;
|
||||||
interrupts = <1a 3>;
|
ranges;
|
||||||
interrupt-parent = <40000>;
|
|
||||||
|
serial@4500 {
|
||||||
|
device_type = "serial";
|
||||||
|
compatible = "ns16550";
|
||||||
|
reg = <0x4500 0x100>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
interrupts = <42 2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
serial@4600 {
|
||||||
|
device_type = "serial";
|
||||||
|
compatible = "ns16550";
|
||||||
|
reg = <0x4600 0x100>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
interrupts = <42 2>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pic@40000 {
|
pic: pic@40000 {
|
||||||
linux,phandle = <40000>;
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#address-cells = <0>;
|
#address-cells = <0>;
|
||||||
reg = <40000 40000>;
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x40000 0x40000>;
|
||||||
compatible = "chrp,open-pic";
|
compatible = "chrp,open-pic";
|
||||||
device_type = "open-pic";
|
device_type = "open-pic";
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c@3000 {
|
i2c@3000 {
|
||||||
interrupt-parent = <40000>;
|
interrupts = <43 2>;
|
||||||
interrupts = <1b 3>;
|
reg = <0x3000 0x100>;
|
||||||
reg = <3000 18>;
|
|
||||||
device_type = "i2c";
|
|
||||||
compatible = "fsl-i2c";
|
compatible = "fsl-i2c";
|
||||||
dfsrr;
|
dfsrr;
|
||||||
|
sleep = <&pmc 00000004>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pmc: power@e0070 {
|
||||||
|
compatible = "fsl,mpc8540-pmc", "fsl,mpc8548-pmc";
|
||||||
|
reg = <0xe0070 0x20>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
Every GPIO controller node must have #gpio-cells property defined,
|
||||||
|
this information will be used to translate gpio-specifiers.
|
||||||
|
|
||||||
|
On CPM1 devices, all ports are using slightly different register layouts.
|
||||||
|
Ports A, C and D are 16bit ports and Ports B and E are 32bit ports.
|
||||||
|
|
||||||
|
On CPM2 devices, all ports are 32bit ports and use a common register layout.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : "fsl,cpm1-pario-bank-a", "fsl,cpm1-pario-bank-b",
|
||||||
|
"fsl,cpm1-pario-bank-c", "fsl,cpm1-pario-bank-d",
|
||||||
|
"fsl,cpm1-pario-bank-e", "fsl,cpm2-pario-bank"
|
||||||
|
- #gpio-cells : Should be two. The first cell is the pin number and the
|
||||||
|
second cell is used to specify optional paramters (currently unused).
|
||||||
|
- gpio-controller : Marks the port as GPIO controller.
|
||||||
|
|
||||||
|
Example of three SOC GPIO banks defined as gpio-controller nodes:
|
||||||
|
|
||||||
|
CPM1_PIO_A: gpio-controller@950 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,cpm1-pario-bank-a";
|
||||||
|
reg = <0x950 0x10>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPM1_PIO_B: gpio-controller@ab8 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,cpm1-pario-bank-b";
|
||||||
|
reg = <0xab8 0x10>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPM1_PIO_E: gpio-controller@ac8 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,cpm1-pario-bank-e";
|
||||||
|
reg = <0xac8 0x18>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
|
@ -1,22 +1,37 @@
|
||||||
* USB (Universal Serial Bus Controller)
|
Freescale QUICC Engine USB Controller
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : could be "qe_udc" or "fhci-hcd".
|
- compatible : should be "fsl,<chip>-qe-usb", "fsl,mpc8323-qe-usb".
|
||||||
- mode : the could be "host" or "slave".
|
- reg : the first two cells should contain usb registers location and
|
||||||
- reg : Offset and length of the register set for the device
|
length, the next two two cells should contain PRAM location and
|
||||||
- interrupts : <a b> where a is the interrupt number and b is a
|
length.
|
||||||
field that represents an encoding of the sense and level
|
- interrupts : should contain USB interrupt.
|
||||||
information for the interrupt. This should be encoded based on
|
- interrupt-parent : interrupt source phandle.
|
||||||
the information in section 2) depending on the type of interrupt
|
- fsl,fullspeed-clock : specifies the full speed USB clock source:
|
||||||
controller you have.
|
"none": clock source is disabled
|
||||||
- interrupt-parent : the phandle for the interrupt controller that
|
"brg1" through "brg16": clock source is BRG1-BRG16, respectively
|
||||||
services interrupts for this device.
|
"clk1" through "clk24": clock source is CLK1-CLK24, respectively
|
||||||
|
- fsl,lowspeed-clock : specifies the low speed USB clock source:
|
||||||
|
"none": clock source is disabled
|
||||||
|
"brg1" through "brg16": clock source is BRG1-BRG16, respectively
|
||||||
|
"clk1" through "clk24": clock source is CLK1-CLK24, respectively
|
||||||
|
- hub-power-budget : USB power budget for the root hub, in mA.
|
||||||
|
- gpios : should specify GPIOs in this order: USBOE, USBTP, USBTN, USBRP,
|
||||||
|
USBRN, SPEED (optional), and POWER (optional).
|
||||||
|
|
||||||
Example(slave):
|
Example:
|
||||||
usb@6c0 {
|
|
||||||
compatible = "qe_udc";
|
usb@6c0 {
|
||||||
reg = <6c0 40>;
|
compatible = "fsl,mpc8360-qe-usb", "fsl,mpc8323-qe-usb";
|
||||||
interrupts = <8b 0>;
|
reg = <0x6c0 0x40 0x8b00 0x100>;
|
||||||
interrupt-parent = <700>;
|
interrupts = <11>;
|
||||||
mode = "slave";
|
interrupt-parent = <&qeic>;
|
||||||
};
|
fsl,fullspeed-clock = "clk21";
|
||||||
|
gpios = <&qe_pio_b 2 0 /* USBOE */
|
||||||
|
&qe_pio_b 3 0 /* USBTP */
|
||||||
|
&qe_pio_b 8 0 /* USBTN */
|
||||||
|
&qe_pio_b 9 0 /* USBRP */
|
||||||
|
&qe_pio_b 11 0 /* USBRN */
|
||||||
|
&qe_pio_e 20 0 /* SPEED */
|
||||||
|
&qe_pio_e 21 0 /* POWER */>;
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
Freescale MPC8349E-mITX-compatible Power Management Micro Controller Unit (MCU)
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : "fsl,<mcu-chip>-<board>", "fsl,mcu-mpc8349emitx".
|
||||||
|
- reg : should specify I2C address (0x0a).
|
||||||
|
- #gpio-cells : should be 2.
|
||||||
|
- gpio-controller : should be present.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
mcu@0a {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,mc9s08qg8-mpc8349emitx",
|
||||||
|
"fsl,mcu-mpc8349emitx";
|
||||||
|
reg = <0x0a>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
|
@ -0,0 +1,63 @@
|
||||||
|
* Power Management Controller
|
||||||
|
|
||||||
|
Properties:
|
||||||
|
- compatible: "fsl,<chip>-pmc".
|
||||||
|
|
||||||
|
"fsl,mpc8349-pmc" should be listed for any chip whose PMC is
|
||||||
|
compatible. "fsl,mpc8313-pmc" should also be listed for any chip
|
||||||
|
whose PMC is compatible, and implies deep-sleep capability.
|
||||||
|
|
||||||
|
"fsl,mpc8548-pmc" should be listed for any chip whose PMC is
|
||||||
|
compatible. "fsl,mpc8536-pmc" should also be listed for any chip
|
||||||
|
whose PMC is compatible, and implies deep-sleep capability.
|
||||||
|
|
||||||
|
"fsl,mpc8641d-pmc" should be listed for any chip whose PMC is
|
||||||
|
compatible; all statements below that apply to "fsl,mpc8548-pmc" also
|
||||||
|
apply to "fsl,mpc8641d-pmc".
|
||||||
|
|
||||||
|
Compatibility does not include bit assigments in SCCR/PMCDR/DEVDISR; these
|
||||||
|
bit assigments are indicated via the sleep specifier in each device's
|
||||||
|
sleep property.
|
||||||
|
|
||||||
|
- reg: For devices compatible with "fsl,mpc8349-pmc", the first resource
|
||||||
|
is the PMC block, and the second resource is the Clock Configuration
|
||||||
|
block.
|
||||||
|
|
||||||
|
For devices compatible with "fsl,mpc8548-pmc", the first resource
|
||||||
|
is a 32-byte block beginning with DEVDISR.
|
||||||
|
|
||||||
|
- interrupts: For "fsl,mpc8349-pmc"-compatible devices, the first
|
||||||
|
resource is the PMC block interrupt.
|
||||||
|
|
||||||
|
- fsl,mpc8313-wakeup-timer: For "fsl,mpc8313-pmc"-compatible devices,
|
||||||
|
this is a phandle to an "fsl,gtm" node on which timer 4 can be used as
|
||||||
|
a wakeup source from deep sleep.
|
||||||
|
|
||||||
|
Sleep specifiers:
|
||||||
|
|
||||||
|
fsl,mpc8349-pmc: Sleep specifiers consist of one cell. For each bit
|
||||||
|
that is set in the cell, the corresponding bit in SCCR will be saved
|
||||||
|
and cleared on suspend, and restored on resume. This sleep controller
|
||||||
|
supports disabling and resuming devices at any time.
|
||||||
|
|
||||||
|
fsl,mpc8536-pmc: Sleep specifiers consist of three cells, the third of
|
||||||
|
which will be ORed into PMCDR upon suspend, and cleared from PMCDR
|
||||||
|
upon resume. The first two cells are as described for fsl,mpc8578-pmc.
|
||||||
|
This sleep controller only supports disabling devices during system
|
||||||
|
sleep, or permanently.
|
||||||
|
|
||||||
|
fsl,mpc8548-pmc: Sleep specifiers consist of one or two cells, the
|
||||||
|
first of which will be ORed into DEVDISR (and the second into
|
||||||
|
DEVDISR2, if present -- this cell should be zero or absent if the
|
||||||
|
hardware does not have DEVDISR2) upon a request for permanent device
|
||||||
|
disabling. This sleep controller does not support configuring devices
|
||||||
|
to disable during system sleep (unless supported by another compatible
|
||||||
|
match), or dynamically.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
power@b00 {
|
||||||
|
compatible = "fsl,mpc8313-pmc", "fsl,mpc8349-pmc";
|
||||||
|
reg = <0xb00 0x100 0xa00 0x100>;
|
||||||
|
interrupts = <80 8>;
|
||||||
|
};
|
|
@ -24,46 +24,39 @@ Example:
|
||||||
|
|
||||||
* Gianfar-compatible ethernet nodes
|
* Gianfar-compatible ethernet nodes
|
||||||
|
|
||||||
Required properties:
|
Properties:
|
||||||
|
|
||||||
- device_type : Should be "network"
|
- device_type : Should be "network"
|
||||||
- model : Model of the device. Can be "TSEC", "eTSEC", or "FEC"
|
- model : Model of the device. Can be "TSEC", "eTSEC", or "FEC"
|
||||||
- compatible : Should be "gianfar"
|
- compatible : Should be "gianfar"
|
||||||
- reg : Offset and length of the register set for the device
|
- reg : Offset and length of the register set for the device
|
||||||
- mac-address : List of bytes representing the ethernet address of
|
- local-mac-address : List of bytes representing the ethernet address of
|
||||||
this controller
|
this controller
|
||||||
- interrupts : <a b> where a is the interrupt number and b is a
|
- interrupts : For FEC devices, the first interrupt is the device's
|
||||||
field that represents an encoding of the sense and level
|
interrupt. For TSEC and eTSEC devices, the first interrupt is
|
||||||
information for the interrupt. This should be encoded based on
|
transmit, the second is receive, and the third is error.
|
||||||
the information in section 2) depending on the type of interrupt
|
|
||||||
controller you have.
|
|
||||||
- interrupt-parent : the phandle for the interrupt controller that
|
|
||||||
services interrupts for this device.
|
|
||||||
- phy-handle : The phandle for the PHY connected to this ethernet
|
- phy-handle : The phandle for the PHY connected to this ethernet
|
||||||
controller.
|
controller.
|
||||||
- fixed-link : <a b c d e> where a is emulated phy id - choose any,
|
- fixed-link : <a b c d e> where a is emulated phy id - choose any,
|
||||||
but unique to the all specified fixed-links, b is duplex - 0 half,
|
but unique to the all specified fixed-links, b is duplex - 0 half,
|
||||||
1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
|
1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
|
||||||
pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
|
pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
|
||||||
|
|
||||||
Recommended properties:
|
|
||||||
|
|
||||||
- phy-connection-type : a string naming the controller/PHY interface type,
|
- phy-connection-type : a string naming the controller/PHY interface type,
|
||||||
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
|
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
|
||||||
"tbi", or "rtbi". This property is only really needed if the connection
|
"tbi", or "rtbi". This property is only really needed if the connection
|
||||||
is of type "rgmii-id", as all other connection types are detected by
|
is of type "rgmii-id", as all other connection types are detected by
|
||||||
hardware.
|
hardware.
|
||||||
|
- fsl,magic-packet : If present, indicates that the hardware supports
|
||||||
|
waking up via magic packet.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
ethernet@24000 {
|
ethernet@24000 {
|
||||||
#size-cells = <0>;
|
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "TSEC";
|
model = "TSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar";
|
||||||
reg = <24000 1000>;
|
reg = <0x24000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 00 ];
|
local-mac-address = [ 00 E0 0C 00 73 00 ];
|
||||||
interrupts = <d 3 e 3 12 3>;
|
interrupts = <29 2 30 2 34 2>;
|
||||||
interrupt-parent = <40000>;
|
interrupt-parent = <&mpic>;
|
||||||
phy-handle = <2452000>
|
phy-handle = <&phy0>
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
Freescale Localbus UPM programmed to work with NAND flash
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : "fsl,upm-nand".
|
||||||
|
- reg : should specify localbus chip select and size used for the chip.
|
||||||
|
- fsl,upm-addr-offset : UPM pattern offset for the address latch.
|
||||||
|
- fsl,upm-cmd-offset : UPM pattern offset for the command latch.
|
||||||
|
- gpios : may specify optional GPIO connected to the Ready-Not-Busy pin.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
upm@1,0 {
|
||||||
|
compatible = "fsl,upm-nand";
|
||||||
|
reg = <1 0 1>;
|
||||||
|
fsl,upm-addr-offset = <16>;
|
||||||
|
fsl,upm-cmd-offset = <8>;
|
||||||
|
gpios = <&qe_pio_e 18 0>;
|
||||||
|
|
||||||
|
flash {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "...";
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,15 @@
|
||||||
|
LED connected to GPIO
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : should be "gpio-led".
|
||||||
|
- label : (optional) the label for this LED. If omitted, the label is
|
||||||
|
taken from the node name (excluding the unit address).
|
||||||
|
- gpios : should specify LED GPIO.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
led@0 {
|
||||||
|
compatible = "gpio-led";
|
||||||
|
label = "hdd";
|
||||||
|
gpios = <&mcu_pio 0 1>;
|
||||||
|
};
|
|
@ -217,7 +217,7 @@ Although it is not recommended, you can specify '0' in the soc.model
|
||||||
field to skip matching SOCs altogether.
|
field to skip matching SOCs altogether.
|
||||||
|
|
||||||
The 'model' field is a 16-bit number that matches the actual SOC. The
|
The 'model' field is a 16-bit number that matches the actual SOC. The
|
||||||
'major' and 'minor' fields are the major and minor revision numbrs,
|
'major' and 'minor' fields are the major and minor revision numbers,
|
||||||
respectively, of the SOC.
|
respectively, of the SOC.
|
||||||
|
|
||||||
For example, to match the 8323, revision 1.0:
|
For example, to match the 8323, revision 1.0:
|
||||||
|
|
|
@ -1,89 +1,528 @@
|
||||||
rfkill - RF switch subsystem support
|
rfkill - RF switch subsystem support
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
1 Implementation details
|
1 Introduction
|
||||||
2 Driver support
|
2 Implementation details
|
||||||
3 Userspace support
|
3 Kernel driver guidelines
|
||||||
|
3.1 wireless device drivers
|
||||||
|
3.2 platform/switch drivers
|
||||||
|
3.3 input device drivers
|
||||||
|
4 Kernel API
|
||||||
|
5 Userspace support
|
||||||
|
|
||||||
|
|
||||||
|
1. Introduction:
|
||||||
|
|
||||||
|
The rfkill switch subsystem exists to add a generic interface to circuitry that
|
||||||
|
can enable or disable the signal output of a wireless *transmitter* of any
|
||||||
|
type. By far, the most common use is to disable radio-frequency transmitters.
|
||||||
|
|
||||||
|
Note that disabling the signal output means that the the transmitter is to be
|
||||||
|
made to not emit any energy when "blocked". rfkill is not about blocking data
|
||||||
|
transmissions, it is about blocking energy emission.
|
||||||
|
|
||||||
|
The rfkill subsystem offers support for keys and switches often found on
|
||||||
|
laptops to enable wireless devices like WiFi and Bluetooth, so that these keys
|
||||||
|
and switches actually perform an action in all wireless devices of a given type
|
||||||
|
attached to the system.
|
||||||
|
|
||||||
|
The buttons to enable and disable the wireless transmitters are important in
|
||||||
|
situations where the user is for example using his laptop on a location where
|
||||||
|
radio-frequency transmitters _must_ be disabled (e.g. airplanes).
|
||||||
|
|
||||||
|
Because of this requirement, userspace support for the keys should not be made
|
||||||
|
mandatory. Because userspace might want to perform some additional smarter
|
||||||
|
tasks when the key is pressed, rfkill provides userspace the possibility to
|
||||||
|
take over the task to handle the key events.
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
1: Implementation details
|
2: Implementation details
|
||||||
|
|
||||||
The rfkill switch subsystem offers support for keys often found on laptops
|
The rfkill subsystem is composed of various components: the rfkill class, the
|
||||||
to enable wireless devices like WiFi and Bluetooth.
|
rfkill-input module (an input layer handler), and some specific input layer
|
||||||
|
events.
|
||||||
|
|
||||||
This is done by providing the user 3 possibilities:
|
The rfkill class provides kernel drivers with an interface that allows them to
|
||||||
1 - The rfkill system handles all events; userspace is not aware of events.
|
know when they should enable or disable a wireless network device transmitter.
|
||||||
2 - The rfkill system handles all events; userspace is informed about the events.
|
This is enabled by the CONFIG_RFKILL Kconfig option.
|
||||||
3 - The rfkill system does not handle events; userspace handles all events.
|
|
||||||
|
|
||||||
The buttons to enable and disable the wireless radios are important in
|
The rfkill class support makes sure userspace will be notified of all state
|
||||||
situations where the user is for example using his laptop on a location where
|
changes on rfkill devices through uevents. It provides a notification chain
|
||||||
wireless radios _must_ be disabled (e.g. airplanes).
|
for interested parties in the kernel to also get notified of rfkill state
|
||||||
Because of this requirement, userspace support for the keys should not be
|
changes in other drivers. It creates several sysfs entries which can be used
|
||||||
made mandatory. Because userspace might want to perform some additional smarter
|
by userspace. See section "Userspace support".
|
||||||
tasks when the key is pressed, rfkill still provides userspace the possibility
|
|
||||||
to take over the task to handle the key events.
|
|
||||||
|
|
||||||
The system inside the kernel has been split into 2 separate sections:
|
The rfkill-input module provides the kernel with the ability to implement a
|
||||||
1 - RFKILL
|
basic response when the user presses a key or button (or toggles a switch)
|
||||||
2 - RFKILL_INPUT
|
related to rfkill functionality. It is an in-kernel implementation of default
|
||||||
|
policy of reacting to rfkill-related input events and neither mandatory nor
|
||||||
|
required for wireless drivers to operate. It is enabled by the
|
||||||
|
CONFIG_RFKILL_INPUT Kconfig option.
|
||||||
|
|
||||||
The first option enables rfkill support and will make sure userspace will
|
rfkill-input is a rfkill-related events input layer handler. This handler will
|
||||||
be notified of any events through the input device. It also creates several
|
listen to all rfkill key events and will change the rfkill state of the
|
||||||
sysfs entries which can be used by userspace. See section "Userspace support".
|
wireless devices accordingly. With this option enabled userspace could either
|
||||||
|
do nothing or simply perform monitoring tasks.
|
||||||
|
|
||||||
The second option provides an rfkill input handler. This handler will
|
The rfkill-input module also provides EPO (emergency power-off) functionality
|
||||||
listen to all rfkill key events and will toggle the radio accordingly.
|
for all wireless transmitters. This function cannot be overridden, and it is
|
||||||
With this option enabled userspace could either do nothing or simply
|
always active. rfkill EPO is related to *_RFKILL_ALL input layer events.
|
||||||
perform monitoring tasks.
|
|
||||||
|
|
||||||
|
|
||||||
|
Important terms for the rfkill subsystem:
|
||||||
|
|
||||||
|
In order to avoid confusion, we avoid the term "switch" in rfkill when it is
|
||||||
|
referring to an electronic control circuit that enables or disables a
|
||||||
|
transmitter. We reserve it for the physical device a human manipulates
|
||||||
|
(which is an input device, by the way):
|
||||||
|
|
||||||
|
rfkill switch:
|
||||||
|
|
||||||
|
A physical device a human manipulates. Its state can be perceived by
|
||||||
|
the kernel either directly (through a GPIO pin, ACPI GPE) or by its
|
||||||
|
effect on a rfkill line of a wireless device.
|
||||||
|
|
||||||
|
rfkill controller:
|
||||||
|
|
||||||
|
A hardware circuit that controls the state of a rfkill line, which a
|
||||||
|
kernel driver can interact with *to modify* that state (i.e. it has
|
||||||
|
either write-only or read/write access).
|
||||||
|
|
||||||
|
rfkill line:
|
||||||
|
|
||||||
|
An input channel (hardware or software) of a wireless device, which
|
||||||
|
causes a wireless transmitter to stop emitting energy (BLOCK) when it
|
||||||
|
is active. Point of view is extremely important here: rfkill lines are
|
||||||
|
always seen from the PoV of a wireless device (and its driver).
|
||||||
|
|
||||||
|
soft rfkill line/software rfkill line:
|
||||||
|
|
||||||
|
A rfkill line the wireless device driver can directly change the state
|
||||||
|
of. Related to rfkill_state RFKILL_STATE_SOFT_BLOCKED.
|
||||||
|
|
||||||
|
hard rfkill line/hardware rfkill line:
|
||||||
|
|
||||||
|
A rfkill line that works fully in hardware or firmware, and that cannot
|
||||||
|
be overridden by the kernel driver. The hardware device or the
|
||||||
|
firmware just exports its status to the driver, but it is read-only.
|
||||||
|
Related to rfkill_state RFKILL_STATE_HARD_BLOCKED.
|
||||||
|
|
||||||
|
The enum rfkill_state describes the rfkill state of a transmitter:
|
||||||
|
|
||||||
|
When a rfkill line or rfkill controller is in the RFKILL_STATE_UNBLOCKED state,
|
||||||
|
the wireless transmitter (radio TX circuit for example) is *enabled*. When the
|
||||||
|
it is in the RFKILL_STATE_SOFT_BLOCKED or RFKILL_STATE_HARD_BLOCKED, the
|
||||||
|
wireless transmitter is to be *blocked* from operating.
|
||||||
|
|
||||||
|
RFKILL_STATE_SOFT_BLOCKED indicates that a call to toggle_radio() can change
|
||||||
|
that state. RFKILL_STATE_HARD_BLOCKED indicates that a call to toggle_radio()
|
||||||
|
will not be able to change the state and will return with a suitable error if
|
||||||
|
attempts are made to set the state to RFKILL_STATE_UNBLOCKED.
|
||||||
|
|
||||||
|
RFKILL_STATE_HARD_BLOCKED is used by drivers to signal that the device is
|
||||||
|
locked in the BLOCKED state by a hardwire rfkill line (typically an input pin
|
||||||
|
that, when active, forces the transmitter to be disabled) which the driver
|
||||||
|
CANNOT override.
|
||||||
|
|
||||||
|
Full rfkill functionality requires two different subsystems to cooperate: the
|
||||||
|
input layer and the rfkill class. The input layer issues *commands* to the
|
||||||
|
entire system requesting that devices registered to the rfkill class change
|
||||||
|
state. The way this interaction happens is not complex, but it is not obvious
|
||||||
|
either:
|
||||||
|
|
||||||
|
Kernel Input layer:
|
||||||
|
|
||||||
|
* Generates KEY_WWAN, KEY_WLAN, KEY_BLUETOOTH, SW_RFKILL_ALL, and
|
||||||
|
other such events when the user presses certain keys, buttons, or
|
||||||
|
toggles certain physical switches.
|
||||||
|
|
||||||
|
THE INPUT LAYER IS NEVER USED TO PROPAGATE STATUS, NOTIFICATIONS OR THE
|
||||||
|
KIND OF STUFF AN ON-SCREEN-DISPLAY APPLICATION WOULD REPORT. It is
|
||||||
|
used to issue *commands* for the system to change behaviour, and these
|
||||||
|
commands may or may not be carried out by some kernel driver or
|
||||||
|
userspace application. It follows that doing user feedback based only
|
||||||
|
on input events is broken, as there is no guarantee that an input event
|
||||||
|
will be acted upon.
|
||||||
|
|
||||||
|
Most wireless communication device drivers implementing rfkill
|
||||||
|
functionality MUST NOT generate these events, and have no reason to
|
||||||
|
register themselves with the input layer. Doing otherwise is a common
|
||||||
|
misconception. There is an API to propagate rfkill status change
|
||||||
|
information, and it is NOT the input layer.
|
||||||
|
|
||||||
|
rfkill class:
|
||||||
|
|
||||||
|
* Calls a hook in a driver to effectively change the wireless
|
||||||
|
transmitter state;
|
||||||
|
* Keeps track of the wireless transmitter state (with help from
|
||||||
|
the driver);
|
||||||
|
* Generates userspace notifications (uevents) and a call to a
|
||||||
|
notification chain (kernel) when there is a wireless transmitter
|
||||||
|
state change;
|
||||||
|
* Connects a wireless communications driver with the common rfkill
|
||||||
|
control system, which, for example, allows actions such as
|
||||||
|
"switch all bluetooth devices offline" to be carried out by
|
||||||
|
userspace or by rfkill-input.
|
||||||
|
|
||||||
|
THE RFKILL CLASS NEVER ISSUES INPUT EVENTS. THE RFKILL CLASS DOES
|
||||||
|
NOT LISTEN TO INPUT EVENTS. NO DRIVER USING THE RFKILL CLASS SHALL
|
||||||
|
EVER LISTEN TO, OR ACT ON RFKILL INPUT EVENTS. Doing otherwise is
|
||||||
|
a layering violation.
|
||||||
|
|
||||||
|
Most wireless data communication drivers in the kernel have just to
|
||||||
|
implement the rfkill class API to work properly. Interfacing to the
|
||||||
|
input layer is not often required (and is very often a *bug*) on
|
||||||
|
wireless drivers.
|
||||||
|
|
||||||
|
Platform drivers often have to attach to the input layer to *issue*
|
||||||
|
(but never to listen to) rfkill events for rfkill switches, and also to
|
||||||
|
the rfkill class to export a control interface for the platform rfkill
|
||||||
|
controllers to the rfkill subsystem. This does NOT mean the rfkill
|
||||||
|
switch is attached to a rfkill class (doing so is almost always wrong).
|
||||||
|
It just means the same kernel module is the driver for different
|
||||||
|
devices (rfkill switches and rfkill controllers).
|
||||||
|
|
||||||
|
|
||||||
|
Userspace input handlers (uevents) or kernel input handlers (rfkill-input):
|
||||||
|
|
||||||
|
* Implements the policy of what should happen when one of the input
|
||||||
|
layer events related to rfkill operation is received.
|
||||||
|
* Uses the sysfs interface (userspace) or private rfkill API calls
|
||||||
|
to tell the devices registered with the rfkill class to change
|
||||||
|
their state (i.e. translates the input layer event into real
|
||||||
|
action).
|
||||||
|
* rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0
|
||||||
|
(power off all transmitters) in a special way: it ignores any
|
||||||
|
overrides and local state cache and forces all transmitters to the
|
||||||
|
RFKILL_STATE_SOFT_BLOCKED state (including those which are already
|
||||||
|
supposed to be BLOCKED). Note that the opposite event (power on all
|
||||||
|
transmitters) is handled normally.
|
||||||
|
|
||||||
|
Userspace uevent handler or kernel platform-specific drivers hooked to the
|
||||||
|
rfkill notifier chain:
|
||||||
|
|
||||||
|
* Taps into the rfkill notifier chain or to KOBJ_CHANGE uevents,
|
||||||
|
in order to know when a device that is registered with the rfkill
|
||||||
|
class changes state;
|
||||||
|
* Issues feedback notifications to the user;
|
||||||
|
* In the rare platforms where this is required, synthesizes an input
|
||||||
|
event to command all *OTHER* rfkill devices to also change their
|
||||||
|
statues when a specific rfkill device changes state.
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
3: Kernel driver guidelines
|
||||||
|
|
||||||
|
Remember: point-of-view is everything for a driver that connects to the rfkill
|
||||||
|
subsystem. All the details below must be measured/perceived from the point of
|
||||||
|
view of the specific driver being modified.
|
||||||
|
|
||||||
|
The first thing one needs to know is whether his driver should be talking to
|
||||||
|
the rfkill class or to the input layer. In rare cases (platform drivers), it
|
||||||
|
could happen that you need to do both, as platform drivers often handle a
|
||||||
|
variety of devices in the same driver.
|
||||||
|
|
||||||
|
Do not mistake input devices for rfkill controllers. The only type of "rfkill
|
||||||
|
switch" device that is to be registered with the rfkill class are those
|
||||||
|
directly controlling the circuits that cause a wireless transmitter to stop
|
||||||
|
working (or the software equivalent of them), i.e. what we call a rfkill
|
||||||
|
controller. Every other kind of "rfkill switch" is just an input device and
|
||||||
|
MUST NOT be registered with the rfkill class.
|
||||||
|
|
||||||
|
A driver should register a device with the rfkill class when ALL of the
|
||||||
|
following conditions are met (they define a rfkill controller):
|
||||||
|
|
||||||
|
1. The device is/controls a data communications wireless transmitter;
|
||||||
|
|
||||||
|
2. The kernel can interact with the hardware/firmware to CHANGE the wireless
|
||||||
|
transmitter state (block/unblock TX operation);
|
||||||
|
|
||||||
|
3. The transmitter can be made to not emit any energy when "blocked":
|
||||||
|
rfkill is not about blocking data transmissions, it is about blocking
|
||||||
|
energy emission;
|
||||||
|
|
||||||
|
A driver should register a device with the input subsystem to issue
|
||||||
|
rfkill-related events (KEY_WLAN, KEY_BLUETOOTH, KEY_WWAN, KEY_WIMAX,
|
||||||
|
SW_RFKILL_ALL, etc) when ALL of the folowing conditions are met:
|
||||||
|
|
||||||
|
1. It is directly related to some physical device the user interacts with, to
|
||||||
|
command the O.S./firmware/hardware to enable/disable a data communications
|
||||||
|
wireless transmitter.
|
||||||
|
|
||||||
|
Examples of the physical device are: buttons, keys and switches the user
|
||||||
|
will press/touch/slide/switch to enable or disable the wireless
|
||||||
|
communication device.
|
||||||
|
|
||||||
|
2. It is NOT slaved to another device, i.e. there is no other device that
|
||||||
|
issues rfkill-related input events in preference to this one.
|
||||||
|
|
||||||
|
Please refer to the corner cases and examples section for more details.
|
||||||
|
|
||||||
|
When in doubt, do not issue input events. For drivers that should generate
|
||||||
|
input events in some platforms, but not in others (e.g. b43), the best solution
|
||||||
|
is to NEVER generate input events in the first place. That work should be
|
||||||
|
deferred to a platform-specific kernel module (which will know when to generate
|
||||||
|
events through the rfkill notifier chain) or to userspace. This avoids the
|
||||||
|
usual maintenance problems with DMI whitelisting.
|
||||||
|
|
||||||
|
|
||||||
|
Corner cases and examples:
|
||||||
====================================
|
====================================
|
||||||
2: Driver support
|
|
||||||
|
|
||||||
To build a driver with rfkill subsystem support, the driver should
|
1. If the device is an input device that, because of hardware or firmware,
|
||||||
depend on the Kconfig symbol RFKILL; it should _not_ depend on
|
causes wireless transmitters to be blocked regardless of the kernel's will, it
|
||||||
RKFILL_INPUT.
|
is still just an input device, and NOT to be registered with the rfkill class.
|
||||||
|
|
||||||
Unless key events trigger an interrupt to which the driver listens, polling
|
2. If the wireless transmitter switch control is read-only, it is an input
|
||||||
will be required to determine the key state changes. For this the input
|
device and not to be registered with the rfkill class (and maybe not to be made
|
||||||
layer providers the input-polldev handler.
|
an input layer event source either, see below).
|
||||||
|
|
||||||
A driver should implement a few steps to correctly make use of the
|
3. If there is some other device driver *closer* to the actual hardware the
|
||||||
rfkill subsystem. First for non-polling drivers:
|
user interacted with (the button/switch/key) to issue an input event, THAT is
|
||||||
|
the device driver that should be issuing input events.
|
||||||
|
|
||||||
- rfkill_allocate()
|
E.g:
|
||||||
- input_allocate_device()
|
[RFKILL slider switch] -- [GPIO hardware] -- [WLAN card rf-kill input]
|
||||||
- rfkill_register()
|
(platform driver) (wireless card driver)
|
||||||
- input_register_device()
|
|
||||||
|
|
||||||
For polling drivers:
|
The user is closer to the RFKILL slide switch plaform driver, so the driver
|
||||||
|
which must issue input events is the platform driver looking at the GPIO
|
||||||
|
hardware, and NEVER the wireless card driver (which is just a slave). It is
|
||||||
|
very likely that there are other leaves than just the WLAN card rf-kill input
|
||||||
|
(e.g. a bluetooth card, etc)...
|
||||||
|
|
||||||
- rfkill_allocate()
|
On the other hand, some embedded devices do this:
|
||||||
- input_allocate_polled_device()
|
|
||||||
- rfkill_register()
|
|
||||||
- input_register_polled_device()
|
|
||||||
|
|
||||||
When a key event has been detected, the correct event should be
|
[RFKILL slider switch] -- [WLAN card rf-kill input]
|
||||||
sent over the input device which has been registered by the driver.
|
(wireless card driver)
|
||||||
|
|
||||||
|
In this situation, the wireless card driver *could* register itself as an input
|
||||||
|
device and issue rf-kill related input events... but in order to AVOID the need
|
||||||
|
for DMI whitelisting, the wireless card driver does NOT do it. Userspace (HAL)
|
||||||
|
or a platform driver (that exists only on these embedded devices) will do the
|
||||||
|
dirty job of issuing the input events.
|
||||||
|
|
||||||
|
|
||||||
|
COMMON MISTAKES in kernel drivers, related to rfkill:
|
||||||
====================================
|
====================================
|
||||||
3: Userspace support
|
|
||||||
|
|
||||||
For each key an input device will be created which will send out the correct
|
1. NEVER confuse input device keys and buttons with input device switches.
|
||||||
key event when the rfkill key has been pressed.
|
|
||||||
|
1a. Switches are always set or reset. They report the current state
|
||||||
|
(on position or off position).
|
||||||
|
|
||||||
|
1b. Keys and buttons are either in the pressed or not-pressed state, and
|
||||||
|
that's it. A "button" that latches down when you press it, and
|
||||||
|
unlatches when you press it again is in fact a switch as far as input
|
||||||
|
devices go.
|
||||||
|
|
||||||
|
Add the SW_* events you need for switches, do NOT try to emulate a button using
|
||||||
|
KEY_* events just because there is no such SW_* event yet. Do NOT try to use,
|
||||||
|
for example, KEY_BLUETOOTH when you should be using SW_BLUETOOTH instead.
|
||||||
|
|
||||||
|
2. Input device switches (sources of EV_SW events) DO store their current state
|
||||||
|
(so you *must* initialize it by issuing a gratuitous input layer event on
|
||||||
|
driver start-up and also when resuming from sleep), and that state CAN be
|
||||||
|
queried from userspace through IOCTLs. There is no sysfs interface for this,
|
||||||
|
but that doesn't mean you should break things trying to hook it to the rfkill
|
||||||
|
class to get a sysfs interface :-)
|
||||||
|
|
||||||
|
3. Do not issue *_RFKILL_ALL events by default, unless you are sure it is the
|
||||||
|
correct event for your switch/button. These events are emergency power-off
|
||||||
|
events when they are trying to turn the transmitters off. An example of an
|
||||||
|
input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill
|
||||||
|
switch in a laptop which is NOT a hotkey, but a real switch that kills radios
|
||||||
|
in hardware, even if the O.S. has gone to lunch. An example of an input device
|
||||||
|
which SHOULD NOT generate *_RFKILL_ALL events by default, is any sort of hot
|
||||||
|
key that does nothing by itself, as well as any hot key that is type-specific
|
||||||
|
(e.g. the one for WLAN).
|
||||||
|
|
||||||
|
|
||||||
|
3.1 Guidelines for wireless device drivers
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
1. Each independent transmitter in a wireless device (usually there is only one
|
||||||
|
transmitter per device) should have a SINGLE rfkill class attached to it.
|
||||||
|
|
||||||
|
2. If the device does not have any sort of hardware assistance to allow the
|
||||||
|
driver to rfkill the device, the driver should emulate it by taking all actions
|
||||||
|
required to silence the transmitter.
|
||||||
|
|
||||||
|
3. If it is impossible to silence the transmitter (i.e. it still emits energy,
|
||||||
|
even if it is just in brief pulses, when there is no data to transmit and there
|
||||||
|
is no hardware support to turn it off) do NOT lie to the users. Do not attach
|
||||||
|
it to a rfkill class. The rfkill subsystem does not deal with data
|
||||||
|
transmission, it deals with energy emission. If the transmitter is emitting
|
||||||
|
energy, it is not blocked in rfkill terms.
|
||||||
|
|
||||||
|
4. It doesn't matter if the device has multiple rfkill input lines affecting
|
||||||
|
the same transmitter, their combined state is to be exported as a single state
|
||||||
|
per transmitter (see rule 1).
|
||||||
|
|
||||||
|
This rule exists because users of the rfkill subsystem expect to get (and set,
|
||||||
|
when possible) the overall transmitter rfkill state, not of a particular rfkill
|
||||||
|
line.
|
||||||
|
|
||||||
|
Example of a WLAN wireless driver connected to the rfkill subsystem:
|
||||||
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
|
A certain WLAN card has one input pin that causes it to block the transmitter
|
||||||
|
and makes the status of that input pin available (only for reading!) to the
|
||||||
|
kernel driver. This is a hard rfkill input line (it cannot be overridden by
|
||||||
|
the kernel driver).
|
||||||
|
|
||||||
|
The card also has one PCI register that, if manipulated by the driver, causes
|
||||||
|
it to block the transmitter. This is a soft rfkill input line.
|
||||||
|
|
||||||
|
It has also a thermal protection circuitry that shuts down its transmitter if
|
||||||
|
the card overheats, and makes the status of that protection available (only for
|
||||||
|
reading!) to the kernel driver. This is also a hard rfkill input line.
|
||||||
|
|
||||||
|
If either one of these rfkill lines are active, the transmitter is blocked by
|
||||||
|
the hardware and forced offline.
|
||||||
|
|
||||||
|
The driver should allocate and attach to its struct device *ONE* instance of
|
||||||
|
the rfkill class (there is only one transmitter).
|
||||||
|
|
||||||
|
It can implement the get_state() hook, and return RFKILL_STATE_HARD_BLOCKED if
|
||||||
|
either one of its two hard rfkill input lines are active. If the two hard
|
||||||
|
rfkill lines are inactive, it must return RFKILL_STATE_SOFT_BLOCKED if its soft
|
||||||
|
rfkill input line is active. Only if none of the rfkill input lines are
|
||||||
|
active, will it return RFKILL_STATE_UNBLOCKED.
|
||||||
|
|
||||||
|
If it doesn't implement the get_state() hook, it must make sure that its calls
|
||||||
|
to rfkill_force_state() are enough to keep the status always up-to-date, and it
|
||||||
|
must do a rfkill_force_state() on resume from sleep.
|
||||||
|
|
||||||
|
Every time the driver gets a notification from the card that one of its rfkill
|
||||||
|
lines changed state (polling might be needed on badly designed cards that don't
|
||||||
|
generate interrupts for such events), it recomputes the rfkill state as per
|
||||||
|
above, and calls rfkill_force_state() to update it.
|
||||||
|
|
||||||
|
The driver should implement the toggle_radio() hook, that:
|
||||||
|
|
||||||
|
1. Returns an error if one of the hardware rfkill lines are active, and the
|
||||||
|
caller asked for RFKILL_STATE_UNBLOCKED.
|
||||||
|
|
||||||
|
2. Activates the soft rfkill line if the caller asked for state
|
||||||
|
RFKILL_STATE_SOFT_BLOCKED. It should do this even if one of the hard rfkill
|
||||||
|
lines are active, effectively double-blocking the transmitter.
|
||||||
|
|
||||||
|
3. Deactivates the soft rfkill line if none of the hardware rfkill lines are
|
||||||
|
active and the caller asked for RFKILL_STATE_UNBLOCKED.
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
4: Kernel API
|
||||||
|
|
||||||
|
To build a driver with rfkill subsystem support, the driver should depend on
|
||||||
|
(or select) the Kconfig symbol RFKILL; it should _not_ depend on RKFILL_INPUT.
|
||||||
|
|
||||||
|
The hardware the driver talks to may be write-only (where the current state
|
||||||
|
of the hardware is unknown), or read-write (where the hardware can be queried
|
||||||
|
about its current state).
|
||||||
|
|
||||||
|
The rfkill class will call the get_state hook of a device every time it needs
|
||||||
|
to know the *real* current state of the hardware. This can happen often.
|
||||||
|
|
||||||
|
Some hardware provides events when its status changes. In these cases, it is
|
||||||
|
best for the driver to not provide a get_state hook, and instead register the
|
||||||
|
rfkill class *already* with the correct status, and keep it updated using
|
||||||
|
rfkill_force_state() when it gets an event from the hardware.
|
||||||
|
|
||||||
|
There is no provision for a statically-allocated rfkill struct. You must
|
||||||
|
use rfkill_allocate() to allocate one.
|
||||||
|
|
||||||
|
You should:
|
||||||
|
- rfkill_allocate()
|
||||||
|
- modify rfkill fields (flags, name)
|
||||||
|
- modify state to the current hardware state (THIS IS THE ONLY TIME
|
||||||
|
YOU CAN ACCESS state DIRECTLY)
|
||||||
|
- rfkill_register()
|
||||||
|
|
||||||
|
The only way to set a device to the RFKILL_STATE_HARD_BLOCKED state is through
|
||||||
|
a suitable return of get_state() or through rfkill_force_state().
|
||||||
|
|
||||||
|
When a device is in the RFKILL_STATE_HARD_BLOCKED state, the only way to switch
|
||||||
|
it to a different state is through a suitable return of get_state() or through
|
||||||
|
rfkill_force_state().
|
||||||
|
|
||||||
|
If toggle_radio() is called to set a device to state RFKILL_STATE_SOFT_BLOCKED
|
||||||
|
when that device is already at the RFKILL_STATE_HARD_BLOCKED state, it should
|
||||||
|
not return an error. Instead, it should try to double-block the transmitter,
|
||||||
|
so that its state will change from RFKILL_STATE_HARD_BLOCKED to
|
||||||
|
RFKILL_STATE_SOFT_BLOCKED should the hardware blocking cease.
|
||||||
|
|
||||||
|
Please refer to the source for more documentation.
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
5: Userspace support
|
||||||
|
|
||||||
|
rfkill devices issue uevents (with an action of "change"), with the following
|
||||||
|
environment variables set:
|
||||||
|
|
||||||
|
RFKILL_NAME
|
||||||
|
RFKILL_STATE
|
||||||
|
RFKILL_TYPE
|
||||||
|
|
||||||
|
The ABI for these variables is defined by the sysfs attributes. It is best
|
||||||
|
to take a quick look at the source to make sure of the possible values.
|
||||||
|
|
||||||
|
It is expected that HAL will trap those, and bridge them to DBUS, etc. These
|
||||||
|
events CAN and SHOULD be used to give feedback to the user about the rfkill
|
||||||
|
status of the system.
|
||||||
|
|
||||||
|
Input devices may issue events that are related to rfkill. These are the
|
||||||
|
various KEY_* events and SW_* events supported by rfkill-input.c.
|
||||||
|
|
||||||
|
******IMPORTANT******
|
||||||
|
When rfkill-input is ACTIVE, userspace is NOT TO CHANGE THE STATE OF AN RFKILL
|
||||||
|
SWITCH IN RESPONSE TO AN INPUT EVENT also handled by rfkill-input, unless it
|
||||||
|
has set to true the user_claim attribute for that particular switch. This rule
|
||||||
|
is *absolute*; do NOT violate it.
|
||||||
|
******IMPORTANT******
|
||||||
|
|
||||||
|
Userspace must not assume it is the only source of control for rfkill switches.
|
||||||
|
Their state CAN and WILL change due to firmware actions, direct user actions,
|
||||||
|
and the rfkill-input EPO override for *_RFKILL_ALL.
|
||||||
|
|
||||||
|
When rfkill-input is not active, userspace must initiate a rfkill status
|
||||||
|
change by writing to the "state" attribute in order for anything to happen.
|
||||||
|
|
||||||
|
Take particular care to implement EV_SW SW_RFKILL_ALL properly. When that
|
||||||
|
switch is set to OFF, *every* rfkill device *MUST* be immediately put into the
|
||||||
|
RFKILL_STATE_SOFT_BLOCKED state, no questions asked.
|
||||||
|
|
||||||
The following sysfs entries will be created:
|
The following sysfs entries will be created:
|
||||||
|
|
||||||
name: Name assigned by driver to this key (interface or driver name).
|
name: Name assigned by driver to this key (interface or driver name).
|
||||||
type: Name of the key type ("wlan", "bluetooth", etc).
|
type: Name of the key type ("wlan", "bluetooth", etc).
|
||||||
state: Current state of the key. 1: On, 0: Off.
|
state: Current state of the transmitter
|
||||||
|
0: RFKILL_STATE_SOFT_BLOCKED
|
||||||
|
transmitter is forced off, but one can override it
|
||||||
|
by a write to the state attribute;
|
||||||
|
1: RFKILL_STATE_UNBLOCKED
|
||||||
|
transmiter is NOT forced off, and may operate if
|
||||||
|
all other conditions for such operation are met
|
||||||
|
(such as interface is up and configured, etc);
|
||||||
|
2: RFKILL_STATE_HARD_BLOCKED
|
||||||
|
transmitter is forced off by something outside of
|
||||||
|
the driver's control. One cannot set a device to
|
||||||
|
this state through writes to the state attribute;
|
||||||
claim: 1: Userspace handles events, 0: Kernel handles events
|
claim: 1: Userspace handles events, 0: Kernel handles events
|
||||||
|
|
||||||
Both the "state" and "claim" entries are also writable. For the "state" entry
|
Both the "state" and "claim" entries are also writable. For the "state" entry
|
||||||
this means that when 1 or 0 is written all radios, not yet in the requested
|
this means that when 1 or 0 is written, the device rfkill state (if not yet in
|
||||||
state, will be will be toggled accordingly.
|
the requested state), will be will be toggled accordingly.
|
||||||
|
|
||||||
For the "claim" entry writing 1 to it means that the kernel no longer handles
|
For the "claim" entry writing 1 to it means that the kernel no longer handles
|
||||||
key events even though RFKILL_INPUT input was enabled. When "claim" has been
|
key events even though RFKILL_INPUT input was enabled. When "claim" has been
|
||||||
set to 0, userspace should make sure that it listens for the input events or
|
set to 0, userspace should make sure that it listens for the input events or
|
||||||
check the sysfs "state" entry regularly to correctly perform the required
|
check the sysfs "state" entry regularly to correctly perform the required tasks
|
||||||
tasks when the rkfill key is pressed.
|
when the rkfill key is pressed.
|
||||||
|
|
||||||
|
A note about input devices and EV_SW events:
|
||||||
|
|
||||||
|
In order to know the current state of an input device switch (like
|
||||||
|
SW_RFKILL_ALL), you will need to use an IOCTL. That information is not
|
||||||
|
available through sysfs in a generic way at this time, and it is not available
|
||||||
|
through the rfkill class AT ALL.
|
||||||
|
|
|
@ -25,7 +25,7 @@ device 4711 via subchannel 1 in subchannel set 0, and subchannel 2 is a non-I/O
|
||||||
subchannel. Device 1234 is accessed via subchannel 0 in subchannel set 1.
|
subchannel. Device 1234 is accessed via subchannel 0 in subchannel set 1.
|
||||||
|
|
||||||
The subchannel named 'defunct' does not represent any real subchannel on the
|
The subchannel named 'defunct' does not represent any real subchannel on the
|
||||||
system; it is a pseudo subchannel where disconnnected ccw devices are moved to
|
system; it is a pseudo subchannel where disconnected ccw devices are moved to
|
||||||
if they are displaced by another ccw device becoming operational on their
|
if they are displaced by another ccw device becoming operational on their
|
||||||
former subchannel. The ccw devices will be moved again to a proper subchannel
|
former subchannel. The ccw devices will be moved again to a proper subchannel
|
||||||
if they become operational again on that subchannel.
|
if they become operational again on that subchannel.
|
||||||
|
|
|
@ -524,7 +524,7 @@
|
||||||
- Michael Lang
|
- Michael Lang
|
||||||
|
|
||||||
June 25 1997: (v1.8b)
|
June 25 1997: (v1.8b)
|
||||||
1) Some cosmetical changes for the handling of SCSI-device-types.
|
1) Some cosmetic changes for the handling of SCSI-device-types.
|
||||||
Now, also CD-Burners / WORMs and SCSI-scanners should work. For
|
Now, also CD-Burners / WORMs and SCSI-scanners should work. For
|
||||||
MO-drives I have no experience, therefore not yet supported.
|
MO-drives I have no experience, therefore not yet supported.
|
||||||
In logical_devices I changed from different type-variables to one
|
In logical_devices I changed from different type-variables to one
|
||||||
|
@ -914,7 +914,7 @@
|
||||||
in version 4.0. This was never really necessary, as all troubles were
|
in version 4.0. This was never really necessary, as all troubles were
|
||||||
based on non-command related reasons up to now, so bypassing commands
|
based on non-command related reasons up to now, so bypassing commands
|
||||||
did not help to avoid any bugs. It is kept in 3.2X for debugging reasons.
|
did not help to avoid any bugs. It is kept in 3.2X for debugging reasons.
|
||||||
5) Dynamical reassignment of ldns was again verified and analyzed to be
|
5) Dynamic reassignment of ldns was again verified and analyzed to be
|
||||||
completely inoperational. This is corrected and should work now.
|
completely inoperational. This is corrected and should work now.
|
||||||
6) All commands that get sent to the SCSI adapter were verified and
|
6) All commands that get sent to the SCSI adapter were verified and
|
||||||
completed in such a way, that they are now completely conform to the
|
completed in such a way, that they are now completely conform to the
|
||||||
|
@ -1386,7 +1386,7 @@
|
||||||
concerning the Linux-kernel in special, this SCSI-driver comes without any
|
concerning the Linux-kernel in special, this SCSI-driver comes without any
|
||||||
warranty. Its functionality is tested as good as possible on certain
|
warranty. Its functionality is tested as good as possible on certain
|
||||||
machines and combinations of computer hardware, which does not exclude,
|
machines and combinations of computer hardware, which does not exclude,
|
||||||
that dataloss or severe damage of hardware is possible while using this
|
that data loss or severe damage of hardware is possible while using this
|
||||||
part of software on some arbitrary computer hardware or in combination
|
part of software on some arbitrary computer hardware or in combination
|
||||||
with other software packages. It is highly recommended to make backup
|
with other software packages. It is highly recommended to make backup
|
||||||
copies of your data before using this software. Furthermore, personal
|
copies of your data before using this software. Furthermore, personal
|
||||||
|
|
|
@ -36,7 +36,7 @@ Cable pull and temporary device Loss:
|
||||||
being removed, a switch rebooting, or a device reboot), the driver could
|
being removed, a switch rebooting, or a device reboot), the driver could
|
||||||
hide the disappearance of the device from the midlayer. I/O's issued to
|
hide the disappearance of the device from the midlayer. I/O's issued to
|
||||||
the LLDD would simply be queued for a short duration, allowing the device
|
the LLDD would simply be queued for a short duration, allowing the device
|
||||||
to reappear or link come back alive, with no inadvertant side effects
|
to reappear or link come back alive, with no inadvertent side effects
|
||||||
to the system. If the driver did not hide these conditions, i/o would be
|
to the system. If the driver did not hide these conditions, i/o would be
|
||||||
errored by the driver, the mid-layer would exhaust its retries, and the
|
errored by the driver, the mid-layer would exhaust its retries, and the
|
||||||
device would be taken offline. Manual intervention would be required to
|
device would be taken offline. Manual intervention would be required to
|
||||||
|
|
|
@ -65,7 +65,7 @@ Overview:
|
||||||
discussion will concentrate on NPIV.
|
discussion will concentrate on NPIV.
|
||||||
|
|
||||||
Note: World Wide Name assignment (and uniqueness guarantees) are left
|
Note: World Wide Name assignment (and uniqueness guarantees) are left
|
||||||
up to an administrative entity controling the vport. For example,
|
up to an administrative entity controlling the vport. For example,
|
||||||
if vports are to be associated with virtual machines, a XEN mgmt
|
if vports are to be associated with virtual machines, a XEN mgmt
|
||||||
utility would be responsible for creating wwpn/wwnn's for the vport,
|
utility would be responsible for creating wwpn/wwnn's for the vport,
|
||||||
using it's own naming authority and OUI. (Note: it already does this
|
using it's own naming authority and OUI. (Note: it already does this
|
||||||
|
@ -91,7 +91,7 @@ Device Trees and Vport Objects:
|
||||||
Here's what to expect in the device tree :
|
Here's what to expect in the device tree :
|
||||||
The typical Physical Port's Scsi_Host:
|
The typical Physical Port's Scsi_Host:
|
||||||
/sys/devices/.../host17/
|
/sys/devices/.../host17/
|
||||||
and it has the typical decendent tree:
|
and it has the typical descendant tree:
|
||||||
/sys/devices/.../host17/rport-17:0-0/target17:0:0/17:0:0:0:
|
/sys/devices/.../host17/rport-17:0-0/target17:0:0/17:0:0:0:
|
||||||
and then the vport is created on the Physical Port:
|
and then the vport is created on the Physical Port:
|
||||||
/sys/devices/.../host17/vport-17:0-0
|
/sys/devices/.../host17/vport-17:0-0
|
||||||
|
@ -192,7 +192,7 @@ Vport States:
|
||||||
independent of the adapter's link state.
|
independent of the adapter's link state.
|
||||||
- Instantiation of the vport on the FC link via ELS traffic, etc.
|
- Instantiation of the vport on the FC link via ELS traffic, etc.
|
||||||
This is equivalent to a "link up" and successfull link initialization.
|
This is equivalent to a "link up" and successfull link initialization.
|
||||||
Futher information can be found in the interfaces section below for
|
Further information can be found in the interfaces section below for
|
||||||
Vport Creation.
|
Vport Creation.
|
||||||
|
|
||||||
Once a vport has been instantiated with the kernel/LLDD, a vport state
|
Once a vport has been instantiated with the kernel/LLDD, a vport state
|
||||||
|
|
|
@ -186,6 +186,17 @@ hardware.
|
||||||
Locking: port_sem taken.
|
Locking: port_sem taken.
|
||||||
Interrupts: caller dependent.
|
Interrupts: caller dependent.
|
||||||
|
|
||||||
|
flush_buffer(port)
|
||||||
|
Flush any write buffers, reset any DMA state and stop any
|
||||||
|
ongoing DMA transfers.
|
||||||
|
|
||||||
|
This will be called whenever the port->info->xmit circular
|
||||||
|
buffer is cleared.
|
||||||
|
|
||||||
|
Locking: port->lock taken.
|
||||||
|
Interrupts: locally disabled.
|
||||||
|
This call must not sleep
|
||||||
|
|
||||||
set_termios(port,termios,oldtermios)
|
set_termios(port,termios,oldtermios)
|
||||||
Change the port parameters, including word length, parity, stop
|
Change the port parameters, including word length, parity, stop
|
||||||
bits. Update read_status_mask and ignore_status_mask to indicate
|
bits. Update read_status_mask and ignore_status_mask to indicate
|
||||||
|
|
|
@ -12,7 +12,7 @@ means no changes to adjanced clock
|
||||||
Internally, the clk_set_rate_ex forwards request to clk->ops->set_rate method,
|
Internally, the clk_set_rate_ex forwards request to clk->ops->set_rate method,
|
||||||
if it is present in ops structure. The method should set the clock rate and adjust
|
if it is present in ops structure. The method should set the clock rate and adjust
|
||||||
all needed clocks according to the passed algo_id.
|
all needed clocks according to the passed algo_id.
|
||||||
Exact values for algo_id are machine-dependend. For the sh7722, the following
|
Exact values for algo_id are machine-dependent. For the sh7722, the following
|
||||||
values are defined:
|
values are defined:
|
||||||
|
|
||||||
NO_CHANGE = 0,
|
NO_CHANGE = 0,
|
||||||
|
|
|
@ -1024,6 +1024,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
intel-mac-v3 Intel Mac Type 3
|
intel-mac-v3 Intel Mac Type 3
|
||||||
intel-mac-v4 Intel Mac Type 4
|
intel-mac-v4 Intel Mac Type 4
|
||||||
intel-mac-v5 Intel Mac Type 5
|
intel-mac-v5 Intel Mac Type 5
|
||||||
|
intel-mac-auto Intel Mac (detect type according to subsystem id)
|
||||||
macmini Intel Mac Mini (equivalent with type 3)
|
macmini Intel Mac Mini (equivalent with type 3)
|
||||||
macbook Intel Mac Book (eq. type 5)
|
macbook Intel Mac Book (eq. type 5)
|
||||||
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
||||||
|
|
|
@ -236,15 +236,15 @@ The parameter can be given:
|
||||||
alias snd-card-1 snd-usb-audio
|
alias snd-card-1 snd-usb-audio
|
||||||
options snd-usb-audio index=1 device_setup=0x09
|
options snd-usb-audio index=1 device_setup=0x09
|
||||||
|
|
||||||
CAUTION when initializaing the device
|
CAUTION when initializing the device
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
* Correct initialization on the device requires that device_setup is given to
|
* Correct initialization on the device requires that device_setup is given to
|
||||||
the module BEFORE the device is turned on. So, if you use the "manual probing"
|
the module BEFORE the device is turned on. So, if you use the "manual probing"
|
||||||
method described above, take care to power-on the device AFTER this initialization.
|
method described above, take care to power-on the device AFTER this initialization.
|
||||||
|
|
||||||
* Failing to respect this will lead in a misconfiguration of the device. In this case
|
* Failing to respect this will lead to a misconfiguration of the device. In this case
|
||||||
turn off the device, unproble the snd-usb-audio module, then probe it again with
|
turn off the device, unprobe the snd-usb-audio module, then probe it again with
|
||||||
correct device_setup parameter and then (and only then) turn on the device again.
|
correct device_setup parameter and then (and only then) turn on the device again.
|
||||||
|
|
||||||
* If you've correctly initialized the device in a valid mode and then want to switch
|
* If you've correctly initialized the device in a valid mode and then want to switch
|
||||||
|
@ -388,9 +388,9 @@ There are 2 main potential issues when using Jackd with the device:
|
||||||
|
|
||||||
Jack supports big endian devices only in recent versions (thanks to
|
Jack supports big endian devices only in recent versions (thanks to
|
||||||
Andreas Steinmetz for his first big-endian patch). I can't remember
|
Andreas Steinmetz for his first big-endian patch). I can't remember
|
||||||
extacly when this support was released into jackd, let's just say that
|
exactly when this support was released into jackd, let's just say that
|
||||||
with jackd version 0.103.0 it's almost ok (just a small bug is affecting
|
with jackd version 0.103.0 it's almost ok (just a small bug is affecting
|
||||||
16bits Big-Endian devices, but since you've read carefully the above
|
16bits Big-Endian devices, but since you've read carefully the above
|
||||||
paragraphs, you're now using kernel >= 2.6.23 and your 16bits devices
|
paragraphs, you're now using kernel >= 2.6.23 and your 16bits devices
|
||||||
are now Little Endians ;-) ).
|
are now Little Endians ;-) ).
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
<sect1><title>Device Components</title>
|
<sect1><title>Device Components</title>
|
||||||
!Esound/core/device.c
|
!Esound/core/device.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>KMOD and Device File Entries</title>
|
<sect1><title>Module requests and Device File Entries</title>
|
||||||
!Esound/core/sound.c
|
!Esound/core/sound.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Memory Management Helpers</title>
|
<sect1><title>Memory Management Helpers</title>
|
||||||
|
|
|
@ -67,7 +67,7 @@ CONFIG_SND_HDA_POWER_SAVE kconfig. It's called when the codec needs
|
||||||
to power up or may power down. The controller should check the all
|
to power up or may power down. The controller should check the all
|
||||||
belonging codecs on the bus whether they are actually powered off
|
belonging codecs on the bus whether they are actually powered off
|
||||||
(check codec->power_on), and optionally the driver may power down the
|
(check codec->power_on), and optionally the driver may power down the
|
||||||
contoller side, too.
|
controller side, too.
|
||||||
|
|
||||||
The bus instance is created via snd_hda_bus_new(). You need to pass
|
The bus instance is created via snd_hda_bus_new(). You need to pass
|
||||||
the card instance, the template, and the pointer to store the
|
the card instance, the template, and the pointer to store the
|
||||||
|
|
|
@ -68,7 +68,7 @@ Audio DAPM widgets fall into a number of types:-
|
||||||
(Widgets are defined in include/sound/soc-dapm.h)
|
(Widgets are defined in include/sound/soc-dapm.h)
|
||||||
|
|
||||||
Widgets are usually added in the codec driver and the machine driver. There are
|
Widgets are usually added in the codec driver and the machine driver. There are
|
||||||
convience macros defined in soc-dapm.h that can be used to quickly build a
|
convenience macros defined in soc-dapm.h that can be used to quickly build a
|
||||||
list of widgets of the codecs and machines DAPM widgets.
|
list of widgets of the codecs and machines DAPM widgets.
|
||||||
|
|
||||||
Most widgets have a name, register, shift and invert. Some widgets have extra
|
Most widgets have a name, register, shift and invert. Some widgets have extra
|
||||||
|
|
|
@ -73,10 +73,10 @@ recompiled, or use "make C=2" to run sparse on the files whether they need to
|
||||||
be recompiled or not. The latter is a fast way to check the whole tree if you
|
be recompiled or not. The latter is a fast way to check the whole tree if you
|
||||||
have already built it.
|
have already built it.
|
||||||
|
|
||||||
The optional make variable CHECKFLAGS can be used to pass arguments to sparse.
|
The optional make variable CF can be used to pass arguments to sparse. The
|
||||||
The build system passes -Wbitwise to sparse automatically. To perform
|
build system passes -Wbitwise to sparse automatically. To perform endianness
|
||||||
endianness checks, you may define __CHECK_ENDIAN__:
|
checks, you may define __CHECK_ENDIAN__:
|
||||||
|
|
||||||
make C=2 CHECKFLAGS="-D__CHECK_ENDIAN__"
|
make C=2 CF="-D__CHECK_ENDIAN__"
|
||||||
|
|
||||||
These checks are disabled by default as they generate a host of warnings.
|
These checks are disabled by default as they generate a host of warnings.
|
||||||
|
|
|
@ -270,8 +270,8 @@ The pinout of the connectors on the IO8+ is:
|
||||||
Hardware handshaking issues.
|
Hardware handshaking issues.
|
||||||
============================
|
============================
|
||||||
|
|
||||||
The driver can be compiled in two different ways. The default
|
The driver can be told to operate in two different ways. The default
|
||||||
("Specialix DTR/RTS pin is RTS" is off) the pin behaves as DTR when
|
behaviour is specialix.sx_rtscts = 0 where the pin behaves as DTR when
|
||||||
hardware handshaking is off. It behaves as the RTS hardware
|
hardware handshaking is off. It behaves as the RTS hardware
|
||||||
handshaking signal when hardware handshaking is selected.
|
handshaking signal when hardware handshaking is selected.
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ cable will either be compatible with hardware handshaking or with
|
||||||
software handshaking. So switching on the fly is not really an
|
software handshaking. So switching on the fly is not really an
|
||||||
option.
|
option.
|
||||||
|
|
||||||
I actually prefer to use the "Specialix DTR/RTS pin is RTS" option.
|
I actually prefer to use the "specialix.sx_rtscts=1" option.
|
||||||
This makes the DTR/RTS pin always an RTS pin, and ioctls to
|
This makes the DTR/RTS pin always an RTS pin, and ioctls to
|
||||||
change DTR are always ignored. I have a cable that is configured
|
change DTR are always ignored. I have a cable that is configured
|
||||||
for this.
|
for this.
|
||||||
|
@ -379,7 +379,5 @@ it doesn't fit in your computer, bring back the card.
|
||||||
You have to WRITE to the address register to even
|
You have to WRITE to the address register to even
|
||||||
read-probe a CD186x register. Disable autodetection?
|
read-probe a CD186x register. Disable autodetection?
|
||||||
-- Specialix: any suggestions?
|
-- Specialix: any suggestions?
|
||||||
- Arbitrary baud rates are not implemented yet.
|
|
||||||
If you need this, bug me about it.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,7 @@ of kilobytes free. The VM uses this number to compute a pages_min
|
||||||
value for each lowmem zone in the system. Each lowmem zone gets
|
value for each lowmem zone in the system. Each lowmem zone gets
|
||||||
a number of reserved free pages based proportionally on its size.
|
a number of reserved free pages based proportionally on its size.
|
||||||
|
|
||||||
Some minimal ammount of memory is needed to satisfy PF_MEMALLOC
|
Some minimal amount of memory is needed to satisfy PF_MEMALLOC
|
||||||
allocations; if you set this to lower than 1024KB, your system will
|
allocations; if you set this to lower than 1024KB, your system will
|
||||||
become subtly broken, and prone to deadlock under high loads.
|
become subtly broken, and prone to deadlock under high loads.
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,8 @@ Rules on how to access information in the Linux kernel sysfs
|
||||||
The kernel-exported sysfs exports internal kernel implementation details
|
The kernel-exported sysfs exports internal kernel implementation details
|
||||||
and depends on internal kernel structures and layout. It is agreed upon
|
and depends on internal kernel structures and layout. It is agreed upon
|
||||||
by the kernel developers that the Linux kernel does not provide a stable
|
by the kernel developers that the Linux kernel does not provide a stable
|
||||||
internal API. As sysfs is a direct export of kernel internal
|
internal API. Therefore, there are aspects of the sysfs interface that
|
||||||
structures, the sysfs interface cannot provide a stable interface either;
|
may not be stable across kernel releases.
|
||||||
it may always change along with internal kernel changes.
|
|
||||||
|
|
||||||
To minimize the risk of breaking users of sysfs, which are in most cases
|
To minimize the risk of breaking users of sysfs, which are in most cases
|
||||||
low-level userspace applications, with a new kernel release, the users
|
low-level userspace applications, with a new kernel release, the users
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue