Merge with rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
This commit is contained in:
commit
ab997aaeb9
|
@ -138,6 +138,8 @@ java.txt
|
||||||
- info on the in-kernel binary support for Java(tm).
|
- info on the in-kernel binary support for Java(tm).
|
||||||
kbuild/
|
kbuild/
|
||||||
- directory with info about the kernel build process.
|
- directory with info about the kernel build process.
|
||||||
|
kdumpt.txt
|
||||||
|
- mini HowTo on getting the crash dump code to work.
|
||||||
kernel-doc-nano-HOWTO.txt
|
kernel-doc-nano-HOWTO.txt
|
||||||
- mini HowTo on generation and location of kernel documentation files.
|
- mini HowTo on generation and location of kernel documentation files.
|
||||||
kernel-docs.txt
|
kernel-docs.txt
|
||||||
|
|
|
@ -44,9 +44,9 @@ running, the suggested command should tell you.
|
||||||
|
|
||||||
Again, keep in mind that this list assumes you are already
|
Again, keep in mind that this list assumes you are already
|
||||||
functionally running a Linux 2.4 kernel. Also, not all tools are
|
functionally running a Linux 2.4 kernel. Also, not all tools are
|
||||||
necessary on all systems; obviously, if you don't have any PCMCIA (PC
|
necessary on all systems; obviously, if you don't have any ISDN
|
||||||
Card) hardware, for example, you probably needn't concern yourself
|
hardware, for example, you probably needn't concern yourself with
|
||||||
with pcmcia-cs.
|
isdn4k-utils.
|
||||||
|
|
||||||
o Gnu C 2.95.3 # gcc --version
|
o Gnu C 2.95.3 # gcc --version
|
||||||
o Gnu make 3.79.1 # make --version
|
o Gnu make 3.79.1 # make --version
|
||||||
|
@ -57,13 +57,14 @@ o e2fsprogs 1.29 # tune2fs
|
||||||
o jfsutils 1.1.3 # fsck.jfs -V
|
o jfsutils 1.1.3 # fsck.jfs -V
|
||||||
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
|
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
|
||||||
o xfsprogs 2.6.0 # xfs_db -V
|
o xfsprogs 2.6.0 # xfs_db -V
|
||||||
|
o pcmciautils 004
|
||||||
o pcmcia-cs 3.1.21 # cardmgr -V
|
o pcmcia-cs 3.1.21 # cardmgr -V
|
||||||
o quota-tools 3.09 # quota -V
|
o quota-tools 3.09 # quota -V
|
||||||
o PPP 2.4.0 # pppd --version
|
o PPP 2.4.0 # pppd --version
|
||||||
o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
|
o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
|
||||||
o nfs-utils 1.0.5 # showmount --version
|
o nfs-utils 1.0.5 # showmount --version
|
||||||
o procps 3.2.0 # ps --version
|
o procps 3.2.0 # ps --version
|
||||||
o oprofile 0.5.3 # oprofiled --version
|
o oprofile 0.9 # oprofiled --version
|
||||||
|
|
||||||
Kernel compilation
|
Kernel compilation
|
||||||
==================
|
==================
|
||||||
|
@ -186,13 +187,20 @@ architecture independent and any version from 2.0.0 onward should
|
||||||
work correctly with this version of the XFS kernel code (2.6.0 or
|
work correctly with this version of the XFS kernel code (2.6.0 or
|
||||||
later is recommended, due to some significant improvements).
|
later is recommended, due to some significant improvements).
|
||||||
|
|
||||||
|
PCMCIAutils
|
||||||
|
-----------
|
||||||
|
|
||||||
|
PCMCIAutils replaces pcmcia-cs (see below). It properly sets up
|
||||||
|
PCMCIA sockets at system startup and loads the appropriate modules
|
||||||
|
for 16-bit PCMCIA devices if the kernel is modularized and the hotplug
|
||||||
|
subsystem is used.
|
||||||
|
|
||||||
Pcmcia-cs
|
Pcmcia-cs
|
||||||
---------
|
---------
|
||||||
|
|
||||||
PCMCIA (PC Card) support is now partially implemented in the main
|
PCMCIA (PC Card) support is now partially implemented in the main
|
||||||
kernel source. Pay attention when you recompile your kernel ;-).
|
kernel source. The "pcmciautils" package (see above) replaces pcmcia-cs
|
||||||
Also, be sure to upgrade to the latest pcmcia-cs release.
|
for newest kernels.
|
||||||
|
|
||||||
Quota-tools
|
Quota-tools
|
||||||
-----------
|
-----------
|
||||||
|
@ -349,9 +357,13 @@ Xfsprogs
|
||||||
--------
|
--------
|
||||||
o <ftp://oss.sgi.com/projects/xfs/download/>
|
o <ftp://oss.sgi.com/projects/xfs/download/>
|
||||||
|
|
||||||
|
Pcmciautils
|
||||||
|
-----------
|
||||||
|
o <ftp://ftp.kernel.org/pub/linux/utils/kernel/pcmcia/>
|
||||||
|
|
||||||
Pcmcia-cs
|
Pcmcia-cs
|
||||||
---------
|
---------
|
||||||
o <ftp://pcmcia-cs.sourceforge.net/pub/pcmcia-cs/pcmcia-cs-3.1.21.tar.gz>
|
o <http://pcmcia-cs.sourceforge.net/>
|
||||||
|
|
||||||
Quota-tools
|
Quota-tools
|
||||||
----------
|
----------
|
||||||
|
|
|
@ -49,7 +49,7 @@ installmandocs: mandocs
|
||||||
KERNELDOC = scripts/kernel-doc
|
KERNELDOC = scripts/kernel-doc
|
||||||
DOCPROC = scripts/basic/docproc
|
DOCPROC = scripts/basic/docproc
|
||||||
|
|
||||||
XMLTOFLAGS = -m Documentation/DocBook/stylesheet.xsl
|
XMLTOFLAGS = -m $(srctree)/Documentation/DocBook/stylesheet.xsl
|
||||||
#XMLTOFLAGS += --skip-validation
|
#XMLTOFLAGS += --skip-validation
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
|
@ -266,7 +266,7 @@ X!Ekernel/module.c
|
||||||
<chapter id="hardware">
|
<chapter id="hardware">
|
||||||
<title>Hardware Interfaces</title>
|
<title>Hardware Interfaces</title>
|
||||||
<sect1><title>Interrupt Handling</title>
|
<sect1><title>Interrupt Handling</title>
|
||||||
!Iarch/i386/kernel/irq.c
|
!Ikernel/irq/manage.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<sect1><title>Resources Management</title>
|
<sect1><title>Resources Management</title>
|
||||||
|
|
|
@ -84,6 +84,14 @@ void (*port_disable) (struct ata_port *);
|
||||||
Called from ata_bus_probe() and ata_bus_reset() error paths,
|
Called from ata_bus_probe() and ata_bus_reset() error paths,
|
||||||
as well as when unregistering from the SCSI module (rmmod, hot
|
as well as when unregistering from the SCSI module (rmmod, hot
|
||||||
unplug).
|
unplug).
|
||||||
|
This function should do whatever needs to be done to take the
|
||||||
|
port out of use. In most cases, ata_port_disable() can be used
|
||||||
|
as this hook.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Called from ata_bus_probe() on a failed probe.
|
||||||
|
Called from ata_bus_reset() on a failed bus reset.
|
||||||
|
Called from ata_scsi_release().
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -98,6 +106,13 @@ void (*dev_config) (struct ata_port *, struct ata_device *);
|
||||||
found. Typically used to apply device-specific fixups prior to
|
found. Typically used to apply device-specific fixups prior to
|
||||||
issue of SET FEATURES - XFER MODE, and prior to operation.
|
issue of SET FEATURES - XFER MODE, and prior to operation.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Called by ata_device_add() after ata_dev_identify() determines
|
||||||
|
a device is present.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This entry may be specified as NULL in ata_port_operations.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -135,6 +150,8 @@ void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||||
registers / DMA buffers. ->tf_read() is called to read the
|
registers / DMA buffers. ->tf_read() is called to read the
|
||||||
hardware registers / DMA buffers, to obtain the current set of
|
hardware registers / DMA buffers, to obtain the current set of
|
||||||
taskfile register values.
|
taskfile register values.
|
||||||
|
Most drivers for taskfile-based hardware (PIO or MMIO) use
|
||||||
|
ata_tf_load() and ata_tf_read() for these hooks.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -147,6 +164,8 @@ void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
|
||||||
<para>
|
<para>
|
||||||
causes an ATA command, previously loaded with
|
causes an ATA command, previously loaded with
|
||||||
->tf_load(), to be initiated in hardware.
|
->tf_load(), to be initiated in hardware.
|
||||||
|
Most drivers for taskfile-based hardware use ata_exec_command()
|
||||||
|
for this hook.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -161,6 +180,10 @@ Allow low-level driver to filter ATA PACKET commands, returning a status
|
||||||
indicating whether or not it is OK to use DMA for the supplied PACKET
|
indicating whether or not it is OK to use DMA for the supplied PACKET
|
||||||
command.
|
command.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
This hook may be specified as NULL, in which case libata will
|
||||||
|
assume that atapi dma can be supported.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -175,6 +198,14 @@ u8 (*check_err)(struct ata_port *ap);
|
||||||
Reads the Status/AltStatus/Error ATA shadow register from
|
Reads the Status/AltStatus/Error ATA shadow register from
|
||||||
hardware. On some hardware, reading the Status register has
|
hardware. On some hardware, reading the Status register has
|
||||||
the side effect of clearing the interrupt condition.
|
the side effect of clearing the interrupt condition.
|
||||||
|
Most drivers for taskfile-based hardware use
|
||||||
|
ata_check_status() for this hook.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that because this is called from ata_device_add(), at
|
||||||
|
least a dummy function that clears device interrupts must be
|
||||||
|
provided for all drivers, even if the controller doesn't
|
||||||
|
actually have a taskfile status register.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -188,7 +219,13 @@ void (*dev_select)(struct ata_port *ap, unsigned int device);
|
||||||
Issues the low-level hardware command(s) that causes one of N
|
Issues the low-level hardware command(s) that causes one of N
|
||||||
hardware devices to be considered 'selected' (active and
|
hardware devices to be considered 'selected' (active and
|
||||||
available for use) on the ATA bus. This generally has no
|
available for use) on the ATA bus. This generally has no
|
||||||
meaning on FIS-based devices.
|
meaning on FIS-based devices.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most drivers for taskfile-based hardware use
|
||||||
|
ata_std_dev_select() for this hook. Controllers which do not
|
||||||
|
support second drives on a port (such as SATA contollers) will
|
||||||
|
use ata_noop_dev_select().
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -204,6 +241,8 @@ void (*phy_reset) (struct ata_port *ap);
|
||||||
for device presence (PATA and SATA), typically a soft reset
|
for device presence (PATA and SATA), typically a soft reset
|
||||||
(SRST) will be performed. Drivers typically use the helper
|
(SRST) will be performed. Drivers typically use the helper
|
||||||
functions ata_bus_reset() or sata_phy_reset() for this hook.
|
functions ata_bus_reset() or sata_phy_reset() for this hook.
|
||||||
|
Many SATA drivers use sata_phy_reset() or call it from within
|
||||||
|
their own phy_reset() functions.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -227,6 +266,25 @@ PCI IDE DMA Status register.
|
||||||
These hooks are typically either no-ops, or simply not implemented, in
|
These hooks are typically either no-ops, or simply not implemented, in
|
||||||
FIS-based drivers.
|
FIS-based drivers.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_bmdma_setup() for the bmdma_setup()
|
||||||
|
hook. ata_bmdma_setup() will write the pointer to the PRD table to
|
||||||
|
the IDE PRD Table Address register, enable DMA in the DMA Command
|
||||||
|
register, and call exec_command() to begin the transfer.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_bmdma_start() for the bmdma_start()
|
||||||
|
hook. ata_bmdma_start() will write the ATA_DMA_START flag to the DMA
|
||||||
|
Command register.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many legacy IDE drivers use ata_bmdma_stop() for the bmdma_stop()
|
||||||
|
hook. ata_bmdma_stop() clears the ATA_DMA_START flag in the DMA
|
||||||
|
command register.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many legacy IDE drivers use ata_bmdma_status() as the bmdma_status() hook.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -250,6 +308,10 @@ int (*qc_issue) (struct ata_queued_cmd *qc);
|
||||||
helper function ata_qc_issue_prot() for taskfile protocol-based
|
helper function ata_qc_issue_prot() for taskfile protocol-based
|
||||||
dispatch. More advanced drivers implement their own ->qc_issue.
|
dispatch. More advanced drivers implement their own ->qc_issue.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
ata_qc_issue_prot() calls ->tf_load(), ->bmdma_setup(), and
|
||||||
|
->bmdma_start() as necessary to initiate a transfer.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -279,6 +341,21 @@ void (*irq_clear) (struct ata_port *);
|
||||||
before the interrupt handler is registered, to be sure hardware
|
before the interrupt handler is registered, to be sure hardware
|
||||||
is quiet.
|
is quiet.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
The second argument, dev_instance, should be cast to a pointer
|
||||||
|
to struct ata_host_set.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_interrupt() for the
|
||||||
|
irq_handler hook, which scans all ports in the host_set,
|
||||||
|
determines which queued command was active (if any), and calls
|
||||||
|
ata_host_intr(ap,qc).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_bmdma_irq_clear() for the
|
||||||
|
irq_clear() hook, which simply clears the interrupt and error
|
||||||
|
flags in the DMA status register.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -292,6 +369,7 @@ void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
|
||||||
<para>
|
<para>
|
||||||
Read and write standard SATA phy registers. Currently only used
|
Read and write standard SATA phy registers. Currently only used
|
||||||
if ->phy_reset hook called the sata_phy_reset() helper function.
|
if ->phy_reset hook called the sata_phy_reset() helper function.
|
||||||
|
sc_reg is one of SCR_STATUS, SCR_CONTROL, SCR_ERROR, or SCR_ACTIVE.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -307,17 +385,29 @@ void (*host_stop) (struct ata_host_set *host_set);
|
||||||
->port_start() is called just after the data structures for each
|
->port_start() is called just after the data structures for each
|
||||||
port are initialized. Typically this is used to alloc per-port
|
port are initialized. Typically this is used to alloc per-port
|
||||||
DMA buffers / tables / rings, enable DMA engines, and similar
|
DMA buffers / tables / rings, enable DMA engines, and similar
|
||||||
tasks.
|
tasks. Some drivers also use this entry point as a chance to
|
||||||
|
allocate driver-private memory for ap->private_data.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many drivers use ata_port_start() as this hook or call
|
||||||
|
it from their own port_start() hooks. ata_port_start()
|
||||||
|
allocates space for a legacy IDE PRD table and returns.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
->port_stop() is called after ->host_stop(). It's sole function
|
->port_stop() is called after ->host_stop(). It's sole function
|
||||||
is to release DMA/memory resources, now that they are no longer
|
is to release DMA/memory resources, now that they are no longer
|
||||||
actively being used.
|
actively being used. Many drivers also free driver-private
|
||||||
|
data from port at this time.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many drivers use ata_port_stop() as this hook, which frees the
|
||||||
|
PRD table.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
->host_stop() is called after all ->port_stop() calls
|
->host_stop() is called after all ->port_stop() calls
|
||||||
have completed. The hook must finalize hardware shutdown, release DMA
|
have completed. The hook must finalize hardware shutdown, release DMA
|
||||||
and other resources, etc.
|
and other resources, etc.
|
||||||
|
This hook may be specified as NULL, in which case it is not called.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
|
@ -2,4 +2,5 @@
|
||||||
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||||
<param name="chunk.quietly">1</param>
|
<param name="chunk.quietly">1</param>
|
||||||
<param name="funcsynopsis.style">ansi</param>
|
<param name="funcsynopsis.style">ansi</param>
|
||||||
|
<param name="funcsynopsis.tabular.threshold">80</param>
|
||||||
</stylesheet>
|
</stylesheet>
|
||||||
|
|
|
@ -25,9 +25,10 @@ subject and I can't cover it all here!
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The LinuxIPMI driver is modular, which means you have to pick several
|
The Linux IPMI driver is modular, which means you have to pick several
|
||||||
things to have it work right depending on your hardware. Most of
|
things to have it work right depending on your hardware. Most of
|
||||||
these are available in the 'Character Devices' menu.
|
these are available in the 'Character Devices' menu then the IPMI
|
||||||
|
menu.
|
||||||
|
|
||||||
No matter what, you must pick 'IPMI top-level message handler' to use
|
No matter what, you must pick 'IPMI top-level message handler' to use
|
||||||
IPMI. What you do beyond that depends on your needs and hardware.
|
IPMI. What you do beyond that depends on your needs and hardware.
|
||||||
|
@ -35,33 +36,30 @@ IPMI. What you do beyond that depends on your needs and hardware.
|
||||||
The message handler does not provide any user-level interfaces.
|
The message handler does not provide any user-level interfaces.
|
||||||
Kernel code (like the watchdog) can still use it. If you need access
|
Kernel code (like the watchdog) can still use it. If you need access
|
||||||
from userland, you need to select 'Device interface for IPMI' if you
|
from userland, you need to select 'Device interface for IPMI' if you
|
||||||
want access through a device driver. Another interface is also
|
want access through a device driver.
|
||||||
available, you may select 'IPMI sockets' in the 'Networking Support'
|
|
||||||
main menu. This provides a socket interface to IPMI. You may select
|
|
||||||
both of these at the same time, they will both work together.
|
|
||||||
|
|
||||||
The driver interface depends on your hardware. If you have a board
|
The driver interface depends on your hardware. If your system
|
||||||
with a standard interface (These will generally be either "KCS",
|
properly provides the SMBIOS info for IPMI, the driver will detect it
|
||||||
"SMIC", or "BT", consult your hardware manual), choose the 'IPMI SI
|
and just work. If you have a board with a standard interface (These
|
||||||
handler' option. A driver also exists for direct I2C access to the
|
will generally be either "KCS", "SMIC", or "BT", consult your hardware
|
||||||
IPMI management controller. Some boards support this, but it is
|
manual), choose the 'IPMI SI handler' option. A driver also exists
|
||||||
unknown if it will work on every board. For this, choose 'IPMI SMBus
|
for direct I2C access to the IPMI management controller. Some boards
|
||||||
handler', but be ready to try to do some figuring to see if it will
|
support this, but it is unknown if it will work on every board. For
|
||||||
work.
|
this, choose 'IPMI SMBus handler', but be ready to try to do some
|
||||||
|
figuring to see if it will work on your system if the SMBIOS/APCI
|
||||||
There is also a KCS-only driver interface supplied, but it is
|
information is wrong or not present. It is fairly safe to have both
|
||||||
depracated in favor of the SI interface.
|
these enabled and let the drivers auto-detect what is present.
|
||||||
|
|
||||||
You should generally enable ACPI on your system, as systems with IPMI
|
You should generally enable ACPI on your system, as systems with IPMI
|
||||||
should have ACPI tables describing them.
|
can have ACPI tables describing them.
|
||||||
|
|
||||||
If you have a standard interface and the board manufacturer has done
|
If you have a standard interface and the board manufacturer has done
|
||||||
their job correctly, the IPMI controller should be automatically
|
their job correctly, the IPMI controller should be automatically
|
||||||
detect (via ACPI or SMBIOS tables) and should just work. Sadly, many
|
detected (via ACPI or SMBIOS tables) and should just work. Sadly,
|
||||||
boards do not have this information. The driver attempts standard
|
many boards do not have this information. The driver attempts
|
||||||
defaults, but they may not work. If you fall into this situation, you
|
standard defaults, but they may not work. If you fall into this
|
||||||
need to read the section below named 'The SI Driver' on how to
|
situation, you need to read the section below named 'The SI Driver' or
|
||||||
hand-configure your system.
|
"The SMBus Driver" on how to hand-configure your system.
|
||||||
|
|
||||||
IPMI defines a standard watchdog timer. You can enable this with the
|
IPMI defines a standard watchdog timer. You can enable this with the
|
||||||
'IPMI Watchdog Timer' config option. If you compile the driver into
|
'IPMI Watchdog Timer' config option. If you compile the driver into
|
||||||
|
@ -73,6 +71,18 @@ closed (by default it is disabled on close). Go into the 'Watchdog
|
||||||
Cards' menu, enable 'Watchdog Timer Support', and enable the option
|
Cards' menu, enable 'Watchdog Timer Support', and enable the option
|
||||||
'Disable watchdog shutdown on close'.
|
'Disable watchdog shutdown on close'.
|
||||||
|
|
||||||
|
IPMI systems can often be powered off using IPMI commands. Select
|
||||||
|
'IPMI Poweroff' to do this. The driver will auto-detect if the system
|
||||||
|
can be powered off by IPMI. It is safe to enable this even if your
|
||||||
|
system doesn't support this option. This works on ATCA systems, the
|
||||||
|
Radisys CPI1 card, and any IPMI system that supports standard chassis
|
||||||
|
management commands.
|
||||||
|
|
||||||
|
If you want the driver to put an event into the event log on a panic,
|
||||||
|
enable the 'Generate a panic event to all BMCs on a panic' option. If
|
||||||
|
you want the whole panic string put into the event log using OEM
|
||||||
|
events, enable the 'Generate OEM events containing the panic string'
|
||||||
|
option.
|
||||||
|
|
||||||
Basic Design
|
Basic Design
|
||||||
------------
|
------------
|
||||||
|
@ -80,7 +90,7 @@ Basic Design
|
||||||
The Linux IPMI driver is designed to be very modular and flexible, you
|
The Linux IPMI driver is designed to be very modular and flexible, you
|
||||||
only need to take the pieces you need and you can use it in many
|
only need to take the pieces you need and you can use it in many
|
||||||
different ways. Because of that, it's broken into many chunks of
|
different ways. Because of that, it's broken into many chunks of
|
||||||
code. These chunks are:
|
code. These chunks (by module name) are:
|
||||||
|
|
||||||
ipmi_msghandler - This is the central piece of software for the IPMI
|
ipmi_msghandler - This is the central piece of software for the IPMI
|
||||||
system. It handles all messages, message timing, and responses. The
|
system. It handles all messages, message timing, and responses. The
|
||||||
|
@ -93,18 +103,26 @@ ipmi_devintf - This provides a userland IOCTL interface for the IPMI
|
||||||
driver, each open file for this device ties in to the message handler
|
driver, each open file for this device ties in to the message handler
|
||||||
as an IPMI user.
|
as an IPMI user.
|
||||||
|
|
||||||
ipmi_si - A driver for various system interfaces. This supports
|
ipmi_si - A driver for various system interfaces. This supports KCS,
|
||||||
KCS, SMIC, and may support BT in the future. Unless you have your own
|
SMIC, and BT interfaces. Unless you have an SMBus interface or your
|
||||||
custom interface, you probably need to use this.
|
own custom interface, you probably need to use this.
|
||||||
|
|
||||||
ipmi_smb - A driver for accessing BMCs on the SMBus. It uses the
|
ipmi_smb - A driver for accessing BMCs on the SMBus. It uses the
|
||||||
I2C kernel driver's SMBus interfaces to send and receive IPMI messages
|
I2C kernel driver's SMBus interfaces to send and receive IPMI messages
|
||||||
over the SMBus.
|
over the SMBus.
|
||||||
|
|
||||||
af_ipmi - A network socket interface to IPMI. This doesn't take up
|
ipmi_watchdog - IPMI requires systems to have a very capable watchdog
|
||||||
a character device in your system.
|
timer. This driver implements the standard Linux watchdog timer
|
||||||
|
interface on top of the IPMI message handler.
|
||||||
|
|
||||||
Note that the KCS-only interface ahs been removed.
|
ipmi_poweroff - Some systems support the ability to be turned off via
|
||||||
|
IPMI commands.
|
||||||
|
|
||||||
|
These are all individually selectable via configuration options.
|
||||||
|
|
||||||
|
Note that the KCS-only interface has been removed. The af_ipmi driver
|
||||||
|
is no longer supported and has been removed because it was impossible
|
||||||
|
to do 32 bit emulation on 64-bit kernels with it.
|
||||||
|
|
||||||
Much documentation for the interface is in the include files. The
|
Much documentation for the interface is in the include files. The
|
||||||
IPMI include files are:
|
IPMI include files are:
|
||||||
|
@ -424,7 +442,7 @@ at module load time (for a module) with:
|
||||||
modprobe ipmi_smb.o
|
modprobe ipmi_smb.o
|
||||||
addr=<adapter1>,<i2caddr1>[,<adapter2>,<i2caddr2>[,...]]
|
addr=<adapter1>,<i2caddr1>[,<adapter2>,<i2caddr2>[,...]]
|
||||||
dbg=<flags1>,<flags2>...
|
dbg=<flags1>,<flags2>...
|
||||||
[defaultprobe=0] [dbg_probe=1]
|
[defaultprobe=1] [dbg_probe=1]
|
||||||
|
|
||||||
The addresses are specified in pairs, the first is the adapter ID and the
|
The addresses are specified in pairs, the first is the adapter ID and the
|
||||||
second is the I2C address on that adapter.
|
second is the I2C address on that adapter.
|
||||||
|
@ -532,3 +550,67 @@ Once you open the watchdog timer, you must write a 'V' character to the
|
||||||
device to close it, or the timer will not stop. This is a new semantic
|
device to close it, or the timer will not stop. This is a new semantic
|
||||||
for the driver, but makes it consistent with the rest of the watchdog
|
for the driver, but makes it consistent with the rest of the watchdog
|
||||||
drivers in Linux.
|
drivers in Linux.
|
||||||
|
|
||||||
|
|
||||||
|
Panic Timeouts
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The OpenIPMI driver supports the ability to put semi-custom and custom
|
||||||
|
events in the system event log if a panic occurs. if you enable the
|
||||||
|
'Generate a panic event to all BMCs on a panic' option, you will get
|
||||||
|
one event on a panic in a standard IPMI event format. If you enable
|
||||||
|
the 'Generate OEM events containing the panic string' option, you will
|
||||||
|
also get a bunch of OEM events holding the panic string.
|
||||||
|
|
||||||
|
|
||||||
|
The field settings of the events are:
|
||||||
|
* Generator ID: 0x21 (kernel)
|
||||||
|
* EvM Rev: 0x03 (this event is formatting in IPMI 1.0 format)
|
||||||
|
* Sensor Type: 0x20 (OS critical stop sensor)
|
||||||
|
* Sensor #: The first byte of the panic string (0 if no panic string)
|
||||||
|
* Event Dir | Event Type: 0x6f (Assertion, sensor-specific event info)
|
||||||
|
* Event Data 1: 0xa1 (Runtime stop in OEM bytes 2 and 3)
|
||||||
|
* Event data 2: second byte of panic string
|
||||||
|
* Event data 3: third byte of panic string
|
||||||
|
See the IPMI spec for the details of the event layout. This event is
|
||||||
|
always sent to the local management controller. It will handle routing
|
||||||
|
the message to the right place
|
||||||
|
|
||||||
|
Other OEM events have the following format:
|
||||||
|
Record ID (bytes 0-1): Set by the SEL.
|
||||||
|
Record type (byte 2): 0xf0 (OEM non-timestamped)
|
||||||
|
byte 3: The slave address of the card saving the panic
|
||||||
|
byte 4: A sequence number (starting at zero)
|
||||||
|
The rest of the bytes (11 bytes) are the panic string. If the panic string
|
||||||
|
is longer than 11 bytes, multiple messages will be sent with increasing
|
||||||
|
sequence numbers.
|
||||||
|
|
||||||
|
Because you cannot send OEM events using the standard interface, this
|
||||||
|
function will attempt to find an SEL and add the events there. It
|
||||||
|
will first query the capabilities of the local management controller.
|
||||||
|
If it has an SEL, then they will be stored in the SEL of the local
|
||||||
|
management controller. If not, and the local management controller is
|
||||||
|
an event generator, the event receiver from the local management
|
||||||
|
controller will be queried and the events sent to the SEL on that
|
||||||
|
device. Otherwise, the events go nowhere since there is nowhere to
|
||||||
|
send them.
|
||||||
|
|
||||||
|
|
||||||
|
Poweroff
|
||||||
|
--------
|
||||||
|
|
||||||
|
If the poweroff capability is selected, the IPMI driver will install
|
||||||
|
a shutdown function into the standard poweroff function pointer. This
|
||||||
|
is in the ipmi_poweroff module. When the system requests a powerdown,
|
||||||
|
it will send the proper IPMI commands to do this. This is supported on
|
||||||
|
several platforms.
|
||||||
|
|
||||||
|
There is a module parameter named "poweroff_control" that may either be zero
|
||||||
|
(do a power down) or 2 (do a power cycle, power the system off, then power
|
||||||
|
it on in a few seconds). Setting ipmi_poweroff.poweroff_control=x will do
|
||||||
|
the same thing on the kernel command line. The parameter is also available
|
||||||
|
via the proc filesystem in /proc/ipmi/poweroff_control. Note that if the
|
||||||
|
system does not support power cycling, it will always to the power off.
|
||||||
|
|
||||||
|
Note that if you have ACPI enabled, the system will prefer using ACPI to
|
||||||
|
power off.
|
||||||
|
|
|
@ -13,13 +13,14 @@ Allocating Device Numbers
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
Major and minor numbers for block and character devices are allocated
|
Major and minor numbers for block and character devices are allocated
|
||||||
by the Linux assigned name and number authority (currently better
|
by the Linux assigned name and number authority (currently this is
|
||||||
known as H Peter Anvin). The site is http://www.lanana.org/. This
|
Torben Mathiasen). The site is http://www.lanana.org/. This
|
||||||
also deals with allocating numbers for devices that are not going to
|
also deals with allocating numbers for devices that are not going to
|
||||||
be submitted to the mainstream kernel.
|
be submitted to the mainstream kernel.
|
||||||
|
See Documentation/devices.txt for more information on this.
|
||||||
|
|
||||||
If you don't use assigned numbers then when you device is submitted it will
|
If you don't use assigned numbers then when your device is submitted it will
|
||||||
get given an assigned number even if that is different from values you may
|
be given an assigned number even if that is different from values you may
|
||||||
have shipped to customers before.
|
have shipped to customers before.
|
||||||
|
|
||||||
Who To Submit Drivers To
|
Who To Submit Drivers To
|
||||||
|
@ -32,7 +33,8 @@ Linux 2.2:
|
||||||
If the code area has a general maintainer then please submit it to
|
If the code area has a general maintainer then please submit it to
|
||||||
the maintainer listed in MAINTAINERS in the kernel file. If the
|
the maintainer listed in MAINTAINERS in the kernel file. If the
|
||||||
maintainer does not respond or you cannot find the appropriate
|
maintainer does not respond or you cannot find the appropriate
|
||||||
maintainer then please contact Alan Cox <alan@lxorguk.ukuu.org.uk>
|
maintainer then please contact the 2.2 kernel maintainer:
|
||||||
|
Marc-Christian Petersen <m.c.p@wolk-project.de>.
|
||||||
|
|
||||||
Linux 2.4:
|
Linux 2.4:
|
||||||
The same rules apply as 2.2. The final contact point for Linux 2.4
|
The same rules apply as 2.2. The final contact point for Linux 2.4
|
||||||
|
@ -48,7 +50,7 @@ What Criteria Determine Acceptance
|
||||||
|
|
||||||
Licensing: The code must be released to us under the
|
Licensing: The code must be released to us under the
|
||||||
GNU General Public License. We don't insist on any kind
|
GNU General Public License. We don't insist on any kind
|
||||||
of exclusively GPL licensing, and if you wish the driver
|
of exclusive GPL licensing, and if you wish the driver
|
||||||
to be useful to other communities such as BSD you may well
|
to be useful to other communities such as BSD you may well
|
||||||
wish to release under multiple licenses.
|
wish to release under multiple licenses.
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ not in any lower subdirectory.
|
||||||
|
|
||||||
To create a patch for a single file, it is often sufficient to do:
|
To create a patch for a single file, it is often sufficient to do:
|
||||||
|
|
||||||
SRCTREE= linux-2.4
|
SRCTREE= linux-2.6
|
||||||
MYFILE= drivers/net/mydriver.c
|
MYFILE= drivers/net/mydriver.c
|
||||||
|
|
||||||
cd $SRCTREE
|
cd $SRCTREE
|
||||||
|
@ -48,17 +48,18 @@ To create a patch for multiple files, you should unpack a "vanilla",
|
||||||
or unmodified kernel source tree, and generate a diff against your
|
or unmodified kernel source tree, and generate a diff against your
|
||||||
own source tree. For example:
|
own source tree. For example:
|
||||||
|
|
||||||
MYSRC= /devel/linux-2.4
|
MYSRC= /devel/linux-2.6
|
||||||
|
|
||||||
tar xvfz linux-2.4.0-test11.tar.gz
|
tar xvfz linux-2.6.12.tar.gz
|
||||||
mv linux linux-vanilla
|
mv linux-2.6.12 linux-2.6.12-vanilla
|
||||||
wget http://www.moses.uklinux.net/patches/dontdiff
|
diff -uprN -X linux-2.6.12-vanilla/Documentation/dontdiff \
|
||||||
diff -uprN -X dontdiff linux-vanilla $MYSRC > /tmp/patch
|
linux-2.6.12-vanilla $MYSRC > /tmp/patch
|
||||||
rm -f dontdiff
|
|
||||||
|
|
||||||
"dontdiff" is a list of files which are generated by the kernel during
|
"dontdiff" is a list of files which are generated by the kernel during
|
||||||
the build process, and should be ignored in any diff(1)-generated
|
the build process, and should be ignored in any diff(1)-generated
|
||||||
patch. dontdiff is maintained by Tigran Aivazian <tigran@veritas.com>
|
patch. The "dontdiff" file is included in the kernel tree in
|
||||||
|
2.6.12 and later. For earlier kernel versions, you can get it
|
||||||
|
from <http://www.xenotime.net/linux/doc/dontdiff>.
|
||||||
|
|
||||||
Make sure your patch does not include any extra files which do not
|
Make sure your patch does not include any extra files which do not
|
||||||
belong in a patch submission. Make sure to review your patch -after-
|
belong in a patch submission. Make sure to review your patch -after-
|
||||||
|
@ -66,18 +67,20 @@ generated it with diff(1), to ensure accuracy.
|
||||||
|
|
||||||
If your changes produce a lot of deltas, you may want to look into
|
If your changes produce a lot of deltas, you may want to look into
|
||||||
splitting them into individual patches which modify things in
|
splitting them into individual patches which modify things in
|
||||||
logical stages, this will facilitate easier reviewing by other
|
logical stages. This will facilitate easier reviewing by other
|
||||||
kernel developers, very important if you want your patch accepted.
|
kernel developers, very important if you want your patch accepted.
|
||||||
There are a number of scripts which can aid in this;
|
There are a number of scripts which can aid in this:
|
||||||
|
|
||||||
Quilt:
|
Quilt:
|
||||||
http://savannah.nongnu.org/projects/quilt
|
http://savannah.nongnu.org/projects/quilt
|
||||||
|
|
||||||
Randy Dunlap's patch scripts:
|
Randy Dunlap's patch scripts:
|
||||||
http://developer.osdl.org/rddunlap/scripts/patching-scripts.tgz
|
http://www.xenotime.net/linux/scripts/patching-scripts-002.tar.gz
|
||||||
|
|
||||||
Andrew Morton's patch scripts:
|
Andrew Morton's patch scripts:
|
||||||
http://www.zip.com.au/~akpm/linux/patches/patch-scripts-0.16
|
http://www.zip.com.au/~akpm/linux/patches/patch-scripts-0.20
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2) Describe your changes.
|
2) Describe your changes.
|
||||||
|
|
||||||
|
@ -132,21 +135,6 @@ which require discussion or do not have a clear advantage should
|
||||||
usually be sent first to linux-kernel. Only after the patch is
|
usually be sent first to linux-kernel. Only after the patch is
|
||||||
discussed should the patch then be submitted to Linus.
|
discussed should the patch then be submitted to Linus.
|
||||||
|
|
||||||
For small patches you may want to CC the Trivial Patch Monkey
|
|
||||||
trivial@rustcorp.com.au set up by Rusty Russell; which collects "trivial"
|
|
||||||
patches. Trivial patches must qualify for one of the following rules:
|
|
||||||
Spelling fixes in documentation
|
|
||||||
Spelling fixes which could break grep(1).
|
|
||||||
Warning fixes (cluttering with useless warnings is bad)
|
|
||||||
Compilation fixes (only if they are actually correct)
|
|
||||||
Runtime fixes (only if they actually fix things)
|
|
||||||
Removing use of deprecated functions/macros (eg. check_region).
|
|
||||||
Contact detail and documentation fixes
|
|
||||||
Non-portable code replaced by portable code (even in arch-specific,
|
|
||||||
since people copy, as long as it's trivial)
|
|
||||||
Any fix by the author/maintainer of the file. (ie. patch monkey
|
|
||||||
in re-transmission mode)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
5) Select your CC (e-mail carbon copy) list.
|
5) Select your CC (e-mail carbon copy) list.
|
||||||
|
@ -178,6 +166,8 @@ patches. Trivial patches must qualify for one of the following rules:
|
||||||
since people copy, as long as it's trivial)
|
since people copy, as long as it's trivial)
|
||||||
Any fix by the author/maintainer of the file. (ie. patch monkey
|
Any fix by the author/maintainer of the file. (ie. patch monkey
|
||||||
in re-transmission mode)
|
in re-transmission mode)
|
||||||
|
URL: <http://www.kernel.org/pub/linux/kernel/people/rusty/trivial/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -299,13 +289,24 @@ can certify the below:
|
||||||
|
|
||||||
then you just add a line saying
|
then you just add a line saying
|
||||||
|
|
||||||
Signed-off-by: Random J Developer <random@developer.org>
|
Signed-off-by: Random J Developer <random@developer.example.org>
|
||||||
|
|
||||||
Some people also put extra tags at the end. They'll just be ignored for
|
Some people also put extra tags at the end. They'll just be ignored for
|
||||||
now, but you can do this to mark internal company procedures or just
|
now, but you can do this to mark internal company procedures or just
|
||||||
point out some special detail about the sign-off.
|
point out some special detail about the sign-off.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
12) More references for submitting patches
|
||||||
|
|
||||||
|
Andrew Morton, "The perfect patch" (tpp).
|
||||||
|
<http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt>
|
||||||
|
|
||||||
|
Jeff Garzik, "Linux kernel patch submission format."
|
||||||
|
<http://linux.yyz.us/patch-format.html>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
SECTION 2 - HINTS, TIPS, AND TRICKS
|
SECTION 2 - HINTS, TIPS, AND TRICKS
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
@ -374,7 +375,5 @@ and 'extern __inline__'.
|
||||||
4) Don't over-design.
|
4) Don't over-design.
|
||||||
|
|
||||||
Don't try to anticipate nebulous future cases which may or may not
|
Don't try to anticipate nebulous future cases which may or may not
|
||||||
be useful: "Make it as simple as you can, and no simpler"
|
be useful: "Make it as simple as you can, and no simpler."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,13 @@ dump output readprofile -m /boot/System.map > captured_profile
|
||||||
|
|
||||||
Oprofile
|
Oprofile
|
||||||
--------
|
--------
|
||||||
Get the source (I use 0.8) from http://oprofile.sourceforge.net/
|
|
||||||
and add "idle=poll" to the kernel command line
|
Get the source (see Changes for required version) from
|
||||||
|
http://oprofile.sourceforge.net/ and add "idle=poll" to the kernel command
|
||||||
|
line.
|
||||||
|
|
||||||
Configure with CONFIG_PROFILING=y and CONFIG_OPROFILE=y & reboot on new kernel
|
Configure with CONFIG_PROFILING=y and CONFIG_OPROFILE=y & reboot on new kernel
|
||||||
|
|
||||||
./configure --with-kernel-support
|
./configure --with-kernel-support
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
@ -46,7 +50,7 @@ start opcontrol --start
|
||||||
stop opcontrol --stop
|
stop opcontrol --stop
|
||||||
dump output opreport > output_file
|
dump output opreport > output_file
|
||||||
|
|
||||||
To only report on the kernel, run opreport /boot/vmlinux > output_file
|
To only report on the kernel, run opreport -l /boot/vmlinux > output_file
|
||||||
|
|
||||||
A reset is needed to clear old statistics, which survive a reboot.
|
A reset is needed to clear old statistics, which survive a reboot.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,176 @@
|
||||||
|
Block io priorities
|
||||||
|
===================
|
||||||
|
|
||||||
|
|
||||||
|
Intro
|
||||||
|
-----
|
||||||
|
|
||||||
|
With the introduction of cfq v3 (aka cfq-ts or time sliced cfq), basic io
|
||||||
|
priorities is supported for reads on files. This enables users to io nice
|
||||||
|
processes or process groups, similar to what has been possible to cpu
|
||||||
|
scheduling for ages. This document mainly details the current possibilites
|
||||||
|
with cfq, other io schedulers do not support io priorities so far.
|
||||||
|
|
||||||
|
Scheduling classes
|
||||||
|
------------------
|
||||||
|
|
||||||
|
CFQ implements three generic scheduling classes that determine how io is
|
||||||
|
served for a process.
|
||||||
|
|
||||||
|
IOPRIO_CLASS_RT: This is the realtime io class. This scheduling class is given
|
||||||
|
higher priority than any other in the system, processes from this class are
|
||||||
|
given first access to the disk every time. Thus it needs to be used with some
|
||||||
|
care, one io RT process can starve the entire system. Within the RT class,
|
||||||
|
there are 8 levels of class data that determine exactly how much time this
|
||||||
|
process needs the disk for on each service. In the future this might change
|
||||||
|
to be more directly mappable to performance, by passing in a wanted data
|
||||||
|
rate instead.
|
||||||
|
|
||||||
|
IOPRIO_CLASS_BE: This is the best-effort scheduling class, which is the default
|
||||||
|
for any process that hasn't set a specific io priority. The class data
|
||||||
|
determines how much io bandwidth the process will get, it's directly mappable
|
||||||
|
to the cpu nice levels just more coarsely implemented. 0 is the highest
|
||||||
|
BE prio level, 7 is the lowest. The mapping between cpu nice level and io
|
||||||
|
nice level is determined as: io_nice = (cpu_nice + 20) / 5.
|
||||||
|
|
||||||
|
IOPRIO_CLASS_IDLE: This is the idle scheduling class, processes running at this
|
||||||
|
level only get io time when no one else needs the disk. The idle class has no
|
||||||
|
class data, since it doesn't really apply here.
|
||||||
|
|
||||||
|
Tools
|
||||||
|
-----
|
||||||
|
|
||||||
|
See below for a sample ionice tool. Usage:
|
||||||
|
|
||||||
|
# ionice -c<class> -n<level> -p<pid>
|
||||||
|
|
||||||
|
If pid isn't given, the current process is assumed. IO priority settings
|
||||||
|
are inherited on fork, so you can use ionice to start the process at a given
|
||||||
|
level:
|
||||||
|
|
||||||
|
# ionice -c2 -n0 /bin/ls
|
||||||
|
|
||||||
|
will run ls at the best-effort scheduling class at the highest priority.
|
||||||
|
For a running process, you can give the pid instead:
|
||||||
|
|
||||||
|
# ionice -c1 -n2 -p100
|
||||||
|
|
||||||
|
will change pid 100 to run at the realtime scheduling class, at priority 2.
|
||||||
|
|
||||||
|
---> snip ionice.c tool <---
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ptrace.h>
|
||||||
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
|
extern int sys_ioprio_set(int, int, int);
|
||||||
|
extern int sys_ioprio_get(int, int);
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
#define __NR_ioprio_set 289
|
||||||
|
#define __NR_ioprio_get 290
|
||||||
|
#elif defined(__ppc__)
|
||||||
|
#define __NR_ioprio_set 273
|
||||||
|
#define __NR_ioprio_get 274
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
#define __NR_ioprio_set 251
|
||||||
|
#define __NR_ioprio_get 252
|
||||||
|
#elif defined(__ia64__)
|
||||||
|
#define __NR_ioprio_set 1274
|
||||||
|
#define __NR_ioprio_get 1275
|
||||||
|
#else
|
||||||
|
#error "Unsupported arch"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_syscall3(int, ioprio_set, int, which, int, who, int, ioprio);
|
||||||
|
_syscall2(int, ioprio_get, int, which, int, who);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IOPRIO_CLASS_NONE,
|
||||||
|
IOPRIO_CLASS_RT,
|
||||||
|
IOPRIO_CLASS_BE,
|
||||||
|
IOPRIO_CLASS_IDLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IOPRIO_WHO_PROCESS = 1,
|
||||||
|
IOPRIO_WHO_PGRP,
|
||||||
|
IOPRIO_WHO_USER,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IOPRIO_CLASS_SHIFT 13
|
||||||
|
|
||||||
|
const char *to_prio[] = { "none", "realtime", "best-effort", "idle", };
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int ioprio = 4, set = 0, ioprio_class = IOPRIO_CLASS_BE;
|
||||||
|
int c, pid = 0;
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "+n:c:p:")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 'n':
|
||||||
|
ioprio = strtol(optarg, NULL, 10);
|
||||||
|
set = 1;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
ioprio_class = strtol(optarg, NULL, 10);
|
||||||
|
set = 1;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
pid = strtol(optarg, NULL, 10);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ioprio_class) {
|
||||||
|
case IOPRIO_CLASS_NONE:
|
||||||
|
ioprio_class = IOPRIO_CLASS_BE;
|
||||||
|
break;
|
||||||
|
case IOPRIO_CLASS_RT:
|
||||||
|
case IOPRIO_CLASS_BE:
|
||||||
|
break;
|
||||||
|
case IOPRIO_CLASS_IDLE:
|
||||||
|
ioprio = 7;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("bad prio class %d\n", ioprio_class);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!set) {
|
||||||
|
if (!pid && argv[optind])
|
||||||
|
pid = strtol(argv[optind], NULL, 10);
|
||||||
|
|
||||||
|
ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid);
|
||||||
|
|
||||||
|
printf("pid=%d, %d\n", pid, ioprio);
|
||||||
|
|
||||||
|
if (ioprio == -1)
|
||||||
|
perror("ioprio_get");
|
||||||
|
else {
|
||||||
|
ioprio_class = ioprio >> IOPRIO_CLASS_SHIFT;
|
||||||
|
ioprio = ioprio & 0xff;
|
||||||
|
printf("%s: prio %d\n", to_prio[ioprio_class], ioprio);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio | ioprio_class << IOPRIO_CLASS_SHIFT) == -1) {
|
||||||
|
perror("ioprio_set");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv[optind])
|
||||||
|
execvp(argv[optind], &argv[optind]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
---> snip ionice.c tool <---
|
||||||
|
|
||||||
|
|
||||||
|
March 11 2005, Jens Axboe <axboe@suse.de>
|
|
@ -17,6 +17,7 @@ This driver is known to work with the following cards:
|
||||||
* SA P600
|
* SA P600
|
||||||
* SA P800
|
* SA P800
|
||||||
* SA E400
|
* SA E400
|
||||||
|
* SA E300
|
||||||
|
|
||||||
If nodes are not already created in the /dev/cciss directory, run as root:
|
If nodes are not already created in the /dev/cciss directory, run as root:
|
||||||
|
|
||||||
|
|
|
@ -419,6 +419,7 @@ into the file "track01":
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <linux/cdrom.h>
|
#include <linux/cdrom.h>
|
||||||
|
|
||||||
static struct cdrom_tochdr hdr;
|
static struct cdrom_tochdr hdr;
|
||||||
|
@ -429,7 +430,7 @@ static int datafile, drive;
|
||||||
static int i, j, limit, track, err;
|
static int i, j, limit, track, err;
|
||||||
static char filename[32];
|
static char filename[32];
|
||||||
|
|
||||||
main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* open /dev/cdrom
|
* open /dev/cdrom
|
||||||
|
@ -516,6 +517,7 @@ entry[track+1].cdte_addr.lba=entry[track].cdte_addr.lba+300;
|
||||||
}
|
}
|
||||||
arg.addr.lba++;
|
arg.addr.lba++;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
/*===================== end program ========================================*/
|
/*===================== end program ========================================*/
|
||||||
|
|
||||||
|
@ -564,15 +566,16 @@ Appendix -- the "cdtester" utility:
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <linux/cdrom.h>
|
#include <linux/cdrom.h>
|
||||||
|
|
||||||
#ifdef AZT_PRIVATE_IOCTLS
|
#ifdef AZT_PRIVATE_IOCTLS
|
||||||
#include <linux/../../drivers/cdrom/aztcd.h>
|
#include <linux/../../drivers/cdrom/aztcd.h>
|
||||||
#endif AZT_PRIVATE_IOCTLS
|
#endif /* AZT_PRIVATE_IOCTLS */
|
||||||
#ifdef SBP_PRIVATE_IOCTLS
|
#ifdef SBP_PRIVATE_IOCTLS
|
||||||
#include <linux/../../drivers/cdrom/sbpcd.h>
|
#include <linux/../../drivers/cdrom/sbpcd.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#endif SBP_PRIVATE_IOCTLS
|
#endif /* SBP_PRIVATE_IOCTLS */
|
||||||
|
|
||||||
struct cdrom_tochdr hdr;
|
struct cdrom_tochdr hdr;
|
||||||
struct cdrom_tochdr tocHdr;
|
struct cdrom_tochdr tocHdr;
|
||||||
|
@ -590,7 +593,7 @@ union
|
||||||
struct cdrom_msf msf;
|
struct cdrom_msf msf;
|
||||||
unsigned char buf[CD_FRAMESIZE_RAW];
|
unsigned char buf[CD_FRAMESIZE_RAW];
|
||||||
} azt;
|
} azt;
|
||||||
#endif AZT_PRIVATE_IOCTLS
|
#endif /* AZT_PRIVATE_IOCTLS */
|
||||||
int i, i1, i2, i3, j, k;
|
int i, i1, i2, i3, j, k;
|
||||||
unsigned char sequence=0;
|
unsigned char sequence=0;
|
||||||
unsigned char command[80];
|
unsigned char command[80];
|
||||||
|
@ -738,7 +741,7 @@ void display(int size,unsigned char *buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
printf("\nTesting tool for a CDROM driver's audio functions V0.1\n");
|
printf("\nTesting tool for a CDROM driver's audio functions V0.1\n");
|
||||||
printf("(C) 1995 Eberhard Moenkeberg <emoenke@gwdg.de>\n");
|
printf("(C) 1995 Eberhard Moenkeberg <emoenke@gwdg.de>\n");
|
||||||
|
@ -1046,12 +1049,13 @@ main(int argc, char *argv[])
|
||||||
rc=ioctl(drive,CDROMAUDIOBUFSIZ,j);
|
rc=ioctl(drive,CDROMAUDIOBUFSIZ,j);
|
||||||
printf("%d frames granted.\n",rc);
|
printf("%d frames granted.\n",rc);
|
||||||
break;
|
break;
|
||||||
#endif SBP_PRIVATE_IOCTLS
|
#endif /* SBP_PRIVATE_IOCTLS */
|
||||||
default:
|
default:
|
||||||
printf("unknown command: \"%s\".\n",command);
|
printf("unknown command: \"%s\".\n",command);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
/*==========================================================================*/
|
/*==========================================================================*/
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
|
|
||||||
Dominik Brodowski <linux@brodo.de>
|
Dominik Brodowski <linux@brodo.de>
|
||||||
|
some additions and corrections by Nico Golde <nico@ngolde.de>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,6 +26,7 @@ Contents:
|
||||||
2.1 Performance
|
2.1 Performance
|
||||||
2.2 Powersave
|
2.2 Powersave
|
||||||
2.3 Userspace
|
2.3 Userspace
|
||||||
|
2.4 Ondemand
|
||||||
|
|
||||||
3. The Governor Interface in the CPUfreq Core
|
3. The Governor Interface in the CPUfreq Core
|
||||||
|
|
||||||
|
@ -86,7 +88,7 @@ highest frequency within the borders of scaling_min_freq and
|
||||||
scaling_max_freq.
|
scaling_max_freq.
|
||||||
|
|
||||||
|
|
||||||
2.1 Powersave
|
2.2 Powersave
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The CPUfreq governor "powersave" sets the CPU statically to the
|
The CPUfreq governor "powersave" sets the CPU statically to the
|
||||||
|
@ -94,7 +96,7 @@ lowest frequency within the borders of scaling_min_freq and
|
||||||
scaling_max_freq.
|
scaling_max_freq.
|
||||||
|
|
||||||
|
|
||||||
2.2 Userspace
|
2.3 Userspace
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The CPUfreq governor "userspace" allows the user, or any userspace
|
The CPUfreq governor "userspace" allows the user, or any userspace
|
||||||
|
@ -103,6 +105,14 @@ by making a sysfs file "scaling_setspeed" available in the CPU-device
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
|
|
||||||
|
2.4 Ondemand
|
||||||
|
------------
|
||||||
|
|
||||||
|
The CPUfreq govenor "ondemand" sets the CPU depending on the
|
||||||
|
current usage. To do this the CPU must have the capability to
|
||||||
|
switch the frequency very fast.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3. The Governor Interface in the CPUfreq Core
|
3. The Governor Interface in the CPUfreq Core
|
||||||
=============================================
|
=============================================
|
||||||
|
|
|
@ -51,6 +51,14 @@ mems_allowed vector.
|
||||||
|
|
||||||
If a cpuset is cpu or mem exclusive, no other cpuset, other than a direct
|
If a cpuset is cpu or mem exclusive, no other cpuset, other than a direct
|
||||||
ancestor or descendent, may share any of the same CPUs or Memory Nodes.
|
ancestor or descendent, may share any of the same CPUs or Memory Nodes.
|
||||||
|
A cpuset that is cpu exclusive has a sched domain associated with it.
|
||||||
|
The sched domain consists of all cpus in the current cpuset that are not
|
||||||
|
part of any exclusive child cpusets.
|
||||||
|
This ensures that the scheduler load balacing code only balances
|
||||||
|
against the cpus that are in the sched domain as defined above and not
|
||||||
|
all of the cpus in the system. This removes any overhead due to
|
||||||
|
load balancing code trying to pull tasks outside of the cpu exclusive
|
||||||
|
cpuset only to be prevented by the tasks' cpus_allowed mask.
|
||||||
|
|
||||||
User level code may create and destroy cpusets by name in the cpuset
|
User level code may create and destroy cpusets by name in the cpuset
|
||||||
virtual file system, manage the attributes and permissions of these
|
virtual file system, manage the attributes and permissions of these
|
||||||
|
@ -84,6 +92,9 @@ This can be especially valuable on:
|
||||||
and a database), or
|
and a database), or
|
||||||
* NUMA systems running large HPC applications with demanding
|
* NUMA systems running large HPC applications with demanding
|
||||||
performance characteristics.
|
performance characteristics.
|
||||||
|
* Also cpu_exclusive cpusets are useful for servers running orthogonal
|
||||||
|
workloads such as RT applications requiring low latency and HPC
|
||||||
|
applications that are throughput sensitive
|
||||||
|
|
||||||
These subsets, or "soft partitions" must be able to be dynamically
|
These subsets, or "soft partitions" must be able to be dynamically
|
||||||
adjusted, as the job mix changes, without impacting other concurrently
|
adjusted, as the job mix changes, without impacting other concurrently
|
||||||
|
@ -125,6 +136,8 @@ Cpusets extends these two mechanisms as follows:
|
||||||
- A cpuset may be marked exclusive, which ensures that no other
|
- A cpuset may be marked exclusive, which ensures that no other
|
||||||
cpuset (except direct ancestors and descendents) may contain
|
cpuset (except direct ancestors and descendents) may contain
|
||||||
any overlapping CPUs or Memory Nodes.
|
any overlapping CPUs or Memory Nodes.
|
||||||
|
Also a cpu_exclusive cpuset would be associated with a sched
|
||||||
|
domain.
|
||||||
- You can list all the tasks (by pid) attached to any cpuset.
|
- You can list all the tasks (by pid) attached to any cpuset.
|
||||||
|
|
||||||
The implementation of cpusets requires a few, simple hooks
|
The implementation of cpusets requires a few, simple hooks
|
||||||
|
@ -136,6 +149,9 @@ into the rest of the kernel, none in performance critical paths:
|
||||||
allowed in that tasks cpuset.
|
allowed in that tasks cpuset.
|
||||||
- in sched.c migrate_all_tasks(), to keep migrating tasks within
|
- in sched.c migrate_all_tasks(), to keep migrating tasks within
|
||||||
the CPUs allowed by their cpuset, if possible.
|
the CPUs allowed by their cpuset, if possible.
|
||||||
|
- in sched.c, a new API partition_sched_domains for handling
|
||||||
|
sched domain changes associated with cpu_exclusive cpusets
|
||||||
|
and related changes in both sched.c and arch/ia64/kernel/domain.c
|
||||||
- in the mbind and set_mempolicy system calls, to mask the requested
|
- in the mbind and set_mempolicy system calls, to mask the requested
|
||||||
Memory Nodes by what's allowed in that tasks cpuset.
|
Memory Nodes by what's allowed in that tasks cpuset.
|
||||||
- in page_alloc, to restrict memory to allowed nodes.
|
- in page_alloc, to restrict memory to allowed nodes.
|
||||||
|
|
|
@ -94,6 +94,7 @@ Your cooperation is appreciated.
|
||||||
9 = /dev/urandom Faster, less secure random number gen.
|
9 = /dev/urandom Faster, less secure random number gen.
|
||||||
10 = /dev/aio Asyncronous I/O notification interface
|
10 = /dev/aio Asyncronous I/O notification interface
|
||||||
11 = /dev/kmsg Writes to this come out as printk's
|
11 = /dev/kmsg Writes to this come out as printk's
|
||||||
|
12 = /dev/oldmem Access to crash dump from kexec kernel
|
||||||
1 block RAM disk
|
1 block RAM disk
|
||||||
0 = /dev/ram0 First RAM disk
|
0 = /dev/ram0 First RAM disk
|
||||||
1 = /dev/ram1 Second RAM disk
|
1 = /dev/ram1 Second RAM disk
|
||||||
|
|
|
@ -1,16 +1,40 @@
|
||||||
Documentation for dib3000* frontend drivers and dibusb device driver
|
Documentation for dvb-usb-framework module and its devices
|
||||||
====================================================================
|
|
||||||
|
|
||||||
Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de),
|
Idea behind the dvb-usb-framework
|
||||||
|
=================================
|
||||||
|
|
||||||
dibusb and dib3000mb/mc drivers based on GPL code, which has
|
In March 2005 I got the new Twinhan USB2.0 DVB-T device. They provided specs and a firmware.
|
||||||
|
|
||||||
Copyright (C) 2004 Amaury Demol for DiBcom (ademol@dibcom.fr)
|
Quite keen I wanted to put the driver (with some quirks of course) into dibusb.
|
||||||
|
After reading some specs and doing some USB snooping, it realized, that the
|
||||||
|
dibusb-driver would be a complete mess afterwards. So I decided to do it in a
|
||||||
|
different way: With the help of a dvb-usb-framework.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
The framework provides generic functions (mostly kernel API calls), such as:
|
||||||
modify it under the terms of the GNU General Public License as
|
|
||||||
published by the Free Software Foundation, version 2.
|
|
||||||
|
|
||||||
|
- Transport Stream URB handling in conjunction with dvb-demux-feed-control
|
||||||
|
(bulk and isoc (TODO) are supported)
|
||||||
|
- registering the device for the DVB-API
|
||||||
|
- registering an I2C-adapter if applicable
|
||||||
|
- remote-control/input-device handling
|
||||||
|
- firmware requesting and loading (currently just for the Cypress USB
|
||||||
|
controller)
|
||||||
|
- other functions/methods which can be shared by several drivers (such as
|
||||||
|
functions for bulk-control-commands)
|
||||||
|
|
||||||
|
The source code of the particular DVB USB devices does just the communication
|
||||||
|
with the device via the bus. The connection between the DVB-API-functionality
|
||||||
|
is done via callbacks, assigned in a static device-description (struct
|
||||||
|
dvb_usb_device) each device-driver has to have.
|
||||||
|
|
||||||
|
For an example have a look in drivers/media/dvb/dvb-usb/vp7045*.
|
||||||
|
|
||||||
|
Objective is to migrate all the usb-devices (dibusb, cinergyT2, maybe the
|
||||||
|
ttusb; flexcop-usb already benefits from the generic flexcop-device) to use
|
||||||
|
the dvb-usb-lib.
|
||||||
|
|
||||||
|
TODO: dynamic enabling and disabling of the pid-filter in regard to number of
|
||||||
|
feeds requested.
|
||||||
|
|
||||||
Supported devices USB1.1
|
Supported devices USB1.1
|
||||||
========================
|
========================
|
||||||
|
@ -55,22 +79,34 @@ Others:
|
||||||
- Grandtec USB DVB-T
|
- Grandtec USB DVB-T
|
||||||
http://www.grand.com.tw/
|
http://www.grand.com.tw/
|
||||||
|
|
||||||
- Avermedia AverTV DVBT USB (2)
|
- AVerMedia AverTV DVBT USB
|
||||||
http://www.avermedia.com/
|
http://www.avermedia.com/
|
||||||
|
|
||||||
- DiBcom USB DVB-T reference device (non-public)
|
- DiBcom USB DVB-T reference device (non-public)
|
||||||
|
|
||||||
|
|
||||||
Supported devices USB2.0
|
Supported devices USB2.0-only
|
||||||
========================
|
=============================
|
||||||
- Twinhan MagicBox II (2)
|
- Twinhan MagicBox II
|
||||||
http://www.twinhan.com/product_terrestrial_7.asp
|
http://www.twinhan.com/product_terrestrial_7.asp
|
||||||
|
|
||||||
- Hanftek UMT-010 (1)
|
- TwinhanDTV Alpha
|
||||||
|
http://www.twinhan.com/product_terrestrial_8.asp
|
||||||
|
|
||||||
|
- DigitalNow TinyUSB 2 DVB-t Receiver
|
||||||
|
http://www.digitalnow.com.au/DigitalNow%20tinyUSB2%20Specifications.html
|
||||||
|
|
||||||
|
- Hanftek UMT-010
|
||||||
http://www.globalsources.com/si/6008819757082/ProductDetail/Digital-TV/product_id-100046529
|
http://www.globalsources.com/si/6008819757082/ProductDetail/Digital-TV/product_id-100046529
|
||||||
|
|
||||||
- Typhoon/Yakumo/HAMA DVB-T mobile USB2.0 (1)
|
|
||||||
|
Supported devices USB2.0 and USB1.1
|
||||||
|
=============================
|
||||||
|
- Typhoon/Yakumo/HAMA/Yuan DVB-T mobile USB2.0
|
||||||
http://www.yakumo.de/produkte/index.php?pid=1&ag=DVB-T
|
http://www.yakumo.de/produkte/index.php?pid=1&ag=DVB-T
|
||||||
|
http://www.yuan.com.tw/en/products/vdo_ub300.html
|
||||||
|
http://www.hama.de/portal/articleId*114663/action*2563
|
||||||
|
http://www.anubisline.com/english/articlec.asp?id=50502&catid=002
|
||||||
|
|
||||||
- Artec T1 USB TVBOX (FX2) (2)
|
- Artec T1 USB TVBOX (FX2) (2)
|
||||||
|
|
||||||
|
@ -81,14 +117,24 @@ Supported devices USB2.0
|
||||||
|
|
||||||
- DiBcom USB2.0 DVB-T reference device (non-public)
|
- DiBcom USB2.0 DVB-T reference device (non-public)
|
||||||
|
|
||||||
1) It is working almost.
|
- AVerMedia AverTV A800 DVB-T USB2.0
|
||||||
|
|
||||||
|
1) It is working almost - work-in-progress.
|
||||||
2) No test reports received yet.
|
2) No test reports received yet.
|
||||||
|
|
||||||
|
0. History & News:
|
||||||
|
2005-04-17 - all dibusb devices ported to make use of the dvb-usb-framework
|
||||||
|
2005-04-02 - re-enabled and improved remote control code.
|
||||||
|
2005-03-31 - ported the Yakumo/Hama/Typhoon DVB-T USB2.0 device to dvb-usb.
|
||||||
|
2005-03-30 - first commit of the dvb-usb-module based on the dibusb-source. First device is a new driver for the
|
||||||
|
TwinhanDTV Alpha / MagicBox II USB2.0-only DVB-T device.
|
||||||
|
|
||||||
0. NEWS:
|
(change from dvb-dibusb to dvb-usb)
|
||||||
|
2005-03-28 - added support for the AVerMedia AverTV DVB-T USB2.0 device (Thanks to Glen Harris and Jiun-Kuei Jung, AVerMedia)
|
||||||
|
2005-03-14 - added support for the Typhoon/Yakumo/HAMA DVB-T mobile USB2.0
|
||||||
2005-02-11 - added support for the KWorld/ADSTech Instant DVB-T USB2.0. Thanks a lot to Joachim von Caron
|
2005-02-11 - added support for the KWorld/ADSTech Instant DVB-T USB2.0. Thanks a lot to Joachim von Caron
|
||||||
2005-02-02 - added support for the Hauppauge Win-TV Nova-T USB2
|
2005-02-02 - added support for the Hauppauge Win-TV Nova-T USB2
|
||||||
2005-01-31 - distorted streaming is finally gone for USB1.1 devices
|
2005-01-31 - distorted streaming is gone for USB1.1 devices
|
||||||
2005-01-13 - moved the mirrored pid_filter_table back to dvb-dibusb
|
2005-01-13 - moved the mirrored pid_filter_table back to dvb-dibusb
|
||||||
- first almost working version for HanfTek UMT-010
|
- first almost working version for HanfTek UMT-010
|
||||||
- found out, that Yakumo/HAMA/Typhoon are predessors of the HanfTek UMT-010
|
- found out, that Yakumo/HAMA/Typhoon are predessors of the HanfTek UMT-010
|
||||||
|
@ -99,7 +145,7 @@ Supported devices USB2.0
|
||||||
2004-12-26 - refactored the dibusb-driver, splitted into separate files
|
2004-12-26 - refactored the dibusb-driver, splitted into separate files
|
||||||
- i2c-probing enabled
|
- i2c-probing enabled
|
||||||
2004-12-06 - possibility for demod i2c-address probing
|
2004-12-06 - possibility for demod i2c-address probing
|
||||||
- new usb IDs (Compro,Artec)
|
- new usb IDs (Compro, Artec)
|
||||||
2004-11-23 - merged changes from DiB3000MC_ver2.1
|
2004-11-23 - merged changes from DiB3000MC_ver2.1
|
||||||
- revised the debugging
|
- revised the debugging
|
||||||
- possibility to deliver the complete TS for USB2.0
|
- possibility to deliver the complete TS for USB2.0
|
||||||
|
@ -127,8 +173,8 @@ Supported devices USB2.0
|
||||||
CTS Portable (Chinese Television System)
|
CTS Portable (Chinese Television System)
|
||||||
2004-07-08 - firmware-extraction-2.422-problem solved, driver is now working
|
2004-07-08 - firmware-extraction-2.422-problem solved, driver is now working
|
||||||
properly with firmware extracted from 2.422
|
properly with firmware extracted from 2.422
|
||||||
- #if for 2.6.4 (dvb), compile issue
|
- #if for 2.6.4 (dvb), compile issue
|
||||||
- changed firmware handling, see vp7041.txt sec 1.1
|
- changed firmware handling, see vp7041.txt sec 1.1
|
||||||
2004-07-02 - some tuner modifications, v0.1, cleanups, first public
|
2004-07-02 - some tuner modifications, v0.1, cleanups, first public
|
||||||
2004-06-28 - now using the dvb_dmx_swfilter_packets, everything
|
2004-06-28 - now using the dvb_dmx_swfilter_packets, everything
|
||||||
runs fine now
|
runs fine now
|
||||||
|
@ -139,38 +185,27 @@ Supported devices USB2.0
|
||||||
2004-05-11 - start writing the driver
|
2004-05-11 - start writing the driver
|
||||||
|
|
||||||
1. How to use?
|
1. How to use?
|
||||||
NOTE: This driver was developed using Linux 2.6.6.,
|
|
||||||
it is working with 2.6.7 and above.
|
|
||||||
|
|
||||||
Linux 2.4.x support is not planned, but patches are very welcome.
|
|
||||||
|
|
||||||
NOTE: I'm using Debian testing, so the following explaination (especially
|
|
||||||
the hotplug-path) needn't match your system, but probably it will :).
|
|
||||||
|
|
||||||
The driver is included in the kernel since Linux 2.6.10.
|
|
||||||
|
|
||||||
1.1. Firmware
|
1.1. Firmware
|
||||||
|
|
||||||
The USB driver needs to download a firmware to start working.
|
Most of the USB drivers need to download a firmware to start working.
|
||||||
|
|
||||||
You can either use "get_dvb_firmware dibusb" to download the firmware or you
|
for USB1.1 (AN2135) you need: dvb-usb-dibusb-5.0.0.11.fw
|
||||||
can get it directly via
|
for USB2.0 HanfTek: dvb-usb-umt-010-02.fw
|
||||||
|
for USB2.0 DiBcom: dvb-usb-dibusb-6.0.0.8.fw
|
||||||
|
for USB2.0 AVerMedia AverTV DVB-T USB2: dvb-usb-avertv-a800-01.fw
|
||||||
|
for USB2.0 TwinhanDTV Alpha/MagicBox II: dvb-usb-vp7045-01.fw
|
||||||
|
|
||||||
for USB1.1 (AN2135)
|
The files can be found on http://www.linuxtv.org/download/firmware/ .
|
||||||
http://www.linuxtv.org/downloads/firmware/dvb-dibusb-5.0.0.11.fw
|
|
||||||
|
|
||||||
for USB1.1 (AN2235) (a few Artec T1 devices)
|
We do not have the permission (yet) to publish the following firmware-files.
|
||||||
http://www.linuxtv.org/downloads/firmware/dvb-dibusb-an2235-1.fw
|
You'll need to extract them from the windows drivers.
|
||||||
|
|
||||||
for USB2.0 (FX2) Hauppauge, DiBcom
|
You should be able to use "get_dvb_firmware dvb-usb" to get the firmware:
|
||||||
http://www.linuxtv.org/downloads/firmware/dvb-dibusb-6.0.0.5.fw
|
|
||||||
|
|
||||||
for USB2.0 ADSTech/Kworld USB2.0
|
|
||||||
http://www.linuxtv.org/downloads/firmware/dvb-dibusb-adstech-usb2-1.fw
|
|
||||||
|
|
||||||
for USB2.0 HanfTek
|
|
||||||
http://www.linuxtv.org/downloads/firmware/dvb-dibusb-an2235-1.fw
|
|
||||||
|
|
||||||
|
for USB1.1 (AN2235) (a few Artec T1 devices): dvb-usb-dibusb-an2235-01.fw
|
||||||
|
for USB2.0 Hauppauge: dvb-usb-nova-t-usb2-01.fw
|
||||||
|
for USB2.0 ADSTech/Kworld USB2.0: dvb-usb-adstech-usb2-01.fw
|
||||||
|
for USB2.0 Yakumo/Typhoon/Hama: dvb-usb-dtt200u-01.fw
|
||||||
|
|
||||||
1.2. Compiling
|
1.2. Compiling
|
||||||
|
|
||||||
|
@ -178,6 +213,9 @@ Since the driver is in the linux kernel, activating the driver in
|
||||||
your favorite config-environment should sufficient. I recommend
|
your favorite config-environment should sufficient. I recommend
|
||||||
to compile the driver as module. Hotplug does the rest.
|
to compile the driver as module. Hotplug does the rest.
|
||||||
|
|
||||||
|
If you use dvb-kernel enter the build-2.6 directory run 'make' and 'insmod.sh
|
||||||
|
load' afterwards.
|
||||||
|
|
||||||
1.3. Loading the drivers
|
1.3. Loading the drivers
|
||||||
|
|
||||||
Hotplug is able to load the driver, when it is needed (because you plugged
|
Hotplug is able to load the driver, when it is needed (because you plugged
|
||||||
|
@ -188,15 +226,13 @@ from withing the dvb-kernel cvs repository.
|
||||||
|
|
||||||
first have a look, which debug level are available:
|
first have a look, which debug level are available:
|
||||||
|
|
||||||
modinfo dib3000mb
|
modinfo dvb-usb
|
||||||
modinfo dib3000-common
|
modinfo dvb-usb-vp7045
|
||||||
modinfo dib3000mc
|
etc.
|
||||||
modinfo dvb-dibusb
|
|
||||||
|
|
||||||
modprobe dib3000-common debug=<level>
|
modprobe dvb-usb debug=<level>
|
||||||
modprobe dib3000mb debug=<level>
|
modprobe dvb-usb-vp7045 debug=<level>
|
||||||
modprobe dib3000mc debug=<level>
|
etc.
|
||||||
modprobe dvb-dibusb debug=<level>
|
|
||||||
|
|
||||||
should do the trick.
|
should do the trick.
|
||||||
|
|
||||||
|
@ -204,52 +240,32 @@ When the driver is loaded successfully, the firmware file was in
|
||||||
the right place and the device is connected, the "Power"-LED should be
|
the right place and the device is connected, the "Power"-LED should be
|
||||||
turned on.
|
turned on.
|
||||||
|
|
||||||
At this point you should be able to start a dvb-capable application. For myself
|
At this point you should be able to start a dvb-capable application. I'm use
|
||||||
I used mplayer, dvbscan, tzap and kaxtv, they are working. Using the device
|
(t|s)zap, mplayer and dvbscan to test the basics. VDR-xine provides the
|
||||||
in vdr is working now also.
|
long-term test scenario.
|
||||||
|
|
||||||
2. Known problems and bugs
|
2. Known problems and bugs
|
||||||
|
|
||||||
- Don't remove the USB device while running an DVB application, your system will die.
|
- Don't remove the USB device while running an DVB application, your system
|
||||||
|
will go crazy or die most likely.
|
||||||
|
|
||||||
2.1. Adding support for devices
|
2.1. Adding support for devices
|
||||||
|
|
||||||
It is not possible to determine the range of devices based on the DiBcom
|
TODO
|
||||||
reference designs. This is because the reference design of DiBcom can be sold
|
|
||||||
to thirds, without telling DiBcom (so done with the Twinhan VP7041 and
|
|
||||||
the HAMA device).
|
|
||||||
|
|
||||||
When you think you have a device like this and the driver does not recognizes it,
|
|
||||||
please send the ****load*.inf and the ****cap*.inf of the Windows driver to me.
|
|
||||||
|
|
||||||
Sometimes the Vendor or Product ID is identical to the ones of Twinhan, even
|
|
||||||
though it is not a Twinhan device (e.g. HAMA), then please send me the name
|
|
||||||
of the device. I will add it to this list in order to make this clear to
|
|
||||||
others.
|
|
||||||
|
|
||||||
If you are familar with C you can also add the VID and PID of the device to
|
|
||||||
the dvb-dibusb-core.c-file and create a patch and send it over to me or to
|
|
||||||
the linux-dvb mailing list, _after_ you have tried compiling and modprobing
|
|
||||||
it.
|
|
||||||
|
|
||||||
2.2. USB1.1 Bandwidth limitation
|
2.2. USB1.1 Bandwidth limitation
|
||||||
|
|
||||||
Most of the currently supported devices are USB1.1 and thus they have a
|
A lot of the currently supported devices are USB1.1 and thus they have a
|
||||||
maximum bandwidth of about 5-6 MBit/s when connected to a USB2.0 hub.
|
maximum bandwidth of about 5-6 MBit/s when connected to a USB2.0 hub.
|
||||||
This is not enough for receiving the complete transport stream of a
|
This is not enough for receiving the complete transport stream of a
|
||||||
DVB-T channel (which can be about 16 MBit/s). Normally this is not a
|
DVB-T channel (which is about 16 MBit/s). Normally this is not a
|
||||||
problem, if you only want to watch TV (this does not apply for HDTV),
|
problem, if you only want to watch TV (this does not apply for HDTV),
|
||||||
but watching a channel while recording another channel on the same
|
but watching a channel while recording another channel on the same
|
||||||
frequency simply does not work very well. This applies to all USB1.1
|
frequency simply does not work very well. This applies to all USB1.1
|
||||||
DVB-T devices, not just dibusb)
|
DVB-T devices, not just the dvb-usb-devices)
|
||||||
|
|
||||||
Update: For the USB1.1 and VDR some work has been done (patches and comments
|
|
||||||
are still very welcome). Maybe the problem is solved in the meantime because I
|
|
||||||
now use the dmx_sw_filter function instead of dmx_sw_filter_packet. I hope the
|
|
||||||
linux-dvb software filter is able to get the best of the garbled TS.
|
|
||||||
|
|
||||||
The bug, where the TS is distorted by a heavy usage of the device is gone
|
The bug, where the TS is distorted by a heavy usage of the device is gone
|
||||||
definitely. All dibusb-devices I was using (Twinhan, Kworld, DiBcom) are
|
definitely. All dvb-usb-devices I was using (Twinhan, Kworld, DiBcom) are
|
||||||
working like charm now with VDR. Sometimes I even was able to record a channel
|
working like charm now with VDR. Sometimes I even was able to record a channel
|
||||||
and watch another one.
|
and watch another one.
|
||||||
|
|
||||||
|
@ -258,7 +274,7 @@ and watch another one.
|
||||||
Patches, comments and suggestions are very very welcome.
|
Patches, comments and suggestions are very very welcome.
|
||||||
|
|
||||||
3. Acknowledgements
|
3. Acknowledgements
|
||||||
Amaury Demol (ademol@dibcom.fr) and Francois Kanounnikoff from DiBcom for
|
Amaury Demol (ademol@dibcom.fr) and Francois Kanounnikoff from DiBcom for
|
||||||
providing specs, code and help, on which the dvb-dibusb, dib3000mb and
|
providing specs, code and help, on which the dvb-dibusb, dib3000mb and
|
||||||
dib3000mc are based.
|
dib3000mc are based.
|
||||||
|
|
||||||
|
@ -270,9 +286,16 @@ Patches, comments and suggestions are very very welcome.
|
||||||
|
|
||||||
Bernd Wagner for helping with huge bug reports and discussions.
|
Bernd Wagner for helping with huge bug reports and discussions.
|
||||||
|
|
||||||
Gunnar Wittich and Joachim von Caron for their trust for giving me
|
Gunnar Wittich and Joachim von Caron for their trust for providing
|
||||||
root-shells on their machines to implement support for new devices.
|
root-shells on their machines to implement support for new devices.
|
||||||
|
|
||||||
|
Glen Harris for bringing up, that there is a new dibusb-device and Jiun-Kuei
|
||||||
|
Jung from AVerMedia who kindly provided a special firmware to get the device
|
||||||
|
up and running in Linux.
|
||||||
|
|
||||||
|
Jennifer Chen, Jeff and Jack from Twinhan for kindly supporting by
|
||||||
|
writing the vp7045-driver.
|
||||||
|
|
||||||
Some guys on the linux-dvb mailing list for encouraging me
|
Some guys on the linux-dvb mailing list for encouraging me
|
||||||
|
|
||||||
Peter Schildmann >peter.schildmann-nospam-at-web.de< for his
|
Peter Schildmann >peter.schildmann-nospam-at-web.de< for his
|
||||||
|
@ -282,4 +305,4 @@ Patches, comments and suggestions are very very welcome.
|
||||||
Ulf Hermenau for helping me out with traditional chinese.
|
Ulf Hermenau for helping me out with traditional chinese.
|
||||||
|
|
||||||
André Smoktun and Christian Frömmel for supporting me with
|
André Smoktun and Christian Frömmel for supporting me with
|
||||||
hardware and listening to my problems very patient
|
hardware and listening to my problems very patient.
|
|
@ -44,26 +44,23 @@ TwinHan (dst) are loaded automatically by the dvb-bt8xx device driver.
|
||||||
$ modprobe dst
|
$ modprobe dst
|
||||||
|
|
||||||
The value 0x71 will override the PCI type detection for dvb-bt8xx,
|
The value 0x71 will override the PCI type detection for dvb-bt8xx,
|
||||||
which is necessary for TwinHan cards.
|
which is necessary for TwinHan cards.
|
||||||
|
|
||||||
If you're having an older card (blue color circuit) and card=0x71 locks
|
If you're having an older card (blue color circuit) and card=0x71 locks
|
||||||
your machine, try using 0x68, too. If that does not work, ask on the
|
your machine, try using 0x68, too. If that does not work, ask on the
|
||||||
mailing list.
|
mailing list.
|
||||||
|
|
||||||
The DST module takes a couple of useful parameters.
|
The DST module takes a couple of useful parameters:
|
||||||
|
|
||||||
verbose takes values 0 to 5. These values control the verbosity level.
|
a. verbose takes values 0 to 5. These values control the verbosity level.
|
||||||
|
b. debug takes values 0 and 1. You can either disable or enable debugging.
|
||||||
debug takes values 0 and 1. You can either disable or enable debugging.
|
c. dst_addons takes values 0 and 0x20:
|
||||||
|
- A value of 0 means it is a FTA card.
|
||||||
dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card.
|
- A value of 0x20 means it has a Conditional Access slot.
|
||||||
0x20 means it has a Conditional Access slot.
|
|
||||||
|
|
||||||
The autodected values are determined bythe cards 'response
|
|
||||||
string' which you can see in your logs e.g.
|
|
||||||
|
|
||||||
dst_get_device_id: Recognise [DSTMCI]
|
|
||||||
|
|
||||||
|
The autodetected values are determined by the "response string"
|
||||||
|
of the card, which you can see in your logs:
|
||||||
|
e.g.: dst_get_device_id: Recognize [DSTMCI]
|
||||||
|
|
||||||
--
|
--
|
||||||
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham
|
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham, Uwe Bugla
|
||||||
|
|
|
@ -43,6 +43,14 @@ Who: Randy Dunlap <rddunlap@osdl.org>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
What: RAW driver (CONFIG_RAW_DRIVER)
|
||||||
|
When: December 2005
|
||||||
|
Why: declared obsolete since kernel 2.6.3
|
||||||
|
O_DIRECT can be used instead
|
||||||
|
Who: Adrian Bunk <bunk@stusta.de>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
What: register_ioctl32_conversion() / unregister_ioctl32_conversion()
|
What: register_ioctl32_conversion() / unregister_ioctl32_conversion()
|
||||||
When: April 2005
|
When: April 2005
|
||||||
Why: Replaced by ->compat_ioctl in file_operations and other method
|
Why: Replaced by ->compat_ioctl in file_operations and other method
|
||||||
|
|
|
@ -58,6 +58,8 @@ noacl Don't support POSIX ACLs.
|
||||||
|
|
||||||
nobh Do not attach buffer_heads to file pagecache.
|
nobh Do not attach buffer_heads to file pagecache.
|
||||||
|
|
||||||
|
xip Use execute in place (no caching) if possible
|
||||||
|
|
||||||
grpquota,noquota,quota,usrquota Quota options are silently ignored by ext2.
|
grpquota,noquota,quota,usrquota Quota options are silently ignored by ext2.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
Execute-in-place for file mappings
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Motivation
|
||||||
|
----------
|
||||||
|
File mappings are performed by mapping page cache pages to userspace. In
|
||||||
|
addition, read&write type file operations also transfer data from/to the page
|
||||||
|
cache.
|
||||||
|
|
||||||
|
For memory backed storage devices that use the block device interface, the page
|
||||||
|
cache pages are in fact copies of the original storage. Various approaches
|
||||||
|
exist to work around the need for an extra copy. The ramdisk driver for example
|
||||||
|
does read the data into the page cache, keeps a reference, and discards the
|
||||||
|
original data behind later on.
|
||||||
|
|
||||||
|
Execute-in-place solves this issue the other way around: instead of keeping
|
||||||
|
data in the page cache, the need to have a page cache copy is eliminated
|
||||||
|
completely. With execute-in-place, read&write type operations are performed
|
||||||
|
directly from/to the memory backed storage device. For file mappings, the
|
||||||
|
storage device itself is mapped directly into userspace.
|
||||||
|
|
||||||
|
This implementation was initialy written for shared memory segments between
|
||||||
|
different virtual machines on s390 hardware to allow multiple machines to
|
||||||
|
share the same binaries and libraries.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
--------------
|
||||||
|
Execute-in-place is implemented in three steps: block device operation,
|
||||||
|
address space operation, and file operations.
|
||||||
|
|
||||||
|
A block device operation named direct_access is used to retrieve a
|
||||||
|
reference (pointer) to a block on-disk. The reference is supposed to be
|
||||||
|
cpu-addressable, physical address and remain valid until the release operation
|
||||||
|
is performed. A struct block_device reference is used to address the device,
|
||||||
|
and a sector_t argument is used to identify the individual block. As an
|
||||||
|
alternative, memory technology devices can be used for this.
|
||||||
|
|
||||||
|
The block device operation is optional, these block devices support it as of
|
||||||
|
today:
|
||||||
|
- dcssblk: s390 dcss block device driver
|
||||||
|
|
||||||
|
An address space operation named get_xip_page is used to retrieve reference
|
||||||
|
to a struct page. To address the target page, a reference to an address_space,
|
||||||
|
and a sector number is provided. A 3rd argument indicates whether the
|
||||||
|
function should allocate blocks if needed.
|
||||||
|
|
||||||
|
This address space operation is mutually exclusive with readpage&writepage that
|
||||||
|
do page cache read/write operations.
|
||||||
|
The following filesystems support it as of today:
|
||||||
|
- ext2: the second extended filesystem, see Documentation/filesystems/ext2.txt
|
||||||
|
|
||||||
|
A set of file operations that do utilize get_xip_page can be found in
|
||||||
|
mm/filemap_xip.c . The following file operation implementations are provided:
|
||||||
|
- aio_read/aio_write
|
||||||
|
- readv/writev
|
||||||
|
- sendfile
|
||||||
|
|
||||||
|
The generic file operations do_sync_read/do_sync_write can be used to implement
|
||||||
|
classic synchronous IO calls.
|
||||||
|
|
||||||
|
Shortcomings
|
||||||
|
------------
|
||||||
|
This implementation is limited to storage devices that are cpu addressable at
|
||||||
|
all times (no highmem or such). It works well on rom/ram, but enhancements are
|
||||||
|
needed to make it work with flash in read+write mode.
|
||||||
|
Putting the Linux kernel and/or its modules on a xip filesystem does not mean
|
||||||
|
they are not copied.
|
|
@ -0,0 +1,179 @@
|
||||||
|
#
|
||||||
|
# This file contains a few gdb macros (user defined commands) to extract
|
||||||
|
# useful information from kernel crashdump (kdump) like stack traces of
|
||||||
|
# all the processes or a particular process and trapinfo.
|
||||||
|
#
|
||||||
|
# These macros can be used by copying this file in .gdbinit (put in home
|
||||||
|
# directory or current directory) or by invoking gdb command with
|
||||||
|
# --command=<command-file-name> option
|
||||||
|
#
|
||||||
|
# Credits:
|
||||||
|
# Alexander Nyberg <alexn@telia.com>
|
||||||
|
# V Srivatsa <vatsa@in.ibm.com>
|
||||||
|
# Maneesh Soni <maneesh@in.ibm.com>
|
||||||
|
#
|
||||||
|
|
||||||
|
define bttnobp
|
||||||
|
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||||
|
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||||
|
set $init_t=&init_task
|
||||||
|
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||||
|
while ($next_t != $init_t)
|
||||||
|
set $next_t=(struct task_struct *)$next_t
|
||||||
|
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||||
|
printf "===================\n"
|
||||||
|
set var $stackp = $next_t.thread.esp
|
||||||
|
set var $stack_top = ($stackp & ~4095) + 4096
|
||||||
|
|
||||||
|
while ($stackp < $stack_top)
|
||||||
|
if (*($stackp) > _stext && *($stackp) < _sinittext)
|
||||||
|
info symbol *($stackp)
|
||||||
|
end
|
||||||
|
set $stackp += 4
|
||||||
|
end
|
||||||
|
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||||
|
while ($next_th != $next_t)
|
||||||
|
set $next_th=(struct task_struct *)$next_th
|
||||||
|
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||||
|
printf "===================\n"
|
||||||
|
set var $stackp = $next_t.thread.esp
|
||||||
|
set var $stack_top = ($stackp & ~4095) + 4096
|
||||||
|
|
||||||
|
while ($stackp < $stack_top)
|
||||||
|
if (*($stackp) > _stext && *($stackp) < _sinittext)
|
||||||
|
info symbol *($stackp)
|
||||||
|
end
|
||||||
|
set $stackp += 4
|
||||||
|
end
|
||||||
|
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||||
|
end
|
||||||
|
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||||
|
end
|
||||||
|
end
|
||||||
|
document bttnobp
|
||||||
|
dump all thread stack traces on a kernel compiled with !CONFIG_FRAME_POINTER
|
||||||
|
end
|
||||||
|
|
||||||
|
define btt
|
||||||
|
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||||
|
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||||
|
set $init_t=&init_task
|
||||||
|
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||||
|
while ($next_t != $init_t)
|
||||||
|
set $next_t=(struct task_struct *)$next_t
|
||||||
|
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||||
|
printf "===================\n"
|
||||||
|
set var $stackp = $next_t.thread.esp
|
||||||
|
set var $stack_top = ($stackp & ~4095) + 4096
|
||||||
|
set var $stack_bot = ($stackp & ~4095)
|
||||||
|
|
||||||
|
set $stackp = *($stackp)
|
||||||
|
while (($stackp < $stack_top) && ($stackp > $stack_bot))
|
||||||
|
set var $addr = *($stackp + 4)
|
||||||
|
info symbol $addr
|
||||||
|
set $stackp = *($stackp)
|
||||||
|
end
|
||||||
|
|
||||||
|
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||||
|
while ($next_th != $next_t)
|
||||||
|
set $next_th=(struct task_struct *)$next_th
|
||||||
|
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||||
|
printf "===================\n"
|
||||||
|
set var $stackp = $next_t.thread.esp
|
||||||
|
set var $stack_top = ($stackp & ~4095) + 4096
|
||||||
|
set var $stack_bot = ($stackp & ~4095)
|
||||||
|
|
||||||
|
set $stackp = *($stackp)
|
||||||
|
while (($stackp < $stack_top) && ($stackp > $stack_bot))
|
||||||
|
set var $addr = *($stackp + 4)
|
||||||
|
info symbol $addr
|
||||||
|
set $stackp = *($stackp)
|
||||||
|
end
|
||||||
|
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||||
|
end
|
||||||
|
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||||
|
end
|
||||||
|
end
|
||||||
|
document btt
|
||||||
|
dump all thread stack traces on a kernel compiled with CONFIG_FRAME_POINTER
|
||||||
|
end
|
||||||
|
|
||||||
|
define btpid
|
||||||
|
set var $pid = $arg0
|
||||||
|
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||||
|
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||||
|
set $init_t=&init_task
|
||||||
|
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||||
|
set var $pid_task = 0
|
||||||
|
|
||||||
|
while ($next_t != $init_t)
|
||||||
|
set $next_t=(struct task_struct *)$next_t
|
||||||
|
|
||||||
|
if ($next_t.pid == $pid)
|
||||||
|
set $pid_task = $next_t
|
||||||
|
end
|
||||||
|
|
||||||
|
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||||
|
while ($next_th != $next_t)
|
||||||
|
set $next_th=(struct task_struct *)$next_th
|
||||||
|
if ($next_th.pid == $pid)
|
||||||
|
set $pid_task = $next_th
|
||||||
|
end
|
||||||
|
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||||
|
end
|
||||||
|
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||||
|
end
|
||||||
|
|
||||||
|
printf "\npid %d; comm %s:\n", $pid_task.pid, $pid_task.comm
|
||||||
|
printf "===================\n"
|
||||||
|
set var $stackp = $pid_task.thread.esp
|
||||||
|
set var $stack_top = ($stackp & ~4095) + 4096
|
||||||
|
set var $stack_bot = ($stackp & ~4095)
|
||||||
|
|
||||||
|
set $stackp = *($stackp)
|
||||||
|
while (($stackp < $stack_top) && ($stackp > $stack_bot))
|
||||||
|
set var $addr = *($stackp + 4)
|
||||||
|
info symbol $addr
|
||||||
|
set $stackp = *($stackp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
document btpid
|
||||||
|
backtrace of pid
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
define trapinfo
|
||||||
|
set var $pid = $arg0
|
||||||
|
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||||
|
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||||
|
set $init_t=&init_task
|
||||||
|
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||||
|
set var $pid_task = 0
|
||||||
|
|
||||||
|
while ($next_t != $init_t)
|
||||||
|
set $next_t=(struct task_struct *)$next_t
|
||||||
|
|
||||||
|
if ($next_t.pid == $pid)
|
||||||
|
set $pid_task = $next_t
|
||||||
|
end
|
||||||
|
|
||||||
|
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||||
|
while ($next_th != $next_t)
|
||||||
|
set $next_th=(struct task_struct *)$next_th
|
||||||
|
if ($next_th.pid == $pid)
|
||||||
|
set $pid_task = $next_th
|
||||||
|
end
|
||||||
|
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||||
|
end
|
||||||
|
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||||
|
end
|
||||||
|
|
||||||
|
printf "Trapno %ld, cr2 0x%lx, error_code %ld\n", $pid_task.thread.trap_no, \
|
||||||
|
$pid_task.thread.cr2, $pid_task.thread.error_code
|
||||||
|
|
||||||
|
end
|
||||||
|
document trapinfo
|
||||||
|
Run info threads and lookup pid of thread #1
|
||||||
|
'trapinfo <pid>' will tell you by which trap & possibly
|
||||||
|
addresthe kernel paniced.
|
||||||
|
end
|
|
@ -0,0 +1,141 @@
|
||||||
|
Documentation for kdump - the kexec-based crash dumping solution
|
||||||
|
================================================================
|
||||||
|
|
||||||
|
DESIGN
|
||||||
|
======
|
||||||
|
|
||||||
|
Kdump uses kexec to reboot to a second kernel whenever a dump needs to be taken.
|
||||||
|
This second kernel is booted with very little memory. The first kernel reserves
|
||||||
|
the section of memory that the second kernel uses. This ensures that on-going
|
||||||
|
DMA from the first kernel does not corrupt the second kernel.
|
||||||
|
|
||||||
|
All the necessary information about Core image is encoded in ELF format and
|
||||||
|
stored in reserved area of memory before crash. Physical address of start of
|
||||||
|
ELF header is passed to new kernel through command line parameter elfcorehdr=.
|
||||||
|
|
||||||
|
On i386, the first 640 KB of physical memory is needed to boot, irrespective
|
||||||
|
of where the kernel loads. Hence, this region is backed up by kexec just before
|
||||||
|
rebooting into the new kernel.
|
||||||
|
|
||||||
|
In the second kernel, "old memory" can be accessed in two ways.
|
||||||
|
|
||||||
|
- The first one is through a /dev/oldmem device interface. A capture utility
|
||||||
|
can read the device file and write out the memory in raw format. This is raw
|
||||||
|
dump of memory and analysis/capture tool should be intelligent enough to
|
||||||
|
determine where to look for the right information. ELF headers (elfcorehdr=)
|
||||||
|
can become handy here.
|
||||||
|
|
||||||
|
- The second interface is through /proc/vmcore. This exports the dump as an ELF
|
||||||
|
format file which can be written out using any file copy command
|
||||||
|
(cp, scp, etc). Further, gdb can be used to perform limited debugging on
|
||||||
|
the dump file. This method ensures methods ensure that there is correct
|
||||||
|
ordering of the dump pages (corresponding to the first 640 KB that has been
|
||||||
|
relocated).
|
||||||
|
|
||||||
|
SETUP
|
||||||
|
=====
|
||||||
|
|
||||||
|
1) Download http://www.xmission.com/~ebiederm/files/kexec/kexec-tools-1.101.tar.gz
|
||||||
|
and apply http://lse.sourceforge.net/kdump/patches/kexec-tools-1.101-kdump.patch
|
||||||
|
and after that build the source.
|
||||||
|
|
||||||
|
2) Download and build the appropriate (latest) kexec/kdump (-mm) kernel
|
||||||
|
patchset and apply it to the vanilla kernel tree.
|
||||||
|
|
||||||
|
Two kernels need to be built in order to get this feature working.
|
||||||
|
|
||||||
|
A) First kernel:
|
||||||
|
a) Enable "kexec system call" feature (in Processor type and features).
|
||||||
|
CONFIG_KEXEC=y
|
||||||
|
b) This kernel's physical load address should be the default value of
|
||||||
|
0x100000 (0x100000, 1 MB) (in Processor type and features).
|
||||||
|
CONFIG_PHYSICAL_START=0x100000
|
||||||
|
c) Enable "sysfs file system support" (in Pseudo filesystems).
|
||||||
|
CONFIG_SYSFS=y
|
||||||
|
d) Boot into first kernel with the command line parameter "crashkernel=Y@X".
|
||||||
|
Use appropriate values for X and Y. Y denotes how much memory to reserve
|
||||||
|
for the second kernel, and X denotes at what physical address the reserved
|
||||||
|
memory section starts. For example: "crashkernel=64M@16M".
|
||||||
|
|
||||||
|
B) Second kernel:
|
||||||
|
a) Enable "kernel crash dumps" feature (in Processor type and features).
|
||||||
|
CONFIG_CRASH_DUMP=y
|
||||||
|
b) Specify a suitable value for "Physical address where the kernel is
|
||||||
|
loaded" (in Processor type and features). Typically this value
|
||||||
|
should be same as X (See option d) above, e.g., 16 MB or 0x1000000.
|
||||||
|
CONFIG_PHYSICAL_START=0x1000000
|
||||||
|
c) Enable "/proc/vmcore support" (Optional, in Pseudo filesystems).
|
||||||
|
CONFIG_PROC_VMCORE=y
|
||||||
|
d) Disable SMP support and build a UP kernel (Until it is fixed).
|
||||||
|
CONFIG_SMP=n
|
||||||
|
e) Enable "Local APIC support on uniprocessors".
|
||||||
|
CONFIG_X86_UP_APIC=y
|
||||||
|
f) Enable "IO-APIC support on uniprocessors"
|
||||||
|
CONFIG_X86_UP_IOAPIC=y
|
||||||
|
|
||||||
|
Note: i) Options a) and b) depend upon "Configure standard kernel features
|
||||||
|
(for small systems)" (under General setup).
|
||||||
|
ii) Option a) also depends on CONFIG_HIGHMEM (under Processor
|
||||||
|
type and features).
|
||||||
|
iii) Both option a) and b) are under "Processor type and features".
|
||||||
|
|
||||||
|
3) Boot into the first kernel. You are now ready to try out kexec-based crash
|
||||||
|
dumps.
|
||||||
|
|
||||||
|
4) Load the second kernel to be booted using:
|
||||||
|
|
||||||
|
kexec -p <second-kernel> --crash-dump --args-linux --append="root=<root-dev>
|
||||||
|
init 1 irqpoll"
|
||||||
|
|
||||||
|
Note: i) <second-kernel> has to be a vmlinux image. bzImage will not work,
|
||||||
|
as of now.
|
||||||
|
ii) By default ELF headers are stored in ELF32 format (for i386). This
|
||||||
|
is sufficient to represent the physical memory up to 4GB. To store
|
||||||
|
headers in ELF64 format, specifiy "--elf64-core-headers" on the
|
||||||
|
kexec command line additionally.
|
||||||
|
iii) Specify "irqpoll" as command line parameter. This reduces driver
|
||||||
|
initialization failures in second kernel due to shared interrupts.
|
||||||
|
|
||||||
|
5) System reboots into the second kernel when a panic occurs. A module can be
|
||||||
|
written to force the panic or "ALT-SysRq-c" can be used initiate a crash
|
||||||
|
dump for testing purposes.
|
||||||
|
|
||||||
|
6) Write out the dump file using
|
||||||
|
|
||||||
|
cp /proc/vmcore <dump-file>
|
||||||
|
|
||||||
|
Dump memory can also be accessed as a /dev/oldmem device for a linear/raw
|
||||||
|
view. To create the device, type:
|
||||||
|
|
||||||
|
mknod /dev/oldmem c 1 12
|
||||||
|
|
||||||
|
Use "dd" with suitable options for count, bs and skip to access specific
|
||||||
|
portions of the dump.
|
||||||
|
|
||||||
|
Entire memory: dd if=/dev/oldmem of=oldmem.001
|
||||||
|
|
||||||
|
ANALYSIS
|
||||||
|
========
|
||||||
|
|
||||||
|
Limited analysis can be done using gdb on the dump file copied out of
|
||||||
|
/proc/vmcore. Use vmlinux built with -g and run
|
||||||
|
|
||||||
|
gdb vmlinux <dump-file>
|
||||||
|
|
||||||
|
Stack trace for the task on processor 0, register display, memory display
|
||||||
|
work fine.
|
||||||
|
|
||||||
|
Note: gdb cannot analyse core files generated in ELF64 format for i386.
|
||||||
|
|
||||||
|
TODO
|
||||||
|
====
|
||||||
|
|
||||||
|
1) Provide a kernel pages filtering mechanism so that core file size is not
|
||||||
|
insane on systems having huge memory banks.
|
||||||
|
2) Modify "crash" tool to make it recognize this dump.
|
||||||
|
|
||||||
|
CONTACT
|
||||||
|
=======
|
||||||
|
|
||||||
|
Vivek Goyal (vgoyal@in.ibm.com)
|
||||||
|
Maneesh Soni (maneesh@in.ibm.com)
|
|
@ -358,6 +358,10 @@ running once the system is up.
|
||||||
cpia_pp= [HW,PPT]
|
cpia_pp= [HW,PPT]
|
||||||
Format: { parport<nr> | auto | none }
|
Format: { parport<nr> | auto | none }
|
||||||
|
|
||||||
|
crashkernel=nn[KMG]@ss[KMG]
|
||||||
|
[KNL] Reserve a chunk of physical memory to
|
||||||
|
hold a kernel to switch to with kexec on panic.
|
||||||
|
|
||||||
cs4232= [HW,OSS]
|
cs4232= [HW,OSS]
|
||||||
Format: <io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>
|
Format: <io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>
|
||||||
|
|
||||||
|
@ -447,6 +451,10 @@ running once the system is up.
|
||||||
Format: {"as"|"cfq"|"deadline"|"noop"}
|
Format: {"as"|"cfq"|"deadline"|"noop"}
|
||||||
See Documentation/block/as-iosched.txt
|
See Documentation/block/as-iosched.txt
|
||||||
and Documentation/block/deadline-iosched.txt for details.
|
and Documentation/block/deadline-iosched.txt for details.
|
||||||
|
elfcorehdr= [IA-32]
|
||||||
|
Specifies physical address of start of kernel core image
|
||||||
|
elf header.
|
||||||
|
See Documentation/kdump.txt for details.
|
||||||
|
|
||||||
enforcing [SELINUX] Set initial enforcing status.
|
enforcing [SELINUX] Set initial enforcing status.
|
||||||
Format: {"0" | "1"}
|
Format: {"0" | "1"}
|
||||||
|
@ -548,6 +556,9 @@ running once the system is up.
|
||||||
|
|
||||||
i810= [HW,DRM]
|
i810= [HW,DRM]
|
||||||
|
|
||||||
|
i8k.ignore_dmi [HW] Continue probing hardware even if DMI data
|
||||||
|
indicates that the driver is running on unsupported
|
||||||
|
hardware.
|
||||||
i8k.force [HW] Activate i8k driver even if SMM BIOS signature
|
i8k.force [HW] Activate i8k driver even if SMM BIOS signature
|
||||||
does not match list of supported models.
|
does not match list of supported models.
|
||||||
i8k.power_status
|
i8k.power_status
|
||||||
|
@ -611,6 +622,17 @@ running once the system is up.
|
||||||
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
|
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
|
||||||
See header of drivers/scsi/ips.c.
|
See header of drivers/scsi/ips.c.
|
||||||
|
|
||||||
|
irqfixup [HW]
|
||||||
|
When an interrupt is not handled search all handlers
|
||||||
|
for it. Intended to get systems with badly broken
|
||||||
|
firmware running.
|
||||||
|
|
||||||
|
irqpoll [HW]
|
||||||
|
When an interrupt is not handled search all handlers
|
||||||
|
for it. Also check all handlers each timer
|
||||||
|
interrupt. Intended to get systems with badly broken
|
||||||
|
firmware running.
|
||||||
|
|
||||||
isapnp= [ISAPNP]
|
isapnp= [ISAPNP]
|
||||||
Format: <RDP>, <reset>, <pci_scan>, <verbosity>
|
Format: <RDP>, <reset>, <pci_scan>, <verbosity>
|
||||||
|
|
||||||
|
@ -1019,6 +1041,10 @@ running once the system is up.
|
||||||
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be assigned
|
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be assigned
|
||||||
automatically to PCI devices. You can make the kernel
|
automatically to PCI devices. You can make the kernel
|
||||||
exclude IRQs of your ISA cards this way.
|
exclude IRQs of your ISA cards this way.
|
||||||
|
pirqaddr=0xAAAAA [IA-32] Specify the physical address
|
||||||
|
of the PIRQ table (normally generated
|
||||||
|
by the BIOS) if it is outside the
|
||||||
|
F0000h-100000h range.
|
||||||
lastbus=N [IA-32] Scan all buses till bus #N. Can be useful
|
lastbus=N [IA-32] Scan all buses till bus #N. Can be useful
|
||||||
if the kernel is unable to find your secondary buses
|
if the kernel is unable to find your secondary buses
|
||||||
and you want to tell it explicitly which ones they are.
|
and you want to tell it explicitly which ones they are.
|
||||||
|
@ -1104,7 +1130,7 @@ running once the system is up.
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
|
||||||
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
||||||
probe for (bare|imps|exps).
|
probe for (bare|imps|exps|lifebook|any).
|
||||||
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
||||||
per second.
|
per second.
|
||||||
psmouse.resetafter=
|
psmouse.resetafter=
|
||||||
|
|
|
@ -22,6 +22,7 @@ This document has the following sections:
|
||||||
- New procfs files
|
- New procfs files
|
||||||
- Userspace system call interface
|
- Userspace system call interface
|
||||||
- Kernel services
|
- Kernel services
|
||||||
|
- Notes on accessing payload contents
|
||||||
- Defining a key type
|
- Defining a key type
|
||||||
- Request-key callback service
|
- Request-key callback service
|
||||||
- Key access filesystem
|
- Key access filesystem
|
||||||
|
@ -45,27 +46,26 @@ Each key has a number of attributes:
|
||||||
- State.
|
- State.
|
||||||
|
|
||||||
|
|
||||||
(*) Each key is issued a serial number of type key_serial_t that is unique
|
(*) Each key is issued a serial number of type key_serial_t that is unique for
|
||||||
for the lifetime of that key. All serial numbers are positive non-zero
|
the lifetime of that key. All serial numbers are positive non-zero 32-bit
|
||||||
32-bit integers.
|
integers.
|
||||||
|
|
||||||
Userspace programs can use a key's serial numbers as a way to gain access
|
Userspace programs can use a key's serial numbers as a way to gain access
|
||||||
to it, subject to permission checking.
|
to it, subject to permission checking.
|
||||||
|
|
||||||
(*) Each key is of a defined "type". Types must be registered inside the
|
(*) Each key is of a defined "type". Types must be registered inside the
|
||||||
kernel by a kernel service (such as a filesystem) before keys of that
|
kernel by a kernel service (such as a filesystem) before keys of that type
|
||||||
type can be added or used. Userspace programs cannot define new types
|
can be added or used. Userspace programs cannot define new types directly.
|
||||||
directly.
|
|
||||||
|
|
||||||
Key types are represented in the kernel by struct key_type. This defines
|
Key types are represented in the kernel by struct key_type. This defines a
|
||||||
a number of operations that can be performed on a key of that type.
|
number of operations that can be performed on a key of that type.
|
||||||
|
|
||||||
Should a type be removed from the system, all the keys of that type will
|
Should a type be removed from the system, all the keys of that type will
|
||||||
be invalidated.
|
be invalidated.
|
||||||
|
|
||||||
(*) Each key has a description. This should be a printable string. The key
|
(*) Each key has a description. This should be a printable string. The key
|
||||||
type provides an operation to perform a match between the description on
|
type provides an operation to perform a match between the description on a
|
||||||
a key and a criterion string.
|
key and a criterion string.
|
||||||
|
|
||||||
(*) Each key has an owner user ID, a group ID and a permissions mask. These
|
(*) Each key has an owner user ID, a group ID and a permissions mask. These
|
||||||
are used to control what a process may do to a key from userspace, and
|
are used to control what a process may do to a key from userspace, and
|
||||||
|
@ -74,10 +74,10 @@ Each key has a number of attributes:
|
||||||
(*) Each key can be set to expire at a specific time by the key type's
|
(*) Each key can be set to expire at a specific time by the key type's
|
||||||
instantiation function. Keys can also be immortal.
|
instantiation function. Keys can also be immortal.
|
||||||
|
|
||||||
(*) Each key can have a payload. This is a quantity of data that represent
|
(*) Each key can have a payload. This is a quantity of data that represent the
|
||||||
the actual "key". In the case of a keyring, this is a list of keys to
|
actual "key". In the case of a keyring, this is a list of keys to which
|
||||||
which the keyring links; in the case of a user-defined key, it's an
|
the keyring links; in the case of a user-defined key, it's an arbitrary
|
||||||
arbitrary blob of data.
|
blob of data.
|
||||||
|
|
||||||
Having a payload is not required; and the payload can, in fact, just be a
|
Having a payload is not required; and the payload can, in fact, just be a
|
||||||
value stored in the struct key itself.
|
value stored in the struct key itself.
|
||||||
|
@ -92,8 +92,8 @@ Each key has a number of attributes:
|
||||||
|
|
||||||
(*) Each key can be in one of a number of basic states:
|
(*) Each key can be in one of a number of basic states:
|
||||||
|
|
||||||
(*) Uninstantiated. The key exists, but does not have any data
|
(*) Uninstantiated. The key exists, but does not have any data attached.
|
||||||
attached. Keys being requested from userspace will be in this state.
|
Keys being requested from userspace will be in this state.
|
||||||
|
|
||||||
(*) Instantiated. This is the normal state. The key is fully formed, and
|
(*) Instantiated. This is the normal state. The key is fully formed, and
|
||||||
has data attached.
|
has data attached.
|
||||||
|
@ -140,10 +140,10 @@ The key service provides a number of features besides keys:
|
||||||
clone, fork, vfork or execve occurs. A new keyring is created only when
|
clone, fork, vfork or execve occurs. A new keyring is created only when
|
||||||
required.
|
required.
|
||||||
|
|
||||||
The process-specific keyring is replaced with an empty one in the child
|
The process-specific keyring is replaced with an empty one in the child on
|
||||||
on clone, fork, vfork unless CLONE_THREAD is supplied, in which case it
|
clone, fork, vfork unless CLONE_THREAD is supplied, in which case it is
|
||||||
is shared. execve also discards the process's process keyring and creates
|
shared. execve also discards the process's process keyring and creates a
|
||||||
a new one.
|
new one.
|
||||||
|
|
||||||
The session-specific keyring is persistent across clone, fork, vfork and
|
The session-specific keyring is persistent across clone, fork, vfork and
|
||||||
execve, even when the latter executes a set-UID or set-GID binary. A
|
execve, even when the latter executes a set-UID or set-GID binary. A
|
||||||
|
@ -177,11 +177,11 @@ The key service provides a number of features besides keys:
|
||||||
If a system call that modifies a key or keyring in some way would put the
|
If a system call that modifies a key or keyring in some way would put the
|
||||||
user over quota, the operation is refused and error EDQUOT is returned.
|
user over quota, the operation is refused and error EDQUOT is returned.
|
||||||
|
|
||||||
(*) There's a system call interface by which userspace programs can create
|
(*) There's a system call interface by which userspace programs can create and
|
||||||
and manipulate keys and keyrings.
|
manipulate keys and keyrings.
|
||||||
|
|
||||||
(*) There's a kernel interface by which services can register types and
|
(*) There's a kernel interface by which services can register types and search
|
||||||
search for keys.
|
for keys.
|
||||||
|
|
||||||
(*) There's a way for the a search done from the kernel to call back to
|
(*) There's a way for the a search done from the kernel to call back to
|
||||||
userspace to request a key that can't be found in a process's keyrings.
|
userspace to request a key that can't be found in a process's keyrings.
|
||||||
|
@ -194,9 +194,9 @@ The key service provides a number of features besides keys:
|
||||||
KEY ACCESS PERMISSIONS
|
KEY ACCESS PERMISSIONS
|
||||||
======================
|
======================
|
||||||
|
|
||||||
Keys have an owner user ID, a group access ID, and a permissions mask. The
|
Keys have an owner user ID, a group access ID, and a permissions mask. The mask
|
||||||
mask has up to eight bits each for user, group and other access. Only five of
|
has up to eight bits each for user, group and other access. Only five of each
|
||||||
each set of eight bits are defined. These permissions granted are:
|
set of eight bits are defined. These permissions granted are:
|
||||||
|
|
||||||
(*) View
|
(*) View
|
||||||
|
|
||||||
|
@ -210,8 +210,8 @@ each set of eight bits are defined. These permissions granted are:
|
||||||
|
|
||||||
(*) Write
|
(*) Write
|
||||||
|
|
||||||
This permits a key's payload to be instantiated or updated, or it allows
|
This permits a key's payload to be instantiated or updated, or it allows a
|
||||||
a link to be added to or removed from a keyring.
|
link to be added to or removed from a keyring.
|
||||||
|
|
||||||
(*) Search
|
(*) Search
|
||||||
|
|
||||||
|
@ -238,8 +238,8 @@ about the status of the key service:
|
||||||
(*) /proc/keys
|
(*) /proc/keys
|
||||||
|
|
||||||
This lists all the keys on the system, giving information about their
|
This lists all the keys on the system, giving information about their
|
||||||
type, description and permissions. The payload of the key is not
|
type, description and permissions. The payload of the key is not available
|
||||||
available this way:
|
this way:
|
||||||
|
|
||||||
SERIAL FLAGS USAGE EXPY PERM UID GID TYPE DESCRIPTION: SUMMARY
|
SERIAL FLAGS USAGE EXPY PERM UID GID TYPE DESCRIPTION: SUMMARY
|
||||||
00000001 I----- 39 perm 1f0000 0 0 keyring _uid_ses.0: 1/4
|
00000001 I----- 39 perm 1f0000 0 0 keyring _uid_ses.0: 1/4
|
||||||
|
@ -318,21 +318,21 @@ The main syscalls are:
|
||||||
If a key of the same type and description as that proposed already exists
|
If a key of the same type and description as that proposed already exists
|
||||||
in the keyring, this will try to update it with the given payload, or it
|
in the keyring, this will try to update it with the given payload, or it
|
||||||
will return error EEXIST if that function is not supported by the key
|
will return error EEXIST if that function is not supported by the key
|
||||||
type. The process must also have permission to write to the key to be
|
type. The process must also have permission to write to the key to be able
|
||||||
able to update it. The new key will have all user permissions granted and
|
to update it. The new key will have all user permissions granted and no
|
||||||
no group or third party permissions.
|
group or third party permissions.
|
||||||
|
|
||||||
Otherwise, this will attempt to create a new key of the specified type
|
Otherwise, this will attempt to create a new key of the specified type and
|
||||||
and description, and to instantiate it with the supplied payload and
|
description, and to instantiate it with the supplied payload and attach it
|
||||||
attach it to the keyring. In this case, an error will be generated if the
|
to the keyring. In this case, an error will be generated if the process
|
||||||
process does not have permission to write to the keyring.
|
does not have permission to write to the keyring.
|
||||||
|
|
||||||
The payload is optional, and the pointer can be NULL if not required by
|
The payload is optional, and the pointer can be NULL if not required by
|
||||||
the type. The payload is plen in size, and plen can be zero for an empty
|
the type. The payload is plen in size, and plen can be zero for an empty
|
||||||
payload.
|
payload.
|
||||||
|
|
||||||
A new keyring can be generated by setting type "keyring", the keyring
|
A new keyring can be generated by setting type "keyring", the keyring name
|
||||||
name as the description (or NULL) and setting the payload to NULL.
|
as the description (or NULL) and setting the payload to NULL.
|
||||||
|
|
||||||
User defined keys can be created by specifying type "user". It is
|
User defined keys can be created by specifying type "user". It is
|
||||||
recommended that a user defined key's description by prefixed with a type
|
recommended that a user defined key's description by prefixed with a type
|
||||||
|
@ -369,9 +369,9 @@ The keyctl syscall functions are:
|
||||||
key_serial_t keyctl(KEYCTL_GET_KEYRING_ID, key_serial_t id,
|
key_serial_t keyctl(KEYCTL_GET_KEYRING_ID, key_serial_t id,
|
||||||
int create);
|
int create);
|
||||||
|
|
||||||
The special key specified by "id" is looked up (with the key being
|
The special key specified by "id" is looked up (with the key being created
|
||||||
created if necessary) and the ID of the key or keyring thus found is
|
if necessary) and the ID of the key or keyring thus found is returned if
|
||||||
returned if it exists.
|
it exists.
|
||||||
|
|
||||||
If the key does not yet exist, the key will be created if "create" is
|
If the key does not yet exist, the key will be created if "create" is
|
||||||
non-zero; and the error ENOKEY will be returned if "create" is zero.
|
non-zero; and the error ENOKEY will be returned if "create" is zero.
|
||||||
|
@ -402,8 +402,8 @@ The keyctl syscall functions are:
|
||||||
|
|
||||||
This will try to update the specified key with the given payload, or it
|
This will try to update the specified key with the given payload, or it
|
||||||
will return error EOPNOTSUPP if that function is not supported by the key
|
will return error EOPNOTSUPP if that function is not supported by the key
|
||||||
type. The process must also have permission to write to the key to be
|
type. The process must also have permission to write to the key to be able
|
||||||
able to update it.
|
to update it.
|
||||||
|
|
||||||
The payload is of length plen, and may be absent or empty as for
|
The payload is of length plen, and may be absent or empty as for
|
||||||
add_key().
|
add_key().
|
||||||
|
@ -422,8 +422,8 @@ The keyctl syscall functions are:
|
||||||
|
|
||||||
long keyctl(KEYCTL_CHOWN, key_serial_t key, uid_t uid, gid_t gid);
|
long keyctl(KEYCTL_CHOWN, key_serial_t key, uid_t uid, gid_t gid);
|
||||||
|
|
||||||
This function permits a key's owner and group ID to be changed. Either
|
This function permits a key's owner and group ID to be changed. Either one
|
||||||
one of uid or gid can be set to -1 to suppress that change.
|
of uid or gid can be set to -1 to suppress that change.
|
||||||
|
|
||||||
Only the superuser can change a key's owner to something other than the
|
Only the superuser can change a key's owner to something other than the
|
||||||
key's current owner. Similarly, only the superuser can change a key's
|
key's current owner. Similarly, only the superuser can change a key's
|
||||||
|
@ -484,12 +484,12 @@ The keyctl syscall functions are:
|
||||||
|
|
||||||
long keyctl(KEYCTL_LINK, key_serial_t keyring, key_serial_t key);
|
long keyctl(KEYCTL_LINK, key_serial_t keyring, key_serial_t key);
|
||||||
|
|
||||||
This function creates a link from the keyring to the key. The process
|
This function creates a link from the keyring to the key. The process must
|
||||||
must have write permission on the keyring and must have link permission
|
have write permission on the keyring and must have link permission on the
|
||||||
on the key.
|
key.
|
||||||
|
|
||||||
Should the keyring not be a keyring, error ENOTDIR will result; and if
|
Should the keyring not be a keyring, error ENOTDIR will result; and if the
|
||||||
the keyring is full, error ENFILE will result.
|
keyring is full, error ENFILE will result.
|
||||||
|
|
||||||
The link procedure checks the nesting of the keyrings, returning ELOOP if
|
The link procedure checks the nesting of the keyrings, returning ELOOP if
|
||||||
it appears to deep or EDEADLK if the link would introduce a cycle.
|
it appears to deep or EDEADLK if the link would introduce a cycle.
|
||||||
|
@ -503,8 +503,8 @@ The keyctl syscall functions are:
|
||||||
specified key, and removes it if found. Subsequent links to that key are
|
specified key, and removes it if found. Subsequent links to that key are
|
||||||
ignored. The process must have write permission on the keyring.
|
ignored. The process must have write permission on the keyring.
|
||||||
|
|
||||||
If the keyring is not a keyring, error ENOTDIR will result; and if the
|
If the keyring is not a keyring, error ENOTDIR will result; and if the key
|
||||||
key is not present, error ENOENT will be the result.
|
is not present, error ENOENT will be the result.
|
||||||
|
|
||||||
|
|
||||||
(*) Search a keyring tree for a key:
|
(*) Search a keyring tree for a key:
|
||||||
|
@ -513,9 +513,9 @@ The keyctl syscall functions are:
|
||||||
const char *type, const char *description,
|
const char *type, const char *description,
|
||||||
key_serial_t dest_keyring);
|
key_serial_t dest_keyring);
|
||||||
|
|
||||||
This searches the keyring tree headed by the specified keyring until a
|
This searches the keyring tree headed by the specified keyring until a key
|
||||||
key is found that matches the type and description criteria. Each keyring
|
is found that matches the type and description criteria. Each keyring is
|
||||||
is checked for keys before recursion into its children occurs.
|
checked for keys before recursion into its children occurs.
|
||||||
|
|
||||||
The process must have search permission on the top level keyring, or else
|
The process must have search permission on the top level keyring, or else
|
||||||
error EACCES will result. Only keyrings that the process has search
|
error EACCES will result. Only keyrings that the process has search
|
||||||
|
@ -549,8 +549,8 @@ The keyctl syscall functions are:
|
||||||
As much of the data as can be fitted into the buffer will be copied to
|
As much of the data as can be fitted into the buffer will be copied to
|
||||||
userspace if the buffer pointer is not NULL.
|
userspace if the buffer pointer is not NULL.
|
||||||
|
|
||||||
On a successful return, the function will always return the amount of
|
On a successful return, the function will always return the amount of data
|
||||||
data available rather than the amount copied.
|
available rather than the amount copied.
|
||||||
|
|
||||||
|
|
||||||
(*) Instantiate a partially constructed key.
|
(*) Instantiate a partially constructed key.
|
||||||
|
@ -568,8 +568,8 @@ The keyctl syscall functions are:
|
||||||
it, and the key must be uninstantiated.
|
it, and the key must be uninstantiated.
|
||||||
|
|
||||||
If a keyring is specified (non-zero), the key will also be linked into
|
If a keyring is specified (non-zero), the key will also be linked into
|
||||||
that keyring, however all the constraints applying in KEYCTL_LINK apply
|
that keyring, however all the constraints applying in KEYCTL_LINK apply in
|
||||||
in this case too.
|
this case too.
|
||||||
|
|
||||||
The payload and plen arguments describe the payload data as for add_key().
|
The payload and plen arguments describe the payload data as for add_key().
|
||||||
|
|
||||||
|
@ -587,8 +587,39 @@ The keyctl syscall functions are:
|
||||||
it, and the key must be uninstantiated.
|
it, and the key must be uninstantiated.
|
||||||
|
|
||||||
If a keyring is specified (non-zero), the key will also be linked into
|
If a keyring is specified (non-zero), the key will also be linked into
|
||||||
that keyring, however all the constraints applying in KEYCTL_LINK apply
|
that keyring, however all the constraints applying in KEYCTL_LINK apply in
|
||||||
in this case too.
|
this case too.
|
||||||
|
|
||||||
|
|
||||||
|
(*) Set the default request-key destination keyring.
|
||||||
|
|
||||||
|
long keyctl(KEYCTL_SET_REQKEY_KEYRING, int reqkey_defl);
|
||||||
|
|
||||||
|
This sets the default keyring to which implicitly requested keys will be
|
||||||
|
attached for this thread. reqkey_defl should be one of these constants:
|
||||||
|
|
||||||
|
CONSTANT VALUE NEW DEFAULT KEYRING
|
||||||
|
====================================== ====== =======================
|
||||||
|
KEY_REQKEY_DEFL_NO_CHANGE -1 No change
|
||||||
|
KEY_REQKEY_DEFL_DEFAULT 0 Default[1]
|
||||||
|
KEY_REQKEY_DEFL_THREAD_KEYRING 1 Thread keyring
|
||||||
|
KEY_REQKEY_DEFL_PROCESS_KEYRING 2 Process keyring
|
||||||
|
KEY_REQKEY_DEFL_SESSION_KEYRING 3 Session keyring
|
||||||
|
KEY_REQKEY_DEFL_USER_KEYRING 4 User keyring
|
||||||
|
KEY_REQKEY_DEFL_USER_SESSION_KEYRING 5 User session keyring
|
||||||
|
KEY_REQKEY_DEFL_GROUP_KEYRING 6 Group keyring
|
||||||
|
|
||||||
|
The old default will be returned if successful and error EINVAL will be
|
||||||
|
returned if reqkey_defl is not one of the above values.
|
||||||
|
|
||||||
|
The default keyring can be overridden by the keyring indicated to the
|
||||||
|
request_key() system call.
|
||||||
|
|
||||||
|
Note that this setting is inherited across fork/exec.
|
||||||
|
|
||||||
|
[1] The default default is: the thread keyring if there is one, otherwise
|
||||||
|
the process keyring if there is one, otherwise the session keyring if
|
||||||
|
there is one, otherwise the user default session keyring.
|
||||||
|
|
||||||
|
|
||||||
===============
|
===============
|
||||||
|
@ -601,17 +632,14 @@ be broken down into two areas: keys and key types.
|
||||||
Dealing with keys is fairly straightforward. Firstly, the kernel service
|
Dealing with keys is fairly straightforward. Firstly, the kernel service
|
||||||
registers its type, then it searches for a key of that type. It should retain
|
registers its type, then it searches for a key of that type. It should retain
|
||||||
the key as long as it has need of it, and then it should release it. For a
|
the key as long as it has need of it, and then it should release it. For a
|
||||||
filesystem or device file, a search would probably be performed during the
|
filesystem or device file, a search would probably be performed during the open
|
||||||
open call, and the key released upon close. How to deal with conflicting keys
|
call, and the key released upon close. How to deal with conflicting keys due to
|
||||||
due to two different users opening the same file is left to the filesystem
|
two different users opening the same file is left to the filesystem author to
|
||||||
author to solve.
|
solve.
|
||||||
|
|
||||||
When accessing a key's payload data, key->lock should be at least read locked,
|
When accessing a key's payload contents, certain precautions must be taken to
|
||||||
or else the data may be changed by an update being performed from userspace
|
prevent access vs modification races. See the section "Notes on accessing
|
||||||
whilst the driver or filesystem is trying to access it. If no update method is
|
payload contents" for more information.
|
||||||
supplied, then the key's payload may be accessed without holding a lock as
|
|
||||||
there is no way to change it, provided it can be guaranteed that the key's
|
|
||||||
type definition won't go away.
|
|
||||||
|
|
||||||
(*) To search for a key, call:
|
(*) To search for a key, call:
|
||||||
|
|
||||||
|
@ -629,6 +657,9 @@ type definition won't go away.
|
||||||
Should the function fail error ENOKEY, EKEYEXPIRED or EKEYREVOKED will be
|
Should the function fail error ENOKEY, EKEYEXPIRED or EKEYREVOKED will be
|
||||||
returned.
|
returned.
|
||||||
|
|
||||||
|
If successful, the key will have been attached to the default keyring for
|
||||||
|
implicitly obtained request-key keys, as set by KEYCTL_SET_REQKEY_KEYRING.
|
||||||
|
|
||||||
|
|
||||||
(*) When it is no longer required, the key should be released using:
|
(*) When it is no longer required, the key should be released using:
|
||||||
|
|
||||||
|
@ -690,6 +721,54 @@ type definition won't go away.
|
||||||
void unregister_key_type(struct key_type *type);
|
void unregister_key_type(struct key_type *type);
|
||||||
|
|
||||||
|
|
||||||
|
===================================
|
||||||
|
NOTES ON ACCESSING PAYLOAD CONTENTS
|
||||||
|
===================================
|
||||||
|
|
||||||
|
The simplest payload is just a number in key->payload.value. In this case,
|
||||||
|
there's no need to indulge in RCU or locking when accessing the payload.
|
||||||
|
|
||||||
|
More complex payload contents must be allocated and a pointer to them set in
|
||||||
|
key->payload.data. One of the following ways must be selected to access the
|
||||||
|
data:
|
||||||
|
|
||||||
|
(1) Unmodifyable key type.
|
||||||
|
|
||||||
|
If the key type does not have a modify method, then the key's payload can
|
||||||
|
be accessed without any form of locking, provided that it's known to be
|
||||||
|
instantiated (uninstantiated keys cannot be "found").
|
||||||
|
|
||||||
|
(2) The key's semaphore.
|
||||||
|
|
||||||
|
The semaphore could be used to govern access to the payload and to control
|
||||||
|
the payload pointer. It must be write-locked for modifications and would
|
||||||
|
have to be read-locked for general access. The disadvantage of doing this
|
||||||
|
is that the accessor may be required to sleep.
|
||||||
|
|
||||||
|
(3) RCU.
|
||||||
|
|
||||||
|
RCU must be used when the semaphore isn't already held; if the semaphore
|
||||||
|
is held then the contents can't change under you unexpectedly as the
|
||||||
|
semaphore must still be used to serialise modifications to the key. The
|
||||||
|
key management code takes care of this for the key type.
|
||||||
|
|
||||||
|
However, this means using:
|
||||||
|
|
||||||
|
rcu_read_lock() ... rcu_dereference() ... rcu_read_unlock()
|
||||||
|
|
||||||
|
to read the pointer, and:
|
||||||
|
|
||||||
|
rcu_dereference() ... rcu_assign_pointer() ... call_rcu()
|
||||||
|
|
||||||
|
to set the pointer and dispose of the old contents after a grace period.
|
||||||
|
Note that only the key type should ever modify a key's payload.
|
||||||
|
|
||||||
|
Furthermore, an RCU controlled payload must hold a struct rcu_head for the
|
||||||
|
use of call_rcu() and, if the payload is of variable size, the length of
|
||||||
|
the payload. key->datalen cannot be relied upon to be consistent with the
|
||||||
|
payload just dereferenced if the key's semaphore is not held.
|
||||||
|
|
||||||
|
|
||||||
===================
|
===================
|
||||||
DEFINING A KEY TYPE
|
DEFINING A KEY TYPE
|
||||||
===================
|
===================
|
||||||
|
@ -717,15 +796,15 @@ The structure has a number of fields, some of which are mandatory:
|
||||||
|
|
||||||
int key_payload_reserve(struct key *key, size_t datalen);
|
int key_payload_reserve(struct key *key, size_t datalen);
|
||||||
|
|
||||||
With the revised data length. Error EDQUOT will be returned if this is
|
With the revised data length. Error EDQUOT will be returned if this is not
|
||||||
not viable.
|
viable.
|
||||||
|
|
||||||
|
|
||||||
(*) int (*instantiate)(struct key *key, const void *data, size_t datalen);
|
(*) int (*instantiate)(struct key *key, const void *data, size_t datalen);
|
||||||
|
|
||||||
This method is called to attach a payload to a key during construction.
|
This method is called to attach a payload to a key during construction.
|
||||||
The payload attached need not bear any relation to the data passed to
|
The payload attached need not bear any relation to the data passed to this
|
||||||
this function.
|
function.
|
||||||
|
|
||||||
If the amount of data attached to the key differs from the size in
|
If the amount of data attached to the key differs from the size in
|
||||||
keytype->def_datalen, then key_payload_reserve() should be called.
|
keytype->def_datalen, then key_payload_reserve() should be called.
|
||||||
|
@ -734,38 +813,47 @@ The structure has a number of fields, some of which are mandatory:
|
||||||
The fact that KEY_FLAG_INSTANTIATED is not set in key->flags prevents
|
The fact that KEY_FLAG_INSTANTIATED is not set in key->flags prevents
|
||||||
anything else from gaining access to the key.
|
anything else from gaining access to the key.
|
||||||
|
|
||||||
This method may sleep if it wishes.
|
It is safe to sleep in this method.
|
||||||
|
|
||||||
|
|
||||||
(*) int (*duplicate)(struct key *key, const struct key *source);
|
(*) int (*duplicate)(struct key *key, const struct key *source);
|
||||||
|
|
||||||
If this type of key can be duplicated, then this method should be
|
If this type of key can be duplicated, then this method should be
|
||||||
provided. It is called to copy the payload attached to the source into
|
provided. It is called to copy the payload attached to the source into the
|
||||||
the new key. The data length on the new key will have been updated and
|
new key. The data length on the new key will have been updated and the
|
||||||
the quota adjusted already.
|
quota adjusted already.
|
||||||
|
|
||||||
This method will be called with the source key's semaphore read-locked to
|
This method will be called with the source key's semaphore read-locked to
|
||||||
prevent its payload from being changed. It is safe to sleep here.
|
prevent its payload from being changed, thus RCU constraints need not be
|
||||||
|
applied to the source key.
|
||||||
|
|
||||||
|
This method does not have to lock the destination key in order to attach a
|
||||||
|
payload. The fact that KEY_FLAG_INSTANTIATED is not set in key->flags
|
||||||
|
prevents anything else from gaining access to the key.
|
||||||
|
|
||||||
|
It is safe to sleep in this method.
|
||||||
|
|
||||||
|
|
||||||
(*) int (*update)(struct key *key, const void *data, size_t datalen);
|
(*) int (*update)(struct key *key, const void *data, size_t datalen);
|
||||||
|
|
||||||
If this type of key can be updated, then this method should be
|
If this type of key can be updated, then this method should be provided.
|
||||||
provided. It is called to update a key's payload from the blob of data
|
It is called to update a key's payload from the blob of data provided.
|
||||||
provided.
|
|
||||||
|
|
||||||
key_payload_reserve() should be called if the data length might change
|
key_payload_reserve() should be called if the data length might change
|
||||||
before any changes are actually made. Note that if this succeeds, the
|
before any changes are actually made. Note that if this succeeds, the type
|
||||||
type is committed to changing the key because it's already been altered,
|
is committed to changing the key because it's already been altered, so all
|
||||||
so all memory allocation must be done first.
|
memory allocation must be done first.
|
||||||
|
|
||||||
key_payload_reserve() should be called with the key->lock write locked,
|
The key will have its semaphore write-locked before this method is called,
|
||||||
and the changes to the key's attached payload should be made before the
|
but this only deters other writers; any changes to the key's payload must
|
||||||
key is locked.
|
be made under RCU conditions, and call_rcu() must be used to dispose of
|
||||||
|
the old payload.
|
||||||
|
|
||||||
The key will have its semaphore write-locked before this method is
|
key_payload_reserve() should be called before the changes are made, but
|
||||||
called. Any changes to the key should be made with the key's rwlock
|
after all allocations and other potentially failing function calls are
|
||||||
write-locked also. It is safe to sleep here.
|
made.
|
||||||
|
|
||||||
|
It is safe to sleep in this method.
|
||||||
|
|
||||||
|
|
||||||
(*) int (*match)(const struct key *key, const void *desc);
|
(*) int (*match)(const struct key *key, const void *desc);
|
||||||
|
@ -782,12 +870,12 @@ The structure has a number of fields, some of which are mandatory:
|
||||||
|
|
||||||
(*) void (*destroy)(struct key *key);
|
(*) void (*destroy)(struct key *key);
|
||||||
|
|
||||||
This method is optional. It is called to discard the payload data on a
|
This method is optional. It is called to discard the payload data on a key
|
||||||
key when it is being destroyed.
|
when it is being destroyed.
|
||||||
|
|
||||||
This method does not need to lock the key; it can consider the key as
|
This method does not need to lock the key to access the payload; it can
|
||||||
being inaccessible. Note that the key's type may have changed before this
|
consider the key as being inaccessible at this time. Note that the key's
|
||||||
function is called.
|
type may have been changed before this function is called.
|
||||||
|
|
||||||
It is not safe to sleep in this method; the caller may hold spinlocks.
|
It is not safe to sleep in this method; the caller may hold spinlocks.
|
||||||
|
|
||||||
|
@ -797,26 +885,31 @@ The structure has a number of fields, some of which are mandatory:
|
||||||
This method is optional. It is called during /proc/keys reading to
|
This method is optional. It is called during /proc/keys reading to
|
||||||
summarise a key's description and payload in text form.
|
summarise a key's description and payload in text form.
|
||||||
|
|
||||||
This method will be called with the key's rwlock read-locked. This will
|
This method will be called with the RCU read lock held. rcu_dereference()
|
||||||
prevent the key's payload and state changing; also the description should
|
should be used to read the payload pointer if the payload is to be
|
||||||
not change. This also means it is not safe to sleep in this method.
|
accessed. key->datalen cannot be trusted to stay consistent with the
|
||||||
|
contents of the payload.
|
||||||
|
|
||||||
|
The description will not change, though the key's state may.
|
||||||
|
|
||||||
|
It is not safe to sleep in this method; the RCU read lock is held by the
|
||||||
|
caller.
|
||||||
|
|
||||||
|
|
||||||
(*) long (*read)(const struct key *key, char __user *buffer, size_t buflen);
|
(*) long (*read)(const struct key *key, char __user *buffer, size_t buflen);
|
||||||
|
|
||||||
This method is optional. It is called by KEYCTL_READ to translate the
|
This method is optional. It is called by KEYCTL_READ to translate the
|
||||||
key's payload into something a blob of data for userspace to deal
|
key's payload into something a blob of data for userspace to deal with.
|
||||||
with. Ideally, the blob should be in the same format as that passed in to
|
Ideally, the blob should be in the same format as that passed in to the
|
||||||
the instantiate and update methods.
|
instantiate and update methods.
|
||||||
|
|
||||||
If successful, the blob size that could be produced should be returned
|
If successful, the blob size that could be produced should be returned
|
||||||
rather than the size copied.
|
rather than the size copied.
|
||||||
|
|
||||||
This method will be called with the key's semaphore read-locked. This
|
This method will be called with the key's semaphore read-locked. This will
|
||||||
will prevent the key's payload changing. It is not necessary to also
|
prevent the key's payload changing. It is not necessary to use RCU locking
|
||||||
read-lock key->lock when accessing the key's payload. It is safe to sleep
|
when accessing the key's payload. It is safe to sleep in this method, such
|
||||||
in this method, such as might happen when the userspace buffer is
|
as might happen when the userspace buffer is accessed.
|
||||||
accessed.
|
|
||||||
|
|
||||||
|
|
||||||
============================
|
============================
|
||||||
|
@ -853,8 +946,8 @@ If it returns with the key remaining in the unconstructed state, the key will
|
||||||
be marked as being negative, it will be added to the session keyring, and an
|
be marked as being negative, it will be added to the session keyring, and an
|
||||||
error will be returned to the key requestor.
|
error will be returned to the key requestor.
|
||||||
|
|
||||||
Supplementary information may be provided from whoever or whatever invoked
|
Supplementary information may be provided from whoever or whatever invoked this
|
||||||
this service. This will be passed as the <callout_info> parameter. If no such
|
service. This will be passed as the <callout_info> parameter. If no such
|
||||||
information was made available, then "-" will be passed as this parameter
|
information was made available, then "-" will be passed as this parameter
|
||||||
instead.
|
instead.
|
||||||
|
|
||||||
|
|
|
@ -114,9 +114,7 @@ tuntap.txt
|
||||||
vortex.txt
|
vortex.txt
|
||||||
- info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards.
|
- info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards.
|
||||||
wan-router.txt
|
wan-router.txt
|
||||||
- Wan router documentation
|
- WAN router documentation
|
||||||
wanpipe.txt
|
|
||||||
- WANPIPE(tm) Multiprotocol WAN Driver for Linux WAN Router
|
|
||||||
wavelan.txt
|
wavelan.txt
|
||||||
- AT&T GIS (nee NCR) WaveLAN card: An Ethernet-like radio transceiver
|
- AT&T GIS (nee NCR) WaveLAN card: An Ethernet-like radio transceiver
|
||||||
x25.txt
|
x25.txt
|
||||||
|
|
|
@ -1,59 +1,65 @@
|
||||||
dmfe.c: Version 1.28 01/18/2000
|
Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver for Linux.
|
||||||
|
|
||||||
A Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver for Linux.
|
This program is free software; you can redistribute it and/or
|
||||||
Copyright (C) 1997 Sten Wang
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is distributed in the hope that it will be useful,
|
||||||
modify it under the terms of the GNU General Public License
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
as published by the Free Software Foundation; either version 2
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
of the License, or (at your option) any later version.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
|
|
||||||
A. Compiler command:
|
This driver provides kernel support for Davicom DM9102(A)/DM9132/DM9801 ethernet cards ( CNET
|
||||||
|
10/100 ethernet cards uses Davicom chipset too, so this driver supports CNET cards too ).If you
|
||||||
|
didn't compile this driver as a module, it will automatically load itself on boot and print a
|
||||||
|
line similar to :
|
||||||
|
|
||||||
A-1: For normal single or multiple processor kernel
|
dmfe: Davicom DM9xxx net driver, version 1.36.4 (2002-01-17)
|
||||||
"gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall
|
|
||||||
-Wstrict-prototypes -O6 -c dmfe.c"
|
|
||||||
|
|
||||||
A-2: For single or multiple processor with kernel module version function
|
If you compiled this driver as a module, you have to load it on boot.You can load it with command :
|
||||||
"gcc -DMODULE -DMODVERSIONS -D__KERNEL__ -I/usr/src/linux/net/inet
|
|
||||||
-Wall -Wstrict-prototypes -O6 -c dmfe.c"
|
insmod dmfe
|
||||||
|
|
||||||
|
This way it will autodetect the device mode.This is the suggested way to load the module.Or you can pass
|
||||||
|
a mode= setting to module while loading, like :
|
||||||
|
|
||||||
|
insmod dmfe mode=0 # Force 10M Half Duplex
|
||||||
|
insmod dmfe mode=1 # Force 100M Half Duplex
|
||||||
|
insmod dmfe mode=4 # Force 10M Full Duplex
|
||||||
|
insmod dmfe mode=5 # Force 100M Full Duplex
|
||||||
|
|
||||||
|
Next you should configure your network interface with a command similar to :
|
||||||
|
|
||||||
|
ifconfig eth0 172.22.3.18
|
||||||
|
^^^^^^^^^^^
|
||||||
|
Your IP Adress
|
||||||
|
|
||||||
|
Then you may have to modify the default routing table with command :
|
||||||
|
|
||||||
|
route add default eth0
|
||||||
|
|
||||||
|
|
||||||
B. The following steps teach you how to activate a DM9102 board:
|
Now your ethernet card should be up and running.
|
||||||
|
|
||||||
1. Used the upper compiler command to compile dmfe.c
|
|
||||||
|
|
||||||
2. Insert dmfe module into kernel
|
|
||||||
"insmod dmfe" ;;Auto Detection Mode (Suggest)
|
|
||||||
"insmod dmfe mode=0" ;;Force 10M Half Duplex
|
|
||||||
"insmod dmfe mode=1" ;;Force 100M Half Duplex
|
|
||||||
"insmod dmfe mode=4" ;;Force 10M Full Duplex
|
|
||||||
"insmod dmfe mode=5" ;;Force 100M Full Duplex
|
|
||||||
|
|
||||||
3. Config a dm9102 network interface
|
|
||||||
"ifconfig eth0 172.22.3.18"
|
|
||||||
^^^^^^^^^^^ Your IP address
|
|
||||||
|
|
||||||
4. Activate the IP routing table. For some distributions, it is not
|
|
||||||
necessary. You can type "route" to check.
|
|
||||||
|
|
||||||
"route add default eth0"
|
|
||||||
|
|
||||||
|
|
||||||
5. Well done. Your DM9102 adapter is now activated.
|
TODO:
|
||||||
|
|
||||||
|
Implement pci_driver::suspend() and pci_driver::resume() power management methods.
|
||||||
|
Check on 64 bit boxes.
|
||||||
|
Check and fix on big endian boxes.
|
||||||
|
Test and make sure PCI latency is now correct for all cases.
|
||||||
|
|
||||||
|
|
||||||
C. Object files description:
|
Authors:
|
||||||
1. dmfe_rh61.o: For Redhat 6.1
|
|
||||||
|
|
||||||
If you can make sure your kernel version, you can rename
|
Sten Wang <sten_wang@davicom.com.tw > : Original Author
|
||||||
to dmfe.o and directly use it without re-compiling.
|
Tobias Ringstrom <tori@unhappy.mine.nu> : Current Maintainer
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
|
||||||
Author: Sten Wang, 886-3-5798797-8517, E-mail: sten_wang@davicom.com.tw
|
Marcelo Tosatti <marcelo@conectiva.com.br>
|
||||||
|
Alan Cox <alan@redhat.com>
|
||||||
|
Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
Vojtech Pavlik <vojtech@suse.cz>
|
||||||
|
|
|
@ -1,622 +0,0 @@
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Linux WAN Router Utilities Package
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
Version 2.2.1
|
|
||||||
Mar 28, 2001
|
|
||||||
Author: Nenad Corbic <ncorbic@sangoma.com>
|
|
||||||
Copyright (c) 1995-2001 Sangoma Technologies Inc.
|
|
||||||
------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
Wide Area Networks (WANs) are used to interconnect Local Area Networks (LANs)
|
|
||||||
and/or stand-alone hosts over vast distances with data transfer rates
|
|
||||||
significantly higher than those achievable with commonly used dial-up
|
|
||||||
connections.
|
|
||||||
|
|
||||||
Usually an external device called `WAN router' sitting on your local network
|
|
||||||
or connected to your machine's serial port provides physical connection to
|
|
||||||
WAN. Although router's job may be as simple as taking your local network
|
|
||||||
traffic, converting it to WAN format and piping it through the WAN link, these
|
|
||||||
devices are notoriously expensive, with prices as much as 2 - 5 times higher
|
|
||||||
then the price of a typical PC box.
|
|
||||||
|
|
||||||
Alternatively, considering robustness and multitasking capabilities of Linux,
|
|
||||||
an internal router can be built (most routers use some sort of stripped down
|
|
||||||
Unix-like operating system anyway). With a number of relatively inexpensive WAN
|
|
||||||
interface cards available on the market, a perfectly usable router can be
|
|
||||||
built for less than half a price of an external router. Yet a Linux box
|
|
||||||
acting as a router can still be used for other purposes, such as fire-walling,
|
|
||||||
running FTP, WWW or DNS server, etc.
|
|
||||||
|
|
||||||
This kernel module introduces the notion of a WAN Link Driver (WLD) to Linux
|
|
||||||
operating system and provides generic hardware-independent services for such
|
|
||||||
drivers. Why can existing Linux network device interface not be used for
|
|
||||||
this purpose? Well, it can. However, there are a few key differences between
|
|
||||||
a typical network interface (e.g. Ethernet) and a WAN link.
|
|
||||||
|
|
||||||
Many WAN protocols, such as X.25 and frame relay, allow for multiple logical
|
|
||||||
connections (known as `virtual circuits' in X.25 terminology) over a single
|
|
||||||
physical link. Each such virtual circuit may (and almost always does) lead
|
|
||||||
to a different geographical location and, therefore, different network. As a
|
|
||||||
result, it is the virtual circuit, not the physical link, that represents a
|
|
||||||
route and, therefore, a network interface in Linux terms.
|
|
||||||
|
|
||||||
To further complicate things, virtual circuits are usually volatile in nature
|
|
||||||
(excluding so called `permanent' virtual circuits or PVCs). With almost no
|
|
||||||
time required to set up and tear down a virtual circuit, it is highly desirable
|
|
||||||
to implement on-demand connections in order to minimize network charges. So
|
|
||||||
unlike a typical network driver, the WAN driver must be able to handle multiple
|
|
||||||
network interfaces and cope as multiple virtual circuits come into existence
|
|
||||||
and go away dynamically.
|
|
||||||
|
|
||||||
Last, but not least, WAN configuration is much more complex than that of say
|
|
||||||
Ethernet and may well amount to several dozens of parameters. Some of them
|
|
||||||
are "link-wide" while others are virtual circuit-specific. The same holds
|
|
||||||
true for WAN statistics which is by far more extensive and extremely useful
|
|
||||||
when troubleshooting WAN connections. Extending the ifconfig utility to suit
|
|
||||||
these needs may be possible, but does not seem quite reasonable. Therefore, a
|
|
||||||
WAN configuration utility and corresponding application programmer's interface
|
|
||||||
is needed for this purpose.
|
|
||||||
|
|
||||||
Most of these problems are taken care of by this module. Its goal is to
|
|
||||||
provide a user with more-or-less standard look and feel for all WAN devices and
|
|
||||||
assist a WAN device driver writer by providing common services, such as:
|
|
||||||
|
|
||||||
o User-level interface via /proc file system
|
|
||||||
o Centralized configuration
|
|
||||||
o Device management (setup, shutdown, etc.)
|
|
||||||
o Network interface management (dynamic creation/destruction)
|
|
||||||
o Protocol encapsulation/decapsulation
|
|
||||||
|
|
||||||
To ba able to use the Linux WAN Router you will also need a WAN Tools package
|
|
||||||
available from
|
|
||||||
|
|
||||||
ftp.sangoma.com/pub/linux/current_wanpipe/wanpipe-X.Y.Z.tgz
|
|
||||||
|
|
||||||
where vX.Y.Z represent the wanpipe version number.
|
|
||||||
|
|
||||||
For technical questions and/or comments please e-mail to ncorbic@sangoma.com.
|
|
||||||
For general inquiries please contact Sangoma Technologies Inc. by
|
|
||||||
|
|
||||||
Hotline: 1-800-388-2475 (USA and Canada, toll free)
|
|
||||||
Phone: (905) 474-1990 ext: 106
|
|
||||||
Fax: (905) 474-9223
|
|
||||||
E-mail: dm@sangoma.com (David Mandelstam)
|
|
||||||
WWW: http://www.sangoma.com
|
|
||||||
|
|
||||||
|
|
||||||
INSTALLATION
|
|
||||||
|
|
||||||
Please read the WanpipeForLinux.pdf manual on how to
|
|
||||||
install the WANPIPE tools and drivers properly.
|
|
||||||
|
|
||||||
|
|
||||||
After installing wanpipe package: /usr/local/wanrouter/doc.
|
|
||||||
On the ftp.sangoma.com : /linux/current_wanpipe/doc
|
|
||||||
|
|
||||||
|
|
||||||
COPYRIGHT AND LICENSING INFORMATION
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 2, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 675 Mass
|
|
||||||
Ave, Cambridge, MA 02139, USA.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ACKNOWLEDGEMENTS
|
|
||||||
|
|
||||||
This product is based on the WANPIPE(tm) Multiprotocol WAN Router developed
|
|
||||||
by Sangoma Technologies Inc. for Linux 2.0.x and 2.2.x. Success of the WANPIPE
|
|
||||||
together with the next major release of Linux kernel in summer 1996 commanded
|
|
||||||
adequate changes to the WANPIPE code to take full advantage of new Linux
|
|
||||||
features.
|
|
||||||
|
|
||||||
Instead of continuing developing proprietary interface tied to Sangoma WAN
|
|
||||||
cards, we decided to separate all hardware-independent code into a separate
|
|
||||||
module and defined two levels of interfaces - one for user-level applications
|
|
||||||
and another for kernel-level WAN drivers. WANPIPE is now implemented as a
|
|
||||||
WAN driver compliant with the WAN Link Driver interface. Also a general
|
|
||||||
purpose WAN configuration utility and a set of shell scripts was developed to
|
|
||||||
support WAN router at the user level.
|
|
||||||
|
|
||||||
Many useful ideas concerning hardware-independent interface implementation
|
|
||||||
were given by Mike McLagan <mike.mclagan@linux.org> and his implementation
|
|
||||||
of the Frame Relay router and drivers for Sangoma cards (dlci/sdla).
|
|
||||||
|
|
||||||
With the new implementation of the APIs being incorporated into the WANPIPE,
|
|
||||||
a special thank goes to Alan Cox in providing insight into BSD sockets.
|
|
||||||
|
|
||||||
Special thanks to all the WANPIPE users who performed field-testing, reported
|
|
||||||
bugs and made valuable comments and suggestions that help us to improve this
|
|
||||||
product.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NEW IN THIS RELEASE
|
|
||||||
|
|
||||||
o Updated the WANCFG utility
|
|
||||||
Calls the pppconfig to configure the PPPD
|
|
||||||
for async connections.
|
|
||||||
|
|
||||||
o Added the PPPCONFIG utility
|
|
||||||
Used to configure the PPPD dameon for the
|
|
||||||
WANPIPE Async PPP and standard serial port.
|
|
||||||
The wancfg calls the pppconfig to configure
|
|
||||||
the pppd.
|
|
||||||
|
|
||||||
o Fixed the PCI autodetect feature.
|
|
||||||
The SLOT 0 was used as an autodetect option
|
|
||||||
however, some high end PC's slot numbers start
|
|
||||||
from 0.
|
|
||||||
|
|
||||||
o This release has been tested with the new backupd
|
|
||||||
daemon release.
|
|
||||||
|
|
||||||
|
|
||||||
PRODUCT COMPONENTS AND RELATED FILES
|
|
||||||
|
|
||||||
/etc: (or user defined)
|
|
||||||
wanpipe1.conf default router configuration file
|
|
||||||
|
|
||||||
/lib/modules/X.Y.Z/misc:
|
|
||||||
wanrouter.o router kernel loadable module
|
|
||||||
af_wanpipe.o wanpipe api socket module
|
|
||||||
|
|
||||||
/lib/modules/X.Y.Z/net:
|
|
||||||
sdladrv.o Sangoma SDLA support module
|
|
||||||
wanpipe.o Sangoma WANPIPE(tm) driver module
|
|
||||||
|
|
||||||
/proc/net/wanrouter
|
|
||||||
Config reads current router configuration
|
|
||||||
Status reads current router status
|
|
||||||
{name} reads WAN driver statistics
|
|
||||||
|
|
||||||
/usr/sbin:
|
|
||||||
wanrouter wanrouter start-up script
|
|
||||||
wanconfig wanrouter configuration utility
|
|
||||||
sdladump WANPIPE adapter memory dump utility
|
|
||||||
fpipemon Monitor for Frame Relay
|
|
||||||
cpipemon Monitor for Cisco HDLC
|
|
||||||
ppipemon Monitor for PPP
|
|
||||||
xpipemon Monitor for X25
|
|
||||||
wpkbdmon WANPIPE keyboard led monitor/debugger
|
|
||||||
|
|
||||||
/usr/local/wanrouter:
|
|
||||||
README this file
|
|
||||||
COPYING GNU General Public License
|
|
||||||
Setup installation script
|
|
||||||
Filelist distribution definition file
|
|
||||||
wanrouter.rc meta-configuration file
|
|
||||||
(used by the Setup and wanrouter script)
|
|
||||||
|
|
||||||
/usr/local/wanrouter/doc:
|
|
||||||
wanpipeForLinux.pdf WAN Router User's Manual
|
|
||||||
|
|
||||||
/usr/local/wanrouter/patches:
|
|
||||||
wanrouter-v2213.gz patch for Linux kernels 2.2.11 up to 2.2.13.
|
|
||||||
wanrouter-v2214.gz patch for Linux kernel 2.2.14.
|
|
||||||
wanrouter-v2215.gz patch for Linux kernels 2.2.15 to 2.2.17.
|
|
||||||
wanrouter-v2218.gz patch for Linux kernels 2.2.18 and up.
|
|
||||||
wanrouter-v240.gz patch for Linux kernel 2.4.0.
|
|
||||||
wanrouter-v242.gz patch for Linux kernel 2.4.2 and up.
|
|
||||||
wanrouter-v2034.gz patch for Linux kernel 2.0.34
|
|
||||||
wanrouter-v2036.gz patch for Linux kernel 2.0.36 and up.
|
|
||||||
|
|
||||||
/usr/local/wanrouter/patches/kdrivers:
|
|
||||||
Sources of the latest WANPIPE device drivers.
|
|
||||||
These are used to UPGRADE the linux kernel to the newest
|
|
||||||
version if the kernel source has already been pathced with
|
|
||||||
WANPIPE drivers.
|
|
||||||
|
|
||||||
/usr/local/wanrouter/samples:
|
|
||||||
interface sample interface configuration file
|
|
||||||
wanpipe1.cpri CHDLC primary port
|
|
||||||
wanpipe2.csec CHDLC secondary port
|
|
||||||
wanpipe1.fr Frame Relay protocol
|
|
||||||
wanpipe1.ppp PPP protocol )
|
|
||||||
wanpipe1.asy CHDLC ASYNC protocol
|
|
||||||
wanpipe1.x25 X25 protocol
|
|
||||||
wanpipe1.stty Sync TTY driver (Used by Kernel PPPD daemon)
|
|
||||||
wanpipe1.atty Async TTY driver (Used by Kernel PPPD daemon)
|
|
||||||
wanrouter.rc sample meta-configuration file
|
|
||||||
|
|
||||||
/usr/local/wanrouter/util:
|
|
||||||
* wan-tools utilities source code
|
|
||||||
|
|
||||||
/usr/local/wanrouter/api/x25:
|
|
||||||
* x25 api sample programs.
|
|
||||||
/usr/local/wanrouter/api/chdlc:
|
|
||||||
* chdlc api sample programs.
|
|
||||||
/usr/local/wanrouter/api/fr:
|
|
||||||
* fr api sample programs.
|
|
||||||
/usr/local/wanrouter/config/wancfg:
|
|
||||||
wancfg WANPIPE GUI configuration program.
|
|
||||||
Creates wanpipe#.conf files.
|
|
||||||
/usr/local/wanrouter/config/cfgft1:
|
|
||||||
cfgft1 GUI CSU/DSU configuration program.
|
|
||||||
|
|
||||||
/usr/include/linux:
|
|
||||||
wanrouter.h router API definitions
|
|
||||||
wanpipe.h WANPIPE API definitions
|
|
||||||
sdladrv.h SDLA support module API definitions
|
|
||||||
sdlasfm.h SDLA firmware module definitions
|
|
||||||
if_wanpipe.h WANPIPE Socket definitions
|
|
||||||
if_wanpipe_common.h WANPIPE Socket/Driver common definitions.
|
|
||||||
sdlapci.h WANPIPE PCI definitions
|
|
||||||
|
|
||||||
|
|
||||||
/usr/src/linux/net/wanrouter:
|
|
||||||
* wanrouter source code
|
|
||||||
|
|
||||||
/var/log:
|
|
||||||
wanrouter wanrouter start-up log (created by the Setup script)
|
|
||||||
|
|
||||||
/var/lock: (or /var/lock/subsys for RedHat)
|
|
||||||
wanrouter wanrouter lock file (created by the Setup script)
|
|
||||||
|
|
||||||
/usr/local/wanrouter/firmware:
|
|
||||||
fr514.sfm Frame relay firmware for Sangoma S508/S514 card
|
|
||||||
cdual514.sfm Dual Port Cisco HDLC firmware for Sangoma S508/S514 card
|
|
||||||
ppp514.sfm PPP Firmware for Sangoma S508 and S514 cards
|
|
||||||
x25_508.sfm X25 Firmware for Sangoma S508 card.
|
|
||||||
|
|
||||||
|
|
||||||
REVISION HISTORY
|
|
||||||
|
|
||||||
1.0.0 December 31, 1996 Initial version
|
|
||||||
|
|
||||||
1.0.1 January 30, 1997 Status and statistics can be read via /proc
|
|
||||||
filesystem entries.
|
|
||||||
|
|
||||||
1.0.2 April 30, 1997 Added UDP management via monitors.
|
|
||||||
|
|
||||||
1.0.3 June 3, 1997 UDP management for multiple boards using Frame
|
|
||||||
Relay and PPP
|
|
||||||
Enabled continuous transmission of Configure
|
|
||||||
Request Packet for PPP (for 508 only)
|
|
||||||
Connection Timeout for PPP changed from 900 to 0
|
|
||||||
Flow Control Problem fixed for Frame Relay
|
|
||||||
|
|
||||||
1.0.4 July 10, 1997 S508/FT1 monitoring capability in fpipemon and
|
|
||||||
ppipemon utilities.
|
|
||||||
Configurable TTL for UDP packets.
|
|
||||||
Multicast and Broadcast IP source addresses are
|
|
||||||
silently discarded.
|
|
||||||
|
|
||||||
1.0.5 July 28, 1997 Configurable T391,T392,N391,N392,N393 for Frame
|
|
||||||
Relay in router.conf.
|
|
||||||
Configurable Memory Address through router.conf
|
|
||||||
for Frame Relay, PPP and X.25. (commenting this
|
|
||||||
out enables auto-detection).
|
|
||||||
Fixed freeing up received buffers using kfree()
|
|
||||||
for Frame Relay and X.25.
|
|
||||||
Protect sdla_peek() by calling save_flags(),
|
|
||||||
cli() and restore_flags().
|
|
||||||
Changed number of Trace elements from 32 to 20
|
|
||||||
Added DLCI specific data monitoring in FPIPEMON.
|
|
||||||
2.0.0 Nov 07, 1997 Implemented protection of RACE conditions by
|
|
||||||
critical flags for FRAME RELAY and PPP.
|
|
||||||
DLCI List interrupt mode implemented.
|
|
||||||
IPX support in FRAME RELAY and PPP.
|
|
||||||
IPX Server Support (MARS)
|
|
||||||
More driver specific stats included in FPIPEMON
|
|
||||||
and PIPEMON.
|
|
||||||
|
|
||||||
2.0.1 Nov 28, 1997 Bug Fixes for version 2.0.0.
|
|
||||||
Protection of "enable_irq()" while
|
|
||||||
"disable_irq()" has been enabled from any other
|
|
||||||
routine (for Frame Relay, PPP and X25).
|
|
||||||
Added additional Stats for Fpipemon and Ppipemon
|
|
||||||
Improved Load Sharing for multiple boards
|
|
||||||
|
|
||||||
2.0.2 Dec 09, 1997 Support for PAP and CHAP for ppp has been
|
|
||||||
implemented.
|
|
||||||
|
|
||||||
2.0.3 Aug 15, 1998 New release supporting Cisco HDLC, CIR for Frame
|
|
||||||
relay, Dynamic IP assignment for PPP and Inverse
|
|
||||||
Arp support for Frame-relay. Man Pages are
|
|
||||||
included for better support and a new utility
|
|
||||||
for configuring FT1 cards.
|
|
||||||
|
|
||||||
2.0.4 Dec 09, 1998 Dual Port support for Cisco HDLC.
|
|
||||||
Support for HDLC (LAPB) API.
|
|
||||||
Supports BiSync Streaming code for S502E
|
|
||||||
and S503 cards.
|
|
||||||
Support for Streaming HDLC API.
|
|
||||||
Provides a BSD socket interface for
|
|
||||||
creating applications using BiSync
|
|
||||||
streaming.
|
|
||||||
|
|
||||||
2.0.5 Aug 04, 1999 CHDLC initializatin bug fix.
|
|
||||||
PPP interrupt driven driver:
|
|
||||||
Fix to the PPP line hangup problem.
|
|
||||||
New PPP firmware
|
|
||||||
Added comments to the startup SYSTEM ERROR messages
|
|
||||||
Xpipemon debugging application for the X25 protocol
|
|
||||||
New USER_MANUAL.txt
|
|
||||||
Fixed the odd boundary 4byte writes to the board.
|
|
||||||
BiSync Streaming code has been taken out.
|
|
||||||
Available as a patch.
|
|
||||||
Streaming HDLC API has been taken out.
|
|
||||||
Available as a patch.
|
|
||||||
|
|
||||||
2.0.6 Aug 17, 1999 Increased debugging in statup scripts
|
|
||||||
Fixed insallation bugs from 2.0.5
|
|
||||||
Kernel patch works for both 2.2.10 and 2.2.11 kernels.
|
|
||||||
There is no functional difference between the two packages
|
|
||||||
|
|
||||||
2.0.7 Aug 26, 1999 o Merged X25API code into WANPIPE.
|
|
||||||
o Fixed a memeory leak for X25API
|
|
||||||
o Updated the X25API code for 2.2.X kernels.
|
|
||||||
o Improved NEM handling.
|
|
||||||
|
|
||||||
2.1.0 Oct 25, 1999 o New code for S514 PCI Card
|
|
||||||
o New CHDLC and Frame Relay drivers
|
|
||||||
o PPP and X25 are not supported in this release
|
|
||||||
|
|
||||||
2.1.1 Nov 30, 1999 o PPP support for S514 PCI Cards
|
|
||||||
|
|
||||||
2.1.3 Apr 06, 2000 o Socket based x25api
|
|
||||||
o Socket based chdlc api
|
|
||||||
o Socket based fr api
|
|
||||||
o Dual Port Receive only CHDLC support.
|
|
||||||
o Asynchronous CHDLC support (Secondary Port)
|
|
||||||
o cfgft1 GUI csu/dsu configurator
|
|
||||||
o wancfg GUI configuration file
|
|
||||||
configurator.
|
|
||||||
o Architectual directory changes.
|
|
||||||
|
|
||||||
beta-2.1.4 Jul 2000 o Dynamic interface configuration:
|
|
||||||
Network interfaces reflect the state
|
|
||||||
of protocol layer. If the protocol becomes
|
|
||||||
disconnected, driver will bring down
|
|
||||||
the interface. Once the protocol reconnects
|
|
||||||
the interface will be brought up.
|
|
||||||
|
|
||||||
Note: This option is turned off by default.
|
|
||||||
|
|
||||||
o Dynamic wanrouter setup using 'wanconfig':
|
|
||||||
wanconfig utility can be used to
|
|
||||||
shutdown,restart,start or reconfigure
|
|
||||||
a virtual circuit dynamically.
|
|
||||||
|
|
||||||
Frame Relay: Each DLCI can be:
|
|
||||||
created,stopped,restarted and reconfigured
|
|
||||||
dynamically using wanconfig.
|
|
||||||
|
|
||||||
ex: wanconfig card wanpipe1 dev wp1_fr16 up
|
|
||||||
|
|
||||||
o Wanrouter startup via command line arguments:
|
|
||||||
wanconfig also supports wanrouter startup via command line
|
|
||||||
arguments. Thus, there is no need to create a wanpipe#.conf
|
|
||||||
configuration file.
|
|
||||||
|
|
||||||
o Socket based x25api update/bug fixes.
|
|
||||||
Added support for LCN numbers greater than 255.
|
|
||||||
Option to pass up modem messages.
|
|
||||||
Provided a PCI IRQ check, so a single S514
|
|
||||||
card is guaranteed to have a non-sharing interrupt.
|
|
||||||
|
|
||||||
o Fixes to the wancfg utility.
|
|
||||||
o New FT1 debugging support via *pipemon utilities.
|
|
||||||
o Frame Relay ARP support Enabled.
|
|
||||||
|
|
||||||
beta3-2.1.4 Jul 2000 o X25 M_BIT Problem fix.
|
|
||||||
o Added the Multi-Port PPP
|
|
||||||
Updated utilites for the Multi-Port PPP.
|
|
||||||
|
|
||||||
2.1.4 Aut 2000
|
|
||||||
o In X25API:
|
|
||||||
Maximum packet an application can send
|
|
||||||
to the driver has been extended to 4096 bytes.
|
|
||||||
|
|
||||||
Fixed the x25 startup bug. Enable
|
|
||||||
communications only after all interfaces
|
|
||||||
come up. HIGH SVC/PVC is used to calculate
|
|
||||||
the number of channels.
|
|
||||||
Enable protocol only after all interfaces
|
|
||||||
are enabled.
|
|
||||||
|
|
||||||
o Added an extra state to the FT1 config, kernel module.
|
|
||||||
o Updated the pipemon debuggers.
|
|
||||||
|
|
||||||
o Blocked the Multi-Port PPP from running on kernels
|
|
||||||
2.2.16 or greater, due to syncppp kernel module
|
|
||||||
change.
|
|
||||||
|
|
||||||
beta1-2.1.5 Nov 15 2000
|
|
||||||
o Fixed the MulitPort PPP Support for kernels 2.2.16 and above.
|
|
||||||
2.2.X kernels only
|
|
||||||
|
|
||||||
o Secured the driver UDP debugging calls
|
|
||||||
- All illegal netowrk debugging calls are reported to
|
|
||||||
the log.
|
|
||||||
- Defined a set of allowed commands, all other denied.
|
|
||||||
|
|
||||||
o Cpipemon
|
|
||||||
- Added set FT1 commands to the cpipemon. Thus CSU/DSU
|
|
||||||
configuraiton can be performed using cpipemon.
|
|
||||||
All systems that cannot run cfgft1 GUI utility should
|
|
||||||
use cpipemon to configure the on board CSU/DSU.
|
|
||||||
|
|
||||||
|
|
||||||
o Keyboard Led Monitor/Debugger
|
|
||||||
- A new utilty /usr/sbin/wpkbdmon uses keyboard leds
|
|
||||||
to convey operatinal statistic information of the
|
|
||||||
Sangoma WANPIPE cards.
|
|
||||||
NUM_LOCK = Line State (On=connected, Off=disconnected)
|
|
||||||
CAPS_LOCK = Tx data (On=transmitting, Off=no tx data)
|
|
||||||
SCROLL_LOCK = Rx data (On=receiving, Off=no rx data
|
|
||||||
|
|
||||||
o Hardware probe on module load and dynamic device allocation
|
|
||||||
- During WANPIPE module load, all Sangoma cards are probed
|
|
||||||
and found information is printed in the /var/log/messages.
|
|
||||||
- If no cards are found, the module load fails.
|
|
||||||
- Appropriate number of devices are dynamically loaded
|
|
||||||
based on the number of Sangoma cards found.
|
|
||||||
|
|
||||||
Note: The kernel configuraiton option
|
|
||||||
CONFIG_WANPIPE_CARDS has been taken out.
|
|
||||||
|
|
||||||
o Fixed the Frame Relay and Chdlc network interfaces so they are
|
|
||||||
compatible with libpcap libraries. Meaning, tcpdump, snort,
|
|
||||||
ethereal, and all other packet sniffers and debuggers work on
|
|
||||||
all WANPIPE netowrk interfaces.
|
|
||||||
- Set the network interface encoding type to ARPHRD_PPP.
|
|
||||||
This tell the sniffers that data obtained from the
|
|
||||||
network interface is in pure IP format.
|
|
||||||
Fix for 2.2.X kernels only.
|
|
||||||
|
|
||||||
o True interface encoding option for Frame Relay and CHDLC
|
|
||||||
- The above fix sets the network interface encoding
|
|
||||||
type to ARPHRD_PPP, however some customers use
|
|
||||||
the encoding interface type to determine the
|
|
||||||
protocol running. Therefore, the TURE ENCODING
|
|
||||||
option will set the interface type back to the
|
|
||||||
original value.
|
|
||||||
|
|
||||||
NOTE: If this option is used with Frame Relay and CHDLC
|
|
||||||
libpcap library support will be broken.
|
|
||||||
i.e. tcpdump will not work.
|
|
||||||
Fix for 2.2.x Kernels only.
|
|
||||||
|
|
||||||
o Ethernet Bridgind over Frame Relay
|
|
||||||
- The Frame Relay bridging has been developed by
|
|
||||||
Kristian Hoffmann and Mark Wells.
|
|
||||||
- The Linux kernel bridge is used to send ethernet
|
|
||||||
data over the frame relay links.
|
|
||||||
For 2.2.X Kernels only.
|
|
||||||
|
|
||||||
o Added extensive 2.0.X support. Most new features of
|
|
||||||
2.1.5 for protocols Frame Relay, PPP and CHDLC are
|
|
||||||
supported under 2.0.X kernels.
|
|
||||||
|
|
||||||
beta1-2.2.0 Dec 30 2000
|
|
||||||
o Updated drivers for 2.4.X kernels.
|
|
||||||
o Updated drivers for SMP support.
|
|
||||||
o X25API is now able to share PCI interrupts.
|
|
||||||
o Took out a general polling routine that was used
|
|
||||||
only by X25API.
|
|
||||||
o Added appropriate locks to the dynamic reconfiguration
|
|
||||||
code.
|
|
||||||
o Fixed a bug in the keyboard debug monitor.
|
|
||||||
|
|
||||||
beta2-2.2.0 Jan 8 2001
|
|
||||||
o Patches for 2.4.0 kernel
|
|
||||||
o Patches for 2.2.18 kernel
|
|
||||||
o Minor updates to PPP and CHLDC drivers.
|
|
||||||
Note: No functinal difference.
|
|
||||||
|
|
||||||
beta3-2.2.9 Jan 10 2001
|
|
||||||
o I missed the 2.2.18 kernel patches in beta2-2.2.0
|
|
||||||
release. They are included in this release.
|
|
||||||
|
|
||||||
Stable Release
|
|
||||||
2.2.0 Feb 01 2001
|
|
||||||
o Bug fix in wancfg GUI configurator.
|
|
||||||
The edit function didn't work properly.
|
|
||||||
|
|
||||||
|
|
||||||
bata1-2.2.1 Feb 09 2001
|
|
||||||
o WANPIPE TTY Driver emulation.
|
|
||||||
Two modes of operation Sync and Async.
|
|
||||||
Sync: Using the PPPD daemon, kernel SyncPPP layer
|
|
||||||
and the Wanpipe sync TTY driver: a PPP protocol
|
|
||||||
connection can be established via Sangoma adapter, over
|
|
||||||
a T1 leased line.
|
|
||||||
|
|
||||||
The 2.4.0 kernel PPP layer supports MULTILINK
|
|
||||||
protocol, that can be used to bundle any number of Sangoma
|
|
||||||
adapters (T1 lines) into one, under a single IP address.
|
|
||||||
Thus, efficiently obtaining multiple T1 throughput.
|
|
||||||
|
|
||||||
NOTE: The remote side must also implement MULTILINK PPP
|
|
||||||
protocol.
|
|
||||||
|
|
||||||
Async:Using the PPPD daemon, kernel AsyncPPP layer
|
|
||||||
and the WANPIPE async TTY driver: a PPP protocol
|
|
||||||
connection can be established via Sangoma adapter and
|
|
||||||
a modem, over a telephone line.
|
|
||||||
|
|
||||||
Thus, the WANPIPE async TTY driver simulates a serial
|
|
||||||
TTY driver that would normally be used to interface the
|
|
||||||
MODEM to the linux kernel.
|
|
||||||
|
|
||||||
o WANPIPE PPP Backup Utility
|
|
||||||
This utility will monitor the state of the PPP T1 line.
|
|
||||||
In case of failure, a dial up connection will be established
|
|
||||||
via pppd daemon, ether via a serial tty driver (serial port),
|
|
||||||
or a WANPIPE async TTY driver (in case serial port is unavailable).
|
|
||||||
|
|
||||||
Furthermore, while in dial up mode, the primary PPP T1 link
|
|
||||||
will be monitored for signs of life.
|
|
||||||
|
|
||||||
If the PPP T1 link comes back to life, the dial up connection
|
|
||||||
will be shutdown and T1 line re-established.
|
|
||||||
|
|
||||||
|
|
||||||
o New Setup installation script.
|
|
||||||
Option to UPGRADE device drivers if the kernel source has
|
|
||||||
already been patched with WANPIPE.
|
|
||||||
|
|
||||||
Option to COMPILE WANPIPE modules against the currently
|
|
||||||
running kernel, thus no need for manual kernel and module
|
|
||||||
re-compilatin.
|
|
||||||
|
|
||||||
o Updates and Bug Fixes to wancfg utility.
|
|
||||||
|
|
||||||
bata2-2.2.1 Feb 20 2001
|
|
||||||
|
|
||||||
o Bug fixes to the CHDLC device drivers.
|
|
||||||
The driver had compilation problems under kernels
|
|
||||||
2.2.14 or lower.
|
|
||||||
|
|
||||||
o Bug fixes to the Setup installation script.
|
|
||||||
The device drivers compilation options didn't work
|
|
||||||
properly.
|
|
||||||
|
|
||||||
o Update to the wpbackupd daemon.
|
|
||||||
Optimized the cross-over times, between the primary
|
|
||||||
link and the backup dialup.
|
|
||||||
|
|
||||||
beta3-2.2.1 Mar 02 2001
|
|
||||||
o Patches for 2.4.2 kernel.
|
|
||||||
|
|
||||||
o Bug fixes to util/ make files.
|
|
||||||
o Bug fixes to the Setup installation script.
|
|
||||||
|
|
||||||
o Took out the backupd support and made it into
|
|
||||||
as separate package.
|
|
||||||
|
|
||||||
beta4-2.2.1 Mar 12 2001
|
|
||||||
|
|
||||||
o Fix to the Frame Relay Device driver.
|
|
||||||
IPSAC sends a packet of zero length
|
|
||||||
header to the frame relay driver. The
|
|
||||||
driver tries to push its own 2 byte header
|
|
||||||
into the packet, which causes the driver to
|
|
||||||
crash.
|
|
||||||
|
|
||||||
o Fix the WANPIPE re-configuration code.
|
|
||||||
Bug was found by trying to run the cfgft1 while the
|
|
||||||
interface was already running.
|
|
||||||
|
|
||||||
o Updates to cfgft1.
|
|
||||||
Writes a wanpipe#.cfgft1 configuration file
|
|
||||||
once the CSU/DSU is configured. This file can
|
|
||||||
holds the current CSU/DSU configuration.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
>>>>>> END OF README <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
Matching of PCMCIA devices to drivers is done using one or more of the
|
||||||
|
following criteria:
|
||||||
|
|
||||||
|
- manufactor ID
|
||||||
|
- card ID
|
||||||
|
- product ID strings _and_ hashes of these strings
|
||||||
|
- function ID
|
||||||
|
- device function (actual and pseudo)
|
||||||
|
|
||||||
|
You should use the helpers in include/pcmcia/device_id.h for generating the
|
||||||
|
struct pcmcia_device_id[] entries which match devices to drivers.
|
||||||
|
|
||||||
|
If you want to match product ID strings, you also need to pass the crc32
|
||||||
|
hashes of the string to the macro, e.g. if you want to match the product ID
|
||||||
|
string 1, you need to use
|
||||||
|
|
||||||
|
PCMCIA_DEVICE_PROD_ID1("some_string", 0x(hash_of_some_string)),
|
||||||
|
|
||||||
|
If the hash is incorrect, the kernel will inform you about this in "dmesg"
|
||||||
|
upon module initialization, and tell you of the correct hash.
|
||||||
|
|
||||||
|
You can determine the hash of the product ID strings by catting the file
|
||||||
|
"modalias" in the sysfs directory of the PCMCIA device. It generates a string
|
||||||
|
in the following form:
|
||||||
|
pcmcia:m0149cC1ABf06pfn00fn00pa725B842DpbF1EFEE84pc0877B627pd00000000
|
||||||
|
|
||||||
|
The hex value after "pa" is the hash of product ID string 1, after "pb" for
|
||||||
|
string 2 and so on.
|
||||||
|
|
||||||
|
Alternatively, you can use this small tool to determine the crc32 hash.
|
||||||
|
simply pass the string you want to evaluate as argument to this program,
|
||||||
|
e.g.
|
||||||
|
$ ./crc32hash "Dual Speed"
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
/* crc32hash.c - derived from linux/lib/crc32.c, GNU GPL v2 */
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
unsigned int crc32(unsigned char const *p, unsigned int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned int crc = 0;
|
||||||
|
while (len--) {
|
||||||
|
crc ^= *p++;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
unsigned int result;
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("no string passed as argument\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
result = crc32(argv[1], strlen(argv[1]));
|
||||||
|
printf("0x%x\n", result);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
This file details changes in 2.6 which affect PCMCIA card driver authors:
|
||||||
|
|
||||||
|
* in-kernel device<->driver matching
|
||||||
|
PCMCIA devices and their correct drivers can now be matched in
|
||||||
|
kernelspace. See 'devicetable.txt' for details.
|
||||||
|
|
||||||
|
* Device model integration (as of 2.6.11)
|
||||||
|
A struct pcmcia_device is registered with the device model core,
|
||||||
|
and can be used (e.g. for SET_NETDEV_DEV) by using
|
||||||
|
handle_to_dev(client_handle_t * handle).
|
||||||
|
|
||||||
|
* Convert internal I/O port addresses to unsigned long (as of 2.6.11)
|
||||||
|
ioaddr_t should be replaced by kio_addr_t in PCMCIA card drivers.
|
||||||
|
|
||||||
|
* irq_mask and irq_list parameters (as of 2.6.11)
|
||||||
|
The irq_mask and irq_list parameters should no longer be used in
|
||||||
|
PCMCIA card drivers. Instead, it is the job of the PCMCIA core to
|
||||||
|
determine which IRQ should be used. Therefore, link->irq.IRQInfo2
|
||||||
|
is ignored.
|
||||||
|
|
||||||
|
* client->PendingEvents is gone (as of 2.6.11)
|
||||||
|
client->PendingEvents is no longer available.
|
||||||
|
|
||||||
|
* client->Attributes are gone (as of 2.6.11)
|
||||||
|
client->Attributes is unused, therefore it is removed from all
|
||||||
|
PCMCIA card drivers
|
||||||
|
|
||||||
|
* core functions no longer available (as of 2.6.11)
|
||||||
|
The following functions have been removed from the kernel source
|
||||||
|
because they are unused by all in-kernel drivers, and no external
|
||||||
|
driver was reported to rely on them:
|
||||||
|
pcmcia_get_first_region()
|
||||||
|
pcmcia_get_next_region()
|
||||||
|
pcmcia_modify_window()
|
||||||
|
pcmcia_set_event_mask()
|
||||||
|
pcmcia_get_first_window()
|
||||||
|
pcmcia_get_next_window()
|
||||||
|
|
||||||
|
* device list iteration upon module removal (as of 2.6.10)
|
||||||
|
It is no longer necessary to iterate on the driver's internal
|
||||||
|
client list and call the ->detach() function upon module removal.
|
||||||
|
|
||||||
|
* Resource management. (as of 2.6.8)
|
||||||
|
Although the PCMCIA subsystem will allocate resources for cards,
|
||||||
|
it no longer marks these resources busy. This means that driver
|
||||||
|
authors are now responsible for claiming your resources as per
|
||||||
|
other drivers in Linux. You should use request_region() to mark
|
||||||
|
your IO regions in-use, and request_mem_region() to mark your
|
||||||
|
memory regions in-use. The name argument should be a pointer to
|
||||||
|
your driver name. Eg, for pcnet_cs, name should point to the
|
||||||
|
string "pcnet_cs".
|
|
@ -12,8 +12,7 @@ refrigerator. Code to do this looks like this:
|
||||||
do {
|
do {
|
||||||
hub_events();
|
hub_events();
|
||||||
wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
|
wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
|
||||||
if (current->flags & PF_FREEZE)
|
try_to_freeze();
|
||||||
refrigerator(PF_FREEZE);
|
|
||||||
} while (!signal_pending(current));
|
} while (!signal_pending(current));
|
||||||
|
|
||||||
from drivers/usb/core/hub.c::hub_thread()
|
from drivers/usb/core/hub.c::hub_thread()
|
||||||
|
|
|
@ -291,6 +291,44 @@ a request to enable wake events from D3, two calls should be made to
|
||||||
pci_enable_wake (one for both D3hot and D3cold).
|
pci_enable_wake (one for both D3hot and D3cold).
|
||||||
|
|
||||||
|
|
||||||
|
A reference implementation
|
||||||
|
-------------------------
|
||||||
|
.suspend()
|
||||||
|
{
|
||||||
|
/* driver specific operations */
|
||||||
|
|
||||||
|
/* Disable IRQ */
|
||||||
|
free_irq();
|
||||||
|
/* If using MSI */
|
||||||
|
pci_disable_msi();
|
||||||
|
|
||||||
|
pci_save_state();
|
||||||
|
pci_enable_wake();
|
||||||
|
/* Disable IO/bus master/irq router */
|
||||||
|
pci_disable_device();
|
||||||
|
pci_set_power_state(pci_choose_state());
|
||||||
|
}
|
||||||
|
|
||||||
|
.resume()
|
||||||
|
{
|
||||||
|
pci_set_power_state(PCI_D0);
|
||||||
|
pci_restore_state();
|
||||||
|
/* device's irq possibly is changed, driver should take care */
|
||||||
|
pci_enable_device();
|
||||||
|
pci_set_master();
|
||||||
|
|
||||||
|
/* if using MSI, device's vector possibly is changed */
|
||||||
|
pci_enable_msi();
|
||||||
|
|
||||||
|
request_irq();
|
||||||
|
/* driver specific operations; */
|
||||||
|
}
|
||||||
|
|
||||||
|
This is a typical implementation. Drivers can slightly change the order
|
||||||
|
of the operations in the implementation, ignore some operations or add
|
||||||
|
more deriver specific operations in it, but drivers should do something like
|
||||||
|
this on the whole.
|
||||||
|
|
||||||
5. Resources
|
5. Resources
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -164,11 +164,11 @@ place where the thread is safe to be frozen (no kernel semaphores
|
||||||
should be held at that point and it must be safe to sleep there), and
|
should be held at that point and it must be safe to sleep there), and
|
||||||
add:
|
add:
|
||||||
|
|
||||||
if (current->flags & PF_FREEZE)
|
try_to_freeze();
|
||||||
refrigerator(PF_FREEZE);
|
|
||||||
|
|
||||||
If the thread is needed for writing the image to storage, you should
|
If the thread is needed for writing the image to storage, you should
|
||||||
instead set the PF_NOFREEZE process flag when creating the thread.
|
instead set the PF_NOFREEZE process flag when creating the thread (and
|
||||||
|
be very carefull).
|
||||||
|
|
||||||
|
|
||||||
Q: What is the difference between between "platform", "shutdown" and
|
Q: What is the difference between between "platform", "shutdown" and
|
||||||
|
@ -233,3 +233,81 @@ A: Try running
|
||||||
cat `cat /proc/[0-9]*/maps | grep / | sed 's:.* /:/:' | sort -u` > /dev/null
|
cat `cat /proc/[0-9]*/maps | grep / | sed 's:.* /:/:' | sort -u` > /dev/null
|
||||||
|
|
||||||
after resume. swapoff -a; swapon -a may also be usefull.
|
after resume. swapoff -a; swapon -a may also be usefull.
|
||||||
|
|
||||||
|
Q: What happens to devices during swsusp? They seem to be resumed
|
||||||
|
during system suspend?
|
||||||
|
|
||||||
|
A: That's correct. We need to resume them if we want to write image to
|
||||||
|
disk. Whole sequence goes like
|
||||||
|
|
||||||
|
Suspend part
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
running system, user asks for suspend-to-disk
|
||||||
|
|
||||||
|
user processes are stopped
|
||||||
|
|
||||||
|
suspend(PMSG_FREEZE): devices are frozen so that they don't interfere
|
||||||
|
with state snapshot
|
||||||
|
|
||||||
|
state snapshot: copy of whole used memory is taken with interrupts disabled
|
||||||
|
|
||||||
|
resume(): devices are woken up so that we can write image to swap
|
||||||
|
|
||||||
|
write image to swap
|
||||||
|
|
||||||
|
suspend(PMSG_SUSPEND): suspend devices so that we can power off
|
||||||
|
|
||||||
|
turn the power off
|
||||||
|
|
||||||
|
Resume part
|
||||||
|
~~~~~~~~~~~
|
||||||
|
(is actually pretty similar)
|
||||||
|
|
||||||
|
running system, user asks for suspend-to-disk
|
||||||
|
|
||||||
|
user processes are stopped (in common case there are none, but with resume-from-initrd, noone knows)
|
||||||
|
|
||||||
|
read image from disk
|
||||||
|
|
||||||
|
suspend(PMSG_FREEZE): devices are frozen so that they don't interfere
|
||||||
|
with image restoration
|
||||||
|
|
||||||
|
image restoration: rewrite memory with image
|
||||||
|
|
||||||
|
resume(): devices are woken up so that system can continue
|
||||||
|
|
||||||
|
thaw all user processes
|
||||||
|
|
||||||
|
Q: What is this 'Encrypt suspend image' for?
|
||||||
|
|
||||||
|
A: First of all: it is not a replacement for dm-crypt encrypted swap.
|
||||||
|
It cannot protect your computer while it is suspended. Instead it does
|
||||||
|
protect from leaking sensitive data after resume from suspend.
|
||||||
|
|
||||||
|
Think of the following: you suspend while an application is running
|
||||||
|
that keeps sensitive data in memory. The application itself prevents
|
||||||
|
the data from being swapped out. Suspend, however, must write these
|
||||||
|
data to swap to be able to resume later on. Without suspend encryption
|
||||||
|
your sensitive data are then stored in plaintext on disk. This means
|
||||||
|
that after resume your sensitive data are accessible to all
|
||||||
|
applications having direct access to the swap device which was used
|
||||||
|
for suspend. If you don't need swap after resume these data can remain
|
||||||
|
on disk virtually forever. Thus it can happen that your system gets
|
||||||
|
broken in weeks later and sensitive data which you thought were
|
||||||
|
encrypted and protected are retrieved and stolen from the swap device.
|
||||||
|
To prevent this situation you should use 'Encrypt suspend image'.
|
||||||
|
|
||||||
|
During suspend a temporary key is created and this key is used to
|
||||||
|
encrypt the data written to disk. When, during resume, the data was
|
||||||
|
read back into memory the temporary key is destroyed which simply
|
||||||
|
means that all data written to disk during suspend are then
|
||||||
|
inaccessible so they can't be stolen later on. The only thing that
|
||||||
|
you must then take care of is that you call 'mkswap' for the swap
|
||||||
|
partition used for suspend as early as possible during regular
|
||||||
|
boot. This asserts that any temporary key from an oopsed suspend or
|
||||||
|
from a failed or aborted resume is erased from the swap device.
|
||||||
|
|
||||||
|
As a rule of thumb use encrypted swap to protect your data while your
|
||||||
|
system is shut down or suspended. Additionally use the encrypted
|
||||||
|
suspend image to prevent sensitive data from being stolen after
|
||||||
|
resume.
|
||||||
|
|
|
@ -83,8 +83,10 @@ Compaq Armada E500 - P3-700 none (1) (S1 also works OK)
|
||||||
Compaq Evo N620c vga=normal, s3_bios (2)
|
Compaq Evo N620c vga=normal, s3_bios (2)
|
||||||
Dell 600m, ATI R250 Lf none (1), but needs xorg-x11-6.8.1.902-1
|
Dell 600m, ATI R250 Lf none (1), but needs xorg-x11-6.8.1.902-1
|
||||||
Dell D600, ATI RV250 vga=normal and X, or try vbestate (6)
|
Dell D600, ATI RV250 vga=normal and X, or try vbestate (6)
|
||||||
|
Dell D610 vga=normal and X (possibly vbestate (6) too, but not tested)
|
||||||
Dell Inspiron 4000 ??? (*)
|
Dell Inspiron 4000 ??? (*)
|
||||||
Dell Inspiron 500m ??? (*)
|
Dell Inspiron 500m ??? (*)
|
||||||
|
Dell Inspiron 510m ???
|
||||||
Dell Inspiron 600m ??? (*)
|
Dell Inspiron 600m ??? (*)
|
||||||
Dell Inspiron 8200 ??? (*)
|
Dell Inspiron 8200 ??? (*)
|
||||||
Dell Inspiron 8500 ??? (*)
|
Dell Inspiron 8500 ??? (*)
|
||||||
|
@ -123,6 +125,7 @@ Toshiba Satellite 4030CDT s3_mode (3)
|
||||||
Toshiba Satellite 4080XCDT s3_mode (3)
|
Toshiba Satellite 4080XCDT s3_mode (3)
|
||||||
Toshiba Satellite 4090XCDT ??? (*)
|
Toshiba Satellite 4090XCDT ??? (*)
|
||||||
Toshiba Satellite P10-554 s3_bios,s3_mode (4)(****)
|
Toshiba Satellite P10-554 s3_bios,s3_mode (4)(****)
|
||||||
|
Toshiba M30 (2) xor X with nvidia driver using internal AGP
|
||||||
Uniwill 244IIO ??? (*)
|
Uniwill 244IIO ??? (*)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
This driver implement the ACPI Extensions For Display Adapters
|
ACPI video extensions
|
||||||
for integrated graphics devices on motherboard, as specified in
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
ACPI 2.0 Specification, Appendix B, allowing to perform some basic
|
|
||||||
control like defining the video POST device, retrieving EDID information
|
This driver implement the ACPI Extensions For Display Adapters for
|
||||||
or to setup a video output, etc. Note that this is an ref. implementation only.
|
integrated graphics devices on motherboard, as specified in ACPI 2.0
|
||||||
It may or may not work for your integrated video device.
|
Specification, Appendix B, allowing to perform some basic control like
|
||||||
|
defining the video POST device, retrieving EDID information or to
|
||||||
|
setup a video output, etc. Note that this is an ref. implementation
|
||||||
|
only. It may or may not work for your integrated video device.
|
||||||
|
|
||||||
Interfaces exposed to userland through /proc/acpi/video:
|
Interfaces exposed to userland through /proc/acpi/video:
|
||||||
|
|
||||||
VGA/info : display the supported video bus device capability like ,Video ROM, CRT/LCD/TV.
|
VGA/info : display the supported video bus device capability like Video ROM, CRT/LCD/TV.
|
||||||
VGA/ROM : Used to get a copy of the display devices' ROM data (up to 4k).
|
VGA/ROM : Used to get a copy of the display devices' ROM data (up to 4k).
|
||||||
VGA/POST_info : Used to determine what options are implemented.
|
VGA/POST_info : Used to determine what options are implemented.
|
||||||
VGA/POST : Used to get/set POST device.
|
VGA/POST : Used to get/set POST device.
|
||||||
|
@ -15,7 +18,7 @@ VGA/DOS : Used to get/set ownership of output switching:
|
||||||
Please refer ACPI spec B.4.1 _DOS
|
Please refer ACPI spec B.4.1 _DOS
|
||||||
VGA/CRT : CRT output
|
VGA/CRT : CRT output
|
||||||
VGA/LCD : LCD output
|
VGA/LCD : LCD output
|
||||||
VGA/TV : TV output
|
VGA/TVO : TV output
|
||||||
VGA/*/brightness : Used to get/set brightness of output device
|
VGA/*/brightness : Used to get/set brightness of output device
|
||||||
|
|
||||||
Notify event through /proc/acpi/event:
|
Notify event through /proc/acpi/event:
|
||||||
|
|
|
@ -12,8 +12,8 @@ where log records can be stored efficiently in memory, where each component
|
||||||
One purpose of this is to inspect the debug logs after a production system crash
|
One purpose of this is to inspect the debug logs after a production system crash
|
||||||
in order to analyze the reason for the crash.
|
in order to analyze the reason for the crash.
|
||||||
If the system still runs but only a subcomponent which uses dbf failes,
|
If the system still runs but only a subcomponent which uses dbf failes,
|
||||||
it is possible to look at the debug logs on a live system via the Linux proc
|
it is possible to look at the debug logs on a live system via the Linux
|
||||||
filesystem.
|
debugfs filesystem.
|
||||||
The debug feature may also very useful for kernel and driver development.
|
The debug feature may also very useful for kernel and driver development.
|
||||||
|
|
||||||
Design:
|
Design:
|
||||||
|
@ -52,16 +52,18 @@ Each debug entry contains the following data:
|
||||||
- Flag, if entry is an exception or not
|
- Flag, if entry is an exception or not
|
||||||
|
|
||||||
The debug logs can be inspected in a live system through entries in
|
The debug logs can be inspected in a live system through entries in
|
||||||
the proc-filesystem. Under the path /proc/s390dbf there is
|
the debugfs-filesystem. Under the toplevel directory "s390dbf" there is
|
||||||
a directory for each registered component, which is named like the
|
a directory for each registered component, which is named like the
|
||||||
corresponding component.
|
corresponding component. The debugfs normally should be mounted to
|
||||||
|
/sys/kernel/debug therefore the debug feature can be accessed unter
|
||||||
|
/sys/kernel/debug/s390dbf.
|
||||||
|
|
||||||
The content of the directories are files which represent different views
|
The content of the directories are files which represent different views
|
||||||
to the debug log. Each component can decide which views should be
|
to the debug log. Each component can decide which views should be
|
||||||
used through registering them with the function debug_register_view().
|
used through registering them with the function debug_register_view().
|
||||||
Predefined views for hex/ascii, sprintf and raw binary data are provided.
|
Predefined views for hex/ascii, sprintf and raw binary data are provided.
|
||||||
It is also possible to define other views. The content of
|
It is also possible to define other views. The content of
|
||||||
a view can be inspected simply by reading the corresponding proc file.
|
a view can be inspected simply by reading the corresponding debugfs file.
|
||||||
|
|
||||||
All debug logs have an an actual debug level (range from 0 to 6).
|
All debug logs have an an actual debug level (range from 0 to 6).
|
||||||
The default level is 3. Event and Exception functions have a 'level'
|
The default level is 3. Event and Exception functions have a 'level'
|
||||||
|
@ -69,14 +71,14 @@ parameter. Only debug entries with a level that is lower or equal
|
||||||
than the actual level are written to the log. This means, when
|
than the actual level are written to the log. This means, when
|
||||||
writing events, high priority log entries should have a low level
|
writing events, high priority log entries should have a low level
|
||||||
value whereas low priority entries should have a high one.
|
value whereas low priority entries should have a high one.
|
||||||
The actual debug level can be changed with the help of the proc-filesystem
|
The actual debug level can be changed with the help of the debugfs-filesystem
|
||||||
through writing a number string "x" to the 'level' proc file which is
|
through writing a number string "x" to the 'level' debugfs file which is
|
||||||
provided for every debug log. Debugging can be switched off completely
|
provided for every debug log. Debugging can be switched off completely
|
||||||
by using "-" on the 'level' proc file.
|
by using "-" on the 'level' debugfs file.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
> echo "-" > /proc/s390dbf/dasd/level
|
> echo "-" > /sys/kernel/debug/s390dbf/dasd/level
|
||||||
|
|
||||||
It is also possible to deactivate the debug feature globally for every
|
It is also possible to deactivate the debug feature globally for every
|
||||||
debug log. You can change the behavior using 2 sysctl parameters in
|
debug log. You can change the behavior using 2 sysctl parameters in
|
||||||
|
@ -99,11 +101,11 @@ Kernel Interfaces:
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
debug_info_t *debug_register(char *name, int pages_index, int nr_areas,
|
debug_info_t *debug_register(char *name, int pages, int nr_areas,
|
||||||
int buf_size);
|
int buf_size);
|
||||||
|
|
||||||
Parameter: name: Name of debug log (e.g. used for proc entry)
|
Parameter: name: Name of debug log (e.g. used for debugfs entry)
|
||||||
pages_index: 2^pages_index pages will be allocated per area
|
pages: number of pages, which will be allocated per area
|
||||||
nr_areas: number of debug areas
|
nr_areas: number of debug areas
|
||||||
buf_size: size of data area in each debug entry
|
buf_size: size of data area in each debug entry
|
||||||
|
|
||||||
|
@ -134,7 +136,7 @@ Return Value: none
|
||||||
Description: Sets new actual debug level if new_level is valid.
|
Description: Sets new actual debug level if new_level is valid.
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
+void debug_stop_all(void);
|
void debug_stop_all(void);
|
||||||
|
|
||||||
Parameter: none
|
Parameter: none
|
||||||
|
|
||||||
|
@ -270,7 +272,7 @@ Parameter: id: handle for debug log
|
||||||
Return Value: 0 : ok
|
Return Value: 0 : ok
|
||||||
< 0: Error
|
< 0: Error
|
||||||
|
|
||||||
Description: registers new debug view and creates proc dir entry
|
Description: registers new debug view and creates debugfs dir entry
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
int debug_unregister_view (debug_info_t * id, struct debug_view *view);
|
int debug_unregister_view (debug_info_t * id, struct debug_view *view);
|
||||||
|
@ -281,7 +283,7 @@ Parameter: id: handle for debug log
|
||||||
Return Value: 0 : ok
|
Return Value: 0 : ok
|
||||||
< 0: Error
|
< 0: Error
|
||||||
|
|
||||||
Description: unregisters debug view and removes proc dir entry
|
Description: unregisters debug view and removes debugfs dir entry
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -308,7 +310,7 @@ static int init(void)
|
||||||
{
|
{
|
||||||
/* register 4 debug areas with one page each and 4 byte data field */
|
/* register 4 debug areas with one page each and 4 byte data field */
|
||||||
|
|
||||||
debug_info = debug_register ("test", 0, 4, 4 );
|
debug_info = debug_register ("test", 1, 4, 4 );
|
||||||
debug_register_view(debug_info,&debug_hex_ascii_view);
|
debug_register_view(debug_info,&debug_hex_ascii_view);
|
||||||
debug_register_view(debug_info,&debug_raw_view);
|
debug_register_view(debug_info,&debug_raw_view);
|
||||||
|
|
||||||
|
@ -343,7 +345,7 @@ static int init(void)
|
||||||
/* register 4 debug areas with one page each and data field for */
|
/* register 4 debug areas with one page each and data field for */
|
||||||
/* format string pointer + 2 varargs (= 3 * sizeof(long)) */
|
/* format string pointer + 2 varargs (= 3 * sizeof(long)) */
|
||||||
|
|
||||||
debug_info = debug_register ("test", 0, 4, sizeof(long) * 3);
|
debug_info = debug_register ("test", 1, 4, sizeof(long) * 3);
|
||||||
debug_register_view(debug_info,&debug_sprintf_view);
|
debug_register_view(debug_info,&debug_sprintf_view);
|
||||||
|
|
||||||
debug_sprintf_event(debug_info, 2 , "first event in %s:%i\n",__FILE__,__LINE__);
|
debug_sprintf_event(debug_info, 2 , "first event in %s:%i\n",__FILE__,__LINE__);
|
||||||
|
@ -362,16 +364,16 @@ module_exit(cleanup);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ProcFS Interface
|
Debugfs Interface
|
||||||
----------------
|
----------------
|
||||||
Views to the debug logs can be investigated through reading the corresponding
|
Views to the debug logs can be investigated through reading the corresponding
|
||||||
proc-files:
|
debugfs-files:
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
> ls /proc/s390dbf/dasd
|
> ls /sys/kernel/debug/s390dbf/dasd
|
||||||
flush hex_ascii level raw
|
flush hex_ascii level pages raw
|
||||||
> cat /proc/s390dbf/dasd/hex_ascii | sort +1
|
> cat /sys/kernel/debug/s390dbf/dasd/hex_ascii | sort +1
|
||||||
00 00974733272:680099 2 - 02 0006ad7e 07 ea 4a 90 | ....
|
00 00974733272:680099 2 - 02 0006ad7e 07 ea 4a 90 | ....
|
||||||
00 00974733272:682210 2 - 02 0006ade6 46 52 45 45 | FREE
|
00 00974733272:682210 2 - 02 0006ade6 46 52 45 45 | FREE
|
||||||
00 00974733272:682213 2 - 02 0006adf6 07 ea 4a 90 | ....
|
00 00974733272:682213 2 - 02 0006adf6 07 ea 4a 90 | ....
|
||||||
|
@ -391,25 +393,36 @@ Changing the debug level
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
||||||
> cat /proc/s390dbf/dasd/level
|
> cat /sys/kernel/debug/s390dbf/dasd/level
|
||||||
3
|
3
|
||||||
> echo "5" > /proc/s390dbf/dasd/level
|
> echo "5" > /sys/kernel/debug/s390dbf/dasd/level
|
||||||
> cat /proc/s390dbf/dasd/level
|
> cat /sys/kernel/debug/s390dbf/dasd/level
|
||||||
5
|
5
|
||||||
|
|
||||||
Flushing debug areas
|
Flushing debug areas
|
||||||
--------------------
|
--------------------
|
||||||
Debug areas can be flushed with piping the number of the desired
|
Debug areas can be flushed with piping the number of the desired
|
||||||
area (0...n) to the proc file "flush". When using "-" all debug areas
|
area (0...n) to the debugfs file "flush". When using "-" all debug areas
|
||||||
are flushed.
|
are flushed.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
1. Flush debug area 0:
|
1. Flush debug area 0:
|
||||||
> echo "0" > /proc/s390dbf/dasd/flush
|
> echo "0" > /sys/kernel/debug/s390dbf/dasd/flush
|
||||||
|
|
||||||
2. Flush all debug areas:
|
2. Flush all debug areas:
|
||||||
> echo "-" > /proc/s390dbf/dasd/flush
|
> echo "-" > /sys/kernel/debug/s390dbf/dasd/flush
|
||||||
|
|
||||||
|
Changing the size of debug areas
|
||||||
|
------------------------------------
|
||||||
|
It is possible the change the size of debug areas through piping
|
||||||
|
the number of pages to the debugfs file "pages". The resize request will
|
||||||
|
also flush the debug areas.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Define 4 pages for the debug areas of debug feature "dasd":
|
||||||
|
> echo "4" > /sys/kernel/debug/s390dbf/dasd/pages
|
||||||
|
|
||||||
Stooping the debug feature
|
Stooping the debug feature
|
||||||
--------------------------
|
--------------------------
|
||||||
|
@ -491,7 +504,7 @@ Defining views
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Views are specified with the 'debug_view' structure. There are defined
|
Views are specified with the 'debug_view' structure. There are defined
|
||||||
callback functions which are used for reading and writing the proc files:
|
callback functions which are used for reading and writing the debugfs files:
|
||||||
|
|
||||||
struct debug_view {
|
struct debug_view {
|
||||||
char name[DEBUG_MAX_PROCF_LEN];
|
char name[DEBUG_MAX_PROCF_LEN];
|
||||||
|
@ -525,7 +538,7 @@ typedef int (debug_input_proc_t) (debug_info_t* id,
|
||||||
The "private_data" member can be used as pointer to view specific data.
|
The "private_data" member can be used as pointer to view specific data.
|
||||||
It is not used by the debug feature itself.
|
It is not used by the debug feature itself.
|
||||||
|
|
||||||
The output when reading a debug-proc file is structured like this:
|
The output when reading a debugfs file is structured like this:
|
||||||
|
|
||||||
"prolog_proc output"
|
"prolog_proc output"
|
||||||
|
|
||||||
|
@ -534,13 +547,13 @@ The output when reading a debug-proc file is structured like this:
|
||||||
"header_proc output 3" "format_proc output 3"
|
"header_proc output 3" "format_proc output 3"
|
||||||
...
|
...
|
||||||
|
|
||||||
When a view is read from the proc fs, the Debug Feature calls the
|
When a view is read from the debugfs, the Debug Feature calls the
|
||||||
'prolog_proc' once for writing the prolog.
|
'prolog_proc' once for writing the prolog.
|
||||||
Then 'header_proc' and 'format_proc' are called for each
|
Then 'header_proc' and 'format_proc' are called for each
|
||||||
existing debug entry.
|
existing debug entry.
|
||||||
|
|
||||||
The input_proc can be used to implement functionality when it is written to
|
The input_proc can be used to implement functionality when it is written to
|
||||||
the view (e.g. like with 'echo "0" > /proc/s390dbf/dasd/level).
|
the view (e.g. like with 'echo "0" > /sys/kernel/debug/s390dbf/dasd/level).
|
||||||
|
|
||||||
For header_proc there can be used the default function
|
For header_proc there can be used the default function
|
||||||
debug_dflt_header_fn() which is defined in in debug.h.
|
debug_dflt_header_fn() which is defined in in debug.h.
|
||||||
|
@ -602,7 +615,7 @@ debug_info = debug_register ("test", 0, 4, 4 ));
|
||||||
debug_register_view(debug_info, &debug_test_view);
|
debug_register_view(debug_info, &debug_test_view);
|
||||||
for(i = 0; i < 10; i ++) debug_int_event(debug_info, 1, i);
|
for(i = 0; i < 10; i ++) debug_int_event(debug_info, 1, i);
|
||||||
|
|
||||||
> cat /proc/s390dbf/test/myview
|
> cat /sys/kernel/debug/s390dbf/test/myview
|
||||||
00 00964419734:611402 1 - 00 88042ca This error...........
|
00 00964419734:611402 1 - 00 88042ca This error...........
|
||||||
00 00964419734:611405 1 - 00 88042ca That error...........
|
00 00964419734:611405 1 - 00 88042ca That error...........
|
||||||
00 00964419734:611408 1 - 00 88042ca Problem..............
|
00 00964419734:611408 1 - 00 88042ca Problem..............
|
||||||
|
|
|
@ -107,8 +107,8 @@ hardware.
|
||||||
indicate that the signal is permanently active. If RI is
|
indicate that the signal is permanently active. If RI is
|
||||||
not available, the signal should not be indicated as active.
|
not available, the signal should not be indicated as active.
|
||||||
|
|
||||||
Locking: none.
|
Locking: port->lock taken.
|
||||||
Interrupts: caller dependent.
|
Interrupts: locally disabled.
|
||||||
This call must not sleep
|
This call must not sleep
|
||||||
|
|
||||||
stop_tx(port,tty_stop)
|
stop_tx(port,tty_stop)
|
||||||
|
|
|
@ -72,6 +72,8 @@ On all - write a character to /proc/sysrq-trigger. eg:
|
||||||
'b' - Will immediately reboot the system without syncing or unmounting
|
'b' - Will immediately reboot the system without syncing or unmounting
|
||||||
your disks.
|
your disks.
|
||||||
|
|
||||||
|
'c' - Will perform a kexec reboot in order to take a crashdump.
|
||||||
|
|
||||||
'o' - Will shut your system off (if configured and supported).
|
'o' - Will shut your system off (if configured and supported).
|
||||||
|
|
||||||
's' - Will attempt to sync all mounted filesystems.
|
's' - Will attempt to sync all mounted filesystems.
|
||||||
|
@ -122,6 +124,9 @@ useful when you want to exit a program that will not let you switch consoles.
|
||||||
re'B'oot is good when you're unable to shut down. But you should also 'S'ync
|
re'B'oot is good when you're unable to shut down. But you should also 'S'ync
|
||||||
and 'U'mount first.
|
and 'U'mount first.
|
||||||
|
|
||||||
|
'C'rashdump can be used to manually trigger a crashdump when the system is hung.
|
||||||
|
The kernel needs to have been built with CONFIG_KEXEC enabled.
|
||||||
|
|
||||||
'S'ync is great when your system is locked up, it allows you to sync your
|
'S'ync is great when your system is locked up, it allows you to sync your
|
||||||
disks and will certainly lessen the chance of data loss and fscking. Note
|
disks and will certainly lessen the chance of data loss and fscking. Note
|
||||||
that the sync hasn't taken place until you see the "OK" and "Done" appear
|
that the sync hasn't taken place until you see the "OK" and "Done" appear
|
||||||
|
|
|
@ -1,399 +1,16 @@
|
||||||
<HTML><HEAD>
|
<TITLE>V4L API</TITLE>
|
||||||
<TITLE>Video4Linux Kernel API Reference v0.1:19990430</TITLE>
|
<H1>Video For Linux APIs</H1>
|
||||||
</HEAD>
|
<table border=0>
|
||||||
<! Revision History: >
|
<tr>
|
||||||
<! 4/30/1999 - Fred Gleason (fredg@wava.com)>
|
<td>
|
||||||
<! Documented extensions for the Radio Data System (RDS) extensions >
|
<A HREF=http://www.linuxtv.org/downloads/video4linux/API/V4L1_API.html>
|
||||||
<BODY bgcolor="#ffffff">
|
V4L original API</a>
|
||||||
<H3>Devices</H3>
|
</td><td>
|
||||||
Video4Linux provides the following sets of device files. These live on the
|
Obsoleted by V4L2 API
|
||||||
character device formerly known as "/dev/bttv". /dev/bttv should be a
|
</td></tr><tr><td>
|
||||||
symlink to /dev/video0 for most people.
|
<A HREF=http://www.linuxtv.org/downloads/video4linux/API/V4L2_API.html>
|
||||||
<P>
|
V4L2 API</a>
|
||||||
<TABLE>
|
</td><td>
|
||||||
<TR><TH>Device Name</TH><TH>Minor Range</TH><TH>Function</TH>
|
Should be used for new projects
|
||||||
<TR><TD>/dev/video</TD><TD>0-63</TD><TD>Video Capture Interface</TD>
|
</td></tr>
|
||||||
<TR><TD>/dev/radio</TD><TD>64-127</TD><TD>AM/FM Radio Devices</TD>
|
</table>
|
||||||
<TR><TD>/dev/vtx</TD><TD>192-223</TD><TD>Teletext Interface Chips</TD>
|
|
||||||
<TR><TD>/dev/vbi</TD><TD>224-239</TD><TD>Raw VBI Data (Intercast/teletext)</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Video4Linux programs open and scan the devices to find what they are looking
|
|
||||||
for. Capability queries define what each interface supports. The
|
|
||||||
described API is only defined for video capture cards. The relevant subset
|
|
||||||
applies to radio cards. Teletext interfaces talk the existing VTX API.
|
|
||||||
<P>
|
|
||||||
<H3>Capability Query Ioctl</H3>
|
|
||||||
The <B>VIDIOCGCAP</B> ioctl call is used to obtain the capability
|
|
||||||
information for a video device. The <b>struct video_capability</b> object
|
|
||||||
passed to the ioctl is completed and returned. It contains the following
|
|
||||||
information
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>name[32]</b><TD>Canonical name for this interface</TD>
|
|
||||||
<TR><TD><b>type</b><TD>Type of interface</TD>
|
|
||||||
<TR><TD><b>channels</b><TD>Number of radio/tv channels if appropriate</TD>
|
|
||||||
<TR><TD><b>audios</b><TD>Number of audio devices if appropriate</TD>
|
|
||||||
<TR><TD><b>maxwidth</b><TD>Maximum capture width in pixels</TD>
|
|
||||||
<TR><TD><b>maxheight</b><TD>Maximum capture height in pixels</TD>
|
|
||||||
<TR><TD><b>minwidth</b><TD>Minimum capture width in pixels</TD>
|
|
||||||
<TR><TD><b>minheight</b><TD>Minimum capture height in pixels</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The type field lists the capability flags for the device. These are
|
|
||||||
as follows
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TH>Name</TH><TH>Description</TH>
|
|
||||||
<TR><TD><b>VID_TYPE_CAPTURE</b><TD>Can capture to memory</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_TUNER</b><TD>Has a tuner of some form</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_TELETEXT</b><TD>Has teletext capability</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_OVERLAY</b><TD>Can overlay its image onto the frame buffer</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_CHROMAKEY</b><TD>Overlay is Chromakeyed</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_CLIPPING</b><TD>Overlay clipping is supported</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_FRAMERAM</b><TD>Overlay overwrites frame buffer memory</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_SCALES</b><TD>The hardware supports image scaling</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_MONOCHROME</b><TD>Image capture is grey scale only</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_SUBCAPTURE</b><TD>Capture can be of only part of the image</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The minimum and maximum sizes listed for a capture device do not imply all
|
|
||||||
that all height/width ratios or sizes within the range are possible. A
|
|
||||||
request to set a size will be honoured by the largest available capture
|
|
||||||
size whose capture is no large than the requested rectangle in either
|
|
||||||
direction. For example the quickcam has 3 fixed settings.
|
|
||||||
<P>
|
|
||||||
<H3>Frame Buffer</H3>
|
|
||||||
Capture cards that drop data directly onto the frame buffer must be told the
|
|
||||||
base address of the frame buffer, its size and organisation. This is a
|
|
||||||
privileged ioctl and one that eventually X itself should set.
|
|
||||||
<P>
|
|
||||||
The <b>VIDIOCSFBUF</b> ioctl sets the frame buffer parameters for a capture
|
|
||||||
card. If the card does not do direct writes to the frame buffer then this
|
|
||||||
ioctl will be unsupported. The <b>VIDIOCGFBUF</b> ioctl returns the
|
|
||||||
currently used parameters. The structure used in both cases is a
|
|
||||||
<b>struct video_buffer</b>.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>void *base</b></TD><TD>Base physical address of the buffer</TD>
|
|
||||||
<TR><TD><b>int height</b></TD><TD>Height of the frame buffer</TD>
|
|
||||||
<TR><TD><b>int width</b></TD><TD>Width of the frame buffer</TD>
|
|
||||||
<TR><TD><b>int depth</b></TD><TD>Depth of the frame buffer</TD>
|
|
||||||
<TR><TD><b>int bytesperline</b></TD><TD>Number of bytes of memory between the start of two adjacent lines</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Note that these values reflect the physical layout of the frame buffer.
|
|
||||||
The visible area may be smaller. In fact under XFree86 this is commonly the
|
|
||||||
case. XFree86 DGA can provide the parameters required to set up this ioctl.
|
|
||||||
Setting the base address to NULL indicates there is no physical frame buffer
|
|
||||||
access.
|
|
||||||
<P>
|
|
||||||
<H3>Capture Windows</H3>
|
|
||||||
The capture area is described by a <b>struct video_window</b>. This defines
|
|
||||||
a capture area and the clipping information if relevant. The
|
|
||||||
<b>VIDIOCGWIN</b> ioctl recovers the current settings and the
|
|
||||||
<b>VIDIOCSWIN</b> sets new values. A successful call to <b>VIDIOCSWIN</b>
|
|
||||||
indicates that a suitable set of parameters have been chosen. They do not
|
|
||||||
indicate that exactly what was requested was granted. The program should
|
|
||||||
call <b>VIDIOCGWIN</b> to check if the nearest match was suitable. The
|
|
||||||
<b>struct video_window</b> contains the following fields.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>x</b><TD>The X co-ordinate specified in X windows format.</TD>
|
|
||||||
<TR><TD><b>y</b><TD>The Y co-ordinate specified in X windows format.</TD>
|
|
||||||
<TR><TD><b>width</b><TD>The width of the image capture.</TD>
|
|
||||||
<TR><TD><b>height</b><TD>The height of the image capture.</TD>
|
|
||||||
<TR><TD><b>chromakey</b><TD>A host order RGB32 value for the chroma key.</TD>
|
|
||||||
<TR><TD><b>flags</b><TD>Additional capture flags.</TD>
|
|
||||||
<TR><TD><b>clips</b><TD>A list of clipping rectangles. <em>(Set only)</em></TD>
|
|
||||||
<TR><TD><b>clipcount</b><TD>The number of clipping rectangles. <em>(Set only)</em></TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Clipping rectangles are passed as an array. Each clip consists of the following
|
|
||||||
fields available to the user.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>x</b></TD><TD>X co-ordinate of rectangle to skip</TD>
|
|
||||||
<TR><TD><b>y</b></TD><TD>Y co-ordinate of rectangle to skip</TD>
|
|
||||||
<TR><TD><b>width</b></TD><TD>Width of rectangle to skip</TD>
|
|
||||||
<TR><TD><b>height</b></TD><TD>Height of rectangle to skip</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Merely setting the window does not enable capturing. Overlay capturing
|
|
||||||
(i.e. PCI-PCI transfer to the frame buffer of the video card)
|
|
||||||
is activated by passing the <b>VIDIOCCAPTURE</b> ioctl a value of 1, and
|
|
||||||
disabled by passing it a value of 0.
|
|
||||||
<P>
|
|
||||||
Some capture devices can capture a subfield of the image they actually see.
|
|
||||||
This is indicated when VIDEO_TYPE_SUBCAPTURE is defined.
|
|
||||||
The video_capture describes the time and special subfields to capture.
|
|
||||||
The video_capture structure contains the following fields.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>x</b></TD><TD>X co-ordinate of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>y</b></TD><TD>Y co-ordinate of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>width</b></TD><TD>Width of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>height</b></TD><TD>Height of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>decimation</b></TD><TD>Decimation to apply</TD>
|
|
||||||
<TR><TD><b>flags</b></TD><TD>Flag settings for grabbing</TD>
|
|
||||||
</TABLE>
|
|
||||||
The available flags are
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TH>Name</TH><TH>Description</TH>
|
|
||||||
<TR><TD><b>VIDEO_CAPTURE_ODD</b><TD>Capture only odd frames</TD>
|
|
||||||
<TR><TD><b>VIDEO_CAPTURE_EVEN</b><TD>Capture only even frames</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Video Sources</H3>
|
|
||||||
Each video4linux video or audio device captures from one or more
|
|
||||||
source <b>channels</b>. Each channel can be queries with the
|
|
||||||
<b>VDIOCGCHAN</b> ioctl call. Before invoking this function the caller
|
|
||||||
must set the channel field to the channel that is being queried. On return
|
|
||||||
the <b>struct video_channel</b> is filled in with information about the
|
|
||||||
nature of the channel itself.
|
|
||||||
<P>
|
|
||||||
The <b>VIDIOCSCHAN</b> ioctl takes an integer argument and switches the
|
|
||||||
capture to this input. It is not defined whether parameters such as colour
|
|
||||||
settings or tuning are maintained across a channel switch. The caller should
|
|
||||||
maintain settings as desired for each channel. (This is reasonable as
|
|
||||||
different video inputs may have different properties).
|
|
||||||
<P>
|
|
||||||
The <b>struct video_channel</b> consists of the following
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>channel</b></TD><TD>The channel number</TD>
|
|
||||||
<TR><TD><b>name</b></TD><TD>The input name - preferably reflecting the label
|
|
||||||
on the card input itself</TD>
|
|
||||||
<TR><TD><b>tuners</b></TD><TD>Number of tuners for this input</TD>
|
|
||||||
<TR><TD><b>flags</b></TD><TD>Properties the tuner has</TD>
|
|
||||||
<TR><TD><b>type</b></TD><TD>Input type (if known)</TD>
|
|
||||||
<TR><TD><b>norm</b><TD>The norm for this channel</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The flags defined are
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_VC_TUNER</b><TD>Channel has tuners.</TD>
|
|
||||||
<TR><TD><b>VIDEO_VC_AUDIO</b><TD>Channel has audio.</TD>
|
|
||||||
<TR><TD><b>VIDEO_VC_NORM</b><TD>Channel has norm setting.</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The types defined are
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_TYPE_TV</b><TD>The input is a TV input.</TD>
|
|
||||||
<TR><TD><b>VIDEO_TYPE_CAMERA</b><TD>The input is a camera.</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Image Properties</H3>
|
|
||||||
The image properties of the picture can be queried with the <b>VIDIOCGPICT</b>
|
|
||||||
ioctl which fills in a <b>struct video_picture</b>. The <b>VIDIOCSPICT</b>
|
|
||||||
ioctl allows values to be changed. All values except for the palette type
|
|
||||||
are scaled between 0-65535.
|
|
||||||
<P>
|
|
||||||
The <b>struct video_picture</b> consists of the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>brightness</b><TD>Picture brightness</TD>
|
|
||||||
<TR><TD><b>hue</b><TD>Picture hue (colour only)</TD>
|
|
||||||
<TR><TD><b>colour</b><TD>Picture colour (colour only)</TD>
|
|
||||||
<TR><TD><b>contrast</b><TD>Picture contrast</TD>
|
|
||||||
<TR><TD><b>whiteness</b><TD>The whiteness (greyscale only)</TD>
|
|
||||||
<TR><TD><b>depth</b><TD>The capture depth (may need to match the frame buffer depth)</TD>
|
|
||||||
<TR><TD><b>palette</b><TD>Reports the palette that should be used for this image</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following palettes are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_GREY</b><TD>Linear intensity grey scale (255 is brightest).</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_HI240</b><TD>The BT848 8bit colour cube.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB565</b><TD>RGB565 packed into 16 bit words.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB555</b><TD>RGV555 packed into 16 bit words, top bit undefined.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB24</b><TD>RGB888 packed into 24bit words.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB32</b><TD>RGB888 packed into the low 3 bytes of 32bit words. The top 8bits are undefined.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV422</b><TD>Video style YUV422 - 8bits packed 4bits Y 2bits U 2bits V</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUYV</b><TD>Describe me</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_UYVY</b><TD>Describe me</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV420</b><TD>YUV420 capture</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV411</b><TD>YUV411 capture</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RAW</b><TD>RAW capture (BT848)</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV422P</b><TD>YUV 4:2:2 Planar</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV411P</b><TD>YUV 4:1:1 Planar</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Tuning</H3>
|
|
||||||
Each video input channel can have one or more tuners associated with it. Many
|
|
||||||
devices will not have tuners. TV cards and radio cards will have one or more
|
|
||||||
tuners attached.
|
|
||||||
<P>
|
|
||||||
Tuners are described by a <b>struct video_tuner</b> which can be obtained by
|
|
||||||
the <b>VIDIOCGTUNER</b> ioctl. Fill in the tuner number in the structure
|
|
||||||
then pass the structure to the ioctl to have the data filled in. The
|
|
||||||
tuner can be switched using <b>VIDIOCSTUNER</b> which takes an integer argument
|
|
||||||
giving the tuner to use. A struct tuner has the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>tuner</b><TD>Number of the tuner</TD>
|
|
||||||
<TR><TD><b>name</b><TD>Canonical name for this tuner (eg FM/AM/TV)</TD>
|
|
||||||
<TR><TD><b>rangelow</b><TD>Lowest tunable frequency</TD>
|
|
||||||
<TR><TD><b>rangehigh</b><TD>Highest tunable frequency</TD>
|
|
||||||
<TR><TD><b>flags</b><TD>Flags describing the tuner</TD>
|
|
||||||
<TR><TD><b>mode</b><TD>The video signal mode if relevant</TD>
|
|
||||||
<TR><TD><b>signal</b><TD>Signal strength if known - between 0-65535</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following flags exist
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_PAL</b><TD>PAL tuning is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_NTSC</b><TD>NTSC tuning is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_SECAM</b><TD>SECAM tuning is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_LOW</b><TD>Frequency is in a lower range</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_NORM</b><TD>The norm for this tuner is settable</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_STEREO_ON</b><TD>The tuner is seeing stereo audio</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_RDS_ON</b><TD>The tuner is seeing a RDS datastream</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_MBS_ON</b><TD>The tuner is seeing a MBS datastream</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following modes are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_MODE_PAL</b><TD>The tuner is in PAL mode</TD>
|
|
||||||
<TR><TD><b>VIDEO_MODE_NTSC</b><TD>The tuner is in NTSC mode</TD>
|
|
||||||
<TR><TD><b>VIDEO_MODE_SECAM</b><TD>The tuner is in SECAM mode</TD>
|
|
||||||
<TR><TD><b>VIDEO_MODE_AUTO</b><TD>The tuner auto switches, or mode does not apply</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Tuning frequencies are an unsigned 32bit value in 1/16th MHz or if the
|
|
||||||
<b>VIDEO_TUNER_LOW</b> flag is set they are in 1/16th KHz. The current
|
|
||||||
frequency is obtained as an unsigned long via the <b>VIDIOCGFREQ</b> ioctl and
|
|
||||||
set by the <b>VIDIOCSFREQ</b> ioctl.
|
|
||||||
<P>
|
|
||||||
<H3>Audio</H3>
|
|
||||||
TV and Radio devices have one or more audio inputs that may be selected.
|
|
||||||
The audio properties are queried by passing a <b>struct video_audio</b> to <b>VIDIOCGAUDIO</b> ioctl. The
|
|
||||||
<b>VIDIOCSAUDIO</b> ioctl sets audio properties.
|
|
||||||
<P>
|
|
||||||
The structure contains the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>audio</b><TD>The channel number</TD>
|
|
||||||
<TR><TD><b>volume</b><TD>The volume level</TD>
|
|
||||||
<TR><TD><b>bass</b><TD>The bass level</TD>
|
|
||||||
<TR><TD><b>treble</b><TD>The treble level</TD>
|
|
||||||
<TR><TD><b>flags</b><TD>Flags describing the audio channel</TD>
|
|
||||||
<TR><TD><b>name</b><TD>Canonical name for the audio input</TD>
|
|
||||||
<TR><TD><b>mode</b><TD>The mode the audio input is in</TD>
|
|
||||||
<TR><TD><b>balance</b><TD>The left/right balance</TD>
|
|
||||||
<TR><TD><b>step</b><TD>Actual step used by the hardware</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following flags are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_MUTE</b><TD>The audio is muted</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_MUTABLE</b><TD>Audio muting is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_VOLUME</b><TD>The volume is controllable</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_BASS</b><TD>The bass is controllable</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_TREBLE</b><TD>The treble is controllable</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_BALANCE</b><TD>The balance is controllable</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following decoding modes are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_MONO</b><TD>Mono signal</TD>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_STEREO</b><TD>Stereo signal (NICAM for TV)</TD>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_LANG1</b><TD>European TV alternate language 1</TD>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_LANG2</b><TD>European TV alternate language 2</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Reading Images</H3>
|
|
||||||
Each call to the <b>read</b> syscall returns the next available image
|
|
||||||
from the device. It is up to the caller to set format and size (using
|
|
||||||
the VIDIOCSPICT and VIDIOCSWIN ioctls) and then to pass a suitable
|
|
||||||
size buffer and length to the function. Not all devices will support
|
|
||||||
read operations.
|
|
||||||
<P>
|
|
||||||
A second way to handle image capture is via the mmap interface if supported.
|
|
||||||
To use the mmap interface a user first sets the desired image size and depth
|
|
||||||
properties. Next the VIDIOCGMBUF ioctl is issued. This reports the size
|
|
||||||
of buffer to mmap and the offset within the buffer for each frame. The
|
|
||||||
number of frames supported is device dependent and may only be one.
|
|
||||||
<P>
|
|
||||||
The video_mbuf structure contains the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>size</b><TD>The number of bytes to map</TD>
|
|
||||||
<TR><TD><b>frames</b><TD>The number of frames</TD>
|
|
||||||
<TR><TD><b>offsets</b><TD>The offset of each frame</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Once the mmap has been made the VIDIOCMCAPTURE ioctl starts the
|
|
||||||
capture to a frame using the format and image size specified in the
|
|
||||||
video_mmap (which should match or be below the initial query size).
|
|
||||||
When the VIDIOCMCAPTURE ioctl returns the frame is <em>not</em>
|
|
||||||
captured yet, the driver just instructed the hardware to start the
|
|
||||||
capture. The application has to use the VIDIOCSYNC ioctl to wait
|
|
||||||
until the capture of a frame is finished. VIDIOCSYNC takes the frame
|
|
||||||
number you want to wait for as argument.
|
|
||||||
<p>
|
|
||||||
It is allowed to call VIDIOCMCAPTURE multiple times (with different
|
|
||||||
frame numbers in video_mmap->frame of course) and thus have multiple
|
|
||||||
outstanding capture requests. A simple way do to double-buffering
|
|
||||||
using this feature looks like this:
|
|
||||||
<pre>
|
|
||||||
/* setup everything */
|
|
||||||
VIDIOCMCAPTURE(0)
|
|
||||||
while (whatever) {
|
|
||||||
VIDIOCMCAPTURE(1)
|
|
||||||
VIDIOCSYNC(0)
|
|
||||||
/* process frame 0 while the hardware captures frame 1 */
|
|
||||||
VIDIOCMCAPTURE(0)
|
|
||||||
VIDIOCSYNC(1)
|
|
||||||
/* process frame 1 while the hardware captures frame 0 */
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
Note that you are <em>not</em> limited to only two frames. The API
|
|
||||||
allows up to 32 frames, the VIDIOCGMBUF ioctl returns the number of
|
|
||||||
frames the driver granted. Thus it is possible to build deeper queues
|
|
||||||
to avoid loosing frames on load peaks.
|
|
||||||
<p>
|
|
||||||
While capturing to memory the driver will make a "best effort" attempt
|
|
||||||
to capture to screen as well if requested. This normally means all
|
|
||||||
frames that "miss" memory mapped capture will go to the display.
|
|
||||||
<P>
|
|
||||||
A final ioctl exists to allow a device to obtain related devices if a
|
|
||||||
driver has multiple components (for example video0 may not be associated
|
|
||||||
with vbi0 which would cause an intercast display program to make a bad
|
|
||||||
mistake). The VIDIOCGUNIT ioctl reports the unit numbers of the associated
|
|
||||||
devices if any exist. The video_unit structure has the following fields.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>video</b><TD>Video capture device</TD>
|
|
||||||
<TR><TD><b>vbi</b><TD>VBI capture device</TD>
|
|
||||||
<TR><TD><b>radio</b><TD>Radio device</TD>
|
|
||||||
<TR><TD><b>audio</b><TD>Audio mixer</TD>
|
|
||||||
<TR><TD><b>teletext</b><TD>Teletext device</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>RDS Datastreams</H3>
|
|
||||||
For radio devices that support it, it is possible to receive Radio Data
|
|
||||||
System (RDS) data by means of a read() on the device. The data is packed in
|
|
||||||
groups of three, as follows:
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD>First Octet</TD><TD>Least Significant Byte of RDS Block</TD></TR>
|
|
||||||
<TR><TD>Second Octet</TD><TD>Most Significant Byte of RDS Block
|
|
||||||
<TR><TD>Third Octet</TD><TD>Bit 7:</TD><TD>Error bit. Indicates that
|
|
||||||
an uncorrectable error occurred during reception of this block.</TD></TR>
|
|
||||||
<TR><TD> </TD><TD>Bit 6:</TD><TD>Corrected bit. Indicates that
|
|
||||||
an error was corrected for this data block.</TD></TR>
|
|
||||||
<TR><TD> </TD><TD>Bits 5-3:</TD><TD>Received Offset. Indicates the
|
|
||||||
offset received by the sync system.</TD></TR>
|
|
||||||
<TR><TD> </TD><TD>Bits 2-0:</TD><TD>Offset Name. Indicates the
|
|
||||||
offset applied to this data.</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
</BODY>
|
|
||||||
</HTML>
|
|
||||||
|
|
|
@ -119,3 +119,17 @@ card=117 - NGS NGSTV+
|
||||||
card=118 - LMLBT4
|
card=118 - LMLBT4
|
||||||
card=119 - Tekram M205 PRO
|
card=119 - Tekram M205 PRO
|
||||||
card=120 - Conceptronic CONTVFMi
|
card=120 - Conceptronic CONTVFMi
|
||||||
|
card=121 - Euresys Picolo Tetra
|
||||||
|
card=122 - Spirit TV Tuner
|
||||||
|
card=123 - AVerMedia AVerTV DVB-T 771
|
||||||
|
card=124 - AverMedia AverTV DVB-T 761
|
||||||
|
card=125 - MATRIX Vision Sigma-SQ
|
||||||
|
card=126 - MATRIX Vision Sigma-SLC
|
||||||
|
card=127 - APAC Viewcomp 878(AMAX)
|
||||||
|
card=128 - DVICO FusionHDTV DVB-T Lite
|
||||||
|
card=129 - V-Gear MyVCD
|
||||||
|
card=130 - Super TV Tuner
|
||||||
|
card=131 - Tibet Systems 'Progress DVR' CS16
|
||||||
|
card=132 - Kodicom 4400R (master)
|
||||||
|
card=133 - Kodicom 4400R (slave)
|
||||||
|
card=134 - Adlink RTV24
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
card=0 - UNKNOWN/GENERIC
|
||||||
|
card=1 - Hauppauge WinTV 34xxx models
|
||||||
|
card=2 - GDI Black Gold
|
||||||
|
card=3 - PixelView
|
||||||
|
card=4 - ATI TV Wonder Pro
|
||||||
|
card=5 - Leadtek Winfast 2000XP Expert
|
||||||
|
card=6 - AverTV Studio 303 (M126)
|
||||||
|
card=7 - MSI TV-@nywhere Master
|
||||||
|
card=8 - Leadtek Winfast DV2000
|
||||||
|
card=9 - Leadtek PVR 2000
|
||||||
|
card=10 - IODATA GV-VCP3/PCI
|
||||||
|
card=11 - Prolink PlayTV PVR
|
||||||
|
card=12 - ASUS PVR-416
|
||||||
|
card=13 - MSI TV-@nywhere
|
||||||
|
card=14 - KWorld/VStream XPert DVB-T
|
||||||
|
card=15 - DViCO FusionHDTV DVB-T1
|
||||||
|
card=16 - KWorld LTV883RF
|
||||||
|
card=17 - DViCO FusionHDTV 3 Gold-Q
|
||||||
|
card=18 - Hauppauge Nova-T DVB-T
|
||||||
|
card=19 - Conexant DVB-T reference design
|
||||||
|
card=20 - Provideo PV259
|
||||||
|
card=21 - DViCO FusionHDTV DVB-T Plus
|
||||||
|
card=22 - digitalnow DNTV Live! DVB-T
|
||||||
|
card=23 - pcHDTV HD3000 HDTV
|
||||||
|
card=24 - Hauppauge WinTV 28xxx (Roslyn) models
|
||||||
|
card=25 - Digital-Logic MICROSPACE Entertainment Center (MEC)
|
||||||
|
card=26 - IODATA GV/BCTV7E
|
||||||
|
card=27 - PixelView PlayTV Ultra Pro (Stereo)
|
||||||
|
card=28 - DViCO FusionHDTV 3 Gold-T
|
|
@ -20,16 +20,43 @@
|
||||||
19 -> Compro VideoMate TV [185b:c100]
|
19 -> Compro VideoMate TV [185b:c100]
|
||||||
20 -> Matrox CronosPlus [102B:48d0]
|
20 -> Matrox CronosPlus [102B:48d0]
|
||||||
21 -> 10MOONS PCI TV CAPTURE CARD [1131:2001]
|
21 -> 10MOONS PCI TV CAPTURE CARD [1131:2001]
|
||||||
22 -> Medion 2819/ AverMedia M156 [1461:a70b,1461:2115]
|
22 -> AverMedia M156 / Medion 2819 [1461:a70b]
|
||||||
23 -> BMK MPEX Tuner
|
23 -> BMK MPEX Tuner
|
||||||
24 -> KNC One TV-Station DVR [1894:a006]
|
24 -> KNC One TV-Station DVR [1894:a006]
|
||||||
25 -> ASUS TV-FM 7133 [1043:4843]
|
25 -> ASUS TV-FM 7133 [1043:4843]
|
||||||
26 -> Pinnacle PCTV Stereo (saa7134) [11bd:002b]
|
26 -> Pinnacle PCTV Stereo (saa7134) [11bd:002b]
|
||||||
27 -> Manli MuchTV M-TV002
|
27 -> Manli MuchTV M-TV002/Behold TV 403 FM
|
||||||
28 -> Manli MuchTV M-TV001
|
28 -> Manli MuchTV M-TV001/Behold TV 401
|
||||||
29 -> Nagase Sangyo TransGear 3000TV [1461:050c]
|
29 -> Nagase Sangyo TransGear 3000TV [1461:050c]
|
||||||
30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) [1019:4cb4]
|
30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) [1019:4cb4]
|
||||||
31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5]
|
31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5]
|
||||||
32 -> AVACS SmartTV
|
32 -> AVACS SmartTV
|
||||||
33 -> AVerMedia DVD EZMaker [1461:10ff]
|
33 -> AVerMedia DVD EZMaker [1461:10ff]
|
||||||
34 -> LifeView FlyTV Platinum33 mini [5168:0212]
|
34 -> Noval Prime TV 7133
|
||||||
|
35 -> AverMedia AverTV Studio 305 [1461:2115]
|
||||||
|
37 -> Items MuchTV Plus / IT-005
|
||||||
|
38 -> Terratec Cinergy 200 TV [153B:1152]
|
||||||
|
39 -> LifeView FlyTV Platinum Mini [5168:0212]
|
||||||
|
40 -> Compro VideoMate TV PVR/FM [185b:c100]
|
||||||
|
41 -> Compro VideoMate TV Gold+ [185b:c100]
|
||||||
|
42 -> Sabrent SBT-TVFM (saa7130)
|
||||||
|
43 -> :Zolid Xpert TV7134
|
||||||
|
44 -> Empire PCI TV-Radio LE
|
||||||
|
45 -> Avermedia AVerTV Studio 307 [1461:9715]
|
||||||
|
46 -> AVerMedia Cardbus TV/Radio [1461:d6ee]
|
||||||
|
47 -> Terratec Cinergy 400 mobile [153b:1162]
|
||||||
|
48 -> Terratec Cinergy 600 TV MK3 [153B:1158]
|
||||||
|
49 -> Compro VideoMate Gold+ Pal [185b:c200]
|
||||||
|
50 -> Pinnacle PCTV 300i DVB-T + PAL [11bd:002d]
|
||||||
|
51 -> ProVideo PV952 [1540:9524]
|
||||||
|
52 -> AverMedia AverTV/305 [1461:2108]
|
||||||
|
54 -> LifeView FlyTV Platinum FM [5168:0214,1489:0214]
|
||||||
|
55 -> LifeView FlyDVB-T DUO [5168:0306]
|
||||||
|
56 -> Avermedia AVerTV 307 [1461:a70a]
|
||||||
|
57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
|
||||||
|
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0370]
|
||||||
|
59 -> Kworld/Tevion V-Stream Xpert TV PVR7134
|
||||||
|
60 -> Typhoon DVB-T Duo Digital/Analog Cardbus
|
||||||
|
61 -> Philips TOUGH DVB-T reference design
|
||||||
|
62 -> Compro VideoMate TV Gold+II
|
||||||
|
63 -> Kworld Xpert TV PVR7134
|
||||||
|
|
|
@ -44,3 +44,21 @@ tuner=42 - Philips 1236D ATSC/NTSC daul in
|
||||||
tuner=43 - Philips NTSC MK3 (FM1236MK3 or FM1236/F)
|
tuner=43 - Philips NTSC MK3 (FM1236MK3 or FM1236/F)
|
||||||
tuner=44 - Philips 4 in 1 (ATI TV Wonder Pro/Conexant)
|
tuner=44 - Philips 4 in 1 (ATI TV Wonder Pro/Conexant)
|
||||||
tuner=45 - Microtune 4049 FM5
|
tuner=45 - Microtune 4049 FM5
|
||||||
|
tuner=46 - Panasonic VP27s/ENGE4324D
|
||||||
|
tuner=47 - LG NTSC (TAPE series)
|
||||||
|
tuner=48 - Tenna TNF 8831 BGFF)
|
||||||
|
tuner=49 - Microtune 4042 FI5 ATSC/NTSC dual in
|
||||||
|
tuner=50 - TCL 2002N
|
||||||
|
tuner=51 - Philips PAL/SECAM_D (FM 1256 I-H3)
|
||||||
|
tuner=52 - Thomson DDT 7610 (ATSC/NTSC)
|
||||||
|
tuner=53 - Philips FQ1286
|
||||||
|
tuner=54 - tda8290+75
|
||||||
|
tuner=55 - LG PAL (TAPE series)
|
||||||
|
tuner=56 - Philips PAL/SECAM multi (FQ1216AME MK4)
|
||||||
|
tuner=57 - Philips FQ1236A MK4
|
||||||
|
tuner=58 - Ymec TVision TVF-8531MF
|
||||||
|
tuner=59 - Ymec TVision TVF-5533MF
|
||||||
|
tuner=60 - Thomson DDT 7611 (ATSC/NTSC)
|
||||||
|
tuner=61 - Tena TNF9533-D/IF
|
||||||
|
tuner=62 - Philips TEA5767HN FM Radio
|
||||||
|
tuner=63 - Philips FMD1216ME MK3 Hybrid Tuner
|
||||||
|
|
|
@ -57,6 +57,15 @@ Cards can use either of these two crystals (xtal):
|
||||||
- 24.576MHz -> .audio_clock=0x200000
|
- 24.576MHz -> .audio_clock=0x200000
|
||||||
(xtal * .audio_clock = 51539600)
|
(xtal * .audio_clock = 51539600)
|
||||||
|
|
||||||
|
Some details about 30/34/35:
|
||||||
|
|
||||||
|
- saa7130 - low-price chip, doesn't have mute, that is why all those
|
||||||
|
cards should have .mute field defined in their tuner structure.
|
||||||
|
|
||||||
|
- saa7134 - usual chip
|
||||||
|
|
||||||
|
- saa7133/35 - saa7135 is probably a marketing decision, since all those
|
||||||
|
chips identifies itself as 33 on pci.
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
=======
|
=======
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
The controls for the mux are GPIO [0,1] for source, and GPIO 2 for muting.
|
||||||
|
|
||||||
|
GPIO0 GPIO1
|
||||||
|
0 0 TV Audio
|
||||||
|
1 0 FM radio
|
||||||
|
0 1 Line-In
|
||||||
|
1 1 Mono tuner bypass or CD passthru (tuner specific)
|
||||||
|
|
||||||
|
GPIO 16(i believe) is tied to the IR port (if present).
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
>From the data sheet:
|
||||||
|
Register 24'h20004 PCI Interrupt Status
|
||||||
|
bit [18] IR_SMP_INT Set when 32 input samples have been collected over
|
||||||
|
gpio[16] pin into GP_SAMPLE register.
|
||||||
|
|
||||||
|
What's missing from the data sheet:
|
||||||
|
|
||||||
|
Setup 4KHz sampling rate (roughly 2x oversampled; good enough for our RC5
|
||||||
|
compat remote)
|
||||||
|
set register 0x35C050 to 0xa80a80
|
||||||
|
|
||||||
|
enable sampling
|
||||||
|
set register 0x35C054 to 0x5
|
||||||
|
|
||||||
|
Of course, enable the IRQ bit 18 in the interrupt mask register .(and
|
||||||
|
provide for a handler)
|
||||||
|
|
||||||
|
GP_SAMPLE register is at 0x35C058
|
||||||
|
|
||||||
|
Bits are then right shifted into the GP_SAMPLE register at the specified
|
||||||
|
rate; you get an interrupt when a full DWORD is recieved.
|
||||||
|
You need to recover the actual RC5 bits out of the (oversampled) IR sensor
|
||||||
|
bits. (Hint: look for the 0/1and 1/0 crossings of the RC5 bi-phase data) An
|
||||||
|
actual raw RC5 code will span 2-3 DWORDS, depending on the actual alignment.
|
||||||
|
|
||||||
|
I'm pretty sure when no IR signal is present the receiver is always in a
|
||||||
|
marking state(1); but stray light, etc can cause intermittent noise values
|
||||||
|
as well. Remember, this is a free running sample of the IR receiver state
|
||||||
|
over time, so don't assume any sample starts at any particular place.
|
||||||
|
|
||||||
|
http://www.atmel.com/dyn/resources/prod_documents/doc2817.pdf
|
||||||
|
This data sheet (google search) seems to have a lovely description of the
|
||||||
|
RC5 basics
|
||||||
|
|
||||||
|
http://users.pandora.be/nenya/electronics/rc5/ and more data
|
||||||
|
|
||||||
|
http://www.ee.washington.edu/circuit_archive/text/ir_decode.txt
|
||||||
|
and even a reference to how to decode a bi-phase data stream.
|
||||||
|
|
||||||
|
http://www.xs4all.nl/~sbp/knowledge/ir/rc5.htm
|
||||||
|
still more info
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
collecting data about the lifeview models and the config coding on
|
||||||
|
gpio pins 0-9 ...
|
||||||
|
==================================================================
|
||||||
|
|
||||||
|
bt878:
|
||||||
|
LR50 rev. Q ("PARTS: 7031505116), Tuner wurde als Nr. 5 erkannt, Eingänge
|
||||||
|
SVideo, TV, Composite, Audio, Remote. CP9..1=100001001 (1: 0-Ohm-Widerstand
|
||||||
|
gegen GND unbestückt; 0: bestückt)
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
saa7134:
|
||||||
|
/* LifeView FlyTV Platinum FM (LR214WF) */
|
||||||
|
/* "Peter Missel <peter.missel@onlinehome.de> */
|
||||||
|
.name = "LifeView FlyTV Platinum FM",
|
||||||
|
/* GP27 MDT2005 PB4 pin 10 */
|
||||||
|
/* GP26 MDT2005 PB3 pin 9 */
|
||||||
|
/* GP25 MDT2005 PB2 pin 8 */
|
||||||
|
/* GP23 MDT2005 PB1 pin 7 */
|
||||||
|
/* GP22 MDT2005 PB0 pin 6 */
|
||||||
|
/* GP21 MDT2005 PB5 pin 11 */
|
||||||
|
/* GP20 MDT2005 PB6 pin 12 */
|
||||||
|
/* GP19 MDT2005 PB7 pin 13 */
|
||||||
|
/* nc MDT2005 PA3 pin 2 */
|
||||||
|
/* Remote MDT2005 PA2 pin 1 */
|
||||||
|
/* GP18 MDT2005 PA1 pin 18 */
|
||||||
|
/* nc MDT2005 PA0 pin 17 strap low */
|
||||||
|
|
||||||
|
/* GP17 Strap "GP7"=High */
|
||||||
|
/* GP16 Strap "GP6"=High
|
||||||
|
0=Radio 1=TV
|
||||||
|
Drives SA630D ENCH1 and HEF4052 A1 pins
|
||||||
|
to do FM radio through SIF input */
|
||||||
|
/* GP15 nc */
|
||||||
|
/* GP14 nc */
|
||||||
|
/* GP13 nc */
|
||||||
|
/* GP12 Strap "GP5" = High */
|
||||||
|
/* GP11 Strap "GP4" = High */
|
||||||
|
/* GP10 Strap "GP3" = High */
|
||||||
|
/* GP09 Strap "GP2" = Low */
|
||||||
|
/* GP08 Strap "GP1" = Low */
|
||||||
|
/* GP07.00 nc */
|
|
@ -0,0 +1,37 @@
|
||||||
|
=================================================================================
|
||||||
|
MO_OUTPUT_FORMAT (0x310164)
|
||||||
|
|
||||||
|
Previous default from DScaler: 0x1c1f0008
|
||||||
|
Digit 8: 31-28
|
||||||
|
28: PREVREMOD = 1
|
||||||
|
|
||||||
|
Digit 7: 27-24 (0xc = 12 = b1100 )
|
||||||
|
27: COMBALT = 1
|
||||||
|
26: PAL_INV_PHASE
|
||||||
|
(DScaler apparently set this to 1, resulted in sucky picture)
|
||||||
|
|
||||||
|
Digits 6,5: 23-16
|
||||||
|
25-16: COMB_RANGE = 0x1f [default] (9 bits -> max 512)
|
||||||
|
|
||||||
|
Digit 4: 15-12
|
||||||
|
15: DISIFX = 0
|
||||||
|
14: INVCBF = 0
|
||||||
|
13: DISADAPT = 0
|
||||||
|
12: NARROWADAPT = 0
|
||||||
|
|
||||||
|
Digit 3: 11-8
|
||||||
|
11: FORCE2H
|
||||||
|
10: FORCEREMD
|
||||||
|
9: NCHROMAEN
|
||||||
|
8: NREMODEN
|
||||||
|
|
||||||
|
Digit 2: 7-4
|
||||||
|
7-6: YCORE
|
||||||
|
5-4: CCORE
|
||||||
|
|
||||||
|
Digit 1: 3-0
|
||||||
|
3: RANGE = 1
|
||||||
|
2: HACTEXT
|
||||||
|
1: HSFMT
|
||||||
|
|
||||||
|
=================================================================================
|
43
MAINTAINERS
43
MAINTAINERS
|
@ -512,11 +512,11 @@ W: http://linuxppc64.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
BTTV VIDEO4LINUX DRIVER
|
BTTV VIDEO4LINUX DRIVER
|
||||||
P: Gerd Knorr
|
P: Mauro Carvalho Chehab
|
||||||
M: kraxel@bytesex.org
|
M: mchehab@brturbo.com.br
|
||||||
L: video4linux-list@redhat.com
|
L: video4linux-list@redhat.com
|
||||||
W: http://bytesex.org/bttv/
|
W: http://linuxtv.org
|
||||||
S: Orphan
|
S: Maintained
|
||||||
|
|
||||||
BUSLOGIC SCSI DRIVER
|
BUSLOGIC SCSI DRIVER
|
||||||
P: Leonard N. Zubkoff
|
P: Leonard N. Zubkoff
|
||||||
|
@ -576,10 +576,9 @@ S: Supported
|
||||||
|
|
||||||
COMPUTONE INTELLIPORT MULTIPORT CARD
|
COMPUTONE INTELLIPORT MULTIPORT CARD
|
||||||
P: Michael H. Warfield
|
P: Michael H. Warfield
|
||||||
M: Michael H. Warfield <mhw@wittsend.com>
|
M: mhw@wittsend.com
|
||||||
W: http://www.wittsend.com/computone.html
|
W: http://www.wittsend.com/computone.html
|
||||||
L: linux-computone@lazuli.wittsend.com
|
S: Maintained
|
||||||
S: Orphaned
|
|
||||||
|
|
||||||
COSA/SRP SYNC SERIAL DRIVER
|
COSA/SRP SYNC SERIAL DRIVER
|
||||||
P: Jan "Yenya" Kasprzak
|
P: Jan "Yenya" Kasprzak
|
||||||
|
@ -1150,7 +1149,7 @@ S: Maintained
|
||||||
|
|
||||||
INFINIBAND SUBSYSTEM
|
INFINIBAND SUBSYSTEM
|
||||||
P: Roland Dreier
|
P: Roland Dreier
|
||||||
M: roland@topspin.com
|
M: rolandd@cisco.com
|
||||||
P: Sean Hefty
|
P: Sean Hefty
|
||||||
M: mshefty@ichips.intel.com
|
M: mshefty@ichips.intel.com
|
||||||
P: Hal Rosenstock
|
P: Hal Rosenstock
|
||||||
|
@ -1330,6 +1329,16 @@ M: rml@novell.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
KEXEC
|
||||||
|
P: Eric Biederman
|
||||||
|
P: Randy Dunlap
|
||||||
|
M: ebiederm@xmission.com
|
||||||
|
M: rddunlap@osdl.org
|
||||||
|
W: http://www.xmission.com/~ebiederm/files/kexec/
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
L: fastboot@osdl.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
LANMEDIA WAN CARD DRIVER
|
LANMEDIA WAN CARD DRIVER
|
||||||
P: Andrew Stanley-Jones
|
P: Andrew Stanley-Jones
|
||||||
M: asj@lanmedia.com
|
M: asj@lanmedia.com
|
||||||
|
@ -2115,9 +2124,7 @@ S: Maintained
|
||||||
SOFTWARE SUSPEND:
|
SOFTWARE SUSPEND:
|
||||||
P: Pavel Machek
|
P: Pavel Machek
|
||||||
M: pavel@suse.cz
|
M: pavel@suse.cz
|
||||||
M: pavel@ucw.cz
|
L: linux-pm@osdl.org
|
||||||
L: http://lister.fornax.hu/mailman/listinfo/swsusp
|
|
||||||
W: http://swsusp.sf.net/
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
SONIC NETWORK DRIVER
|
SONIC NETWORK DRIVER
|
||||||
|
@ -2145,6 +2152,11 @@ W: http://tpmdd.sourceforge.net
|
||||||
L: tpmdd-devel@lists.sourceforge.net
|
L: tpmdd-devel@lists.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
TENSILICA XTENSA PORT (xtensa):
|
||||||
|
P: Chris Zankel
|
||||||
|
M: chris@zankel.net
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
UltraSPARC (sparc64):
|
UltraSPARC (sparc64):
|
||||||
P: David S. Miller
|
P: David S. Miller
|
||||||
M: davem@davemloft.net
|
M: davem@davemloft.net
|
||||||
|
@ -2589,7 +2601,7 @@ M: davidm@snapgear.com
|
||||||
P: D. Jeff Dionne (created first uClinux port)
|
P: D. Jeff Dionne (created first uClinux port)
|
||||||
M: jeff@uclinux.org
|
M: jeff@uclinux.org
|
||||||
W: http://www.uclinux.org/
|
W: http://www.uclinux.org/
|
||||||
L: uclinux-dev@uclinux.org
|
L: uclinux-dev@uclinux.org (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
UCLINUX FOR NEC V850
|
UCLINUX FOR NEC V850
|
||||||
|
@ -2613,10 +2625,11 @@ W: http://rio500.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
VIDEO FOR LINUX
|
VIDEO FOR LINUX
|
||||||
P: Gerd Knorr
|
P: Mauro Carvalho Chehab
|
||||||
M: kraxel@bytesex.org
|
M: mchehab@brturbo.com.br
|
||||||
L: video4linux-list@redhat.com
|
L: video4linux-list@redhat.com
|
||||||
S: Orphan
|
W: http://linuxtv.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
W1 DALLAS'S 1-WIRE BUS
|
W1 DALLAS'S 1-WIRE BUS
|
||||||
P: Evgeniy Polyakov
|
P: Evgeniy Polyakov
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 12
|
SUBLEVEL = 13
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =-rc1
|
||||||
NAME=Woozy Numbat
|
NAME=Woozy Numbat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -281,7 +281,7 @@ export quiet Q KBUILD_VERBOSE
|
||||||
# See documentation in Documentation/kbuild/makefiles.txt
|
# See documentation in Documentation/kbuild/makefiles.txt
|
||||||
|
|
||||||
# cc-option
|
# cc-option
|
||||||
# Usage: cflags-y += $(call gcc-option, -march=winchip-c6, -march=i586)
|
# Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586)
|
||||||
|
|
||||||
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
|
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
|
||||||
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
|
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
|
||||||
|
|
|
@ -157,7 +157,7 @@ config ARCH_RPC
|
||||||
config ARCH_SA1100
|
config ARCH_SA1100
|
||||||
bool "SA1100-based"
|
bool "SA1100-based"
|
||||||
select ISA
|
select ISA
|
||||||
select DISCONTIGMEM
|
select ARCH_DISCONTIGMEM_ENABLE
|
||||||
|
|
||||||
config ARCH_S3C2410
|
config ARCH_S3C2410
|
||||||
bool "Samsung S3C2410"
|
bool "Samsung S3C2410"
|
||||||
|
@ -346,6 +346,26 @@ config PREEMPT
|
||||||
Say Y here if you are building a kernel for a desktop, embedded
|
Say Y here if you are building a kernel for a desktop, embedded
|
||||||
or real-time system. Say N if you are unsure.
|
or real-time system. Say N if you are unsure.
|
||||||
|
|
||||||
|
config NO_IDLE_HZ
|
||||||
|
bool "Dynamic tick timer"
|
||||||
|
help
|
||||||
|
Select this option if you want to disable continuous timer ticks
|
||||||
|
and have them programmed to occur as required. This option saves
|
||||||
|
power as the system can remain in idle state for longer.
|
||||||
|
|
||||||
|
By default dynamic tick is disabled during the boot, and can be
|
||||||
|
manually enabled with:
|
||||||
|
|
||||||
|
echo 1 > /sys/devices/system/timer/timer0/dyn_tick
|
||||||
|
|
||||||
|
Alternatively, if you want dynamic tick automatically enabled
|
||||||
|
during boot, pass "dyntick=enable" via the kernel command string.
|
||||||
|
|
||||||
|
Please note that dynamic tick may affect the accuracy of
|
||||||
|
timekeeping on some platforms depending on the implementation.
|
||||||
|
Currently at least OMAP platform is known to have accurate
|
||||||
|
timekeeping with dynamic tick.
|
||||||
|
|
||||||
config ARCH_DISCONTIGMEM_ENABLE
|
config ARCH_DISCONTIGMEM_ENABLE
|
||||||
bool
|
bool
|
||||||
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc1-bk2
|
# Linux kernel version: 2.6.12-git6
|
||||||
# Sun Mar 27 22:08:24 2005
|
# Sat Jun 25 00:57:29 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_IOMAP=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CLEAN_COMPILE=y
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_EPOLL=y
|
CONFIG_EPOLL=y
|
||||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
# CONFIG_ARCH_VERSATILE is not set
|
||||||
# CONFIG_ARCH_IMX is not set
|
# CONFIG_ARCH_IMX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
|
# CONFIG_ARCH_AAEC2000 is not set
|
||||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -96,6 +99,7 @@ CONFIG_ARCH_ENP2611=y
|
||||||
# CONFIG_ARCH_IXDP2800 is not set
|
# CONFIG_ARCH_IXDP2800 is not set
|
||||||
# CONFIG_ARCH_IXDP2401 is not set
|
# CONFIG_ARCH_IXDP2401 is not set
|
||||||
# CONFIG_ARCH_IXDP2801 is not set
|
# CONFIG_ARCH_IXDP2801 is not set
|
||||||
|
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Type
|
# Processor Type
|
||||||
|
@ -106,7 +110,6 @@ CONFIG_CPU_32v5=y
|
||||||
CONFIG_CPU_ABRT_EV5T=y
|
CONFIG_CPU_ABRT_EV5T=y
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
CONFIG_CPU_CACHE_VIVT=y
|
||||||
CONFIG_CPU_TLB_V4WBI=y
|
CONFIG_CPU_TLB_V4WBI=y
|
||||||
CONFIG_CPU_MINICACHE=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Features
|
# Processor Features
|
||||||
|
@ -118,9 +121,11 @@ CONFIG_XSCALE_PMU=y
|
||||||
#
|
#
|
||||||
# Bus support
|
# Bus support
|
||||||
#
|
#
|
||||||
|
CONFIG_ISA_DMA_API=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_LEGACY_PROC=y
|
CONFIG_PCI_LEGACY_PROC=y
|
||||||
CONFIG_PCI_NAMES=y
|
CONFIG_PCI_NAMES=y
|
||||||
|
# CONFIG_PCI_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# PCCARD (PCMCIA/CardBus) support
|
# PCCARD (PCMCIA/CardBus) support
|
||||||
|
@ -130,7 +135,15 @@ CONFIG_PCI_NAMES=y
|
||||||
#
|
#
|
||||||
# Kernel Features
|
# Kernel Features
|
||||||
#
|
#
|
||||||
|
# CONFIG_SMP is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -269,7 +282,6 @@ CONFIG_MTD_IXP2000=y
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
#
|
#
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
|
||||||
# CONFIG_BLK_CPQ_DA is not set
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
# CONFIG_BLK_DEV_DAC960 is not set
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
@ -308,6 +320,7 @@ CONFIG_IOSCHED_CFQ=y
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_FUSION is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
|
@ -329,10 +342,11 @@ CONFIG_NET=y
|
||||||
#
|
#
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_MMAP=y
|
CONFIG_PACKET_MMAP=y
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
# CONFIG_NET_KEY is not set
|
# CONFIG_NET_KEY is not set
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_FIB_TRIE is not set
|
||||||
# CONFIG_IP_MULTICAST is not set
|
# CONFIG_IP_MULTICAST is not set
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
@ -349,6 +363,17 @@ CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_INET_TUNNEL is not set
|
# CONFIG_INET_TUNNEL is not set
|
||||||
# CONFIG_IP_TCPDIAG is not set
|
# CONFIG_IP_TCPDIAG is not set
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TCP congestion control
|
||||||
|
#
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_TCP_CONG_WESTWOOD=m
|
||||||
|
CONFIG_TCP_CONG_HTCP=m
|
||||||
|
# CONFIG_TCP_CONG_HSTCP is not set
|
||||||
|
# CONFIG_TCP_CONG_HYBLA is not set
|
||||||
|
# CONFIG_TCP_CONG_VEGAS is not set
|
||||||
|
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
@ -404,6 +429,7 @@ CONFIG_MII=y
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
# CONFIG_NET_VENDOR_3COM is not set
|
||||||
# CONFIG_SMC91X is not set
|
# CONFIG_SMC91X is not set
|
||||||
|
# CONFIG_DM9000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tulip family network device support
|
# Tulip family network device support
|
||||||
|
@ -440,9 +466,11 @@ CONFIG_EEPRO100=y
|
||||||
# CONFIG_HAMACHI is not set
|
# CONFIG_HAMACHI is not set
|
||||||
# CONFIG_YELLOWFIN is not set
|
# CONFIG_YELLOWFIN is not set
|
||||||
# CONFIG_R8169 is not set
|
# CONFIG_R8169 is not set
|
||||||
|
# CONFIG_SKGE is not set
|
||||||
# CONFIG_SK98LIN is not set
|
# CONFIG_SK98LIN is not set
|
||||||
# CONFIG_VIA_VELOCITY is not set
|
# CONFIG_VIA_VELOCITY is not set
|
||||||
# CONFIG_TIGON3 is not set
|
# CONFIG_TIGON3 is not set
|
||||||
|
# CONFIG_BNX2 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10000 Mbit)
|
# Ethernet (10000 Mbit)
|
||||||
|
@ -464,6 +492,7 @@ CONFIG_EEPRO100=y
|
||||||
# Wan interfaces
|
# Wan interfaces
|
||||||
#
|
#
|
||||||
CONFIG_WAN=y
|
CONFIG_WAN=y
|
||||||
|
# CONFIG_DSCC4 is not set
|
||||||
# CONFIG_LANMEDIA is not set
|
# CONFIG_LANMEDIA is not set
|
||||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||||
CONFIG_HDLC=y
|
CONFIG_HDLC=y
|
||||||
|
@ -526,7 +555,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
|
@ -547,6 +575,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@ -613,17 +642,18 @@ CONFIG_I2C_ALGOBIT=y
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 is not set
|
||||||
# CONFIG_I2C_I801 is not set
|
# CONFIG_I2C_I801 is not set
|
||||||
# CONFIG_I2C_I810 is not set
|
# CONFIG_I2C_I810 is not set
|
||||||
|
# CONFIG_I2C_PIIX4 is not set
|
||||||
# CONFIG_I2C_ISA is not set
|
# CONFIG_I2C_ISA is not set
|
||||||
# CONFIG_I2C_IXP2000 is not set
|
# CONFIG_I2C_IXP2000 is not set
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
|
||||||
# CONFIG_I2C_PROSAVAGE is not set
|
# CONFIG_I2C_PROSAVAGE is not set
|
||||||
# CONFIG_I2C_SAVAGE4 is not set
|
# CONFIG_I2C_SAVAGE4 is not set
|
||||||
# CONFIG_SCx200_ACB is not set
|
# CONFIG_SCx200_ACB is not set
|
||||||
# CONFIG_I2C_SIS5595 is not set
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
# CONFIG_I2C_SIS630 is not set
|
# CONFIG_I2C_SIS630 is not set
|
||||||
# CONFIG_I2C_SIS96X is not set
|
# CONFIG_I2C_SIS96X is not set
|
||||||
|
# CONFIG_I2C_STUB is not set
|
||||||
# CONFIG_I2C_VIA is not set
|
# CONFIG_I2C_VIA is not set
|
||||||
# CONFIG_I2C_VIAPRO is not set
|
# CONFIG_I2C_VIAPRO is not set
|
||||||
# CONFIG_I2C_VOODOO3 is not set
|
# CONFIG_I2C_VOODOO3 is not set
|
||||||
|
@ -637,7 +667,9 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_ADM1025 is not set
|
# CONFIG_SENSORS_ADM1025 is not set
|
||||||
# CONFIG_SENSORS_ADM1026 is not set
|
# CONFIG_SENSORS_ADM1026 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
# CONFIG_SENSORS_FSCPOS is not set
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
|
@ -653,6 +685,7 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_LM85 is not set
|
# CONFIG_SENSORS_LM85 is not set
|
||||||
# CONFIG_SENSORS_LM87 is not set
|
# CONFIG_SENSORS_LM87 is not set
|
||||||
# CONFIG_SENSORS_LM90 is not set
|
# CONFIG_SENSORS_LM90 is not set
|
||||||
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
|
@ -662,14 +695,19 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
# CONFIG_SENSORS_W83L785TS is not set
|
# CONFIG_SENSORS_W83L785TS is not set
|
||||||
# CONFIG_SENSORS_W83627HF is not set
|
# CONFIG_SENSORS_W83627HF is not set
|
||||||
|
# CONFIG_SENSORS_W83627EHF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other I2C Chip support
|
# Other I2C Chip support
|
||||||
#
|
#
|
||||||
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
|
# CONFIG_SENSORS_DS1374 is not set
|
||||||
CONFIG_SENSORS_EEPROM=y
|
CONFIG_SENSORS_EEPROM=y
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_MAX6875 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
@ -723,6 +761,7 @@ CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_EXT2_FS_SECURITY is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||||
|
@ -763,7 +802,6 @@ CONFIG_DNOTIFY=y
|
||||||
#
|
#
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
|
@ -801,12 +839,14 @@ CONFIG_JFFS2_RTIME=y
|
||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -891,3 +931,4 @@ CONFIG_CRC32=y
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
# CONFIG_TEXTSEARCH is not set
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc1-bk2
|
# Linux kernel version: 2.6.12-git6
|
||||||
# Sun Mar 27 21:13:38 2005
|
# Sat Jun 25 00:58:38 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_IOMAP=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CLEAN_COMPILE=y
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_EPOLL=y
|
CONFIG_EPOLL=y
|
||||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
# CONFIG_ARCH_VERSATILE is not set
|
||||||
# CONFIG_ARCH_IMX is not set
|
# CONFIG_ARCH_IMX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
|
# CONFIG_ARCH_AAEC2000 is not set
|
||||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_IXDP2400=y
|
||||||
CONFIG_ARCH_IXDP2X00=y
|
CONFIG_ARCH_IXDP2X00=y
|
||||||
# CONFIG_ARCH_IXDP2401 is not set
|
# CONFIG_ARCH_IXDP2401 is not set
|
||||||
# CONFIG_ARCH_IXDP2801 is not set
|
# CONFIG_ARCH_IXDP2801 is not set
|
||||||
|
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Type
|
# Processor Type
|
||||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
||||||
CONFIG_CPU_ABRT_EV5T=y
|
CONFIG_CPU_ABRT_EV5T=y
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
CONFIG_CPU_CACHE_VIVT=y
|
||||||
CONFIG_CPU_TLB_V4WBI=y
|
CONFIG_CPU_TLB_V4WBI=y
|
||||||
CONFIG_CPU_MINICACHE=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Features
|
# Processor Features
|
||||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
||||||
#
|
#
|
||||||
# Bus support
|
# Bus support
|
||||||
#
|
#
|
||||||
|
CONFIG_ISA_DMA_API=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_LEGACY_PROC=y
|
CONFIG_PCI_LEGACY_PROC=y
|
||||||
CONFIG_PCI_NAMES=y
|
CONFIG_PCI_NAMES=y
|
||||||
|
# CONFIG_PCI_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# PCCARD (PCMCIA/CardBus) support
|
# PCCARD (PCMCIA/CardBus) support
|
||||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
||||||
#
|
#
|
||||||
# Kernel Features
|
# Kernel Features
|
||||||
#
|
#
|
||||||
|
# CONFIG_SMP is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
#
|
#
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
|
||||||
# CONFIG_BLK_CPQ_DA is not set
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
# CONFIG_BLK_DEV_DAC960 is not set
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_FUSION is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
||||||
#
|
#
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_MMAP=y
|
CONFIG_PACKET_MMAP=y
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
# CONFIG_NET_KEY is not set
|
# CONFIG_NET_KEY is not set
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_FIB_TRIE is not set
|
||||||
# CONFIG_IP_MULTICAST is not set
|
# CONFIG_IP_MULTICAST is not set
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_INET_TUNNEL is not set
|
# CONFIG_INET_TUNNEL is not set
|
||||||
# CONFIG_IP_TCPDIAG is not set
|
# CONFIG_IP_TCPDIAG is not set
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TCP congestion control
|
||||||
|
#
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_TCP_CONG_WESTWOOD=m
|
||||||
|
CONFIG_TCP_CONG_HTCP=m
|
||||||
|
# CONFIG_TCP_CONG_HSTCP is not set
|
||||||
|
# CONFIG_TCP_CONG_HYBLA is not set
|
||||||
|
# CONFIG_TCP_CONG_VEGAS is not set
|
||||||
|
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
# CONFIG_NET_VENDOR_3COM is not set
|
||||||
# CONFIG_SMC91X is not set
|
# CONFIG_SMC91X is not set
|
||||||
|
# CONFIG_DM9000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tulip family network device support
|
# Tulip family network device support
|
||||||
|
@ -441,9 +467,11 @@ CONFIG_EEPRO100=y
|
||||||
# CONFIG_HAMACHI is not set
|
# CONFIG_HAMACHI is not set
|
||||||
# CONFIG_YELLOWFIN is not set
|
# CONFIG_YELLOWFIN is not set
|
||||||
# CONFIG_R8169 is not set
|
# CONFIG_R8169 is not set
|
||||||
|
# CONFIG_SKGE is not set
|
||||||
# CONFIG_SK98LIN is not set
|
# CONFIG_SK98LIN is not set
|
||||||
# CONFIG_VIA_VELOCITY is not set
|
# CONFIG_VIA_VELOCITY is not set
|
||||||
# CONFIG_TIGON3 is not set
|
# CONFIG_TIGON3 is not set
|
||||||
|
# CONFIG_BNX2 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10000 Mbit)
|
# Ethernet (10000 Mbit)
|
||||||
|
@ -465,6 +493,7 @@ CONFIG_EEPRO100=y
|
||||||
# Wan interfaces
|
# Wan interfaces
|
||||||
#
|
#
|
||||||
CONFIG_WAN=y
|
CONFIG_WAN=y
|
||||||
|
# CONFIG_DSCC4 is not set
|
||||||
# CONFIG_LANMEDIA is not set
|
# CONFIG_LANMEDIA is not set
|
||||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||||
CONFIG_HDLC=y
|
CONFIG_HDLC=y
|
||||||
|
@ -527,7 +556,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
|
@ -548,6 +576,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@ -614,17 +643,18 @@ CONFIG_I2C_ALGOBIT=y
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 is not set
|
||||||
# CONFIG_I2C_I801 is not set
|
# CONFIG_I2C_I801 is not set
|
||||||
# CONFIG_I2C_I810 is not set
|
# CONFIG_I2C_I810 is not set
|
||||||
|
# CONFIG_I2C_PIIX4 is not set
|
||||||
# CONFIG_I2C_ISA is not set
|
# CONFIG_I2C_ISA is not set
|
||||||
# CONFIG_I2C_IXP2000 is not set
|
# CONFIG_I2C_IXP2000 is not set
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
|
||||||
# CONFIG_I2C_PROSAVAGE is not set
|
# CONFIG_I2C_PROSAVAGE is not set
|
||||||
# CONFIG_I2C_SAVAGE4 is not set
|
# CONFIG_I2C_SAVAGE4 is not set
|
||||||
# CONFIG_SCx200_ACB is not set
|
# CONFIG_SCx200_ACB is not set
|
||||||
# CONFIG_I2C_SIS5595 is not set
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
# CONFIG_I2C_SIS630 is not set
|
# CONFIG_I2C_SIS630 is not set
|
||||||
# CONFIG_I2C_SIS96X is not set
|
# CONFIG_I2C_SIS96X is not set
|
||||||
|
# CONFIG_I2C_STUB is not set
|
||||||
# CONFIG_I2C_VIA is not set
|
# CONFIG_I2C_VIA is not set
|
||||||
# CONFIG_I2C_VIAPRO is not set
|
# CONFIG_I2C_VIAPRO is not set
|
||||||
# CONFIG_I2C_VOODOO3 is not set
|
# CONFIG_I2C_VOODOO3 is not set
|
||||||
|
@ -638,7 +668,9 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_ADM1025 is not set
|
# CONFIG_SENSORS_ADM1025 is not set
|
||||||
# CONFIG_SENSORS_ADM1026 is not set
|
# CONFIG_SENSORS_ADM1026 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
# CONFIG_SENSORS_FSCPOS is not set
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
|
@ -654,6 +686,7 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_LM85 is not set
|
# CONFIG_SENSORS_LM85 is not set
|
||||||
# CONFIG_SENSORS_LM87 is not set
|
# CONFIG_SENSORS_LM87 is not set
|
||||||
# CONFIG_SENSORS_LM90 is not set
|
# CONFIG_SENSORS_LM90 is not set
|
||||||
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
|
@ -663,14 +696,19 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
# CONFIG_SENSORS_W83L785TS is not set
|
# CONFIG_SENSORS_W83L785TS is not set
|
||||||
# CONFIG_SENSORS_W83627HF is not set
|
# CONFIG_SENSORS_W83627HF is not set
|
||||||
|
# CONFIG_SENSORS_W83627EHF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other I2C Chip support
|
# Other I2C Chip support
|
||||||
#
|
#
|
||||||
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
|
# CONFIG_SENSORS_DS1374 is not set
|
||||||
CONFIG_SENSORS_EEPROM=y
|
CONFIG_SENSORS_EEPROM=y
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_MAX6875 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
@ -724,6 +762,7 @@ CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_EXT2_FS_SECURITY is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||||
|
@ -764,7 +803,6 @@ CONFIG_DNOTIFY=y
|
||||||
#
|
#
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
|
@ -802,12 +840,14 @@ CONFIG_JFFS2_RTIME=y
|
||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -892,3 +932,4 @@ CONFIG_CRC32=y
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
# CONFIG_TEXTSEARCH is not set
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc1-bk2
|
# Linux kernel version: 2.6.12-git6
|
||||||
# Sun Mar 27 21:53:55 2005
|
# Sat Jun 25 00:59:35 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_IOMAP=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CLEAN_COMPILE=y
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_EPOLL=y
|
CONFIG_EPOLL=y
|
||||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
# CONFIG_ARCH_VERSATILE is not set
|
||||||
# CONFIG_ARCH_IMX is not set
|
# CONFIG_ARCH_IMX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
|
# CONFIG_ARCH_AAEC2000 is not set
|
||||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
CONFIG_ARCH_IXDP2401=y
|
CONFIG_ARCH_IXDP2401=y
|
||||||
# CONFIG_ARCH_IXDP2801 is not set
|
# CONFIG_ARCH_IXDP2801 is not set
|
||||||
CONFIG_ARCH_IXDP2X01=y
|
CONFIG_ARCH_IXDP2X01=y
|
||||||
|
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Type
|
# Processor Type
|
||||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
||||||
CONFIG_CPU_ABRT_EV5T=y
|
CONFIG_CPU_ABRT_EV5T=y
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
CONFIG_CPU_CACHE_VIVT=y
|
||||||
CONFIG_CPU_TLB_V4WBI=y
|
CONFIG_CPU_TLB_V4WBI=y
|
||||||
CONFIG_CPU_MINICACHE=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Features
|
# Processor Features
|
||||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
||||||
#
|
#
|
||||||
# Bus support
|
# Bus support
|
||||||
#
|
#
|
||||||
|
CONFIG_ISA_DMA_API=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_LEGACY_PROC=y
|
CONFIG_PCI_LEGACY_PROC=y
|
||||||
CONFIG_PCI_NAMES=y
|
CONFIG_PCI_NAMES=y
|
||||||
|
# CONFIG_PCI_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# PCCARD (PCMCIA/CardBus) support
|
# PCCARD (PCMCIA/CardBus) support
|
||||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
||||||
#
|
#
|
||||||
# Kernel Features
|
# Kernel Features
|
||||||
#
|
#
|
||||||
|
# CONFIG_SMP is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
#
|
#
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
|
||||||
# CONFIG_BLK_CPQ_DA is not set
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
# CONFIG_BLK_DEV_DAC960 is not set
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_FUSION is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
||||||
#
|
#
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_MMAP=y
|
CONFIG_PACKET_MMAP=y
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
# CONFIG_NET_KEY is not set
|
# CONFIG_NET_KEY is not set
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_FIB_TRIE is not set
|
||||||
# CONFIG_IP_MULTICAST is not set
|
# CONFIG_IP_MULTICAST is not set
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_INET_TUNNEL is not set
|
# CONFIG_INET_TUNNEL is not set
|
||||||
CONFIG_IP_TCPDIAG=y
|
CONFIG_IP_TCPDIAG=y
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TCP congestion control
|
||||||
|
#
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_TCP_CONG_WESTWOOD=m
|
||||||
|
CONFIG_TCP_CONG_HTCP=m
|
||||||
|
# CONFIG_TCP_CONG_HSTCP is not set
|
||||||
|
# CONFIG_TCP_CONG_HYBLA is not set
|
||||||
|
# CONFIG_TCP_CONG_VEGAS is not set
|
||||||
|
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
# CONFIG_NET_VENDOR_3COM is not set
|
||||||
# CONFIG_SMC91X is not set
|
# CONFIG_SMC91X is not set
|
||||||
|
# CONFIG_DM9000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tulip family network device support
|
# Tulip family network device support
|
||||||
|
@ -442,9 +468,11 @@ CONFIG_EEPRO100=y
|
||||||
# CONFIG_HAMACHI is not set
|
# CONFIG_HAMACHI is not set
|
||||||
# CONFIG_YELLOWFIN is not set
|
# CONFIG_YELLOWFIN is not set
|
||||||
# CONFIG_R8169 is not set
|
# CONFIG_R8169 is not set
|
||||||
|
# CONFIG_SKGE is not set
|
||||||
# CONFIG_SK98LIN is not set
|
# CONFIG_SK98LIN is not set
|
||||||
# CONFIG_VIA_VELOCITY is not set
|
# CONFIG_VIA_VELOCITY is not set
|
||||||
# CONFIG_TIGON3 is not set
|
# CONFIG_TIGON3 is not set
|
||||||
|
# CONFIG_BNX2 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10000 Mbit)
|
# Ethernet (10000 Mbit)
|
||||||
|
@ -466,6 +494,7 @@ CONFIG_EEPRO100=y
|
||||||
# Wan interfaces
|
# Wan interfaces
|
||||||
#
|
#
|
||||||
CONFIG_WAN=y
|
CONFIG_WAN=y
|
||||||
|
# CONFIG_DSCC4 is not set
|
||||||
# CONFIG_LANMEDIA is not set
|
# CONFIG_LANMEDIA is not set
|
||||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||||
CONFIG_HDLC=y
|
CONFIG_HDLC=y
|
||||||
|
@ -528,7 +557,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
|
@ -549,6 +577,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@ -615,17 +644,18 @@ CONFIG_I2C_ALGOBIT=y
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 is not set
|
||||||
# CONFIG_I2C_I801 is not set
|
# CONFIG_I2C_I801 is not set
|
||||||
# CONFIG_I2C_I810 is not set
|
# CONFIG_I2C_I810 is not set
|
||||||
|
# CONFIG_I2C_PIIX4 is not set
|
||||||
# CONFIG_I2C_ISA is not set
|
# CONFIG_I2C_ISA is not set
|
||||||
# CONFIG_I2C_IXP2000 is not set
|
# CONFIG_I2C_IXP2000 is not set
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
|
||||||
# CONFIG_I2C_PROSAVAGE is not set
|
# CONFIG_I2C_PROSAVAGE is not set
|
||||||
# CONFIG_I2C_SAVAGE4 is not set
|
# CONFIG_I2C_SAVAGE4 is not set
|
||||||
# CONFIG_SCx200_ACB is not set
|
# CONFIG_SCx200_ACB is not set
|
||||||
# CONFIG_I2C_SIS5595 is not set
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
# CONFIG_I2C_SIS630 is not set
|
# CONFIG_I2C_SIS630 is not set
|
||||||
# CONFIG_I2C_SIS96X is not set
|
# CONFIG_I2C_SIS96X is not set
|
||||||
|
# CONFIG_I2C_STUB is not set
|
||||||
# CONFIG_I2C_VIA is not set
|
# CONFIG_I2C_VIA is not set
|
||||||
# CONFIG_I2C_VIAPRO is not set
|
# CONFIG_I2C_VIAPRO is not set
|
||||||
# CONFIG_I2C_VOODOO3 is not set
|
# CONFIG_I2C_VOODOO3 is not set
|
||||||
|
@ -639,7 +669,9 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_ADM1025 is not set
|
# CONFIG_SENSORS_ADM1025 is not set
|
||||||
# CONFIG_SENSORS_ADM1026 is not set
|
# CONFIG_SENSORS_ADM1026 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
# CONFIG_SENSORS_FSCPOS is not set
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
|
@ -655,6 +687,7 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_LM85 is not set
|
# CONFIG_SENSORS_LM85 is not set
|
||||||
# CONFIG_SENSORS_LM87 is not set
|
# CONFIG_SENSORS_LM87 is not set
|
||||||
# CONFIG_SENSORS_LM90 is not set
|
# CONFIG_SENSORS_LM90 is not set
|
||||||
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
|
@ -664,14 +697,19 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
# CONFIG_SENSORS_W83L785TS is not set
|
# CONFIG_SENSORS_W83L785TS is not set
|
||||||
# CONFIG_SENSORS_W83627HF is not set
|
# CONFIG_SENSORS_W83627HF is not set
|
||||||
|
# CONFIG_SENSORS_W83627EHF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other I2C Chip support
|
# Other I2C Chip support
|
||||||
#
|
#
|
||||||
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
|
# CONFIG_SENSORS_DS1374 is not set
|
||||||
CONFIG_SENSORS_EEPROM=y
|
CONFIG_SENSORS_EEPROM=y
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_MAX6875 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
@ -725,6 +763,7 @@ CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_EXT2_FS_SECURITY is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||||
|
@ -765,7 +804,6 @@ CONFIG_DNOTIFY=y
|
||||||
#
|
#
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
|
@ -803,12 +841,14 @@ CONFIG_JFFS2_RTIME=y
|
||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -893,3 +933,4 @@ CONFIG_CRC32=y
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
# CONFIG_TEXTSEARCH is not set
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc1-bk2
|
# Linux kernel version: 2.6.12-git6
|
||||||
# Sun Mar 27 22:15:23 2005
|
# Sat Jun 25 01:00:27 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_IOMAP=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CLEAN_COMPILE=y
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_EPOLL=y
|
CONFIG_EPOLL=y
|
||||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
# CONFIG_ARCH_VERSATILE is not set
|
||||||
# CONFIG_ARCH_IMX is not set
|
# CONFIG_ARCH_IMX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
|
# CONFIG_ARCH_AAEC2000 is not set
|
||||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_IXDP2800=y
|
||||||
CONFIG_ARCH_IXDP2X00=y
|
CONFIG_ARCH_IXDP2X00=y
|
||||||
# CONFIG_ARCH_IXDP2401 is not set
|
# CONFIG_ARCH_IXDP2401 is not set
|
||||||
# CONFIG_ARCH_IXDP2801 is not set
|
# CONFIG_ARCH_IXDP2801 is not set
|
||||||
|
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Type
|
# Processor Type
|
||||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
||||||
CONFIG_CPU_ABRT_EV5T=y
|
CONFIG_CPU_ABRT_EV5T=y
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
CONFIG_CPU_CACHE_VIVT=y
|
||||||
CONFIG_CPU_TLB_V4WBI=y
|
CONFIG_CPU_TLB_V4WBI=y
|
||||||
CONFIG_CPU_MINICACHE=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Features
|
# Processor Features
|
||||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
||||||
#
|
#
|
||||||
# Bus support
|
# Bus support
|
||||||
#
|
#
|
||||||
|
CONFIG_ISA_DMA_API=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_LEGACY_PROC=y
|
CONFIG_PCI_LEGACY_PROC=y
|
||||||
CONFIG_PCI_NAMES=y
|
CONFIG_PCI_NAMES=y
|
||||||
|
# CONFIG_PCI_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# PCCARD (PCMCIA/CardBus) support
|
# PCCARD (PCMCIA/CardBus) support
|
||||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
||||||
#
|
#
|
||||||
# Kernel Features
|
# Kernel Features
|
||||||
#
|
#
|
||||||
|
# CONFIG_SMP is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
#
|
#
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
|
||||||
# CONFIG_BLK_CPQ_DA is not set
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
# CONFIG_BLK_DEV_DAC960 is not set
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_FUSION is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
||||||
#
|
#
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_MMAP=y
|
CONFIG_PACKET_MMAP=y
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
# CONFIG_NET_KEY is not set
|
# CONFIG_NET_KEY is not set
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_FIB_TRIE is not set
|
||||||
# CONFIG_IP_MULTICAST is not set
|
# CONFIG_IP_MULTICAST is not set
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_INET_TUNNEL is not set
|
# CONFIG_INET_TUNNEL is not set
|
||||||
# CONFIG_IP_TCPDIAG is not set
|
# CONFIG_IP_TCPDIAG is not set
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TCP congestion control
|
||||||
|
#
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_TCP_CONG_WESTWOOD=m
|
||||||
|
CONFIG_TCP_CONG_HTCP=m
|
||||||
|
# CONFIG_TCP_CONG_HSTCP is not set
|
||||||
|
# CONFIG_TCP_CONG_HYBLA is not set
|
||||||
|
# CONFIG_TCP_CONG_VEGAS is not set
|
||||||
|
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
# CONFIG_NET_VENDOR_3COM is not set
|
||||||
# CONFIG_SMC91X is not set
|
# CONFIG_SMC91X is not set
|
||||||
|
# CONFIG_DM9000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tulip family network device support
|
# Tulip family network device support
|
||||||
|
@ -441,9 +467,11 @@ CONFIG_EEPRO100=y
|
||||||
# CONFIG_HAMACHI is not set
|
# CONFIG_HAMACHI is not set
|
||||||
# CONFIG_YELLOWFIN is not set
|
# CONFIG_YELLOWFIN is not set
|
||||||
# CONFIG_R8169 is not set
|
# CONFIG_R8169 is not set
|
||||||
|
# CONFIG_SKGE is not set
|
||||||
# CONFIG_SK98LIN is not set
|
# CONFIG_SK98LIN is not set
|
||||||
# CONFIG_VIA_VELOCITY is not set
|
# CONFIG_VIA_VELOCITY is not set
|
||||||
# CONFIG_TIGON3 is not set
|
# CONFIG_TIGON3 is not set
|
||||||
|
# CONFIG_BNX2 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10000 Mbit)
|
# Ethernet (10000 Mbit)
|
||||||
|
@ -465,6 +493,7 @@ CONFIG_EEPRO100=y
|
||||||
# Wan interfaces
|
# Wan interfaces
|
||||||
#
|
#
|
||||||
CONFIG_WAN=y
|
CONFIG_WAN=y
|
||||||
|
# CONFIG_DSCC4 is not set
|
||||||
# CONFIG_LANMEDIA is not set
|
# CONFIG_LANMEDIA is not set
|
||||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||||
CONFIG_HDLC=y
|
CONFIG_HDLC=y
|
||||||
|
@ -527,7 +556,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
|
@ -548,6 +576,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@ -614,17 +643,18 @@ CONFIG_I2C_ALGOBIT=y
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 is not set
|
||||||
# CONFIG_I2C_I801 is not set
|
# CONFIG_I2C_I801 is not set
|
||||||
# CONFIG_I2C_I810 is not set
|
# CONFIG_I2C_I810 is not set
|
||||||
|
# CONFIG_I2C_PIIX4 is not set
|
||||||
# CONFIG_I2C_ISA is not set
|
# CONFIG_I2C_ISA is not set
|
||||||
# CONFIG_I2C_IXP2000 is not set
|
# CONFIG_I2C_IXP2000 is not set
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
|
||||||
# CONFIG_I2C_PROSAVAGE is not set
|
# CONFIG_I2C_PROSAVAGE is not set
|
||||||
# CONFIG_I2C_SAVAGE4 is not set
|
# CONFIG_I2C_SAVAGE4 is not set
|
||||||
# CONFIG_SCx200_ACB is not set
|
# CONFIG_SCx200_ACB is not set
|
||||||
# CONFIG_I2C_SIS5595 is not set
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
# CONFIG_I2C_SIS630 is not set
|
# CONFIG_I2C_SIS630 is not set
|
||||||
# CONFIG_I2C_SIS96X is not set
|
# CONFIG_I2C_SIS96X is not set
|
||||||
|
# CONFIG_I2C_STUB is not set
|
||||||
# CONFIG_I2C_VIA is not set
|
# CONFIG_I2C_VIA is not set
|
||||||
# CONFIG_I2C_VIAPRO is not set
|
# CONFIG_I2C_VIAPRO is not set
|
||||||
# CONFIG_I2C_VOODOO3 is not set
|
# CONFIG_I2C_VOODOO3 is not set
|
||||||
|
@ -638,7 +668,9 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_ADM1025 is not set
|
# CONFIG_SENSORS_ADM1025 is not set
|
||||||
# CONFIG_SENSORS_ADM1026 is not set
|
# CONFIG_SENSORS_ADM1026 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
# CONFIG_SENSORS_FSCPOS is not set
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
|
@ -654,6 +686,7 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_LM85 is not set
|
# CONFIG_SENSORS_LM85 is not set
|
||||||
# CONFIG_SENSORS_LM87 is not set
|
# CONFIG_SENSORS_LM87 is not set
|
||||||
# CONFIG_SENSORS_LM90 is not set
|
# CONFIG_SENSORS_LM90 is not set
|
||||||
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
|
@ -663,14 +696,19 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
# CONFIG_SENSORS_W83L785TS is not set
|
# CONFIG_SENSORS_W83L785TS is not set
|
||||||
# CONFIG_SENSORS_W83627HF is not set
|
# CONFIG_SENSORS_W83627HF is not set
|
||||||
|
# CONFIG_SENSORS_W83627EHF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other I2C Chip support
|
# Other I2C Chip support
|
||||||
#
|
#
|
||||||
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
|
# CONFIG_SENSORS_DS1374 is not set
|
||||||
CONFIG_SENSORS_EEPROM=y
|
CONFIG_SENSORS_EEPROM=y
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_MAX6875 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
@ -724,6 +762,7 @@ CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_EXT2_FS_SECURITY is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||||
|
@ -764,7 +803,6 @@ CONFIG_DNOTIFY=y
|
||||||
#
|
#
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
|
@ -802,12 +840,14 @@ CONFIG_JFFS2_RTIME=y
|
||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -892,3 +932,4 @@ CONFIG_CRC32=y
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
# CONFIG_TEXTSEARCH is not set
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc1-bk2
|
# Linux kernel version: 2.6.12-git6
|
||||||
# Sun Mar 27 22:39:19 2005
|
# Sat Jun 25 01:01:18 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_IOMAP=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CLEAN_COMPILE=y
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_EPOLL=y
|
CONFIG_EPOLL=y
|
||||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
# CONFIG_ARCH_VERSATILE is not set
|
||||||
# CONFIG_ARCH_IMX is not set
|
# CONFIG_ARCH_IMX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
|
# CONFIG_ARCH_AAEC2000 is not set
|
||||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||||
# CONFIG_ARCH_IXDP2401 is not set
|
# CONFIG_ARCH_IXDP2401 is not set
|
||||||
CONFIG_ARCH_IXDP2801=y
|
CONFIG_ARCH_IXDP2801=y
|
||||||
CONFIG_ARCH_IXDP2X01=y
|
CONFIG_ARCH_IXDP2X01=y
|
||||||
|
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Type
|
# Processor Type
|
||||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
||||||
CONFIG_CPU_ABRT_EV5T=y
|
CONFIG_CPU_ABRT_EV5T=y
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
CONFIG_CPU_CACHE_VIVT=y
|
||||||
CONFIG_CPU_TLB_V4WBI=y
|
CONFIG_CPU_TLB_V4WBI=y
|
||||||
CONFIG_CPU_MINICACHE=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Features
|
# Processor Features
|
||||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
||||||
#
|
#
|
||||||
# Bus support
|
# Bus support
|
||||||
#
|
#
|
||||||
|
CONFIG_ISA_DMA_API=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_LEGACY_PROC=y
|
CONFIG_PCI_LEGACY_PROC=y
|
||||||
CONFIG_PCI_NAMES=y
|
CONFIG_PCI_NAMES=y
|
||||||
|
# CONFIG_PCI_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# PCCARD (PCMCIA/CardBus) support
|
# PCCARD (PCMCIA/CardBus) support
|
||||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
||||||
#
|
#
|
||||||
# Kernel Features
|
# Kernel Features
|
||||||
#
|
#
|
||||||
|
# CONFIG_SMP is not set
|
||||||
# CONFIG_PREEMPT is not set
|
# CONFIG_PREEMPT is not set
|
||||||
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
#
|
#
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
|
||||||
# CONFIG_BLK_CPQ_DA is not set
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
# CONFIG_BLK_DEV_DAC960 is not set
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
#
|
#
|
||||||
|
# CONFIG_FUSION is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
||||||
#
|
#
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_MMAP=y
|
CONFIG_PACKET_MMAP=y
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
# CONFIG_NET_KEY is not set
|
# CONFIG_NET_KEY is not set
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_FIB_TRIE is not set
|
||||||
# CONFIG_IP_MULTICAST is not set
|
# CONFIG_IP_MULTICAST is not set
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_INET_TUNNEL is not set
|
# CONFIG_INET_TUNNEL is not set
|
||||||
# CONFIG_IP_TCPDIAG is not set
|
# CONFIG_IP_TCPDIAG is not set
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TCP congestion control
|
||||||
|
#
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_TCP_CONG_WESTWOOD=m
|
||||||
|
CONFIG_TCP_CONG_HTCP=m
|
||||||
|
# CONFIG_TCP_CONG_HSTCP is not set
|
||||||
|
# CONFIG_TCP_CONG_HYBLA is not set
|
||||||
|
# CONFIG_TCP_CONG_VEGAS is not set
|
||||||
|
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
# CONFIG_NET_VENDOR_3COM is not set
|
||||||
# CONFIG_SMC91X is not set
|
# CONFIG_SMC91X is not set
|
||||||
|
# CONFIG_DM9000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tulip family network device support
|
# Tulip family network device support
|
||||||
|
@ -442,9 +468,11 @@ CONFIG_EEPRO100=y
|
||||||
# CONFIG_HAMACHI is not set
|
# CONFIG_HAMACHI is not set
|
||||||
# CONFIG_YELLOWFIN is not set
|
# CONFIG_YELLOWFIN is not set
|
||||||
# CONFIG_R8169 is not set
|
# CONFIG_R8169 is not set
|
||||||
|
# CONFIG_SKGE is not set
|
||||||
# CONFIG_SK98LIN is not set
|
# CONFIG_SK98LIN is not set
|
||||||
# CONFIG_VIA_VELOCITY is not set
|
# CONFIG_VIA_VELOCITY is not set
|
||||||
# CONFIG_TIGON3 is not set
|
# CONFIG_TIGON3 is not set
|
||||||
|
# CONFIG_BNX2 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10000 Mbit)
|
# Ethernet (10000 Mbit)
|
||||||
|
@ -466,6 +494,7 @@ CONFIG_EEPRO100=y
|
||||||
# Wan interfaces
|
# Wan interfaces
|
||||||
#
|
#
|
||||||
CONFIG_WAN=y
|
CONFIG_WAN=y
|
||||||
|
# CONFIG_DSCC4 is not set
|
||||||
# CONFIG_LANMEDIA is not set
|
# CONFIG_LANMEDIA is not set
|
||||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||||
CONFIG_HDLC=y
|
CONFIG_HDLC=y
|
||||||
|
@ -528,7 +557,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
|
@ -549,6 +577,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@ -615,17 +644,18 @@ CONFIG_I2C_ALGOBIT=y
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 is not set
|
||||||
# CONFIG_I2C_I801 is not set
|
# CONFIG_I2C_I801 is not set
|
||||||
# CONFIG_I2C_I810 is not set
|
# CONFIG_I2C_I810 is not set
|
||||||
|
# CONFIG_I2C_PIIX4 is not set
|
||||||
# CONFIG_I2C_ISA is not set
|
# CONFIG_I2C_ISA is not set
|
||||||
# CONFIG_I2C_IXP2000 is not set
|
# CONFIG_I2C_IXP2000 is not set
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
|
||||||
# CONFIG_I2C_PROSAVAGE is not set
|
# CONFIG_I2C_PROSAVAGE is not set
|
||||||
# CONFIG_I2C_SAVAGE4 is not set
|
# CONFIG_I2C_SAVAGE4 is not set
|
||||||
# CONFIG_SCx200_ACB is not set
|
# CONFIG_SCx200_ACB is not set
|
||||||
# CONFIG_I2C_SIS5595 is not set
|
# CONFIG_I2C_SIS5595 is not set
|
||||||
# CONFIG_I2C_SIS630 is not set
|
# CONFIG_I2C_SIS630 is not set
|
||||||
# CONFIG_I2C_SIS96X is not set
|
# CONFIG_I2C_SIS96X is not set
|
||||||
|
# CONFIG_I2C_STUB is not set
|
||||||
# CONFIG_I2C_VIA is not set
|
# CONFIG_I2C_VIA is not set
|
||||||
# CONFIG_I2C_VIAPRO is not set
|
# CONFIG_I2C_VIAPRO is not set
|
||||||
# CONFIG_I2C_VOODOO3 is not set
|
# CONFIG_I2C_VOODOO3 is not set
|
||||||
|
@ -639,7 +669,9 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_ADM1025 is not set
|
# CONFIG_SENSORS_ADM1025 is not set
|
||||||
# CONFIG_SENSORS_ADM1026 is not set
|
# CONFIG_SENSORS_ADM1026 is not set
|
||||||
# CONFIG_SENSORS_ADM1031 is not set
|
# CONFIG_SENSORS_ADM1031 is not set
|
||||||
|
# CONFIG_SENSORS_ADM9240 is not set
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
|
# CONFIG_SENSORS_ATXP1 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
# CONFIG_SENSORS_FSCPOS is not set
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
|
@ -655,6 +687,7 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_LM85 is not set
|
# CONFIG_SENSORS_LM85 is not set
|
||||||
# CONFIG_SENSORS_LM87 is not set
|
# CONFIG_SENSORS_LM87 is not set
|
||||||
# CONFIG_SENSORS_LM90 is not set
|
# CONFIG_SENSORS_LM90 is not set
|
||||||
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
|
@ -664,14 +697,19 @@ CONFIG_I2C_SENSOR=y
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
# CONFIG_SENSORS_W83L785TS is not set
|
# CONFIG_SENSORS_W83L785TS is not set
|
||||||
# CONFIG_SENSORS_W83627HF is not set
|
# CONFIG_SENSORS_W83627HF is not set
|
||||||
|
# CONFIG_SENSORS_W83627EHF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other I2C Chip support
|
# Other I2C Chip support
|
||||||
#
|
#
|
||||||
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
|
# CONFIG_SENSORS_DS1374 is not set
|
||||||
CONFIG_SENSORS_EEPROM=y
|
CONFIG_SENSORS_EEPROM=y
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_MAX6875 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
@ -725,6 +763,7 @@ CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_EXT2_FS_SECURITY is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||||
|
@ -765,7 +804,6 @@ CONFIG_DNOTIFY=y
|
||||||
#
|
#
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
|
@ -803,12 +841,14 @@ CONFIG_JFFS2_RTIME=y
|
||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -893,3 +933,4 @@ CONFIG_CRC32=y
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_ZLIB_INFLATE=y
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=y
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
# CONFIG_TEXTSEARCH is not set
|
||||||
|
|
|
@ -30,9 +30,6 @@ extern void __lshrdi3(void);
|
||||||
extern void __modsi3(void);
|
extern void __modsi3(void);
|
||||||
extern void __muldi3(void);
|
extern void __muldi3(void);
|
||||||
extern void __ucmpdi2(void);
|
extern void __ucmpdi2(void);
|
||||||
extern void __udivdi3(void);
|
|
||||||
extern void __umoddi3(void);
|
|
||||||
extern void __udivmoddi4(void);
|
|
||||||
extern void __udivsi3(void);
|
extern void __udivsi3(void);
|
||||||
extern void __umodsi3(void);
|
extern void __umodsi3(void);
|
||||||
extern void __do_div64(void);
|
extern void __do_div64(void);
|
||||||
|
@ -134,9 +131,6 @@ EXPORT_SYMBOL(__lshrdi3);
|
||||||
EXPORT_SYMBOL(__modsi3);
|
EXPORT_SYMBOL(__modsi3);
|
||||||
EXPORT_SYMBOL(__muldi3);
|
EXPORT_SYMBOL(__muldi3);
|
||||||
EXPORT_SYMBOL(__ucmpdi2);
|
EXPORT_SYMBOL(__ucmpdi2);
|
||||||
EXPORT_SYMBOL(__udivdi3);
|
|
||||||
EXPORT_SYMBOL(__umoddi3);
|
|
||||||
EXPORT_SYMBOL(__udivmoddi4);
|
|
||||||
EXPORT_SYMBOL(__udivsi3);
|
EXPORT_SYMBOL(__udivsi3);
|
||||||
EXPORT_SYMBOL(__umodsi3);
|
EXPORT_SYMBOL(__umodsi3);
|
||||||
EXPORT_SYMBOL(__do_div64);
|
EXPORT_SYMBOL(__do_div64);
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
* Copyright (C) 1992 Linus Torvalds
|
* Copyright (C) 1992 Linus Torvalds
|
||||||
* Modifications for ARM processor Copyright (C) 1995-2000 Russell King.
|
* Modifications for ARM processor Copyright (C) 1995-2000 Russell King.
|
||||||
*
|
*
|
||||||
|
* Support for Dynamic Tick Timer Copyright (C) 2004-2005 Nokia Corporation.
|
||||||
|
* Dynamic Tick Timer written by Tony Lindgren <tony@atomide.com> and
|
||||||
|
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>.
|
||||||
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
|
@ -37,6 +41,7 @@
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Maximum IRQ count. Currently, this is arbitary. However, it should
|
* Maximum IRQ count. Currently, this is arbitary. However, it should
|
||||||
|
@ -329,6 +334,15 @@ __do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs)
|
||||||
|
|
||||||
spin_unlock(&irq_controller_lock);
|
spin_unlock(&irq_controller_lock);
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
if (!(action->flags & SA_TIMER) && system_timer->dyn_tick != NULL) {
|
||||||
|
write_seqlock(&xtime_lock);
|
||||||
|
if (system_timer->dyn_tick->state & DYN_TICK_ENABLED)
|
||||||
|
system_timer->dyn_tick->handler(irq, 0, regs);
|
||||||
|
write_sequnlock(&xtime_lock);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!(action->flags & SA_INTERRUPT))
|
if (!(action->flags & SA_INTERRUPT))
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <asm/leds.h>
|
#include <asm/leds.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
extern const char *processor_modes[];
|
extern const char *processor_modes[];
|
||||||
extern void setup_mm_for_reboot(char mode);
|
extern void setup_mm_for_reboot(char mode);
|
||||||
|
@ -85,8 +86,10 @@ EXPORT_SYMBOL(pm_power_off);
|
||||||
void default_idle(void)
|
void default_idle(void)
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
if (!need_resched() && !hlt_counter)
|
if (!need_resched() && !hlt_counter) {
|
||||||
|
timer_dyn_reprogram();
|
||||||
arch_idle();
|
arch_idle();
|
||||||
|
}
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -359,7 +359,8 @@ void cpu_init(void)
|
||||||
"I" (offsetof(struct stack, abt[0])),
|
"I" (offsetof(struct stack, abt[0])),
|
||||||
"I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
|
"I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
|
||||||
"I" (offsetof(struct stack, und[0])),
|
"I" (offsetof(struct stack, und[0])),
|
||||||
"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE));
|
"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
|
||||||
|
: "r14");
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct machine_desc * __init setup_machine(unsigned int nr)
|
static struct machine_desc * __init setup_machine(unsigned int nr)
|
||||||
|
|
|
@ -697,7 +697,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (try_to_freeze(0))
|
if (try_to_freeze())
|
||||||
goto no_signal;
|
goto no_signal;
|
||||||
|
|
||||||
if (current->ptrace & PT_SINGLESTEP)
|
if (current->ptrace & PT_SINGLESTEP)
|
||||||
|
|
|
@ -502,3 +502,126 @@ int __init setup_profiling_timer(unsigned int multiplier)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
on_each_cpu_mask(void (*func)(void *), void *info, int retry, int wait,
|
||||||
|
cpumask_t mask)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
|
||||||
|
ret = smp_call_function_on_cpu(func, info, retry, wait, mask);
|
||||||
|
if (cpu_isset(smp_processor_id(), mask))
|
||||||
|
func(info);
|
||||||
|
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TLB operations
|
||||||
|
*/
|
||||||
|
struct tlb_args {
|
||||||
|
struct vm_area_struct *ta_vma;
|
||||||
|
unsigned long ta_start;
|
||||||
|
unsigned long ta_end;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_all(void *ignored)
|
||||||
|
{
|
||||||
|
local_flush_tlb_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_mm(void *arg)
|
||||||
|
{
|
||||||
|
struct mm_struct *mm = (struct mm_struct *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_mm(mm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_page(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_page(ta->ta_vma, ta->ta_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_kernel_page(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_kernel_page(ta->ta_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_range(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_kernel_range(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_kernel_range(ta->ta_start, ta->ta_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_all(void)
|
||||||
|
{
|
||||||
|
on_each_cpu(ipi_flush_tlb_all, NULL, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_mm(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
cpumask_t mask = mm->cpu_vm_mask;
|
||||||
|
|
||||||
|
on_each_cpu_mask(ipi_flush_tlb_mm, mm, 1, 1, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
|
||||||
|
{
|
||||||
|
cpumask_t mask = vma->vm_mm->cpu_vm_mask;
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_vma = vma;
|
||||||
|
ta.ta_start = uaddr;
|
||||||
|
|
||||||
|
on_each_cpu_mask(ipi_flush_tlb_page, &ta, 1, 1, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_kernel_page(unsigned long kaddr)
|
||||||
|
{
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_start = kaddr;
|
||||||
|
|
||||||
|
on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_range(struct vm_area_struct *vma,
|
||||||
|
unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
cpumask_t mask = vma->vm_mm->cpu_vm_mask;
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_vma = vma;
|
||||||
|
ta.ta_start = start;
|
||||||
|
ta.ta_end = end;
|
||||||
|
|
||||||
|
on_each_cpu_mask(ipi_flush_tlb_range, &ta, 1, 1, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_start = start;
|
||||||
|
ta.ta_end = end;
|
||||||
|
|
||||||
|
on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1, 1);
|
||||||
|
}
|
||||||
|
|
|
@ -381,6 +381,99 @@ static struct sysdev_class timer_sysclass = {
|
||||||
.resume = timer_resume,
|
.resume = timer_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
static int timer_dyn_tick_enable(void)
|
||||||
|
{
|
||||||
|
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||||
|
unsigned long flags;
|
||||||
|
int ret = -ENODEV;
|
||||||
|
|
||||||
|
if (dyn_tick) {
|
||||||
|
write_seqlock_irqsave(&xtime_lock, flags);
|
||||||
|
ret = 0;
|
||||||
|
if (!(dyn_tick->state & DYN_TICK_ENABLED)) {
|
||||||
|
ret = dyn_tick->enable();
|
||||||
|
|
||||||
|
if (ret == 0)
|
||||||
|
dyn_tick->state |= DYN_TICK_ENABLED;
|
||||||
|
}
|
||||||
|
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int timer_dyn_tick_disable(void)
|
||||||
|
{
|
||||||
|
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||||
|
unsigned long flags;
|
||||||
|
int ret = -ENODEV;
|
||||||
|
|
||||||
|
if (dyn_tick) {
|
||||||
|
write_seqlock_irqsave(&xtime_lock, flags);
|
||||||
|
ret = 0;
|
||||||
|
if (dyn_tick->state & DYN_TICK_ENABLED) {
|
||||||
|
ret = dyn_tick->disable();
|
||||||
|
|
||||||
|
if (ret == 0)
|
||||||
|
dyn_tick->state &= ~DYN_TICK_ENABLED;
|
||||||
|
}
|
||||||
|
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reprogram the system timer for at least the calculated time interval.
|
||||||
|
* This function should be called from the idle thread with IRQs disabled,
|
||||||
|
* immediately before sleeping.
|
||||||
|
*/
|
||||||
|
void timer_dyn_reprogram(void)
|
||||||
|
{
|
||||||
|
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||||
|
|
||||||
|
write_seqlock(&xtime_lock);
|
||||||
|
if (dyn_tick->state & DYN_TICK_ENABLED)
|
||||||
|
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
||||||
|
write_sequnlock(&xtime_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
||||||
|
{
|
||||||
|
return sprintf(buf, "%i\n",
|
||||||
|
(system_timer->dyn_tick->state & DYN_TICK_ENABLED) >> 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t timer_set_dyn_tick(struct sys_device *dev, const char *buf,
|
||||||
|
size_t count)
|
||||||
|
{
|
||||||
|
unsigned int enable = simple_strtoul(buf, NULL, 2);
|
||||||
|
|
||||||
|
if (enable)
|
||||||
|
timer_dyn_tick_enable();
|
||||||
|
else
|
||||||
|
timer_dyn_tick_disable();
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
static SYSDEV_ATTR(dyn_tick, 0644, timer_show_dyn_tick, timer_set_dyn_tick);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* dyntick=enable|disable
|
||||||
|
*/
|
||||||
|
static char dyntick_str[4] __initdata = "";
|
||||||
|
|
||||||
|
static int __init dyntick_setup(char *str)
|
||||||
|
{
|
||||||
|
if (str)
|
||||||
|
strlcpy(dyntick_str, str, sizeof(dyntick_str));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
__setup("dyntick=", dyntick_setup);
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __init timer_init_sysfs(void)
|
static int __init timer_init_sysfs(void)
|
||||||
{
|
{
|
||||||
int ret = sysdev_class_register(&timer_sysclass);
|
int ret = sysdev_class_register(&timer_sysclass);
|
||||||
|
@ -388,6 +481,20 @@ static int __init timer_init_sysfs(void)
|
||||||
system_timer->dev.cls = &timer_sysclass;
|
system_timer->dev.cls = &timer_sysclass;
|
||||||
ret = sysdev_register(&system_timer->dev);
|
ret = sysdev_register(&system_timer->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
if (ret == 0 && system_timer->dyn_tick) {
|
||||||
|
ret = sysdev_create_file(&system_timer->dev, &attr_dyn_tick);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Turn on dynamic tick after calibrate delay
|
||||||
|
* for correct bogomips
|
||||||
|
*/
|
||||||
|
if (ret == 0 && dyntick_str[0] == 'e')
|
||||||
|
ret = timer_dyn_tick_enable();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
|
||||||
strnlen_user.o strchr.o strrchr.o testchangebit.o \
|
strnlen_user.o strchr.o strrchr.o testchangebit.o \
|
||||||
testclearbit.o testsetbit.o uaccess.o getuser.o \
|
testclearbit.o testsetbit.o uaccess.o getuser.o \
|
||||||
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
||||||
ucmpdi2.o udivdi3.o lib1funcs.o div64.o \
|
ucmpdi2.o lib1funcs.o div64.o \
|
||||||
io-readsb.o io-writesb.o io-readsl.o io-writesl.o
|
io-readsb.o io-writesb.o io-readsl.o io-writesl.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_CPU_32v3),y)
|
ifeq ($(CONFIG_CPU_32v3),y)
|
||||||
|
|
|
@ -1,183 +0,0 @@
|
||||||
/* longlong.h -- based on code from gcc-2.95.3
|
|
||||||
|
|
||||||
definitions for mixed size 32/64 bit arithmetic.
|
|
||||||
Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This definition file is free software; you can redistribute it
|
|
||||||
and/or modify it under the terms of the GNU General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2, or (at your option) any later version.
|
|
||||||
|
|
||||||
This definition file is distributed in the hope that it will be
|
|
||||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
/* Borrowed from GCC 2.95.3, I Molton 29/07/01 */
|
|
||||||
|
|
||||||
#ifndef SI_TYPE_SIZE
|
|
||||||
#define SI_TYPE_SIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __BITS4 (SI_TYPE_SIZE / 4)
|
|
||||||
#define __ll_B (1L << (SI_TYPE_SIZE / 2))
|
|
||||||
#define __ll_lowpart(t) ((u32) (t) % __ll_B)
|
|
||||||
#define __ll_highpart(t) ((u32) (t) / __ll_B)
|
|
||||||
|
|
||||||
/* Define auxiliary asm macros.
|
|
||||||
|
|
||||||
1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
|
|
||||||
multiplies two u32 integers MULTIPLER and MULTIPLICAND,
|
|
||||||
and generates a two-part u32 product in HIGH_PROD and
|
|
||||||
LOW_PROD.
|
|
||||||
|
|
||||||
2) __umulsidi3(a,b) multiplies two u32 integers A and B,
|
|
||||||
and returns a u64 product. This is just a variant of umul_ppmm.
|
|
||||||
|
|
||||||
3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
|
|
||||||
denominator) divides a two-word unsigned integer, composed by the
|
|
||||||
integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
|
|
||||||
places the quotient in QUOTIENT and the remainder in REMAINDER.
|
|
||||||
HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
|
|
||||||
If, in addition, the most significant bit of DENOMINATOR must be 1,
|
|
||||||
then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
|
|
||||||
|
|
||||||
4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
|
|
||||||
denominator). Like udiv_qrnnd but the numbers are signed. The
|
|
||||||
quotient is rounded towards 0.
|
|
||||||
|
|
||||||
5) count_leading_zeros(count, x) counts the number of zero-bits from
|
|
||||||
the msb to the first non-zero bit. This is the number of steps X
|
|
||||||
needs to be shifted left to set the msb. Undefined for X == 0.
|
|
||||||
|
|
||||||
6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
|
|
||||||
high_addend_2, low_addend_2) adds two two-word unsigned integers,
|
|
||||||
composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
|
|
||||||
LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and
|
|
||||||
LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is
|
|
||||||
lost.
|
|
||||||
|
|
||||||
7) sub_ddmmss(high_difference, low_difference, high_minuend,
|
|
||||||
low_minuend, high_subtrahend, low_subtrahend) subtracts two
|
|
||||||
two-word unsigned integers, composed by HIGH_MINUEND_1 and
|
|
||||||
LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
|
|
||||||
respectively. The result is placed in HIGH_DIFFERENCE and
|
|
||||||
LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
|
|
||||||
and is lost.
|
|
||||||
|
|
||||||
If any of these macros are left undefined for a particular CPU,
|
|
||||||
C macros are used. */
|
|
||||||
|
|
||||||
#if defined (__arm__)
|
|
||||||
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
|
|
||||||
__asm__ ("adds %1, %4, %5 \n\
|
|
||||||
adc %0, %2, %3" \
|
|
||||||
: "=r" ((u32) (sh)), \
|
|
||||||
"=&r" ((u32) (sl)) \
|
|
||||||
: "%r" ((u32) (ah)), \
|
|
||||||
"rI" ((u32) (bh)), \
|
|
||||||
"%r" ((u32) (al)), \
|
|
||||||
"rI" ((u32) (bl)))
|
|
||||||
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
|
|
||||||
__asm__ ("subs %1, %4, %5 \n\
|
|
||||||
sbc %0, %2, %3" \
|
|
||||||
: "=r" ((u32) (sh)), \
|
|
||||||
"=&r" ((u32) (sl)) \
|
|
||||||
: "r" ((u32) (ah)), \
|
|
||||||
"rI" ((u32) (bh)), \
|
|
||||||
"r" ((u32) (al)), \
|
|
||||||
"rI" ((u32) (bl)))
|
|
||||||
#define umul_ppmm(xh, xl, a, b) \
|
|
||||||
{register u32 __t0, __t1, __t2; \
|
|
||||||
__asm__ ("%@ Inlined umul_ppmm \n\
|
|
||||||
mov %2, %5, lsr #16 \n\
|
|
||||||
mov %0, %6, lsr #16 \n\
|
|
||||||
bic %3, %5, %2, lsl #16 \n\
|
|
||||||
bic %4, %6, %0, lsl #16 \n\
|
|
||||||
mul %1, %3, %4 \n\
|
|
||||||
mul %4, %2, %4 \n\
|
|
||||||
mul %3, %0, %3 \n\
|
|
||||||
mul %0, %2, %0 \n\
|
|
||||||
adds %3, %4, %3 \n\
|
|
||||||
addcs %0, %0, #65536 \n\
|
|
||||||
adds %1, %1, %3, lsl #16 \n\
|
|
||||||
adc %0, %0, %3, lsr #16" \
|
|
||||||
: "=&r" ((u32) (xh)), \
|
|
||||||
"=r" ((u32) (xl)), \
|
|
||||||
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
|
|
||||||
: "r" ((u32) (a)), \
|
|
||||||
"r" ((u32) (b)));}
|
|
||||||
#define UMUL_TIME 20
|
|
||||||
#define UDIV_TIME 100
|
|
||||||
#endif /* __arm__ */
|
|
||||||
|
|
||||||
#define __umulsidi3(u, v) \
|
|
||||||
({DIunion __w; \
|
|
||||||
umul_ppmm (__w.s.high, __w.s.low, u, v); \
|
|
||||||
__w.ll; })
|
|
||||||
|
|
||||||
#define __udiv_qrnnd_c(q, r, n1, n0, d) \
|
|
||||||
do { \
|
|
||||||
u32 __d1, __d0, __q1, __q0; \
|
|
||||||
u32 __r1, __r0, __m; \
|
|
||||||
__d1 = __ll_highpart (d); \
|
|
||||||
__d0 = __ll_lowpart (d); \
|
|
||||||
\
|
|
||||||
__r1 = (n1) % __d1; \
|
|
||||||
__q1 = (n1) / __d1; \
|
|
||||||
__m = (u32) __q1 * __d0; \
|
|
||||||
__r1 = __r1 * __ll_B | __ll_highpart (n0); \
|
|
||||||
if (__r1 < __m) \
|
|
||||||
{ \
|
|
||||||
__q1--, __r1 += (d); \
|
|
||||||
if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
|
|
||||||
if (__r1 < __m) \
|
|
||||||
__q1--, __r1 += (d); \
|
|
||||||
} \
|
|
||||||
__r1 -= __m; \
|
|
||||||
\
|
|
||||||
__r0 = __r1 % __d1; \
|
|
||||||
__q0 = __r1 / __d1; \
|
|
||||||
__m = (u32) __q0 * __d0; \
|
|
||||||
__r0 = __r0 * __ll_B | __ll_lowpart (n0); \
|
|
||||||
if (__r0 < __m) \
|
|
||||||
{ \
|
|
||||||
__q0--, __r0 += (d); \
|
|
||||||
if (__r0 >= (d)) \
|
|
||||||
if (__r0 < __m) \
|
|
||||||
__q0--, __r0 += (d); \
|
|
||||||
} \
|
|
||||||
__r0 -= __m; \
|
|
||||||
\
|
|
||||||
(q) = (u32) __q1 * __ll_B | __q0; \
|
|
||||||
(r) = __r0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define UDIV_NEEDS_NORMALIZATION 1
|
|
||||||
#define udiv_qrnnd __udiv_qrnnd_c
|
|
||||||
|
|
||||||
#define count_leading_zeros(count, x) \
|
|
||||||
do { \
|
|
||||||
u32 __xr = (x); \
|
|
||||||
u32 __a; \
|
|
||||||
\
|
|
||||||
if (SI_TYPE_SIZE <= 32) \
|
|
||||||
{ \
|
|
||||||
__a = __xr < ((u32)1<<2*__BITS4) \
|
|
||||||
? (__xr < ((u32)1<<__BITS4) ? 0 : __BITS4) \
|
|
||||||
: (__xr < ((u32)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8) \
|
|
||||||
if (((__xr >> __a) & 0xff) != 0) \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
(count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
|
|
||||||
} while (0)
|
|
|
@ -1,222 +0,0 @@
|
||||||
/* More subroutines needed by GCC output code on some machines. */
|
|
||||||
/* Compile this one with gcc. */
|
|
||||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file is part of GNU CC.
|
|
||||||
|
|
||||||
GNU CC is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
any later version.
|
|
||||||
|
|
||||||
GNU CC is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with GNU CC; see the file COPYING. If not, write to
|
|
||||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
/* As a special exception, if you link this library with other files,
|
|
||||||
some of which are compiled with GCC, to produce an executable,
|
|
||||||
this library does not by itself cause the resulting executable
|
|
||||||
to be covered by the GNU General Public License.
|
|
||||||
This exception does not however invalidate any other reasons why
|
|
||||||
the executable file might be covered by the GNU General Public License.
|
|
||||||
*/
|
|
||||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
|
||||||
/* I Molton 29/07/01 */
|
|
||||||
|
|
||||||
#include "gcclib.h"
|
|
||||||
#include "longlong.h"
|
|
||||||
|
|
||||||
static const u8 __clz_tab[] = {
|
|
||||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
u64 __udivmoddi4(u64 n, u64 d, u64 * rp)
|
|
||||||
{
|
|
||||||
DIunion ww;
|
|
||||||
DIunion nn, dd;
|
|
||||||
DIunion rr;
|
|
||||||
u32 d0, d1, n0, n1, n2;
|
|
||||||
u32 q0, q1;
|
|
||||||
u32 b, bm;
|
|
||||||
|
|
||||||
nn.ll = n;
|
|
||||||
dd.ll = d;
|
|
||||||
|
|
||||||
d0 = dd.s.low;
|
|
||||||
d1 = dd.s.high;
|
|
||||||
n0 = nn.s.low;
|
|
||||||
n1 = nn.s.high;
|
|
||||||
|
|
||||||
if (d1 == 0) {
|
|
||||||
if (d0 > n1) {
|
|
||||||
/* 0q = nn / 0D */
|
|
||||||
|
|
||||||
count_leading_zeros(bm, d0);
|
|
||||||
|
|
||||||
if (bm != 0) {
|
|
||||||
/* Normalize, i.e. make the most significant bit of the
|
|
||||||
denominator set. */
|
|
||||||
|
|
||||||
d0 = d0 << bm;
|
|
||||||
n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
|
|
||||||
n0 = n0 << bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
udiv_qrnnd(q0, n0, n1, n0, d0);
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
/* Remainder in n0 >> bm. */
|
|
||||||
} else {
|
|
||||||
/* qq = NN / 0d */
|
|
||||||
|
|
||||||
if (d0 == 0)
|
|
||||||
d0 = 1 / d0; /* Divide intentionally by zero. */
|
|
||||||
|
|
||||||
count_leading_zeros(bm, d0);
|
|
||||||
|
|
||||||
if (bm == 0) {
|
|
||||||
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
|
|
||||||
conclude (the most significant bit of n1 is set) /\ (the
|
|
||||||
leading quotient digit q1 = 1).
|
|
||||||
|
|
||||||
This special case is necessary, not an optimization.
|
|
||||||
(Shifts counts of SI_TYPE_SIZE are undefined.) */
|
|
||||||
|
|
||||||
n1 -= d0;
|
|
||||||
q1 = 1;
|
|
||||||
} else {
|
|
||||||
/* Normalize. */
|
|
||||||
|
|
||||||
b = SI_TYPE_SIZE - bm;
|
|
||||||
|
|
||||||
d0 = d0 << bm;
|
|
||||||
n2 = n1 >> b;
|
|
||||||
n1 = (n1 << bm) | (n0 >> b);
|
|
||||||
n0 = n0 << bm;
|
|
||||||
|
|
||||||
udiv_qrnnd(q1, n1, n2, n1, d0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* n1 != d0... */
|
|
||||||
|
|
||||||
udiv_qrnnd(q0, n0, n1, n0, d0);
|
|
||||||
|
|
||||||
/* Remainder in n0 >> bm. */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rp != 0) {
|
|
||||||
rr.s.low = n0 >> bm;
|
|
||||||
rr.s.high = 0;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (d1 > n1) {
|
|
||||||
/* 00 = nn / DD */
|
|
||||||
|
|
||||||
q0 = 0;
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
/* Remainder in n1n0. */
|
|
||||||
if (rp != 0) {
|
|
||||||
rr.s.low = n0;
|
|
||||||
rr.s.high = n1;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* 0q = NN / dd */
|
|
||||||
|
|
||||||
count_leading_zeros(bm, d1);
|
|
||||||
if (bm == 0) {
|
|
||||||
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
|
|
||||||
conclude (the most significant bit of n1 is set) /\ (the
|
|
||||||
quotient digit q0 = 0 or 1).
|
|
||||||
|
|
||||||
This special case is necessary, not an optimization. */
|
|
||||||
|
|
||||||
/* The condition on the next line takes advantage of that
|
|
||||||
n1 >= d1 (true due to program flow). */
|
|
||||||
if (n1 > d1 || n0 >= d0) {
|
|
||||||
q0 = 1;
|
|
||||||
sub_ddmmss(n1, n0, n1, n0, d1, d0);
|
|
||||||
} else
|
|
||||||
q0 = 0;
|
|
||||||
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
if (rp != 0) {
|
|
||||||
rr.s.low = n0;
|
|
||||||
rr.s.high = n1;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
u32 m1, m0;
|
|
||||||
/* Normalize. */
|
|
||||||
|
|
||||||
b = SI_TYPE_SIZE - bm;
|
|
||||||
|
|
||||||
d1 = (d1 << bm) | (d0 >> b);
|
|
||||||
d0 = d0 << bm;
|
|
||||||
n2 = n1 >> b;
|
|
||||||
n1 = (n1 << bm) | (n0 >> b);
|
|
||||||
n0 = n0 << bm;
|
|
||||||
|
|
||||||
udiv_qrnnd(q0, n1, n2, n1, d1);
|
|
||||||
umul_ppmm(m1, m0, q0, d0);
|
|
||||||
|
|
||||||
if (m1 > n1 || (m1 == n1 && m0 > n0)) {
|
|
||||||
q0--;
|
|
||||||
sub_ddmmss(m1, m0, m1, m0, d1, d0);
|
|
||||||
}
|
|
||||||
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
/* Remainder in (n1n0 - m1m0) >> bm. */
|
|
||||||
if (rp != 0) {
|
|
||||||
sub_ddmmss(n1, n0, n1, n0, m1, m0);
|
|
||||||
rr.s.low = (n1 << b) | (n0 >> bm);
|
|
||||||
rr.s.high = n1 >> bm;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ww.s.low = q0;
|
|
||||||
ww.s.high = q1;
|
|
||||||
return ww.ll;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 __udivdi3(u64 n, u64 d)
|
|
||||||
{
|
|
||||||
return __udivmoddi4(n, d, (u64 *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 __umoddi3(u64 u, u64 v)
|
|
||||||
{
|
|
||||||
u64 w;
|
|
||||||
|
|
||||||
(void)__udivmoddi4(u, v, &w);
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
|
@ -0,0 +1 @@
|
||||||
|
zreladdr-y := 0xf0008000
|
|
@ -128,8 +128,8 @@ aaec2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction aaec2000_timer_irq = {
|
static struct irqaction aaec2000_timer_irq = {
|
||||||
.name = "AAEC-2000 Timer Tick",
|
.name = "AAEC-2000 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = aaec2000_timer_interrupt
|
.handler = aaec2000_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init aaec2000_timer_init(void)
|
static void __init aaec2000_timer_init(void)
|
||||||
|
|
|
@ -28,7 +28,7 @@ config ARCH_CLEP7312
|
||||||
config ARCH_EDB7211
|
config ARCH_EDB7211
|
||||||
bool "EDB7211"
|
bool "EDB7211"
|
||||||
select ISA
|
select ISA
|
||||||
select DISCONTIGMEM
|
select ARCH_DISCONTIGMEM_ENABLE
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
||||||
evaluation board.
|
evaluation board.
|
||||||
|
|
|
@ -57,8 +57,8 @@ p720t_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction clps711x_timer_irq = {
|
static struct irqaction clps711x_timer_irq = {
|
||||||
.name = "CLPS711x Timer Tick",
|
.name = "CLPS711x Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = p720t_timer_interrupt
|
.handler = p720t_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init clps711x_timer_init(void)
|
static void __init clps711x_timer_init(void)
|
||||||
|
|
|
@ -298,8 +298,8 @@ clps7500_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction clps7500_timer_irq = {
|
static struct irqaction clps7500_timer_irq = {
|
||||||
.name = "CLPS7500 Timer Tick",
|
.name = "CLPS7500 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = clps7500_timer_interrupt
|
.handler = clps7500_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -173,8 +173,8 @@ ebsa110_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction ebsa110_timer_irq = {
|
static struct irqaction ebsa110_timer_irq = {
|
||||||
.name = "EBSA110 Timer Tick",
|
.name = "EBSA110 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = ebsa110_timer_interrupt
|
.handler = ebsa110_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -56,8 +56,8 @@ epxa10db_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction epxa10db_timer_irq = {
|
static struct irqaction epxa10db_timer_irq = {
|
||||||
.name = "Excalibur Timer Tick",
|
.name = "Excalibur Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = epxa10db_timer_interrupt
|
.handler = epxa10db_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -43,7 +43,7 @@ timer1_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction footbridge_timer_irq = {
|
static struct irqaction footbridge_timer_irq = {
|
||||||
.name = "Timer1 timer tick",
|
.name = "Timer1 timer tick",
|
||||||
.handler = timer1_interrupt,
|
.handler = timer1_interrupt,
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -72,7 +72,7 @@ isa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction isa_timer_irq = {
|
static struct irqaction isa_timer_irq = {
|
||||||
.name = "ISA timer tick",
|
.name = "ISA timer tick",
|
||||||
.handler = isa_timer_interrupt,
|
.handler = isa_timer_interrupt,
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init isa_timer_init(void)
|
static void __init isa_timer_init(void)
|
||||||
|
|
|
@ -41,8 +41,8 @@ h7201_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction h7201_timer_irq = {
|
static struct irqaction h7201_timer_irq = {
|
||||||
.name = "h7201 Timer Tick",
|
.name = "h7201 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = h7201_timer_interrupt
|
.handler = h7201_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -171,8 +171,8 @@ static struct irqchip h7202_timerx_chip = {
|
||||||
|
|
||||||
static struct irqaction h7202_timer_irq = {
|
static struct irqaction h7202_timer_irq = {
|
||||||
.name = "h7202 Timer Tick",
|
.name = "h7202 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = h7202_timer_interrupt
|
.handler = h7202_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -72,8 +72,8 @@ imx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction imx_timer_irq = {
|
static struct irqaction imx_timer_irq = {
|
||||||
.name = "i.MX Timer Tick",
|
.name = "i.MX Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = imx_timer_interrupt
|
.handler = imx_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/hardware/amba.h>
|
#include <asm/hardware/amba.h>
|
||||||
|
#include <asm/hardware/arm_timer.h>
|
||||||
#include <asm/arch/cm.h>
|
#include <asm/arch/cm.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/leds.h>
|
#include <asm/leds.h>
|
||||||
|
@ -156,16 +157,6 @@ EXPORT_SYMBOL(cm_control);
|
||||||
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
|
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* What does it look like?
|
|
||||||
*/
|
|
||||||
typedef struct TimerStruct {
|
|
||||||
unsigned long TimerLoad;
|
|
||||||
unsigned long TimerValue;
|
|
||||||
unsigned long TimerControl;
|
|
||||||
unsigned long TimerClear;
|
|
||||||
} TimerStruct_t;
|
|
||||||
|
|
||||||
static unsigned long timer_reload;
|
static unsigned long timer_reload;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -174,7 +165,6 @@ static unsigned long timer_reload;
|
||||||
*/
|
*/
|
||||||
unsigned long integrator_gettimeoffset(void)
|
unsigned long integrator_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
volatile TimerStruct_t *timer1 = (TimerStruct_t *)TIMER1_VA_BASE;
|
|
||||||
unsigned long ticks1, ticks2, status;
|
unsigned long ticks1, ticks2, status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -183,11 +173,11 @@ unsigned long integrator_gettimeoffset(void)
|
||||||
* an interrupt. We get around this by ensuring that the
|
* an interrupt. We get around this by ensuring that the
|
||||||
* counter has not reloaded between our two reads.
|
* counter has not reloaded between our two reads.
|
||||||
*/
|
*/
|
||||||
ticks2 = timer1->TimerValue & 0xffff;
|
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
|
||||||
do {
|
do {
|
||||||
ticks1 = ticks2;
|
ticks1 = ticks2;
|
||||||
status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
|
status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
|
||||||
ticks2 = timer1->TimerValue & 0xffff;
|
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
|
||||||
} while (ticks2 > ticks1);
|
} while (ticks2 > ticks1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -213,14 +203,12 @@ unsigned long integrator_gettimeoffset(void)
|
||||||
static irqreturn_t
|
static irqreturn_t
|
||||||
integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE;
|
|
||||||
|
|
||||||
write_seqlock(&xtime_lock);
|
write_seqlock(&xtime_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* clear the interrupt
|
* clear the interrupt
|
||||||
*/
|
*/
|
||||||
timer1->TimerClear = 1;
|
writel(1, TIMER1_VA_BASE + TIMER_INTCLR);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the clock tick routines are only processed on the
|
* the clock tick routines are only processed on the
|
||||||
|
@ -247,8 +235,8 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction integrator_timer_irq = {
|
static struct irqaction integrator_timer_irq = {
|
||||||
.name = "Integrator Timer Tick",
|
.name = "Integrator Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = integrator_timer_interrupt
|
.handler = integrator_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -256,32 +244,29 @@ static struct irqaction integrator_timer_irq = {
|
||||||
*/
|
*/
|
||||||
void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
||||||
{
|
{
|
||||||
volatile TimerStruct_t *timer0 = (volatile TimerStruct_t *)TIMER0_VA_BASE;
|
unsigned int timer_ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
|
||||||
volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE;
|
|
||||||
volatile TimerStruct_t *timer2 = (volatile TimerStruct_t *)TIMER2_VA_BASE;
|
|
||||||
unsigned int timer_ctrl = 0x80 | 0x40; /* periodic */
|
|
||||||
|
|
||||||
timer_reload = reload;
|
timer_reload = reload;
|
||||||
timer_ctrl |= ctrl;
|
timer_ctrl |= ctrl;
|
||||||
|
|
||||||
if (timer_reload > 0x100000) {
|
if (timer_reload > 0x100000) {
|
||||||
timer_reload >>= 8;
|
timer_reload >>= 8;
|
||||||
timer_ctrl |= 0x08; /* /256 */
|
timer_ctrl |= TIMER_CTRL_DIV256;
|
||||||
} else if (timer_reload > 0x010000) {
|
} else if (timer_reload > 0x010000) {
|
||||||
timer_reload >>= 4;
|
timer_reload >>= 4;
|
||||||
timer_ctrl |= 0x04; /* /16 */
|
timer_ctrl |= TIMER_CTRL_DIV16;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise to a known state (all timers off)
|
* Initialise to a known state (all timers off)
|
||||||
*/
|
*/
|
||||||
timer0->TimerControl = 0;
|
writel(0, TIMER0_VA_BASE + TIMER_CTRL);
|
||||||
timer1->TimerControl = 0;
|
writel(0, TIMER1_VA_BASE + TIMER_CTRL);
|
||||||
timer2->TimerControl = 0;
|
writel(0, TIMER2_VA_BASE + TIMER_CTRL);
|
||||||
|
|
||||||
timer1->TimerLoad = timer_reload;
|
writel(timer_reload, TIMER1_VA_BASE + TIMER_LOAD);
|
||||||
timer1->TimerValue = timer_reload;
|
writel(timer_reload, TIMER1_VA_BASE + TIMER_VALUE);
|
||||||
timer1->TimerControl = timer_ctrl;
|
writel(timer_ctrl, TIMER1_VA_BASE + TIMER_CTRL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make irqs happen for the system timer
|
* Make irqs happen for the system timer
|
||||||
|
|
|
@ -86,7 +86,7 @@ iop321_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction iop321_timer_irq = {
|
static struct irqaction iop321_timer_irq = {
|
||||||
.name = "IOP321 Timer Tick",
|
.name = "IOP321 Timer Tick",
|
||||||
.handler = iop321_timer_interrupt,
|
.handler = iop321_timer_interrupt,
|
||||||
.flags = SA_INTERRUPT
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init iop321_timer_init(void)
|
static void __init iop321_timer_init(void)
|
||||||
|
|
|
@ -83,7 +83,7 @@ iop331_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction iop331_timer_irq = {
|
static struct irqaction iop331_timer_irq = {
|
||||||
.name = "IOP331 Timer Tick",
|
.name = "IOP331 Timer Tick",
|
||||||
.handler = iop331_timer_interrupt,
|
.handler = iop331_timer_interrupt,
|
||||||
.flags = SA_INTERRUPT
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init iop331_timer_init(void)
|
static void __init iop331_timer_init(void)
|
||||||
|
|
|
@ -54,6 +54,14 @@ config ARCH_IXDP2X01
|
||||||
depends on ARCH_IXDP2401 || ARCH_IXDP2801
|
depends on ARCH_IXDP2401 || ARCH_IXDP2801
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config IXP2000_SUPPORT_BROKEN_PCI_IO
|
||||||
|
bool "Support broken PCI I/O on older IXP2000s"
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
Say 'N' here if you only intend to run your kernel on an
|
||||||
|
IXP2000 B0 or later model and do not need the PCI I/O
|
||||||
|
byteswap workaround. Say 'Y' otherwise.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(ixp2000_slowport_lock);
|
static DEFINE_SPINLOCK(ixp2000_slowport_lock);
|
||||||
static unsigned long ixp2000_slowport_irq_flags;
|
static unsigned long ixp2000_slowport_irq_flags;
|
||||||
|
|
||||||
|
@ -100,6 +102,11 @@ static struct map_desc ixp2000_io_desc[] __initdata = {
|
||||||
.physical = IXP2000_PCI_CSR_PHYS_BASE,
|
.physical = IXP2000_PCI_CSR_PHYS_BASE,
|
||||||
.length = IXP2000_PCI_CSR_SIZE,
|
.length = IXP2000_PCI_CSR_SIZE,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE
|
||||||
|
}, {
|
||||||
|
.virtual = IXP2000_MSF_VIRT_BASE,
|
||||||
|
.physical = IXP2000_MSF_PHYS_BASE,
|
||||||
|
.length = IXP2000_MSF_SIZE,
|
||||||
|
.type = MT_DEVICE
|
||||||
}, {
|
}, {
|
||||||
.virtual = IXP2000_PCI_IO_VIRT_BASE,
|
.virtual = IXP2000_PCI_IO_VIRT_BASE,
|
||||||
.physical = IXP2000_PCI_IO_PHYS_BASE,
|
.physical = IXP2000_PCI_IO_PHYS_BASE,
|
||||||
|
@ -179,7 +186,7 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
/* clear timer 1 */
|
/* clear timer 1 */
|
||||||
ixp2000_reg_write(IXP2000_T1_CLR, 1);
|
ixp2000_reg_write(IXP2000_T1_CLR, 1);
|
||||||
|
|
||||||
while ((next_jiffy_time - *missing_jiffy_timer_csr) > ticks_per_jiffy) {
|
while ((next_jiffy_time - *missing_jiffy_timer_csr) > ticks_per_jiffy) {
|
||||||
timer_tick(regs);
|
timer_tick(regs);
|
||||||
next_jiffy_time -= ticks_per_jiffy;
|
next_jiffy_time -= ticks_per_jiffy;
|
||||||
|
@ -192,8 +199,8 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction ixp2000_timer_irq = {
|
static struct irqaction ixp2000_timer_irq = {
|
||||||
.name = "IXP2000 Timer Tick",
|
.name = "IXP2000 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = ixp2000_timer_interrupt
|
.handler = ixp2000_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init ixp2000_init_time(unsigned long tick_rate)
|
void __init ixp2000_init_time(unsigned long tick_rate)
|
||||||
|
@ -238,35 +245,40 @@ void __init ixp2000_init_time(unsigned long tick_rate)
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GPIO helpers
|
* GPIO helpers
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
static unsigned long GPIO_IRQ_rising_edge;
|
|
||||||
static unsigned long GPIO_IRQ_falling_edge;
|
static unsigned long GPIO_IRQ_falling_edge;
|
||||||
|
static unsigned long GPIO_IRQ_rising_edge;
|
||||||
static unsigned long GPIO_IRQ_level_low;
|
static unsigned long GPIO_IRQ_level_low;
|
||||||
static unsigned long GPIO_IRQ_level_high;
|
static unsigned long GPIO_IRQ_level_high;
|
||||||
|
|
||||||
void gpio_line_config(int line, int style)
|
static void update_gpio_int_csrs(void)
|
||||||
|
{
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_FEDR, GPIO_IRQ_falling_edge);
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_REDR, GPIO_IRQ_rising_edge);
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_LSLR, GPIO_IRQ_level_low);
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_LSHR, GPIO_IRQ_level_high);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gpio_line_config(int line, int direction)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
|
if (direction == GPIO_OUT) {
|
||||||
|
irq_desc[line + IRQ_IXP2000_GPIO0].valid = 0;
|
||||||
|
|
||||||
if(style == GPIO_OUT) {
|
|
||||||
/* if it's an output, it ain't an interrupt anymore */
|
/* if it's an output, it ain't an interrupt anymore */
|
||||||
ixp2000_reg_write(IXP2000_GPIO_PDSR, (1 << line));
|
|
||||||
GPIO_IRQ_falling_edge &= ~(1 << line);
|
GPIO_IRQ_falling_edge &= ~(1 << line);
|
||||||
GPIO_IRQ_rising_edge &= ~(1 << line);
|
GPIO_IRQ_rising_edge &= ~(1 << line);
|
||||||
GPIO_IRQ_level_low &= ~(1 << line);
|
GPIO_IRQ_level_low &= ~(1 << line);
|
||||||
GPIO_IRQ_level_high &= ~(1 << line);
|
GPIO_IRQ_level_high &= ~(1 << line);
|
||||||
ixp2000_reg_write(IXP2000_GPIO_FEDR, GPIO_IRQ_falling_edge);
|
update_gpio_int_csrs();
|
||||||
ixp2000_reg_write(IXP2000_GPIO_REDR, GPIO_IRQ_rising_edge);
|
|
||||||
ixp2000_reg_write(IXP2000_GPIO_LSHR, GPIO_IRQ_level_high);
|
ixp2000_reg_write(IXP2000_GPIO_PDSR, 1 << line);
|
||||||
ixp2000_reg_write(IXP2000_GPIO_LSLR, GPIO_IRQ_level_low);
|
} else if (direction == GPIO_IN) {
|
||||||
irq_desc[line+IRQ_IXP2000_GPIO0].valid = 0;
|
ixp2000_reg_write(IXP2000_GPIO_PDCR, 1 << line);
|
||||||
} else if(style == GPIO_IN) {
|
|
||||||
ixp2000_reg_write(IXP2000_GPIO_PDCR, (1 << line));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -285,9 +297,50 @@ static void ixp2000_GPIO_irq_handler(unsigned int irq, struct irqdesc *desc, str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ixp2000_GPIO_irq_type(unsigned int irq, unsigned int type)
|
||||||
|
{
|
||||||
|
int line = irq - IRQ_IXP2000_GPIO0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First, configure this GPIO line as an input.
|
||||||
|
*/
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_PDCR, 1 << line);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Then, set the proper trigger type.
|
||||||
|
*/
|
||||||
|
if (type & IRQT_FALLING)
|
||||||
|
GPIO_IRQ_falling_edge |= 1 << line;
|
||||||
|
else
|
||||||
|
GPIO_IRQ_falling_edge &= ~(1 << line);
|
||||||
|
if (type & IRQT_RISING)
|
||||||
|
GPIO_IRQ_rising_edge |= 1 << line;
|
||||||
|
else
|
||||||
|
GPIO_IRQ_rising_edge &= ~(1 << line);
|
||||||
|
if (type & IRQT_LOW)
|
||||||
|
GPIO_IRQ_level_low |= 1 << line;
|
||||||
|
else
|
||||||
|
GPIO_IRQ_level_low &= ~(1 << line);
|
||||||
|
if (type & IRQT_HIGH)
|
||||||
|
GPIO_IRQ_level_high |= 1 << line;
|
||||||
|
else
|
||||||
|
GPIO_IRQ_level_high &= ~(1 << line);
|
||||||
|
update_gpio_int_csrs();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finally, mark the corresponding IRQ as valid.
|
||||||
|
*/
|
||||||
|
irq_desc[irq].valid = 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void ixp2000_GPIO_irq_mask_ack(unsigned int irq)
|
static void ixp2000_GPIO_irq_mask_ack(unsigned int irq)
|
||||||
{
|
{
|
||||||
ixp2000_reg_write(IXP2000_GPIO_INCR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
ixp2000_reg_write(IXP2000_GPIO_INCR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||||
|
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_EDSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||||
|
ixp2000_reg_write(IXP2000_GPIO_LDSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||||
ixp2000_reg_write(IXP2000_GPIO_INST, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
ixp2000_reg_write(IXP2000_GPIO_INST, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,6 +355,7 @@ static void ixp2000_GPIO_irq_unmask(unsigned int irq)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip ixp2000_GPIO_irq_chip = {
|
static struct irqchip ixp2000_GPIO_irq_chip = {
|
||||||
|
.type = ixp2000_GPIO_irq_type,
|
||||||
.ack = ixp2000_GPIO_irq_mask_ack,
|
.ack = ixp2000_GPIO_irq_mask_ack,
|
||||||
.mask = ixp2000_GPIO_irq_mask,
|
.mask = ixp2000_GPIO_irq_mask,
|
||||||
.unmask = ixp2000_GPIO_irq_unmask
|
.unmask = ixp2000_GPIO_irq_unmask
|
||||||
|
@ -338,7 +392,7 @@ static void ixp2000_irq_mask(unsigned int irq)
|
||||||
|
|
||||||
static void ixp2000_irq_unmask(unsigned int irq)
|
static void ixp2000_irq_unmask(unsigned int irq)
|
||||||
{
|
{
|
||||||
ixp2000_reg_write(IXP2000_IRQ_ENABLE_SET, (1 << irq));
|
ixp2000_reg_write(IXP2000_IRQ_ENABLE_SET, (1 << irq));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irqchip ixp2000_irq_chip = {
|
static struct irqchip ixp2000_irq_chip = {
|
||||||
|
@ -375,16 +429,16 @@ void __init ixp2000_init_irq(void)
|
||||||
* our mask/unmask code much simpler.
|
* our mask/unmask code much simpler.
|
||||||
*/
|
*/
|
||||||
for (irq = IRQ_IXP2000_SOFT_INT; irq <= IRQ_IXP2000_THDB3; irq++) {
|
for (irq = IRQ_IXP2000_SOFT_INT; irq <= IRQ_IXP2000_THDB3; irq++) {
|
||||||
if((1 << irq) & IXP2000_VALID_IRQ_MASK) {
|
if ((1 << irq) & IXP2000_VALID_IRQ_MASK) {
|
||||||
set_irq_chip(irq, &ixp2000_irq_chip);
|
set_irq_chip(irq, &ixp2000_irq_chip);
|
||||||
set_irq_handler(irq, do_level_IRQ);
|
set_irq_handler(irq, do_level_IRQ);
|
||||||
set_irq_flags(irq, IRQF_VALID);
|
set_irq_flags(irq, IRQF_VALID);
|
||||||
} else set_irq_flags(irq, 0);
|
} else set_irq_flags(irq, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIO IRQs are invalid until someone sets the interrupt mode
|
* GPIO IRQs are invalid until someone sets the interrupt mode
|
||||||
* by calling gpio_line_set();
|
* by calling set_irq_type().
|
||||||
*/
|
*/
|
||||||
for (irq = IRQ_IXP2000_GPIO0; irq <= IRQ_IXP2000_GPIO7; irq++) {
|
for (irq = IRQ_IXP2000_GPIO0; irq <= IRQ_IXP2000_GPIO7; irq++) {
|
||||||
set_irq_chip(irq, &ixp2000_GPIO_irq_chip);
|
set_irq_chip(irq, &ixp2000_GPIO_irq_chip);
|
||||||
|
|
|
@ -197,8 +197,23 @@ static struct platform_device enp2611_flash = {
|
||||||
.resource = &enp2611_flash_resource,
|
.resource = &enp2611_flash_resource,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct ixp2000_i2c_pins enp2611_i2c_gpio_pins = {
|
||||||
|
.sda_pin = ENP2611_GPIO_SDA,
|
||||||
|
.scl_pin = ENP2611_GPIO_SCL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device enp2611_i2c_controller = {
|
||||||
|
.name = "IXP2000-I2C",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &enp2611_i2c_gpio_pins
|
||||||
|
},
|
||||||
|
.num_resources = 0
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *enp2611_devices[] __initdata = {
|
static struct platform_device *enp2611_devices[] __initdata = {
|
||||||
&enp2611_flash
|
&enp2611_flash,
|
||||||
|
&enp2611_i2c_controller
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init enp2611_init_machine(void)
|
static void __init enp2611_init_machine(void)
|
||||||
|
|
|
@ -42,12 +42,6 @@
|
||||||
#include <asm/mach/flash.h>
|
#include <asm/mach/flash.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
||||||
|
|
||||||
void ixdp2400_init_irq(void)
|
|
||||||
{
|
|
||||||
ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2400_NR_IRQS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* IXDP2800 timer tick
|
* IXDP2800 timer tick
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
|
@ -42,6 +42,9 @@
|
||||||
#include <asm/mach/flash.h>
|
#include <asm/mach/flash.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* IXDP2x00 IRQ Initialization
|
* IXDP2x00 IRQ Initialization
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
|
@ -198,6 +198,19 @@ clear_master_aborts(void)
|
||||||
void __init
|
void __init
|
||||||
ixp2000_pci_preinit(void)
|
ixp2000_pci_preinit(void)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO
|
||||||
|
/*
|
||||||
|
* Configure the PCI unit to properly byteswap I/O transactions,
|
||||||
|
* and verify that it worked.
|
||||||
|
*/
|
||||||
|
ixp2000_reg_write(IXP2000_PCI_CONTROL,
|
||||||
|
(*IXP2000_PCI_CONTROL | PCI_CONTROL_IEE));
|
||||||
|
|
||||||
|
if ((*IXP2000_PCI_CONTROL & PCI_CONTROL_IEE) == 0)
|
||||||
|
panic("IXP2000: PCI I/O is broken on this ixp model, and "
|
||||||
|
"the needed workaround has not been configured in");
|
||||||
|
#endif
|
||||||
|
|
||||||
hook_fault_code(16+6, ixp2000_pci_abort_handler, SIGBUS,
|
hook_fault_code(16+6, ixp2000_pci_abort_handler, SIGBUS,
|
||||||
"PCI config cycle to non-existent device");
|
"PCI config cycle to non-existent device");
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,7 +141,15 @@ static struct map_desc ixp4xx_io_desc[] __initdata = {
|
||||||
.physical = IXP4XX_PCI_CFG_BASE_PHYS,
|
.physical = IXP4XX_PCI_CFG_BASE_PHYS,
|
||||||
.length = IXP4XX_PCI_CFG_REGION_SIZE,
|
.length = IXP4XX_PCI_CFG_REGION_SIZE,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE
|
||||||
|
},
|
||||||
|
#ifdef CONFIG_DEBUG_LL
|
||||||
|
{ /* Debug UART mapping */
|
||||||
|
.virtual = IXP4XX_DEBUG_UART_BASE_VIRT,
|
||||||
|
.physical = IXP4XX_DEBUG_UART_BASE_PHYS,
|
||||||
|
.length = IXP4XX_DEBUG_UART_REGION_SIZE,
|
||||||
|
.type = MT_DEVICE
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init ixp4xx_map_io(void)
|
void __init ixp4xx_map_io(void)
|
||||||
|
@ -290,8 +298,8 @@ static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs
|
||||||
|
|
||||||
static struct irqaction ixp4xx_timer_irq = {
|
static struct irqaction ixp4xx_timer_irq = {
|
||||||
.name = "IXP4xx Timer Tick",
|
.name = "IXP4xx Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = ixp4xx_timer_interrupt
|
.handler = ixp4xx_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init ixp4xx_timer_init(void)
|
static void __init ixp4xx_timer_init(void)
|
||||||
|
|
|
@ -53,8 +53,8 @@ lh7a40x_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction lh7a40x_timer_irq = {
|
static struct irqaction lh7a40x_timer_irq = {
|
||||||
.name = "LHA740x Timer Tick",
|
.name = "LHA740x Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = lh7a40x_timer_interrupt
|
.handler = lh7a40x_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init lh7a40x_timer_init(void)
|
static void __init lh7a40x_timer_init(void)
|
||||||
|
|
|
@ -41,7 +41,9 @@
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <asm/mach/time.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
#include <asm/arch/omap16xx.h>
|
#include <asm/arch/omap16xx.h>
|
||||||
#include <asm/arch/pm.h>
|
#include <asm/arch/pm.h>
|
||||||
#include <asm/arch/mux.h>
|
#include <asm/arch/mux.h>
|
||||||
|
@ -80,13 +82,13 @@ void omap_pm_idle(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mask32 = omap_readl(ARM_SYSST);
|
mask32 = omap_readl(ARM_SYSST);
|
||||||
local_fiq_enable();
|
|
||||||
local_irq_enable();
|
|
||||||
|
|
||||||
#if defined(CONFIG_OMAP_32K_TIMER) && defined(CONFIG_NO_IDLE_HZ)
|
/*
|
||||||
/* Override timer to use VST for the next cycle */
|
* Since an interrupt may set up a timer, we don't want to
|
||||||
omap_32k_timer_next_vst_interrupt();
|
* reprogram the hardware timer with interrupts enabled.
|
||||||
#endif
|
* Re-enable interrupts only after returning from idle.
|
||||||
|
*/
|
||||||
|
timer_dyn_reprogram();
|
||||||
|
|
||||||
if ((mask32 & DSP_IDLE) == 0) {
|
if ((mask32 & DSP_IDLE) == 0) {
|
||||||
__asm__ volatile ("mcr p15, 0, r0, c7, c0, 4");
|
__asm__ volatile ("mcr p15, 0, r0, c7, c0, 4");
|
||||||
|
@ -102,6 +104,8 @@ void omap_pm_idle(void)
|
||||||
|
|
||||||
func_ptr();
|
func_ptr();
|
||||||
}
|
}
|
||||||
|
local_fiq_enable();
|
||||||
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* OMAP Timers
|
* OMAP Timers
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Nokia Corporation
|
* Copyright (C) 2004 Nokia Corporation
|
||||||
* Partial timer rewrite and additional VST timer support by
|
* Partial timer rewrite and additional dynamic tick timer support by
|
||||||
* Tony Lindgen <tony@atomide.com> and
|
* Tony Lindgen <tony@atomide.com> and
|
||||||
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
|
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
|
||||||
*
|
*
|
||||||
|
@ -188,8 +188,8 @@ static irqreturn_t omap_mpu_timer_interrupt(int irq, void *dev_id,
|
||||||
|
|
||||||
static struct irqaction omap_mpu_timer_irq = {
|
static struct irqaction omap_mpu_timer_irq = {
|
||||||
.name = "mpu timer",
|
.name = "mpu timer",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = omap_mpu_timer_interrupt
|
.handler = omap_mpu_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned long omap_mpu_timer1_overflows;
|
static unsigned long omap_mpu_timer1_overflows;
|
||||||
|
@ -203,7 +203,7 @@ static irqreturn_t omap_mpu_timer1_interrupt(int irq, void *dev_id,
|
||||||
static struct irqaction omap_mpu_timer1_irq = {
|
static struct irqaction omap_mpu_timer1_irq = {
|
||||||
.name = "mpu timer1 overflow",
|
.name = "mpu timer1 overflow",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT,
|
||||||
.handler = omap_mpu_timer1_interrupt
|
.handler = omap_mpu_timer1_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init void omap_init_mpu_timer(void)
|
static __init void omap_init_mpu_timer(void)
|
||||||
|
@ -261,7 +261,6 @@ unsigned long long sched_clock(void)
|
||||||
* so with HZ = 100, TVR = 327.68.
|
* so with HZ = 100, TVR = 327.68.
|
||||||
*/
|
*/
|
||||||
#define OMAP_32K_TIMER_TICK_PERIOD ((32768 / HZ) - 1)
|
#define OMAP_32K_TIMER_TICK_PERIOD ((32768 / HZ) - 1)
|
||||||
#define MAX_SKIP_JIFFIES 25
|
|
||||||
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
||||||
|
|
||||||
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
|
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
|
||||||
|
@ -347,14 +346,55 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
/*
|
||||||
|
* Programs the next timer interrupt needed. Called when dynamic tick is
|
||||||
|
* enabled, and to reprogram the ticks to skip from pm_idle. Note that
|
||||||
|
* we can keep the timer continuous, and don't need to set it to run in
|
||||||
|
* one-shot mode. This is because the timer will get reprogrammed again
|
||||||
|
* after next interrupt.
|
||||||
|
*/
|
||||||
|
void omap_32k_timer_reprogram(unsigned long next_tick)
|
||||||
|
{
|
||||||
|
omap_32k_timer_start(JIFFIES_TO_HW_TICKS(next_tick, 32768) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqaction omap_32k_timer_irq;
|
||||||
|
extern struct timer_update_handler timer_update;
|
||||||
|
|
||||||
|
static int omap_32k_timer_enable_dyn_tick(void)
|
||||||
|
{
|
||||||
|
/* No need to reprogram timer, just use the next interrupt */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int omap_32k_timer_disable_dyn_tick(void)
|
||||||
|
{
|
||||||
|
omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct dyn_tick_timer omap_dyn_tick_timer = {
|
||||||
|
.enable = omap_32k_timer_enable_dyn_tick,
|
||||||
|
.disable = omap_32k_timer_disable_dyn_tick,
|
||||||
|
.reprogram = omap_32k_timer_reprogram,
|
||||||
|
.handler = omap_32k_timer_interrupt,
|
||||||
|
};
|
||||||
|
#endif /* CONFIG_NO_IDLE_HZ */
|
||||||
|
|
||||||
static struct irqaction omap_32k_timer_irq = {
|
static struct irqaction omap_32k_timer_irq = {
|
||||||
.name = "32KHz timer",
|
.name = "32KHz timer",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = omap_32k_timer_interrupt
|
.handler = omap_32k_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init void omap_init_32k_timer(void)
|
static __init void omap_init_32k_timer(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
omap_timer.dyn_tick = &omap_dyn_tick_timer;
|
||||||
|
#endif
|
||||||
|
|
||||||
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
||||||
omap_timer.offset = omap_32k_timer_gettimeoffset;
|
omap_timer.offset = omap_32k_timer_gettimeoffset;
|
||||||
omap_32k_last_tick = omap_32k_sync_timer_read();
|
omap_32k_last_tick = omap_32k_sync_timer_read();
|
||||||
|
|
|
@ -288,8 +288,8 @@ static void usb_release(struct device *dev)
|
||||||
static struct resource udc_resources[] = {
|
static struct resource udc_resources[] = {
|
||||||
/* order is significant! */
|
/* order is significant! */
|
||||||
{ /* registers */
|
{ /* registers */
|
||||||
.start = IO_ADDRESS(UDC_BASE),
|
.start = UDC_BASE,
|
||||||
.end = IO_ADDRESS(UDC_BASE + 0xff),
|
.end = UDC_BASE + 0xff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
}, { /* general IRQ */
|
}, { /* general IRQ */
|
||||||
.start = IH2_BASE + 20,
|
.start = IH2_BASE + 20,
|
||||||
|
@ -355,8 +355,8 @@ static struct platform_device ohci_device = {
|
||||||
static struct resource otg_resources[] = {
|
static struct resource otg_resources[] = {
|
||||||
/* order is significant! */
|
/* order is significant! */
|
||||||
{
|
{
|
||||||
.start = IO_ADDRESS(OTG_BASE),
|
.start = OTG_BASE,
|
||||||
.end = IO_ADDRESS(OTG_BASE + 0xff),
|
.end = OTG_BASE + 0xff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
}, {
|
}, {
|
||||||
.start = IH2_BASE + 8,
|
.start = IH2_BASE + 8,
|
||||||
|
|
|
@ -105,8 +105,8 @@ pxa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction pxa_timer_irq = {
|
static struct irqaction pxa_timer_irq = {
|
||||||
.name = "PXA Timer Tick",
|
.name = "PXA Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = pxa_timer_interrupt
|
.handler = pxa_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init pxa_timer_init(void)
|
static void __init pxa_timer_init(void)
|
||||||
|
|
|
@ -154,6 +154,11 @@ config S3C2410_PM_CHECK_CHUNKSIZE
|
||||||
the CRC data block will take more memory, but wil identify any
|
the CRC data block will take more memory, but wil identify any
|
||||||
faults with better precision.
|
faults with better precision.
|
||||||
|
|
||||||
|
config PM_SIMTEC
|
||||||
|
bool
|
||||||
|
depends on PM && (ARCH_BAST || MACH_VR1000)
|
||||||
|
default y
|
||||||
|
|
||||||
config S3C2410_LOWLEVEL_UART_PORT
|
config S3C2410_LOWLEVEL_UART_PORT
|
||||||
int "S3C2410 UART to use for low-level messages"
|
int "S3C2410 UART to use for low-level messages"
|
||||||
default 0
|
default 0
|
||||||
|
|
|
@ -18,6 +18,7 @@ obj-$(CONFIG_S3C2410_DMA) += dma.o
|
||||||
# Power Management support
|
# Power Management support
|
||||||
|
|
||||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||||
|
obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
|
||||||
|
|
||||||
# S3C2440 support
|
# S3C2440 support
|
||||||
|
|
||||||
|
|
|
@ -96,8 +96,8 @@ struct platform_device s3c_device_lcd = {
|
||||||
.num_resources = ARRAY_SIZE(s3c_lcd_resource),
|
.num_resources = ARRAY_SIZE(s3c_lcd_resource),
|
||||||
.resource = s3c_lcd_resource,
|
.resource = s3c_lcd_resource,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &s3c_device_lcd_dmamask,
|
.dma_mask = &s3c_device_lcd_dmamask,
|
||||||
.coherent_dma_mask = 0xffffffffUL
|
.coherent_dma_mask = 0xffffffffUL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,11 @@
|
||||||
* 04-Nov-2004 Ben Dooks
|
* 04-Nov-2004 Ben Dooks
|
||||||
* Fix standard IRQ wake for EINT0..4 and RTC
|
* Fix standard IRQ wake for EINT0..4 and RTC
|
||||||
*
|
*
|
||||||
* 22-Feb-2004 Ben Dooks
|
* 22-Feb-2005 Ben Dooks
|
||||||
* Fixed edge-triggering on ADC IRQ
|
* Fixed edge-triggering on ADC IRQ
|
||||||
|
*
|
||||||
|
* 28-Jun-2005 Ben Dooks
|
||||||
|
* Mark IRQ_LCD valid
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
@ -366,7 +369,6 @@ static struct irqchip s3c_irq_eint0t4 = {
|
||||||
#define INTMSK_UART1 (1UL << (IRQ_UART1 - IRQ_EINT0))
|
#define INTMSK_UART1 (1UL << (IRQ_UART1 - IRQ_EINT0))
|
||||||
#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))
|
#define INTMSK_UART2 (1UL << (IRQ_UART2 - IRQ_EINT0))
|
||||||
#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))
|
#define INTMSK_ADCPARENT (1UL << (IRQ_ADCPARENT - IRQ_EINT0))
|
||||||
#define INTMSK_LCD (1UL << (IRQ_LCD - IRQ_EINT0))
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,
|
s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,
|
||||||
|
@ -716,7 +718,6 @@ void __init s3c24xx_init_irq(void)
|
||||||
case IRQ_UART0:
|
case IRQ_UART0:
|
||||||
case IRQ_UART1:
|
case IRQ_UART1:
|
||||||
case IRQ_UART2:
|
case IRQ_UART2:
|
||||||
case IRQ_LCD:
|
|
||||||
case IRQ_ADCPARENT:
|
case IRQ_ADCPARENT:
|
||||||
set_irq_chip(irqno, &s3c_irq_level_chip);
|
set_irq_chip(irqno, &s3c_irq_level_chip);
|
||||||
set_irq_handler(irqno, do_level_IRQ);
|
set_irq_handler(irqno, do_level_IRQ);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
|
||||||
* 14-Mar-2006 BJD Updated for __iomem changes
|
* 14-Mar-2006 BJD Updated for __iomem changes
|
||||||
* 22-Jun-2006 BJD Added DM9000 platform information
|
* 22-Jun-2006 BJD Added DM9000 platform information
|
||||||
|
* 28-Jun-2006 BJD Moved pm functionality out to common code
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
@ -67,7 +68,6 @@
|
||||||
#include "devs.h"
|
#include "devs.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "usb-simtec.h"
|
#include "usb-simtec.h"
|
||||||
#include "pm.h"
|
|
||||||
|
|
||||||
#define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
|
#define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
|
||||||
|
|
||||||
|
@ -405,44 +405,13 @@ void __init bast_map_io(void)
|
||||||
usb_simtec_init();
|
usb_simtec_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init bast_init_irq(void)
|
|
||||||
{
|
|
||||||
s3c24xx_init_irq();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
|
||||||
|
|
||||||
/* bast_init_machine
|
|
||||||
*
|
|
||||||
* enable the power management functions for the EB2410ITX
|
|
||||||
*/
|
|
||||||
|
|
||||||
static __init void bast_init_machine(void)
|
|
||||||
{
|
|
||||||
unsigned long gstatus4;
|
|
||||||
|
|
||||||
printk(KERN_INFO "BAST Power Manangement" COPYRIGHT "\n");
|
|
||||||
|
|
||||||
gstatus4 = (__raw_readl(S3C2410_BANKCON7) & 0x3) << 30;
|
|
||||||
gstatus4 |= (__raw_readl(S3C2410_BANKCON6) & 0x3) << 28;
|
|
||||||
gstatus4 |= (__raw_readl(S3C2410_BANKSIZE) & S3C2410_BANKSIZE_MASK);
|
|
||||||
|
|
||||||
__raw_writel(gstatus4, S3C2410_GSTATUS4);
|
|
||||||
|
|
||||||
s3c2410_pm_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define bast_init_machine NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
MACHINE_START(BAST, "Simtec-BAST")
|
MACHINE_START(BAST, "Simtec-BAST")
|
||||||
MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
|
MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
|
||||||
BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
|
BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
|
||||||
BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
|
BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
|
||||||
MAPIO(bast_map_io)
|
|
||||||
INITIRQ(bast_init_irq)
|
.map_io = bast_map_io,
|
||||||
.init_machine = bast_init_machine,
|
.init_irq = s3c24xx_init_irq,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -371,16 +371,12 @@ void __init vr1000_map_io(void)
|
||||||
usb_simtec_init();
|
usb_simtec_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init vr1000_init_irq(void)
|
|
||||||
{
|
|
||||||
s3c24xx_init_irq();
|
|
||||||
}
|
|
||||||
|
|
||||||
MACHINE_START(VR1000, "Thorcom-VR1000")
|
MACHINE_START(VR1000, "Thorcom-VR1000")
|
||||||
MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
|
MAINTAINER("Ben Dooks <ben@simtec.co.uk>")
|
||||||
BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
|
BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, (u32)S3C24XX_VA_UART)
|
||||||
BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
|
BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100)
|
||||||
MAPIO(vr1000_map_io)
|
.map_io = vr1000_map_io,
|
||||||
INITIRQ(vr1000_init_irq)
|
.init_irq = s3c24xx_init_irq,
|
||||||
.timer = &s3c24xx_timer,
|
.timer = &s3c24xx_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
/* linux/arch/arm/mach-s3c2410/pm-simtec.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2004 Simtec Electronics
|
||||||
|
* Ben Dooks <ben@simtec.co.uk>
|
||||||
|
*
|
||||||
|
* http://armlinux.simtec.co.uk/
|
||||||
|
*
|
||||||
|
* Power Management helpers for Simtec S3C24XX implementations
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
#include <linux/timer.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
#include <asm/hardware.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#include <asm/arch/map.h>
|
||||||
|
#include <asm/arch/regs-serial.h>
|
||||||
|
#include <asm/arch/regs-gpio.h>
|
||||||
|
#include <asm/arch/regs-mem.h>
|
||||||
|
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
|
#include "pm.h"
|
||||||
|
|
||||||
|
#define COPYRIGHT ", (c) 2005 Simtec Electronics"
|
||||||
|
|
||||||
|
/* pm_simtec_init
|
||||||
|
*
|
||||||
|
* enable the power management functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
static __init int pm_simtec_init(void)
|
||||||
|
{
|
||||||
|
unsigned long gstatus4;
|
||||||
|
|
||||||
|
/* check which machine we are running on */
|
||||||
|
|
||||||
|
if (!machine_is_bast() && !machine_is_vr1000())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
printk(KERN_INFO "Simtec Board Power Manangement" COPYRIGHT "\n");
|
||||||
|
|
||||||
|
gstatus4 = (__raw_readl(S3C2410_BANKCON7) & 0x3) << 30;
|
||||||
|
gstatus4 |= (__raw_readl(S3C2410_BANKCON6) & 0x3) << 28;
|
||||||
|
gstatus4 |= (__raw_readl(S3C2410_BANKSIZE) & S3C2410_BANKSIZE_MASK);
|
||||||
|
|
||||||
|
__raw_writel(gstatus4, S3C2410_GSTATUS4);
|
||||||
|
|
||||||
|
return s3c2410_pm_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(pm_simtec_init);
|
|
@ -137,8 +137,8 @@ s3c2410_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction s3c2410_timer_irq = {
|
static struct irqaction s3c2410_timer_irq = {
|
||||||
.name = "S3C2410 Timer Tick",
|
.name = "S3C2410 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = s3c2410_timer_interrupt
|
.handler = s3c2410_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue