mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
39fe5434cb
4
.gitignore
vendored
4
.gitignore
vendored
@ -22,6 +22,7 @@
|
||||
tags
|
||||
TAGS
|
||||
vmlinux*
|
||||
!vmlinux.lds.S
|
||||
System.map
|
||||
Module.symvers
|
||||
|
||||
@ -45,3 +46,6 @@ series
|
||||
|
||||
# cscope files
|
||||
cscope.*
|
||||
|
||||
*.orig
|
||||
*.rej
|
||||
|
10
CREDITS
10
CREDITS
@ -2212,13 +2212,13 @@ S: 2300 Copenhagen S
|
||||
S: Denmark
|
||||
|
||||
N: Claudio S. Matsuoka
|
||||
E: claudio@conectiva.com
|
||||
E: claudio@helllabs.org
|
||||
E: cmatsuoka@gmail.com
|
||||
E: claudio@mandriva.com
|
||||
W: http://helllabs.org/~claudio
|
||||
D: V4L, OV511 driver hacks
|
||||
D: V4L, OV511 and HDA-codec hacks
|
||||
S: Conectiva S.A.
|
||||
S: R. Tocantins 89
|
||||
S: 80050-430 Curitiba PR
|
||||
S: Souza Naves 1250
|
||||
S: 80050-040 Curitiba PR
|
||||
S: Brazil
|
||||
|
||||
N: Heinz Mauelshagen
|
||||
|
@ -12,6 +12,8 @@ Following translations are available on the WWW:
|
||||
|
||||
00-INDEX
|
||||
- this file.
|
||||
ABI/
|
||||
- info on kernel <-> userspace ABI and relative interface stability.
|
||||
BUG-HUNTING
|
||||
- brute force method of doing binary search of patches to find bug.
|
||||
Changes
|
||||
@ -25,37 +27,57 @@ DMA-mapping.txt
|
||||
DocBook/
|
||||
- directory with DocBook templates etc. for kernel documentation.
|
||||
HOWTO
|
||||
- The process and procedures of how to do Linux kernel development.
|
||||
- the process and procedures of how to do Linux kernel development.
|
||||
IO-mapping.txt
|
||||
- how to access I/O mapped memory from within device drivers.
|
||||
IPMI.txt
|
||||
- info on Linux Intelligent Platform Management Interface (IPMI) Driver.
|
||||
IRQ-affinity.txt
|
||||
- how to select which CPU(s) handle which interrupt events on SMP.
|
||||
IRQ.txt
|
||||
- description of what an IRQ is.
|
||||
ManagementStyle
|
||||
- how to (attempt to) manage kernel hackers.
|
||||
MSI-HOWTO.txt
|
||||
- the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
|
||||
PCIEBUS-HOWTO.txt
|
||||
- a guide describing the PCI Express Port Bus driver.
|
||||
RCU/
|
||||
- directory with info on RCU (read-copy update).
|
||||
README.DAC960
|
||||
- info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux.
|
||||
README.cycladesZ
|
||||
- info on Cyclades-Z firmware loading.
|
||||
SAK.txt
|
||||
- info on Secure Attention Keys.
|
||||
SecurityBugs
|
||||
- procedure for reporting security bugs found in the kernel.
|
||||
SubmitChecklist
|
||||
- Linux kernel patch submission checklist.
|
||||
SubmittingDrivers
|
||||
- procedure to get a new driver source included into the kernel tree.
|
||||
SubmittingPatches
|
||||
- procedure to get a source patch included into the kernel tree.
|
||||
VGA-softcursor.txt
|
||||
- how to change your VGA cursor from a blinking underscore.
|
||||
accounting/
|
||||
- documentation on accounting and taskstats.
|
||||
aoe/
|
||||
- description of AoE (ATA over Ethernet) along with config examples.
|
||||
applying-patches.txt
|
||||
- description of various trees and how to apply their patches.
|
||||
arm/
|
||||
- directory with info about Linux on the ARM architecture.
|
||||
atomic_ops.txt
|
||||
- semantics and behavior of atomic and bitmask operations.
|
||||
auxdisplay/
|
||||
- misc. LCD driver documentation (cfag12864b, ks0108).
|
||||
basic_profiling.txt
|
||||
- basic instructions for those who wants to profile Linux kernel.
|
||||
binfmt_misc.txt
|
||||
- info on the kernel support for extra binary formats.
|
||||
blackfin/
|
||||
- directory with documentation for the Blackfin arch.
|
||||
block/
|
||||
- info on the Block I/O (BIO) layer.
|
||||
cachetlb.txt
|
||||
@ -68,16 +90,32 @@ cli-sti-removal.txt
|
||||
- cli()/sti() removal guide.
|
||||
computone.txt
|
||||
- info on Computone Intelliport II/Plus Multiport Serial Driver.
|
||||
connector/
|
||||
- docs on the netlink based userspace<->kernel space communication mod.
|
||||
console/
|
||||
- documentation on Linux console drivers.
|
||||
cpqarray.txt
|
||||
- info on using Compaq's SMART2 Intelligent Disk Array Controllers.
|
||||
cpu-freq/
|
||||
- info on CPU frequency and voltage scaling.
|
||||
cpu-hotplug.txt
|
||||
- document describing CPU hotplug support in the Linux kernel.
|
||||
cpu-load.txt
|
||||
- document describing how CPU load statistics are collected.
|
||||
cpusets.txt
|
||||
- documents the cpusets feature; assign CPUs and Mem to a set of tasks.
|
||||
cputopology.txt
|
||||
- documentation on how CPU topology info is exported via sysfs.
|
||||
cris/
|
||||
- directory with info about Linux on CRIS architecture.
|
||||
crypto/
|
||||
- directory with info on the Crypto API.
|
||||
dcdbas.txt
|
||||
- information on the Dell Systems Management Base Driver.
|
||||
debugging-modules.txt
|
||||
- some notes on debugging modules after Linux 2.6.3.
|
||||
dell_rbu.txt
|
||||
- document demonstrating the use of the Dell Remote BIOS Update driver.
|
||||
device-mapper/
|
||||
- directory with info on Device Mapper.
|
||||
devices.txt
|
||||
@ -86,32 +124,52 @@ digiepca.txt
|
||||
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
|
||||
dnotify.txt
|
||||
- info about directory notification in Linux.
|
||||
dontdiff
|
||||
- file containing a list of files that should never be diff'ed.
|
||||
driver-model/
|
||||
- directory with info about Linux driver model.
|
||||
drivers/
|
||||
- directory with driver documentation (currently only EDAC).
|
||||
dvb/
|
||||
- info on Linux Digital Video Broadcast (DVB) subsystem.
|
||||
early-userspace/
|
||||
- info about initramfs, klibc, and userspace early during boot.
|
||||
ecryptfs.txt
|
||||
- docs on eCryptfs: stacked cryptographic filesystem for Linux.
|
||||
eisa.txt
|
||||
- info on EISA bus support.
|
||||
exception.txt
|
||||
- how Linux v2.2 handles exceptions without verify_area etc.
|
||||
fault-injection/
|
||||
- dir with docs about the fault injection capabilities infrastructure.
|
||||
fb/
|
||||
- directory with info on the frame buffer graphics abstraction layer.
|
||||
feature-removal-schedule.txt
|
||||
- list of files and features that are going to be removed.
|
||||
filesystems/
|
||||
- directory with info on the various filesystems that Linux supports.
|
||||
firmware_class/
|
||||
- request_firmware() hotplug interface info.
|
||||
floppy.txt
|
||||
- notes and driver options for the floppy disk driver.
|
||||
fujitsu/
|
||||
- Fujitsu FR-V Linux documentation.
|
||||
gpio.txt
|
||||
- overview of GPIO (General Purpose Input/Output) access conventions.
|
||||
hayes-esp.txt
|
||||
- info on using the Hayes ESP serial driver.
|
||||
highuid.txt
|
||||
- notes on the change from 16 bit to 32 bit user/group IDs.
|
||||
hpet.txt
|
||||
- High Precision Event Timer Driver for Linux.
|
||||
hrtimer/
|
||||
- info on the timer_stats debugging facility for timer (ab)use.
|
||||
hrtimers/
|
||||
- info on the hrtimers subsystem for high-resolution kernel timers.
|
||||
hw_random.txt
|
||||
- info on Linux support for random number generator in i8xx chipsets.
|
||||
hwmon/
|
||||
- directory with docs on various hardware monitoring drivers.
|
||||
i2c/
|
||||
- directory with info about the I2C bus/protocol (2 wire, kHz speed).
|
||||
i2o/
|
||||
@ -122,16 +180,22 @@ ia64/
|
||||
- directory with info about Linux on Intel 64 bit architecture.
|
||||
ide.txt
|
||||
- important info for users of ATA devices (IDE/EIDE disks and CD-ROMS).
|
||||
infiniband/
|
||||
- directory with documents concerning Linux InfiniBand support.
|
||||
initrd.txt
|
||||
- how to use the RAM disk as an initial/temporary root filesystem.
|
||||
input/
|
||||
- info on Linux input device support.
|
||||
io_ordering.txt
|
||||
- info on ordering I/O writes to memory-mapped addresses.
|
||||
ioctl/
|
||||
- directory with documents describing various IOCTL calls.
|
||||
ioctl-number.txt
|
||||
- how to implement and register device/driver ioctl calls.
|
||||
iostats.txt
|
||||
- info on I/O statistics Linux kernel provides.
|
||||
irqflags-tracing.txt
|
||||
- how to use the irq-flags tracing feature.
|
||||
isapnp.txt
|
||||
- info on Linux ISA Plug & Play support.
|
||||
isdn/
|
||||
@ -140,26 +204,40 @@ java.txt
|
||||
- info on the in-kernel binary support for Java(tm).
|
||||
kbuild/
|
||||
- directory with info about the kernel build process.
|
||||
kdumpt.txt
|
||||
- mini HowTo on getting the crash dump code to work.
|
||||
kdump/
|
||||
- directory with mini HowTo on getting the crash dump code to work.
|
||||
kernel-doc-nano-HOWTO.txt
|
||||
- mini HowTo on generation and location of kernel documentation files.
|
||||
kernel-docs.txt
|
||||
- listing of various WWW + books that document kernel internals.
|
||||
kernel-parameters.txt
|
||||
- summary listing of command line / boot prompt args for the kernel.
|
||||
keys-request-key.txt
|
||||
- description of the kernel key request service.
|
||||
keys.txt
|
||||
- description of the kernel key retention service.
|
||||
kobject.txt
|
||||
- info of the kobject infrastructure of the Linux kernel.
|
||||
kprobes.txt
|
||||
- documents the kernel probes debugging feature.
|
||||
kref.txt
|
||||
- docs on adding reference counters (krefs) to kernel objects.
|
||||
laptop-mode.txt
|
||||
- How to conserve battery power using laptop-mode.
|
||||
- how to conserve battery power using laptop-mode.
|
||||
ldm.txt
|
||||
- a brief description of LDM (Windows Dynamic Disks).
|
||||
leds-class.txt
|
||||
- documents LED handling under Linux.
|
||||
local_ops.txt
|
||||
- semantics and behavior of local atomic operations.
|
||||
lockdep-design.txt
|
||||
- documentation on the runtime locking correctness validator.
|
||||
locks.txt
|
||||
- info on file locking implementations, flock() vs. fcntl(), etc.
|
||||
logo.gif
|
||||
- Full colour GIF image of Linux logo (penguin).
|
||||
- full colour GIF image of Linux logo (penguin - Tux).
|
||||
logo.txt
|
||||
- Info on creator of above logo & site to get additional images from.
|
||||
- info on creator of above logo & site to get additional images from.
|
||||
m68k/
|
||||
- directory with info about Linux on Motorola 68k architecture.
|
||||
magic-number.txt
|
||||
@ -170,6 +248,8 @@ mca.txt
|
||||
- info on supporting Micro Channel Architecture (e.g. PS/2) systems.
|
||||
md.txt
|
||||
- info on boot arguments for the multiple devices driver.
|
||||
memory-barriers.txt
|
||||
- info on Linux kernel memory barriers.
|
||||
memory.txt
|
||||
- info on typical Linux memory problems.
|
||||
mips/
|
||||
@ -177,9 +257,11 @@ mips/
|
||||
mono.txt
|
||||
- how to execute Mono-based .NET binaries with the help of BINFMT_MISC.
|
||||
moxa-smartio
|
||||
- info on installing/using Moxa multiport serial driver.
|
||||
- file with info on installing/using Moxa multiport serial driver.
|
||||
mtrr.txt
|
||||
- how to use PPro Memory Type Range Registers to increase performance.
|
||||
mutex-design.txt
|
||||
- info on the generic mutex subsystem.
|
||||
nbd.txt
|
||||
- info on a TCP implementation of a network block device.
|
||||
netlabel/
|
||||
@ -190,6 +272,8 @@ nfsroot.txt
|
||||
- short guide on setting up a diskless box with NFS root filesystem.
|
||||
nmi_watchdog.txt
|
||||
- info on NMI watchdog for SMP systems.
|
||||
nommu-mmap.txt
|
||||
- documentation about no-mmu memory mapping support.
|
||||
numastat.txt
|
||||
- info on how to read Numa policy hit/miss statistics in sysfs.
|
||||
oops-tracing.txt
|
||||
@ -202,8 +286,16 @@ parport.txt
|
||||
- how to use the parallel-port driver.
|
||||
parport-lowlevel.txt
|
||||
- description and usage of the low level parallel port functions.
|
||||
pci-error-recovery.txt
|
||||
- info on PCI error recovery.
|
||||
pci.txt
|
||||
- info on the PCI subsystem for device driver authors.
|
||||
pcieaer-howto.txt
|
||||
- the PCI Express Advanced Error Reporting Driver Guide HOWTO.
|
||||
pcmcia/
|
||||
- info on the Linux PCMCIA driver.
|
||||
pi-futex.txt
|
||||
- documentation on lightweight PI-futexes.
|
||||
pm.txt
|
||||
- info on Linux power management support.
|
||||
pnp.txt
|
||||
@ -214,18 +306,32 @@ powerpc/
|
||||
- directory with info on using Linux with the PowerPC.
|
||||
preempt-locking.txt
|
||||
- info on locking under a preemptive kernel.
|
||||
prio_tree.txt
|
||||
- info on radix-priority-search-tree use for indexing vmas.
|
||||
ramdisk.txt
|
||||
- short guide on how to set up and use the RAM disk.
|
||||
rbtree.txt
|
||||
- info on what red-black trees are and what they are for.
|
||||
riscom8.txt
|
||||
- notes on using the RISCom/8 multi-port serial driver.
|
||||
robust-futex-ABI.txt
|
||||
- documentation of the robust futex ABI.
|
||||
robust-futexes.txt
|
||||
- a description of what robust futexes are.
|
||||
rocket.txt
|
||||
- info on the Comtrol RocketPort multiport serial driver.
|
||||
rpc-cache.txt
|
||||
- introduction to the caching mechanisms in the sunrpc layer.
|
||||
rt-mutex-design.txt
|
||||
- description of the RealTime mutex implementation design.
|
||||
rt-mutex.txt
|
||||
- desc. of RT-mutex subsystem with PI (Priority Inheritance) support.
|
||||
rtc.txt
|
||||
- notes on how to use the Real Time Clock (aka CMOS clock) driver.
|
||||
s390/
|
||||
- directory with info on using Linux on the IBM S390.
|
||||
sched-arch.txt
|
||||
- CPU Scheduler implementation hints for architecture specific code.
|
||||
sched-coding.txt
|
||||
- reference for various scheduler-related methods in the O(1) scheduler.
|
||||
sched-design.txt
|
||||
@ -240,22 +346,32 @@ serial/
|
||||
- directory with info on the low level serial API.
|
||||
serial-console.txt
|
||||
- how to set up Linux with a serial line console as the default.
|
||||
sgi-ioc4.txt
|
||||
- description of the SGI IOC4 PCI (multi function) device.
|
||||
sgi-visws.txt
|
||||
- short blurb on the SGI Visual Workstations.
|
||||
sh/
|
||||
- directory with info on porting Linux to a new architecture.
|
||||
sharedsubtree.txt
|
||||
- a description of shared subtrees for namespaces.
|
||||
smart-config.txt
|
||||
- description of the Smart Config makefile feature.
|
||||
smp.txt
|
||||
- a few notes on symmetric multi-processing.
|
||||
sony-laptop.txt
|
||||
- Sony Notebook Control Driver (SNC) Readme.
|
||||
sonypi.txt
|
||||
- info on Linux Sony Programmable I/O Device support.
|
||||
sound/
|
||||
- directory with info on sound card support.
|
||||
sparc/
|
||||
- directory with info on using Linux on Sparc architecture.
|
||||
sparse.txt
|
||||
- info on how to obtain and use the sparse tool for typechecking.
|
||||
specialix.txt
|
||||
- info on hardware/driver for specialix IO8+ multiport serial card.
|
||||
spi/
|
||||
- overview of Linux kernel Serial Peripheral Interface (SPI) support.
|
||||
spinlocks.txt
|
||||
- info on using spinlocks to provide exclusive access in kernel.
|
||||
stable_api_nonsense.txt
|
||||
@ -274,24 +390,32 @@ sysrq.txt
|
||||
- info on the magic SysRq key.
|
||||
telephony/
|
||||
- directory with info on telephony (e.g. voice over IP) support.
|
||||
thinkpad-acpi.txt
|
||||
- information on the (IBM and Lenovo) ThinkPad ACPI Extras driver.
|
||||
time_interpolators.txt
|
||||
- info on time interpolators.
|
||||
tipar.txt
|
||||
- information about Parallel link cable for Texas Instruments handhelds.
|
||||
tty.txt
|
||||
- guide to the locking policies of the tty layer.
|
||||
unicode.txt
|
||||
- info on the Unicode character/font mapping used in Linux.
|
||||
uml/
|
||||
- directory with information about User Mode Linux.
|
||||
unicode.txt
|
||||
- info on the Unicode character/font mapping used in Linux.
|
||||
unshare.txt
|
||||
- description of the Linux unshare system call.
|
||||
usb/
|
||||
- directory with info regarding the Universal Serial Bus.
|
||||
video-output.txt
|
||||
- sysfs class driver interface to enable/disable a video output device.
|
||||
video4linux/
|
||||
- directory with info regarding video/TV/radio cards and linux.
|
||||
vm/
|
||||
- directory with info on the Linux vm code.
|
||||
voyager.txt
|
||||
- guide to running Linux on the Voyager architecture.
|
||||
w1/
|
||||
- directory with documents regarding the 1-wire (w1) subsystem.
|
||||
watchdog/
|
||||
- how to auto-reboot Linux if it has "fallen and can't get up". ;-)
|
||||
x86_64/
|
||||
|
@ -39,3 +39,16 @@ Description:
|
||||
If you want to suspend a device immediately but leave it
|
||||
free to wake up in response to I/O requests, you should
|
||||
write "0" to power/autosuspend.
|
||||
|
||||
What: /sys/bus/usb/devices/.../power/persist
|
||||
Date: May 2007
|
||||
KernelVersion: 2.6.23
|
||||
Contact: Alan Stern <stern@rowland.harvard.edu>
|
||||
Description:
|
||||
If CONFIG_USB_PERSIST is set, then each USB device directory
|
||||
will contain a file named power/persist. The file holds a
|
||||
boolean value (0 or 1) indicating whether or not the
|
||||
"USB-Persist" facility is enabled for the device. Since the
|
||||
facility is inherently dangerous, it is disabled by default
|
||||
for all devices except hubs. For more information, see
|
||||
Documentation/usb/persist.txt.
|
||||
|
@ -218,6 +218,18 @@ no space after the prefix increment & decrement unary operators:
|
||||
|
||||
and no space around the '.' and "->" structure member operators.
|
||||
|
||||
Do not leave trailing whitespace at the ends of lines. Some editors with
|
||||
"smart" indentation will insert whitespace at the beginning of new lines as
|
||||
appropriate, so you can start typing the next line of code right away.
|
||||
However, some such editors do not remove the whitespace if you end up not
|
||||
putting a line of code there, such as if you leave a blank line. As a result,
|
||||
you end up with lines containing trailing whitespace.
|
||||
|
||||
Git will warn you about patches that introduce trailing whitespace, and can
|
||||
optionally strip the trailing whitespace for you; however, if applying a series
|
||||
of patches, this may make later patches in the series fail by changing their
|
||||
context lines.
|
||||
|
||||
|
||||
Chapter 4: Naming
|
||||
|
||||
@ -621,12 +633,27 @@ covers RTL which is used frequently with assembly language in the kernel.
|
||||
|
||||
Kernel developers like to be seen as literate. Do mind the spelling
|
||||
of kernel messages to make a good impression. Do not use crippled
|
||||
words like "dont" and use "do not" or "don't" instead.
|
||||
words like "dont"; use "do not" or "don't" instead. Make the messages
|
||||
concise, clear, and unambiguous.
|
||||
|
||||
Kernel messages do not have to be terminated with a period.
|
||||
|
||||
Printing numbers in parentheses (%d) adds no value and should be avoided.
|
||||
|
||||
There are a number of driver model diagnostic macros in <linux/device.h>
|
||||
which you should use to make sure messages are matched to the right device
|
||||
and driver, and are tagged with the right level: dev_err(), dev_warn(),
|
||||
dev_info(), and so forth. For messages that aren't associated with a
|
||||
particular device, <linux/kernel.h> defines pr_debug() and pr_info().
|
||||
|
||||
Coming up with good debugging messages can be quite a challenge; and once
|
||||
you have them, they can be a huge help for remote troubleshooting. Such
|
||||
messages should be compiled out when the DEBUG symbol is not defined (that
|
||||
is, by default they are not included). When you use dev_dbg() or pr_debug(),
|
||||
that's automatic. Many subsystems have Kconfig options to turn on -DDEBUG.
|
||||
A related convention uses VERBOSE_DEBUG to add dev_vdbg() messages to the
|
||||
ones already enabled by DEBUG.
|
||||
|
||||
|
||||
Chapter 14: Allocating memory
|
||||
|
||||
@ -726,6 +753,33 @@ need them. Feel free to peruse that header file to see what else is already
|
||||
defined that you shouldn't reproduce in your code.
|
||||
|
||||
|
||||
Chapter 18: Editor modelines and other cruft
|
||||
|
||||
Some editors can interpret configuration information embedded in source files,
|
||||
indicated with special markers. For example, emacs interprets lines marked
|
||||
like this:
|
||||
|
||||
-*- mode: c -*-
|
||||
|
||||
Or like this:
|
||||
|
||||
/*
|
||||
Local Variables:
|
||||
compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
|
||||
End:
|
||||
*/
|
||||
|
||||
Vim interprets markers that look like this:
|
||||
|
||||
/* vim:set sw=8 noet */
|
||||
|
||||
Do not include any of these in source files. People have their own personal
|
||||
editor configurations, and your source files should not override them. This
|
||||
includes markers for indentation and mode configuration. People may use their
|
||||
own custom mode, or may have some other magic method for making indentation
|
||||
work correctly.
|
||||
|
||||
|
||||
|
||||
Appendix I: References
|
||||
|
||||
@ -751,4 +805,5 @@ Kernel CodingStyle, by greg@kroah.com at OLS 2002:
|
||||
http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
|
||||
|
||||
--
|
||||
Last updated on 2006-December-06.
|
||||
Last updated on 2007-July-13.
|
||||
|
||||
|
@ -664,109 +664,6 @@ It is that simple.
|
||||
Well, not for some odd devices. See the next section for information
|
||||
about that.
|
||||
|
||||
DAC Addressing for Address Space Hungry Devices
|
||||
|
||||
There exists a class of devices which do not mesh well with the PCI
|
||||
DMA mapping API. By definition these "mappings" are a finite
|
||||
resource. The number of total available mappings per bus is platform
|
||||
specific, but there will always be a reasonable amount.
|
||||
|
||||
What is "reasonable"? Reasonable means that networking and block I/O
|
||||
devices need not worry about using too many mappings.
|
||||
|
||||
As an example of a problematic device, consider compute cluster cards.
|
||||
They can potentially need to access gigabytes of memory at once via
|
||||
DMA. Dynamic mappings are unsuitable for this kind of access pattern.
|
||||
|
||||
To this end we've provided a small API by which a device driver
|
||||
may use DAC cycles to directly address all of physical memory.
|
||||
Not all platforms support this, but most do. It is easy to determine
|
||||
whether the platform will work properly at probe time.
|
||||
|
||||
First, understand that there may be a SEVERE performance penalty for
|
||||
using these interfaces on some platforms. Therefore, you MUST only
|
||||
use these interfaces if it is absolutely required. %99 of devices can
|
||||
use the normal APIs without any problems.
|
||||
|
||||
Note that for streaming type mappings you must either use these
|
||||
interfaces, or the dynamic mapping interfaces above. You may not mix
|
||||
usage of both for the same device. Such an act is illegal and is
|
||||
guaranteed to put a banana in your tailpipe.
|
||||
|
||||
However, consistent mappings may in fact be used in conjunction with
|
||||
these interfaces. Remember that, as defined, consistent mappings are
|
||||
always going to be SAC addressable.
|
||||
|
||||
The first thing your driver needs to do is query the PCI platform
|
||||
layer if it is capable of handling your devices DAC addressing
|
||||
capabilities:
|
||||
|
||||
int pci_dac_dma_supported(struct pci_dev *hwdev, u64 mask);
|
||||
|
||||
You may not use the following interfaces if this routine fails.
|
||||
|
||||
Next, DMA addresses using this API are kept track of using the
|
||||
dma64_addr_t type. It is guaranteed to be big enough to hold any
|
||||
DAC address the platform layer will give to you from the following
|
||||
routines. If you have consistent mappings as well, you still
|
||||
use plain dma_addr_t to keep track of those.
|
||||
|
||||
All mappings obtained here will be direct. The mappings are not
|
||||
translated, and this is the purpose of this dialect of the DMA API.
|
||||
|
||||
All routines work with page/offset pairs. This is the _ONLY_ way to
|
||||
portably refer to any piece of memory. If you have a cpu pointer
|
||||
(which may be validly DMA'd too) you may easily obtain the page
|
||||
and offset using something like this:
|
||||
|
||||
struct page *page = virt_to_page(ptr);
|
||||
unsigned long offset = offset_in_page(ptr);
|
||||
|
||||
Here are the interfaces:
|
||||
|
||||
dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
|
||||
struct page *page,
|
||||
unsigned long offset,
|
||||
int direction);
|
||||
|
||||
The DAC address for the tuple PAGE/OFFSET are returned. The direction
|
||||
argument is the same as for pci_{map,unmap}_single(). The same rules
|
||||
for cpu/device access apply here as for the streaming mapping
|
||||
interfaces. To reiterate:
|
||||
|
||||
The cpu may touch the buffer before pci_dac_page_to_dma.
|
||||
The device may touch the buffer after pci_dac_page_to_dma
|
||||
is made, but the cpu may NOT.
|
||||
|
||||
When the DMA transfer is complete, invoke:
|
||||
|
||||
void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,
|
||||
dma64_addr_t dma_addr,
|
||||
size_t len, int direction);
|
||||
|
||||
This must be done before the CPU looks at the buffer again.
|
||||
This interface behaves identically to pci_dma_sync_{single,sg}_for_cpu().
|
||||
|
||||
And likewise, if you wish to let the device get back at the buffer after
|
||||
the cpu has read/written it, invoke:
|
||||
|
||||
void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,
|
||||
dma64_addr_t dma_addr,
|
||||
size_t len, int direction);
|
||||
|
||||
before letting the device access the DMA area again.
|
||||
|
||||
If you need to get back to the PAGE/OFFSET tuple from a dma64_addr_t
|
||||
the following interfaces are provided:
|
||||
|
||||
struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
|
||||
dma64_addr_t dma_addr);
|
||||
unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
|
||||
dma64_addr_t dma_addr);
|
||||
|
||||
This is possible with the DAC interfaces purely because they are
|
||||
not translated in any way.
|
||||
|
||||
Optimizing Unmap State Space Consumption
|
||||
|
||||
On many platforms, pci_unmap_{single,page}() is simply a nop.
|
||||
|
@ -15,11 +15,11 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||
|
||||
###
|
||||
# The build process is as follows (targets):
|
||||
# (xmldocs)
|
||||
# file.tmpl --> file.xml +--> file.ps (psdocs)
|
||||
# +--> file.pdf (pdfdocs)
|
||||
# +--> DIR=file (htmldocs)
|
||||
# +--> man/ (mandocs)
|
||||
# (xmldocs) [by docproc]
|
||||
# file.tmpl --> file.xml +--> file.ps (psdocs) [by db2ps or xmlto]
|
||||
# +--> file.pdf (pdfdocs) [by db2pdf or xmlto]
|
||||
# +--> DIR=file (htmldocs) [by xmlto]
|
||||
# +--> man/ (mandocs) [by xmlto]
|
||||
|
||||
|
||||
# for PDF and PS output you can choose between xmlto and docbook-utils tools
|
||||
|
@ -139,8 +139,10 @@ X!Ilib/string.c
|
||||
!Elib/cmdline.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>CRC Functions</title>
|
||||
<sect1 id="crc"><title>CRC Functions</title>
|
||||
!Elib/crc7.c
|
||||
!Elib/crc16.c
|
||||
!Elib/crc-itu-t.c
|
||||
!Elib/crc32.c
|
||||
!Elib/crc-ccitt.c
|
||||
</sect1>
|
||||
@ -157,7 +159,6 @@ X!Ilib/string.c
|
||||
!Earch/i386/lib/usercopy.c
|
||||
</sect1>
|
||||
<sect1><title>More Memory Management Functions</title>
|
||||
!Iinclude/linux/rmap.h
|
||||
!Emm/readahead.c
|
||||
!Emm/filemap.c
|
||||
!Emm/memory.c
|
||||
@ -406,6 +407,10 @@ X!Edrivers/pnp/system.c
|
||||
!Edrivers/pnp/manager.c
|
||||
!Edrivers/pnp/support.c
|
||||
</sect1>
|
||||
<sect1><title>Userspace IO devices</title>
|
||||
!Edrivers/uio/uio.c
|
||||
!Iinclude/linux/uio_driver.h
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="blkdev">
|
||||
@ -643,6 +648,60 @@ X!Idrivers/video/console/fonts.c
|
||||
!Edrivers/spi/spi.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="i2c">
|
||||
<title>I<superscript>2</superscript>C and SMBus Subsystem</title>
|
||||
|
||||
<para>
|
||||
I<superscript>2</superscript>C (or without fancy typography, "I2C")
|
||||
is an acronym for the "Inter-IC" bus, a simple bus protocol which is
|
||||
widely used where low data rate communications suffice.
|
||||
Since it's also a licensed trademark, some vendors use another
|
||||
name (such as "Two-Wire Interface", TWI) for the same bus.
|
||||
I2C only needs two signals (SCL for clock, SDA for data), conserving
|
||||
board real estate and minimizing signal quality issues.
|
||||
Most I2C devices use seven bit addresses, and bus speeds of up
|
||||
to 400 kHz; there's a high speed extension (3.4 MHz) that's not yet
|
||||
found wide use.
|
||||
I2C is a multi-master bus; open drain signaling is used to
|
||||
arbitrate between masters, as well as to handshake and to
|
||||
synchronize clocks from slower clients.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The Linux I2C programming interfaces support only the master
|
||||
side of bus interactions, not the slave side.
|
||||
The programming interface is structured around two kinds of driver,
|
||||
and two kinds of device.
|
||||
An I2C "Adapter Driver" abstracts the controller hardware; it binds
|
||||
to a physical device (perhaps a PCI device or platform_device) and
|
||||
exposes a <structname>struct i2c_adapter</structname> representing
|
||||
each I2C bus segment it manages.
|
||||
On each I2C bus segment will be I2C devices represented by a
|
||||
<structname>struct i2c_client</structname>. Those devices will
|
||||
be bound to a <structname>struct i2c_driver</structname>,
|
||||
which should follow the standard Linux driver model.
|
||||
(At this writing, a legacy model is more widely used.)
|
||||
There are functions to perform various I2C protocol operations; at
|
||||
this writing all such functions are usable only from task context.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The System Management Bus (SMBus) is a sibling protocol. Most SMBus
|
||||
systems are also I2C conformant. The electrical constraints are
|
||||
tighter for SMBus, and it standardizes particular protocol messages
|
||||
and idioms. Controllers that support I2C can also support most
|
||||
SMBus operations, but SMBus controllers don't support all the protocol
|
||||
options that an I2C controller will.
|
||||
There are functions to perform various SMBus protocol operations,
|
||||
either using I2C primitives or by issuing SMBus commands to
|
||||
i2c_adapter devices which don't support those I2C operations.
|
||||
</para>
|
||||
|
||||
!Iinclude/linux/i2c.h
|
||||
!Fdrivers/i2c/i2c-boardinfo.c i2c_register_board_info
|
||||
!Edrivers/i2c/i2c-core.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="splice">
|
||||
<title>splice API</title>
|
||||
<para>)
|
||||
@ -654,4 +713,5 @@ X!Idrivers/video/console/fonts.c
|
||||
!Ffs/splice.c
|
||||
</chapter>
|
||||
|
||||
|
||||
</book>
|
||||
|
@ -219,7 +219,7 @@
|
||||
</para>
|
||||
|
||||
<sect1 id="lock-intro">
|
||||
<title>Two Main Types of Kernel Locks: Spinlocks and Semaphores</title>
|
||||
<title>Three Main Types of Kernel Locks: Spinlocks, Mutexes and Semaphores</title>
|
||||
|
||||
<para>
|
||||
There are three main types of kernel locks. The fundamental type
|
||||
|
@ -456,8 +456,9 @@ void (*irq_clear) (struct ata_port *);
|
||||
|
||||
<sect2><title>SATA phy read/write</title>
|
||||
<programlisting>
|
||||
u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg);
|
||||
void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
|
||||
int (*scr_read) (struct ata_port *ap, unsigned int sc_reg,
|
||||
u32 *val);
|
||||
int (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
|
||||
u32 val);
|
||||
</programlisting>
|
||||
|
||||
|
@ -352,49 +352,93 @@ entry->write_proc = write_proc_foo;
|
||||
<funcsynopsis>
|
||||
<funcprototype>
|
||||
<funcdef>int <function>read_func</function></funcdef>
|
||||
<paramdef>char* <parameter>page</parameter></paramdef>
|
||||
<paramdef>char* <parameter>buffer</parameter></paramdef>
|
||||
<paramdef>char** <parameter>start</parameter></paramdef>
|
||||
<paramdef>off_t <parameter>off</parameter></paramdef>
|
||||
<paramdef>int <parameter>count</parameter></paramdef>
|
||||
<paramdef>int* <parameter>eof</parameter></paramdef>
|
||||
<paramdef>int* <parameter>peof</parameter></paramdef>
|
||||
<paramdef>void* <parameter>data</parameter></paramdef>
|
||||
</funcprototype>
|
||||
</funcsynopsis>
|
||||
|
||||
<para>
|
||||
The read function should write its information into the
|
||||
<parameter>page</parameter>. For proper use, the function
|
||||
should start writing at an offset of
|
||||
<parameter>off</parameter> in <parameter>page</parameter> and
|
||||
write at most <parameter>count</parameter> bytes, but because
|
||||
most read functions are quite simple and only return a small
|
||||
amount of information, these two parameters are usually
|
||||
ignored (it breaks pagers like <literal>more</literal> and
|
||||
<literal>less</literal>, but <literal>cat</literal> still
|
||||
works).
|
||||
<parameter>buffer</parameter>, which will be exactly
|
||||
<literal>PAGE_SIZE</literal> bytes long.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If the <parameter>off</parameter> and
|
||||
<parameter>count</parameter> parameters are properly used,
|
||||
<parameter>eof</parameter> should be used to signal that the
|
||||
The parameter
|
||||
<parameter>peof</parameter> should be used to signal that the
|
||||
end of the file has been reached by writing
|
||||
<literal>1</literal> to the memory location
|
||||
<parameter>eof</parameter> points to.
|
||||
<parameter>peof</parameter> points to.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The parameter <parameter>start</parameter> doesn't seem to be
|
||||
used anywhere in the kernel. The <parameter>data</parameter>
|
||||
The <parameter>data</parameter>
|
||||
parameter can be used to create a single call back function for
|
||||
several files, see <xref linkend="usingdata"/>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The <function>read_func</function> function must return the
|
||||
number of bytes written into the <parameter>page</parameter>.
|
||||
The rest of the parameters and the return value are described
|
||||
by a comment in <filename>fs/proc/generic.c</filename> as follows:
|
||||
</para>
|
||||
|
||||
<blockquote>
|
||||
<para>
|
||||
You have three ways to return data:
|
||||
</para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
Leave <literal>*start = NULL</literal>. (This is the default.)
|
||||
Put the data of the requested offset at that
|
||||
offset within the buffer. Return the number (<literal>n</literal>)
|
||||
of bytes there are from the beginning of the
|
||||
buffer up to the last byte of data. If the
|
||||
number of supplied bytes (<literal>= n - offset</literal>) is
|
||||
greater than zero and you didn't signal eof
|
||||
and the reader is prepared to take more data
|
||||
you will be called again with the requested
|
||||
offset advanced by the number of bytes
|
||||
absorbed. This interface is useful for files
|
||||
no larger than the buffer.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Set <literal>*start</literal> to an unsigned long value less than
|
||||
the buffer address but greater than zero.
|
||||
Put the data of the requested offset at the
|
||||
beginning of the buffer. Return the number of
|
||||
bytes of data placed there. If this number is
|
||||
greater than zero and you didn't signal eof
|
||||
and the reader is prepared to take more data
|
||||
you will be called again with the requested
|
||||
offset advanced by <literal>*start</literal>. This interface is
|
||||
useful when you have a large file consisting
|
||||
of a series of blocks which you want to count
|
||||
and return as wholes.
|
||||
(Hack by Paul.Russell@rustcorp.com.au)
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
Set <literal>*start</literal> to an address within the buffer.
|
||||
Put the data of the requested offset at <literal>*start</literal>.
|
||||
Return the number of bytes of data placed there.
|
||||
If this number is greater than zero and you
|
||||
didn't signal eof and the reader is prepared to
|
||||
take more data you will be called again with the
|
||||
requested offset advanced by the number of bytes
|
||||
absorbed.
|
||||
</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</blockquote>
|
||||
|
||||
<para>
|
||||
<xref linkend="example"/> shows how to use a read call back
|
||||
function.
|
||||
|
611
Documentation/DocBook/uio-howto.tmpl
Normal file
611
Documentation/DocBook/uio-howto.tmpl
Normal file
@ -0,0 +1,611 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []>
|
||||
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>The Userspace I/O HOWTO</title>
|
||||
|
||||
<author>
|
||||
<firstname>Hans-Jürgen</firstname>
|
||||
<surname>Koch</surname>
|
||||
<authorblurb><para>Linux developer, Linutronix</para></authorblurb>
|
||||
<affiliation>
|
||||
<orgname>
|
||||
<ulink url="http://www.linutronix.de">Linutronix</ulink>
|
||||
</orgname>
|
||||
|
||||
<address>
|
||||
<email>hjk@linutronix.de</email>
|
||||
</address>
|
||||
</affiliation>
|
||||
</author>
|
||||
|
||||
<pubdate>2006-12-11</pubdate>
|
||||
|
||||
<abstract>
|
||||
<para>This HOWTO describes concept and usage of Linux kernel's
|
||||
Userspace I/O system.</para>
|
||||
</abstract>
|
||||
|
||||
<revhistory>
|
||||
<revision>
|
||||
<revnumber>0.3</revnumber>
|
||||
<date>2007-04-29</date>
|
||||
<authorinitials>hjk</authorinitials>
|
||||
<revremark>Added section about userspace drivers.</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>0.2</revnumber>
|
||||
<date>2007-02-13</date>
|
||||
<authorinitials>hjk</authorinitials>
|
||||
<revremark>Update after multiple mappings were added.</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>0.1</revnumber>
|
||||
<date>2006-12-11</date>
|
||||
<authorinitials>hjk</authorinitials>
|
||||
<revremark>First draft.</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
</bookinfo>
|
||||
|
||||
<chapter id="aboutthisdoc">
|
||||
<?dbhtml filename="about.html"?>
|
||||
<title>About this document</title>
|
||||
|
||||
<sect1 id="copyright">
|
||||
<?dbhtml filename="copyright.html"?>
|
||||
<title>Copyright and License</title>
|
||||
<para>
|
||||
Copyright (c) 2006 by Hans-Jürgen Koch.</para>
|
||||
<para>
|
||||
This documentation is Free Software licensed under the terms of the
|
||||
GPL version 2.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="translations">
|
||||
<?dbhtml filename="translations.html"?>
|
||||
<title>Translations</title>
|
||||
|
||||
<para>If you know of any translations for this document, or you are
|
||||
interested in translating it, please email me
|
||||
<email>hjk@linutronix.de</email>.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="preface">
|
||||
<title>Preface</title>
|
||||
<para>
|
||||
For many types of devices, creating a Linux kernel driver is
|
||||
overkill. All that is really needed is some way to handle an
|
||||
interrupt and provide access to the memory space of the
|
||||
device. The logic of controlling the device does not
|
||||
necessarily have to be within the kernel, as the device does
|
||||
not need to take advantage of any of other resources that the
|
||||
kernel provides. One such common class of devices that are
|
||||
like this are for industrial I/O cards.
|
||||
</para>
|
||||
<para>
|
||||
To address this situation, the userspace I/O system (UIO) was
|
||||
designed. For typical industrial I/O cards, only a very small
|
||||
kernel module is needed. The main part of the driver will run in
|
||||
user space. This simplifies development and reduces the risk of
|
||||
serious bugs within a kernel module.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="thanks">
|
||||
<title>Acknowledgments</title>
|
||||
<para>I'd like to thank Thomas Gleixner and Benedikt Spranger of
|
||||
Linutronix, who have not only written most of the UIO code, but also
|
||||
helped greatly writing this HOWTO by giving me all kinds of background
|
||||
information.</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="feedback">
|
||||
<title>Feedback</title>
|
||||
<para>Find something wrong with this document? (Or perhaps something
|
||||
right?) I would love to hear from you. Please email me at
|
||||
<email>hjk@linutronix.de</email>.</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="about">
|
||||
<?dbhtml filename="about.html"?>
|
||||
<title>About UIO</title>
|
||||
|
||||
<para>If you use UIO for your card's driver, here's what you get:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>only one small kernel module to write and maintain.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>develop the main part of your driver in user space,
|
||||
with all the tools and libraries you're used to.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>bugs in your driver won't crash the kernel.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>updates of your driver can take place without recompiling
|
||||
the kernel.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>if you need to keep some parts of your driver closed source,
|
||||
you can do so without violating the GPL license on the kernel.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<sect1 id="how_uio_works">
|
||||
<title>How UIO works</title>
|
||||
<para>
|
||||
Each UIO device is accessed through a device file and several
|
||||
sysfs attribute files. The device file will be called
|
||||
<filename>/dev/uio0</filename> for the first device, and
|
||||
<filename>/dev/uio1</filename>, <filename>/dev/uio2</filename>
|
||||
and so on for subsequent devices.
|
||||
</para>
|
||||
|
||||
<para><filename>/dev/uioX</filename> is used to access the
|
||||
address space of the card. Just use
|
||||
<function>mmap()</function> to access registers or RAM
|
||||
locations of your card.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Interrupts are handled by reading from
|
||||
<filename>/dev/uioX</filename>. A blocking
|
||||
<function>read()</function> from
|
||||
<filename>/dev/uioX</filename> will return as soon as an
|
||||
interrupt occurs. You can also use
|
||||
<function>select()</function> on
|
||||
<filename>/dev/uioX</filename> to wait for an interrupt. The
|
||||
integer value read from <filename>/dev/uioX</filename>
|
||||
represents the total interrupt count. You can use this number
|
||||
to figure out if you missed some interrupts.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To handle interrupts properly, your custom kernel module can
|
||||
provide its own interrupt handler. It will automatically be
|
||||
called by the built-in handler.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For cards that don't generate interrupts but need to be
|
||||
polled, there is the possibility to set up a timer that
|
||||
triggers the interrupt handler at configurable time intervals.
|
||||
See <filename>drivers/uio/uio_dummy.c</filename> for an
|
||||
example of this technique.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Each driver provides attributes that are used to read or write
|
||||
variables. These attributes are accessible through sysfs
|
||||
files. A custom kernel driver module can add its own
|
||||
attributes to the device owned by the uio driver, but not added
|
||||
to the UIO device itself at this time. This might change in the
|
||||
future if it would be found to be useful.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The following standard attributes are provided by the UIO
|
||||
framework:
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<filename>name</filename>: The name of your device. It is
|
||||
recommended to use the name of your kernel module for this.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<filename>version</filename>: A version string defined by your
|
||||
driver. This allows the user space part of your driver to deal
|
||||
with different versions of the kernel module.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<filename>event</filename>: The total number of interrupts
|
||||
handled by the driver since the last time the device node was
|
||||
read.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>
|
||||
These attributes appear under the
|
||||
<filename>/sys/class/uio/uioX</filename> directory. Please
|
||||
note that this directory might be a symlink, and not a real
|
||||
directory. Any userspace code that accesses it must be able
|
||||
to handle this.
|
||||
</para>
|
||||
<para>
|
||||
Each UIO device can make one or more memory regions available for
|
||||
memory mapping. This is necessary because some industrial I/O cards
|
||||
require access to more than one PCI memory region in a driver.
|
||||
</para>
|
||||
<para>
|
||||
Each mapping has its own directory in sysfs, the first mapping
|
||||
appears as <filename>/sys/class/uio/uioX/maps/map0/</filename>.
|
||||
Subsequent mappings create directories <filename>map1/</filename>,
|
||||
<filename>map2/</filename>, and so on. These directories will only
|
||||
appear if the size of the mapping is not 0.
|
||||
</para>
|
||||
<para>
|
||||
Each <filename>mapX/</filename> directory contains two read-only files
|
||||
that show start address and size of the memory:
|
||||
</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<filename>addr</filename>: The address of memory that can be mapped.
|
||||
</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<filename>size</filename>: The size, in bytes, of the memory
|
||||
pointed to by addr.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
From userspace, the different mappings are distinguished by adjusting
|
||||
the <varname>offset</varname> parameter of the
|
||||
<function>mmap()</function> call. To map the memory of mapping N, you
|
||||
have to use N times the page size as your offset:
|
||||
</para>
|
||||
<programlisting format="linespecific">
|
||||
offset = N * getpagesize();
|
||||
</programlisting>
|
||||
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="using-uio_dummy" xreflabel="Using uio_dummy">
|
||||
<?dbhtml filename="using-uio_dummy.html"?>
|
||||
<title>Using uio_dummy</title>
|
||||
<para>
|
||||
Well, there is no real use for uio_dummy. Its only purpose is
|
||||
to test most parts of the UIO system (everything except
|
||||
hardware interrupts), and to serve as an example for the
|
||||
kernel module that you will have to write yourself.
|
||||
</para>
|
||||
|
||||
<sect1 id="what_uio_dummy_does">
|
||||
<title>What uio_dummy does</title>
|
||||
<para>
|
||||
The kernel module <filename>uio_dummy.ko</filename> creates a
|
||||
device that uses a timer to generate periodic interrupts. The
|
||||
interrupt handler does nothing but increment a counter. The
|
||||
driver adds two custom attributes, <varname>count</varname>
|
||||
and <varname>freq</varname>, that appear under
|
||||
<filename>/sys/devices/platform/uio_dummy/</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The attribute <varname>count</varname> can be read and
|
||||
written. The associated file
|
||||
<filename>/sys/devices/platform/uio_dummy/count</filename>
|
||||
appears as a normal text file and contains the total number of
|
||||
timer interrupts. If you look at it (e.g. using
|
||||
<function>cat</function>), you'll notice it is slowly counting
|
||||
up.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The attribute <varname>freq</varname> can be read and written.
|
||||
The content of
|
||||
<filename>/sys/devices/platform/uio_dummy/freq</filename>
|
||||
represents the number of system timer ticks between two timer
|
||||
interrupts. The default value of <varname>freq</varname> is
|
||||
the value of the kernel variable <varname>HZ</varname>, which
|
||||
gives you an interval of one second. Lower values will
|
||||
increase the frequency. Try the following:
|
||||
</para>
|
||||
<programlisting format="linespecific">
|
||||
cd /sys/devices/platform/uio_dummy/
|
||||
echo 100 > freq
|
||||
</programlisting>
|
||||
<para>
|
||||
Use <function>cat count</function> to see how the interrupt
|
||||
frequency changes.
|
||||
</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="custom_kernel_module" xreflabel="Writing your own kernel module">
|
||||
<?dbhtml filename="custom_kernel_module.html"?>
|
||||
<title>Writing your own kernel module</title>
|
||||
<para>
|
||||
Please have a look at <filename>uio_dummy.c</filename> as an
|
||||
example. The following paragraphs explain the different
|
||||
sections of this file.
|
||||
</para>
|
||||
|
||||
<sect1 id="uio_info">
|
||||
<title>struct uio_info</title>
|
||||
<para>
|
||||
This structure tells the framework the details of your driver,
|
||||
Some of the members are required, others are optional.
|
||||
</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<varname>char *name</varname>: Required. The name of your driver as
|
||||
it will appear in sysfs. I recommend using the name of your module for this.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>char *version</varname>: Required. This string appears in
|
||||
<filename>/sys/class/uio/uioX/version</filename>.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>struct uio_mem mem[ MAX_UIO_MAPS ]</varname>: Required if you
|
||||
have memory that can be mapped with <function>mmap()</function>. For each
|
||||
mapping you need to fill one of the <varname>uio_mem</varname> structures.
|
||||
See the description below for details.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>long irq</varname>: Required. If your hardware generates an
|
||||
interrupt, it's your modules task to determine the irq number during
|
||||
initialization. If you don't have a hardware generated interrupt but
|
||||
want to trigger the interrupt handler in some other way, set
|
||||
<varname>irq</varname> to <varname>UIO_IRQ_CUSTOM</varname>. The
|
||||
uio_dummy module does this as it triggers the event mechanism in a timer
|
||||
routine. If you had no interrupt at all, you could set
|
||||
<varname>irq</varname> to <varname>UIO_IRQ_NONE</varname>, though this
|
||||
rarely makes sense.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>unsigned long irq_flags</varname>: Required if you've set
|
||||
<varname>irq</varname> to a hardware interrupt number. The flags given
|
||||
here will be used in the call to <function>request_irq()</function>.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>int (*mmap)(struct uio_info *info, struct vm_area_struct
|
||||
*vma)</varname>: Optional. If you need a special
|
||||
<function>mmap()</function> function, you can set it here. If this
|
||||
pointer is not NULL, your <function>mmap()</function> will be called
|
||||
instead of the built-in one.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>int (*open)(struct uio_info *info, struct inode *inode)
|
||||
</varname>: Optional. You might want to have your own
|
||||
<function>open()</function>, e.g. to enable interrupts only when your
|
||||
device is actually used.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>int (*release)(struct uio_info *info, struct inode *inode)
|
||||
</varname>: Optional. If you define your own
|
||||
<function>open()</function>, you will probably also want a custom
|
||||
<function>release()</function> function.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
Usually, your device will have one or more memory regions that can be mapped
|
||||
to user space. For each region, you have to set up a
|
||||
<varname>struct uio_mem</varname> in the <varname>mem[]</varname> array.
|
||||
Here's a description of the fields of <varname>struct uio_mem</varname>:
|
||||
</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<varname>int memtype</varname>: Required if the mapping is used. Set this to
|
||||
<varname>UIO_MEM_PHYS</varname> if you you have physical memory on your
|
||||
card to be mapped. Use <varname>UIO_MEM_LOGICAL</varname> for logical
|
||||
memory (e.g. allocated with <function>kmalloc()</function>). There's also
|
||||
<varname>UIO_MEM_VIRTUAL</varname> for virtual memory.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>unsigned long addr</varname>: Required if the mapping is used.
|
||||
Fill in the address of your memory block. This address is the one that
|
||||
appears in sysfs.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>unsigned long size</varname>: Fill in the size of the
|
||||
memory block that <varname>addr</varname> points to. If <varname>size</varname>
|
||||
is zero, the mapping is considered unused. Note that you
|
||||
<emphasis>must</emphasis> initialize <varname>size</varname> with zero for
|
||||
all unused mappings.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>void *internal_addr</varname>: If you have to access this memory
|
||||
region from within your kernel module, you will want to map it internally by
|
||||
using something like <function>ioremap()</function>. Addresses
|
||||
returned by this function cannot be mapped to user space, so you must not
|
||||
store it in <varname>addr</varname>. Use <varname>internal_addr</varname>
|
||||
instead to remember such an address.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
Please do not touch the <varname>kobj</varname> element of
|
||||
<varname>struct uio_mem</varname>! It is used by the UIO framework
|
||||
to set up sysfs files for this mapping. Simply leave it alone.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="adding_irq_handler">
|
||||
<title>Adding an interrupt handler</title>
|
||||
<para>
|
||||
What you need to do in your interrupt handler depends on your
|
||||
hardware and on how you want to handle it. You should try to
|
||||
keep the amount of code in your kernel interrupt handler low.
|
||||
If your hardware requires no action that you
|
||||
<emphasis>have</emphasis> to perform after each interrupt,
|
||||
then your handler can be empty.</para> <para>If, on the other
|
||||
hand, your hardware <emphasis>needs</emphasis> some action to
|
||||
be performed after each interrupt, then you
|
||||
<emphasis>must</emphasis> do it in your kernel module. Note
|
||||
that you cannot rely on the userspace part of your driver. Your
|
||||
userspace program can terminate at any time, possibly leaving
|
||||
your hardware in a state where proper interrupt handling is
|
||||
still required.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
There might also be applications where you want to read data
|
||||
from your hardware at each interrupt and buffer it in a piece
|
||||
of kernel memory you've allocated for that purpose. With this
|
||||
technique you could avoid loss of data if your userspace
|
||||
program misses an interrupt.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
A note on shared interrupts: Your driver should support
|
||||
interrupt sharing whenever this is possible. It is possible if
|
||||
and only if your driver can detect whether your hardware has
|
||||
triggered the interrupt or not. This is usually done by looking
|
||||
at an interrupt status register. If your driver sees that the
|
||||
IRQ bit is actually set, it will perform its actions, and the
|
||||
handler returns IRQ_HANDLED. If the driver detects that it was
|
||||
not your hardware that caused the interrupt, it will do nothing
|
||||
and return IRQ_NONE, allowing the kernel to call the next
|
||||
possible interrupt handler.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If you decide not to support shared interrupts, your card
|
||||
won't work in computers with no free interrupts. As this
|
||||
frequently happens on the PC platform, you can save yourself a
|
||||
lot of trouble by supporting interrupt sharing.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
||||
|
||||
<chapter id="userspace_driver" xreflabel="Writing a driver in user space">
|
||||
<?dbhtml filename="userspace_driver.html"?>
|
||||
<title>Writing a driver in userspace</title>
|
||||
<para>
|
||||
Once you have a working kernel module for your hardware, you can
|
||||
write the userspace part of your driver. You don't need any special
|
||||
libraries, your driver can be written in any reasonable language,
|
||||
you can use floating point numbers and so on. In short, you can
|
||||
use all the tools and libraries you'd normally use for writing a
|
||||
userspace application.
|
||||
</para>
|
||||
|
||||
<sect1 id="getting_uio_information">
|
||||
<title>Getting information about your UIO device</title>
|
||||
<para>
|
||||
Information about all UIO devices is available in sysfs. The
|
||||
first thing you should do in your driver is check
|
||||
<varname>name</varname> and <varname>version</varname> to
|
||||
make sure your talking to the right device and that its kernel
|
||||
driver has the version you expect.
|
||||
</para>
|
||||
<para>
|
||||
You should also make sure that the memory mapping you need
|
||||
exists and has the size you expect.
|
||||
</para>
|
||||
<para>
|
||||
There is a tool called <varname>lsuio</varname> that lists
|
||||
UIO devices and their attributes. It is available here:
|
||||
</para>
|
||||
<para>
|
||||
<ulink url="http://www.osadl.org/projects/downloads/UIO/user/">
|
||||
http://www.osadl.org/projects/downloads/UIO/user/</ulink>
|
||||
</para>
|
||||
<para>
|
||||
With <varname>lsuio</varname> you can quickly check if your
|
||||
kernel module is loaded and which attributes it exports.
|
||||
Have a look at the manpage for details.
|
||||
</para>
|
||||
<para>
|
||||
The source code of <varname>lsuio</varname> can serve as an
|
||||
example for getting information about an UIO device.
|
||||
The file <filename>uio_helper.c</filename> contains a lot of
|
||||
functions you could use in your userspace driver code.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="mmap_device_memory">
|
||||
<title>mmap() device memory</title>
|
||||
<para>
|
||||
After you made sure you've got the right device with the
|
||||
memory mappings you need, all you have to do is to call
|
||||
<function>mmap()</function> to map the device's memory
|
||||
to userspace.
|
||||
</para>
|
||||
<para>
|
||||
The parameter <varname>offset</varname> of the
|
||||
<function>mmap()</function> call has a special meaning
|
||||
for UIO devices: It is used to select which mapping of
|
||||
your device you want to map. To map the memory of
|
||||
mapping N, you have to use N times the page size as
|
||||
your offset:
|
||||
</para>
|
||||
<programlisting format="linespecific">
|
||||
offset = N * getpagesize();
|
||||
</programlisting>
|
||||
<para>
|
||||
N starts from zero, so if you've got only one memory
|
||||
range to map, set <varname>offset = 0</varname>.
|
||||
A drawback of this technique is that memory is always
|
||||
mapped beginning with its start address.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 id="wait_for_interrupts">
|
||||
<title>Waiting for interrupts</title>
|
||||
<para>
|
||||
After you successfully mapped your devices memory, you
|
||||
can access it like an ordinary array. Usually, you will
|
||||
perform some initialization. After that, your hardware
|
||||
starts working and will generate an interrupt as soon
|
||||
as it's finished, has some data available, or needs your
|
||||
attention because an error occured.
|
||||
</para>
|
||||
<para>
|
||||
<filename>/dev/uioX</filename> is a read-only file. A
|
||||
<function>read()</function> will always block until an
|
||||
interrupt occurs. There is only one legal value for the
|
||||
<varname>count</varname> parameter of
|
||||
<function>read()</function>, and that is the size of a
|
||||
signed 32 bit integer (4). Any other value for
|
||||
<varname>count</varname> causes <function>read()</function>
|
||||
to fail. The signed 32 bit integer read is the interrupt
|
||||
count of your device. If the value is one more than the value
|
||||
you read the last time, everything is OK. If the difference
|
||||
is greater than one, you missed interrupts.
|
||||
</para>
|
||||
<para>
|
||||
You can also use <function>select()</function> on
|
||||
<filename>/dev/uioX</filename>.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
||||
|
||||
<appendix id="app1">
|
||||
<title>Further information</title>
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<ulink url="http://www.osadl.org">
|
||||
OSADL homepage.</ulink>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<ulink url="http://www.linutronix.de">
|
||||
Linutronix homepage.</ulink>
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</appendix>
|
||||
|
||||
</book>
|
@ -249,6 +249,9 @@ process is as follows:
|
||||
release a new -rc kernel every week.
|
||||
- Process continues until the kernel is considered "ready", the
|
||||
process should last around 6 weeks.
|
||||
- A list of known regressions present in each -rc release is
|
||||
tracked at the following URI:
|
||||
http://kernelnewbies.org/known_regressions
|
||||
|
||||
It is worth mentioning what Andrew Morton wrote on the linux-kernel
|
||||
mailing list about kernel releases:
|
||||
|
@ -222,7 +222,15 @@ over a rather long period of time, but improvements are always welcome!
|
||||
deadlock as soon as the RCU callback happens to interrupt that
|
||||
acquisition's critical section.
|
||||
|
||||
13. SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu())
|
||||
13. RCU callbacks can be and are executed in parallel. In many cases,
|
||||
the callback code simply wrappers around kfree(), so that this
|
||||
is not an issue (or, more accurately, to the extent that it is
|
||||
an issue, the memory-allocator locking handles it). However,
|
||||
if the callbacks do manipulate a shared data structure, they
|
||||
must use whatever locking or other synchronization is required
|
||||
to safely access and/or modify that data structure.
|
||||
|
||||
14. SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu())
|
||||
may only be invoked from process context. Unlike other forms of
|
||||
RCU, it -is- permissible to block in an SRCU read-side critical
|
||||
section (demarked by srcu_read_lock() and srcu_read_unlock()),
|
||||
|
@ -1,4 +1,4 @@
|
||||
Linux Kernel patch sumbittal checklist
|
||||
Linux Kernel patch submission checklist
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here are some basic things that developers should do if they want to see their
|
||||
@ -9,7 +9,6 @@ Documentation/SubmittingPatches and elsewhere regarding submitting Linux
|
||||
kernel patches.
|
||||
|
||||
|
||||
|
||||
1: Builds cleanly with applicable or modified CONFIG options =y, =m, and
|
||||
=n. No gcc warnings/errors, no linker warnings/errors.
|
||||
|
||||
|
@ -122,7 +122,7 @@ then only post say 15 or so at a time and wait for review and integration.
|
||||
|
||||
Check your patch for basic style violations, details of which can be
|
||||
found in Documentation/CodingStyle. Failure to do so simply wastes
|
||||
the reviewers time and will get your patch rejected, probabally
|
||||
the reviewers time and will get your patch rejected, probably
|
||||
without even being read.
|
||||
|
||||
At a minimum you should check your patches with the patch style
|
||||
@ -464,9 +464,25 @@ section Linus Computer Science 101.
|
||||
Nuff said. If your code deviates too much from this, it is likely
|
||||
to be rejected without further review, and without comment.
|
||||
|
||||
Once significant exception is when moving code from one file to
|
||||
another in this case you should not modify the moved code at all in
|
||||
the same patch which moves it. This clearly delineates the act of
|
||||
moving the code and your changes. This greatly aids review of the
|
||||
actual differences and allows tools to better track the history of
|
||||
the code itself.
|
||||
|
||||
Check your patches with the patch style checker prior to submission
|
||||
(scripts/checkpatch.pl). You should be able to justify all
|
||||
violations that remain in your patch.
|
||||
(scripts/checkpatch.pl). The style checker should be viewed as
|
||||
a guide not as the final word. If your code looks better with
|
||||
a violation then its probably best left alone.
|
||||
|
||||
The checker reports at three levels:
|
||||
- ERROR: things that are very likely to be wrong
|
||||
- WARNING: things requiring careful review
|
||||
- CHECK: things requiring thought
|
||||
|
||||
You should be able to justify all violations that remain in your
|
||||
patch.
|
||||
|
||||
|
||||
|
||||
|
@ -49,6 +49,7 @@ char name[100];
|
||||
int dbg;
|
||||
int print_delays;
|
||||
int print_io_accounting;
|
||||
int print_task_context_switch_counts;
|
||||
__u64 stime, utime;
|
||||
|
||||
#define PRINTF(fmt, arg...) { \
|
||||
@ -195,7 +196,7 @@ void print_delayacct(struct taskstats *t)
|
||||
"IO %15s%15s\n"
|
||||
" %15llu%15llu\n"
|
||||
"MEM %15s%15s\n"
|
||||
" %15llu%15llu\n\n",
|
||||
" %15llu%15llu\n"
|
||||
"count", "real total", "virtual total", "delay total",
|
||||
t->cpu_count, t->cpu_run_real_total, t->cpu_run_virtual_total,
|
||||
t->cpu_delay_total,
|
||||
@ -204,6 +205,14 @@ void print_delayacct(struct taskstats *t)
|
||||
"count", "delay total", t->swapin_count, t->swapin_delay_total);
|
||||
}
|
||||
|
||||
void task_context_switch_counts(struct taskstats *t)
|
||||
{
|
||||
printf("\n\nTask %15s%15s\n"
|
||||
" %15lu%15lu\n",
|
||||
"voluntary", "nonvoluntary",
|
||||
t->nvcsw, t->nivcsw);
|
||||
}
|
||||
|
||||
void print_ioacct(struct taskstats *t)
|
||||
{
|
||||
printf("%s: read=%llu, write=%llu, cancelled_write=%llu\n",
|
||||
@ -235,7 +244,7 @@ int main(int argc, char *argv[])
|
||||
struct msgtemplate msg;
|
||||
|
||||
while (1) {
|
||||
c = getopt(argc, argv, "diw:r:m:t:p:vl");
|
||||
c = getopt(argc, argv, "qdiw:r:m:t:p:vl");
|
||||
if (c < 0)
|
||||
break;
|
||||
|
||||
@ -248,6 +257,10 @@ int main(int argc, char *argv[])
|
||||
printf("printing IO accounting\n");
|
||||
print_io_accounting = 1;
|
||||
break;
|
||||
case 'q':
|
||||
printf("printing task/process context switch rates\n");
|
||||
print_task_context_switch_counts = 1;
|
||||
break;
|
||||
case 'w':
|
||||
logfile = strdup(optarg);
|
||||
printf("write to file %s\n", logfile);
|
||||
@ -389,6 +402,8 @@ int main(int argc, char *argv[])
|
||||
print_delayacct((struct taskstats *) NLA_DATA(na));
|
||||
if (print_io_accounting)
|
||||
print_ioacct((struct taskstats *) NLA_DATA(na));
|
||||
if (print_task_context_switch_counts)
|
||||
task_context_switch_counts((struct taskstats *) NLA_DATA(na));
|
||||
if (fd) {
|
||||
if (write(fd, NLA_DATA(na), na->nla_len) < 0) {
|
||||
err(1,"write error\n");
|
||||
|
@ -22,6 +22,8 @@ There are three different groups of fields in the struct taskstats:
|
||||
/* Extended accounting fields end */
|
||||
Their values are collected if CONFIG_TASK_XACCT is set.
|
||||
|
||||
4) Per-task and per-thread context switch count statistics
|
||||
|
||||
Future extension should add fields to the end of the taskstats struct, and
|
||||
should not change the relative position of each field within the struct.
|
||||
|
||||
@ -158,4 +160,8 @@ struct taskstats {
|
||||
|
||||
/* Extended accounting fields end */
|
||||
|
||||
4) Per-task and per-thread statistics
|
||||
__u64 nvcsw; /* Context voluntary switch counter */
|
||||
__u64 nivcsw; /* Context involuntary switch counter */
|
||||
|
||||
}
|
||||
|
155
Documentation/blackfin/kgdb.txt
Normal file
155
Documentation/blackfin/kgdb.txt
Normal file
@ -0,0 +1,155 @@
|
||||
A Simple Guide to Configure KGDB
|
||||
|
||||
Sonic Zhang <sonic.zhang@analog.com>
|
||||
Aug. 24th 2006
|
||||
|
||||
|
||||
This KGDB patch enables the kernel developer to do source level debugging on
|
||||
the kernel for the Blackfin architecture. The debugging works over either the
|
||||
ethernet interface or one of the uarts. Both software breakpoints and
|
||||
hardware breakpoints are supported in this version.
|
||||
http://docs.blackfin.uclinux.org/doku.php?id=kgdb
|
||||
|
||||
|
||||
2 known issues:
|
||||
1. This bug:
|
||||
http://blackfin.uclinux.org/tracker/index.php?func=detail&aid=544&group_id=18&atid=145
|
||||
The GDB client for Blackfin uClinux causes incorrect values of local
|
||||
variables to be displayed when the user breaks the running of kernel in GDB.
|
||||
2. Because of a hardware bug in Blackfin 533 v1.0.3:
|
||||
05000067 - Watchpoints (Hardware Breakpoints) are not supported
|
||||
Hardware breakpoints cannot be set properly.
|
||||
|
||||
|
||||
Debug over Ethernet:
|
||||
|
||||
1. Compile and install the cross platform version of gdb for blackfin, which
|
||||
can be found at $(BINROOT)/bfin-elf-gdb.
|
||||
|
||||
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
|
||||
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
|
||||
With this selected, option "Full Symbolic/Source Debugging support" and
|
||||
"Compile the kernel with frame pointers" are also selected.
|
||||
|
||||
3. Select option "KGDB: connect over (Ethernet)". Add "kgdboe=@target-IP/,@host-IP/" to
|
||||
the option "Compiled-in Kernel Boot Parameter" under "Kernel hacking".
|
||||
|
||||
4. Connect minicom to the serial port and boot the kernel image.
|
||||
|
||||
5. Configure the IP "/> ifconfig eth0 target-IP"
|
||||
|
||||
6. Start GDB client "bfin-elf-gdb vmlinux".
|
||||
|
||||
7. Connect to the target "(gdb) target remote udp:target-IP:6443".
|
||||
|
||||
8. Set software breakpoint "(gdb) break sys_open".
|
||||
|
||||
9. Continue "(gdb) c".
|
||||
|
||||
10. Run ls in the target console "/> ls".
|
||||
|
||||
11. Breakpoint hits. "Breakpoint 1: sys_open(..."
|
||||
|
||||
12. Display local variables and function paramters.
|
||||
(*) This operation gives wrong results, see known issue 1.
|
||||
|
||||
13. Single stepping "(gdb) si".
|
||||
|
||||
14. Remove breakpoint 1. "(gdb) del 1"
|
||||
|
||||
15. Set hardware breakpoint "(gdb) hbreak sys_open".
|
||||
|
||||
16. Continue "(gdb) c".
|
||||
|
||||
17. Run ls in the target console "/> ls".
|
||||
|
||||
18. Hardware breakpoint hits. "Breakpoint 1: sys_open(...".
|
||||
(*) This hardware breakpoint will not be hit, see known issue 2.
|
||||
|
||||
19. Continue "(gdb) c".
|
||||
|
||||
20. Interrupt the target in GDB "Ctrl+C".
|
||||
|
||||
21. Detach from the target "(gdb) detach".
|
||||
|
||||
22. Exit GDB "(gdb) quit".
|
||||
|
||||
|
||||
Debug over the UART:
|
||||
|
||||
1. Compile and install the cross platform version of gdb for blackfin, which
|
||||
can be found at $(BINROOT)/bfin-elf-gdb.
|
||||
|
||||
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
|
||||
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
|
||||
With this selected, option "Full Symbolic/Source Debugging support" and
|
||||
"Compile the kernel with frame pointers" are also selected.
|
||||
|
||||
3. Select option "KGDB: connect over (UART)". Set "KGDB: UART port number" to be
|
||||
a different one from the console. Don't forget to change the mode of
|
||||
blackfin serial driver to PIO. Otherwise kgdb works incorrectly on UART.
|
||||
|
||||
4. If you want connect to kgdb when the kernel boots, enable
|
||||
"KGDB: Wait for gdb connection early"
|
||||
|
||||
5. Compile kernel.
|
||||
|
||||
6. Connect minicom to the serial port of the console and boot the kernel image.
|
||||
|
||||
7. Start GDB client "bfin-elf-gdb vmlinux".
|
||||
|
||||
8. Set the baud rate in GDB "(gdb) set remotebaud 57600".
|
||||
|
||||
9. Connect to the target on the second serial port "(gdb) target remote /dev/ttyS1".
|
||||
|
||||
10. Set software breakpoint "(gdb) break sys_open".
|
||||
|
||||
11. Continue "(gdb) c".
|
||||
|
||||
12. Run ls in the target console "/> ls".
|
||||
|
||||
13. A breakpoint is hit. "Breakpoint 1: sys_open(..."
|
||||
|
||||
14. All other operations are the same as that in KGDB over Ethernet.
|
||||
|
||||
|
||||
Debug over the same UART as console:
|
||||
|
||||
1. Compile and install the cross platform version of gdb for blackfin, which
|
||||
can be found at $(BINROOT)/bfin-elf-gdb.
|
||||
|
||||
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
|
||||
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
|
||||
With this selected, option "Full Symbolic/Source Debugging support" and
|
||||
"Compile the kernel with frame pointers" are also selected.
|
||||
|
||||
3. Select option "KGDB: connect over UART". Set "KGDB: UART port number" to console.
|
||||
Don't forget to change the mode of blackfin serial driver to PIO.
|
||||
Otherwise kgdb works incorrectly on UART.
|
||||
|
||||
4. If you want connect to kgdb when the kernel boots, enable
|
||||
"KGDB: Wait for gdb connection early"
|
||||
|
||||
5. Connect minicom to the serial port and boot the kernel image.
|
||||
|
||||
6. (Optional) Ask target to wait for gdb connection by entering Ctrl+A. In minicom, you should enter Ctrl+A+A.
|
||||
|
||||
7. Start GDB client "bfin-elf-gdb vmlinux".
|
||||
|
||||
8. Set the baud rate in GDB "(gdb) set remotebaud 57600".
|
||||
|
||||
9. Connect to the target "(gdb) target remote /dev/ttyS0".
|
||||
|
||||
10. Set software breakpoint "(gdb) break sys_open".
|
||||
|
||||
11. Continue "(gdb) c". Then enter Ctrl+C twice to stop GDB connection.
|
||||
|
||||
12. Run ls in the target console "/> ls". Dummy string can be seen on the console.
|
||||
|
||||
13. Then connect the gdb to target again. "(gdb) target remote /dev/ttyS0".
|
||||
Now you will find a breakpoint is hit. "Breakpoint 1: sys_open(..."
|
||||
|
||||
14. All other operations are the same as that in KGDB over Ethernet. The only
|
||||
difference is that after continue command in GDB, please stop GDB
|
||||
connection by 2 "Ctrl+C"s and connect again after breakpoints are hit or
|
||||
Ctrl+A is entered.
|
@ -253,7 +253,7 @@ Here are the routines, one by one:
|
||||
|
||||
The first of these two routines is invoked after map_vm_area()
|
||||
has installed the page table entries. The second is invoked
|
||||
before unmap_vm_area() deletes the page table entries.
|
||||
before unmap_kernel_range() deletes the page table entries.
|
||||
|
||||
There exists another whole class of cpu cache issues which currently
|
||||
require a whole different set of interfaces to handle properly.
|
||||
|
@ -2,32 +2,10 @@
|
||||
- this file (info on CD-ROMs and Linux)
|
||||
Makefile
|
||||
- only used to generate TeX output from the documentation.
|
||||
aztcd
|
||||
- info on Aztech/Orchid/Okano/Wearnes/Conrad/CyCDROM driver.
|
||||
cdrom-standard.tex
|
||||
- LaTeX document on standardizing the CD-ROM programming interface.
|
||||
cdu31a
|
||||
- info on the Sony CDU31A/CDU33A CD-ROM driver.
|
||||
cm206
|
||||
- info on the Philips/LMS cm206/cm260 CD-ROM driver.
|
||||
gscd
|
||||
- info on the Goldstar R420 CD-ROM driver.
|
||||
ide-cd
|
||||
- info on setting up and using ATAPI (aka IDE) CD-ROMs.
|
||||
isp16
|
||||
- info on the CD-ROM interface on ISP16, MAD16 or Mozart sound card.
|
||||
mcd
|
||||
- info on limitations of standard Mitsumi CD-ROM driver.
|
||||
mcdx
|
||||
- info on improved Mitsumi CD-ROM driver.
|
||||
optcd
|
||||
- info on the Optics Storage 8000 AT CD-ROM driver
|
||||
packet-writing.txt
|
||||
- Info on the CDRW packet writing module
|
||||
sbpcd
|
||||
- info on the SoundBlaster/Panasonic CD-ROM interface driver.
|
||||
sjcd
|
||||
- info on the SANYO CDR-H94A CD-ROM interface driver.
|
||||
sonycd535
|
||||
- info on the Sony CDU-535 (and 531) CD-ROM driver.
|
||||
|
||||
|
@ -1,822 +0,0 @@
|
||||
$Id: README.aztcd,v 2.60 1997/11/29 09:51:25 root Exp root $
|
||||
Readme-File Documentation/cdrom/aztcd
|
||||
for
|
||||
AZTECH CD-ROM CDA268-01A, ORCHID CD-3110,
|
||||
OKANO/WEARNES CDD110, CONRAD TXC, CyCDROM CR520, CR540
|
||||
CD-ROM Drives
|
||||
Version 2.6 and newer
|
||||
(for other drives see 6.-8.)
|
||||
|
||||
NOTE: THIS DRIVER WILL WORK WITH THE CD-ROM DRIVES LISTED, WHICH HAVE
|
||||
A PROPRIETARY INTERFACE (implemented on a sound card or on an
|
||||
ISA-AT-bus card).
|
||||
IT WILL DEFINITELY NOT WORK WITH CD-ROM DRIVES WITH *IDE*-INTERFACE,
|
||||
such as the Aztech CDA269-031SE !!! (The only known exceptions are
|
||||
'faked' IDE drives like the CyCDROM CR520ie which work with aztcd
|
||||
under certain conditions, see 7.). IF YOU'RE USING A CD-ROM DRIVE
|
||||
WITH IDE-INTERFACE, SOMETIMES ALSO CALLED ATAPI-COMPATIBLE, PLEASE
|
||||
USE THE ide-cd.c DRIVER, WRITTEN BY MARK LORD AND SCOTT SNYDER !
|
||||
THE STANDARD-KERNEL 1.2.x NOW ALSO SUPPORTS IDE-CDROM-DRIVES, SEE THE
|
||||
HARDDISK (!) SECTION OF make config, WHEN COMPILING A NEW KERNEL!!!
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Contents of this file:
|
||||
1. NOTE
|
||||
2. INSTALLATION
|
||||
3. CONFIGURING YOUR KERNEL
|
||||
4. RECOMPILING YOUR KERNEL
|
||||
4.1 AZTCD AS A RUN-TIME LOADABLE MODULE
|
||||
4.2 CDROM CONNECTED TO A SOUNDCARD
|
||||
5. KNOWN PROBLEMS, FUTURE DEVELOPMENTS
|
||||
5.1 MULTISESSION SUPPORT
|
||||
5.2 STATUS RECOGNITION
|
||||
5.3 DOSEMU's CDROM SUPPORT
|
||||
6. BUG REPORTS
|
||||
7. OTHER DRIVES
|
||||
8. IF YOU DON'T SUCCEED ... DEBUGGING
|
||||
9. TECHNICAL HISTORY OF THE DRIVER
|
||||
10. ACKNOWLEDGMENTS
|
||||
11. PROGRAMMING ADD ONS: CDPLAY.C
|
||||
APPENDIX: Source code of cdplay.c
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
1. NOTE
|
||||
This software has been successfully in alpha and beta test and is part of
|
||||
the standard kernel since kernel 1.1.8x since December 1994. It works with
|
||||
AZTECH CDA268-01A, ORCHID CDS-3110, ORCHID/WEARNES CDD110 and CONRAD TXC
|
||||
(Nr.99 31 23 -series 04) and has proven to be stable with kernel
|
||||
versions 1.0.9 and newer. But with any software there still may be bugs in it.
|
||||
So if you encounter problems, you are invited to help us improve this software.
|
||||
Please send me a detailed bug report (see chapter BUG REPORTS). You are also
|
||||
invited in helping us to increase the number of drives, which are supported.
|
||||
|
||||
Please read the README-files carefully and always keep a backup copy of your
|
||||
old kernel, in order to reboot if something goes wrong!
|
||||
|
||||
2. INSTALLATION
|
||||
The driver consists of a header file 'aztcd.h', which normally should reside
|
||||
in /usr/src/linux/drivers/cdrom and the source code 'aztcd.c', which normally
|
||||
resides in the same place. It uses /dev/aztcd (/dev/aztcd0 in some distri-
|
||||
butions), which must be a valid block device with major number 29 and reside
|
||||
in directory /dev. To mount a CD-ROM, your kernel needs to have the ISO9660-
|
||||
filesystem support included.
|
||||
|
||||
PLEASE NOTE: aztcd.c has been developed in parallel to the linux kernel,
|
||||
which had and is having many major and minor changes which are not backward
|
||||
compatible. Quite definitely aztcd.c version 1.80 and newer will NOT work
|
||||
in kernels older than 1.3.33. So please always use the most recent version
|
||||
of aztcd.c with the appropriate linux-kernel.
|
||||
|
||||
3. CONFIGURING YOUR KERNEL
|
||||
If your kernel is already configured for using the AZTECH driver you will
|
||||
see the following message while Linux boots:
|
||||
Aztech CD-ROM Init: DriverVersion=<version number> BaseAddress=<baseaddress>
|
||||
Aztech CD-ROM Init: FirmwareVersion=<firmware version id of your I/O-card>>>
|
||||
Aztech CD-ROM Init: <drive type> detected
|
||||
Aztech CD-ROM Init: End
|
||||
If the message looks different and you are sure to have a supported drive,
|
||||
it may have a different base address. The Aztech driver does look for the
|
||||
CD-ROM drive at the base address specified in aztcd.h at compile time. This
|
||||
address can be overwritten by boot parameter aztcd=....You should reboot and
|
||||
start Linux with boot parameter aztcd=<base address>, e.g. aztcd=0x320. If
|
||||
you do not know the base address, start your PC with DOS and look at the boot
|
||||
message of your CD-ROM's DOS driver. If that still does not help, use boot
|
||||
parameter aztcd=<base address>,0x79 , this tells aztcd to try a little harder.
|
||||
aztcd may be configured to use autoprobing the base address by recompiling
|
||||
it (see chapter 4.).
|
||||
|
||||
If the message looks correct, as user 'root' you should be able to mount the
|
||||
drive by
|
||||
mount -t iso9660 -r /dev/aztcd0 /mnt
|
||||
and use it as any other filesystem. (If this does not work, check if
|
||||
/dev/aztcd0 and /mnt do exist and create them, if necessary by doing
|
||||
mknod /dev/aztcd0 b 29 0
|
||||
mkdir /mnt
|
||||
|
||||
If you still get a different message while Linux boots or when you get the
|
||||
message, that the ISO9660-filesystem is not supported by your kernel, when
|
||||
you try to mount the CD-ROM drive, you have to recompile your kernel.
|
||||
|
||||
If you do *not* have an Aztech/Orchid/Okano/Wearnes/TXC drive and want to
|
||||
bypass drive detection during Linux boot up, start with boot parameter aztcd=0.
|
||||
|
||||
Most distributions nowadays do contain a boot disk image containing aztcd.
|
||||
Please note, that this driver will not work with IDE/ATAPI drives! With these
|
||||
you must use ide-cd.c instead.
|
||||
|
||||
4. RECOMPILING YOUR KERNEL
|
||||
If your kernel is not yet configured for the AZTECH driver and the ISO9660-
|
||||
filesystem, you have to recompile your kernel:
|
||||
|
||||
- Edit aztcd.h to set the I/O-address to your I/O-Base address (AZT_BASE_ADDR),
|
||||
the driver does not use interrupts or DMA, so if you are using an AZTECH
|
||||
CD268, an ORCHID CD-3110 or ORCHID/WEARNES CDD110 that's the only item you
|
||||
have to set up. If you have a soundcard, read chapter 4.2.
|
||||
Users of other drives should read chapter OTHER DRIVES of this file.
|
||||
You also can configure that address by kernel boot parameter aztcd=...
|
||||
- aztcd may be configured to use autoprobing the base address by setting
|
||||
AZT_BASE_ADDR to '-1'. In that case aztcd probes the addresses listed
|
||||
under AZT_BASE_AUTO. But please remember, that autoprobing always may
|
||||
incorrectly influence other hardware components too!
|
||||
- There are some other points, which may be configured, e.g. auto-eject the
|
||||
CD when unmounting a drive, tray locking etc., see aztcd.h for details.
|
||||
- If you're using a linux kernel version prior to 2.1.0, in aztcd.h
|
||||
uncomment the line '#define AZT_KERNEL_PRIOR_2_1'
|
||||
- Build a new kernel, configure it for 'Aztech/Orchid/Okano/Wearnes support'
|
||||
(if you want aztcd to be part of the kernel). Do not configure it for
|
||||
'Aztech... support', if you want to use aztcd as a run time loadable module.
|
||||
But in any case you must have the ISO9660-filesystem included in your
|
||||
kernel.
|
||||
- Activate the new kernel, normally this is done by running LILO (don't for-
|
||||
get to configure it before and to keep a copy of your old kernel in case
|
||||
something goes wrong!).
|
||||
- Reboot
|
||||
- If you've included aztcd in your kernel, you now should see during boot
|
||||
some messages like
|
||||
Aztech CD-ROM Init: DriverVersion=<version number> BaseAddress=<baseaddress>
|
||||
Aztech CD-ROM Init: FirmwareVersion=<firmware version id of your I/O-card>
|
||||
Aztech CD-ROM Init: <drive type> detected
|
||||
Aztech CD-ROM Init: End
|
||||
- If you have not included aztcd in your kernel, but want to load aztcd as a
|
||||
run time loadable module see 4.1.
|
||||
- If the message looks correct, as user 'root' you should be able to mount
|
||||
the drive by
|
||||
mount -t iso9660 -r /dev/aztcd0 /mnt
|
||||
and use it as any other filesystem. (If this does not work, check if
|
||||
/dev/aztcd0 and /mnt do exist and create them, if necessary by doing
|
||||
mknod /dev/aztcd0 b 29 0
|
||||
mkdir /mnt
|
||||
- If this still does not help, see chapters OTHER DRIVES and DEBUGGING.
|
||||
|
||||
4.1 AZTCD AS A RUN-TIME LOADABLE MODULE
|
||||
If you do not need aztcd permanently, you can also load and remove the driver
|
||||
during runtime via insmod and rmmod. To build aztcd as a loadable module you
|
||||
must configure your kernel for AZTECH module support (answer 'm' when con-
|
||||
figuring the kernel). Anyhow, you may run into problems, if the version of
|
||||
your boot kernel is not the same than the source kernel version, from which
|
||||
you create the modules. So rebuild your kernel, if necessary.
|
||||
|
||||
Now edit the base address of your AZTECH interface card in
|
||||
/usr/src/linux/drivers/cdrom/aztcd.h to the appropriate value.
|
||||
aztcd may be configured to use autoprobing the base address by setting
|
||||
AZT_BASE_ADDR to '-1'. In that case aztcd probes the addresses listed
|
||||
under AZT_BASE_AUTO. But please remember, that autoprobing always may
|
||||
incorrectly influence other hardware components too!
|
||||
There are also some special features which may be configured, e.g.
|
||||
auto-eject a CD when unmounting the drive etc; see aztcd.h for details.
|
||||
Then change to /usr/src/linux and do a
|
||||
make modules
|
||||
make modules_install
|
||||
After that you can run-time load the driver via
|
||||
insmod /lib/modules/X.X.X/misc/aztcd.o
|
||||
and remove it via rmmod aztcd.
|
||||
If you did not set the correct base address in aztcd.h, you can also supply the
|
||||
base address when loading the driver via
|
||||
insmod /lib/modules/X.X.X/misc/aztcd.o aztcd=<base address>
|
||||
Again specifying aztcd=-1 will cause autoprobing.
|
||||
If you do not have the iso9660-filesystem in your boot kernel, you also have
|
||||
to load it before you can mount the CDROM:
|
||||
insmod /lib/modules/X.X.X/fs/isofs.o
|
||||
The mount procedure works as described in 4. above.
|
||||
(In all commands 'X.X.X' is the current linux kernel version number)
|
||||
|
||||
4.2 CDROM CONNECTED TO A SOUNDCARD
|
||||
Most soundcards do have a bus interface to the CDROM-drive. In many cases
|
||||
this soundcard needs to be configured, before the CDROM can be used. This
|
||||
configuration procedure consists of writing some kind of initialization
|
||||
data to the soundcard registers. The AZTECH-CDROM driver in the moment does
|
||||
only support one type of soundcard (SoundWave32). Users of other soundcards
|
||||
should try to boot DOS first and let their DOS drivers initialize the
|
||||
soundcard and CDROM, then warm boot (or use loadlin) their PC to start
|
||||
Linux.
|
||||
Support for the CDROM-interface of SoundWave32-soundcards is directly
|
||||
implemented in the AZTECH driver. Please edit linux/drivers/cdrom/aztdc.h,
|
||||
uncomment line '#define AZT_SW32' and set the appropriate value for
|
||||
AZT_BASE_ADDR and AZT_SW32_BASE_ADDR. This support was tested with an Orchid
|
||||
CDS-3110 connected to a SoundWave32.
|
||||
If you want your soundcard to be supported, find out, how it needs to be
|
||||
configured and mail me (see 6.) the appropriate information.
|
||||
|
||||
5. KNOWN PROBLEMS, FUTURE DEVELOPMENTS
|
||||
5.1 MULTISESSION SUPPORT
|
||||
Multisession support for CD's still is a myth. I implemented and tested a basic
|
||||
support for multisession and XA CDs, but I still have not enough CDs and appli-
|
||||
cations to test it rigorously. So if you'd like to help me, please contact me
|
||||
(Email address see below). As of version 1.4 and newer you can enable the
|
||||
multisession support in aztcd.h by setting AZT_MULTISESSION to 1. Doing so
|
||||
will cause the ISO9660-filesystem to deal with multisession CDs, ie. redirect
|
||||
requests to the Table of Contents (TOC) information from the last session,
|
||||
which contains the info of all previous sessions etc.. If you do set
|
||||
AZT_MULTISESSION to 0, you can use multisession CDs anyway. In that case the
|
||||
drive's firmware will do automatic redirection. For the ISO9660-filesystem any
|
||||
multisession CD will then look like a 'normal' single session CD. But never-
|
||||
theless the data of all sessions are viewable and accessible. So with practical-
|
||||
ly all real world applications you won't notice the difference. But as future
|
||||
applications may make use of advanced multisession features, I've started to
|
||||
implement the interface for the ISO9660 multisession interface via ioctl
|
||||
CDROMMULTISESSION.
|
||||
|
||||
5.2 STATUS RECOGNITION
|
||||
The drive status recognition does not work correctly in all cases. Changing
|
||||
a disk or having the door open, when a drive is already mounted, is detected
|
||||
by the Aztech driver itself, but nevertheless causes multiple read attempts
|
||||
by the different layers of the ISO9660-filesystem driver, which finally timeout,
|
||||
so you have to wait quite a little... But isn't it bad style to change a disk
|
||||
in a mounted drive, anyhow ?!
|
||||
|
||||
The driver uses busy wait in most cases for the drive handshake (macros
|
||||
STEN_LOW and DTEN_LOW). I tested with a 486/DX2 at 66MHz and a Pentium at
|
||||
60MHz and 90MHz. Whenever you use a much faster machine you are likely to get
|
||||
timeout messages. In that case edit aztcd.h and increase the timeout value
|
||||
AZT_TIMEOUT.
|
||||
|
||||
For some 'slow' drive commands I implemented waiting with a timer waitqueue
|
||||
(macro STEN_LOW_WAIT). If you get this timeout message, you may also edit
|
||||
aztcd.h and increase the timeout value AZT_STATUS_DELAY. The waitqueue has
|
||||
shown to be a little critical. If you get kernel panic messages, edit aztcd.c
|
||||
and substitute STEN_LOW_WAIT by STEN_LOW. Busy waiting with STEN_LOW is more
|
||||
stable, but also causes CPU overhead.
|
||||
|
||||
5.3 DOSEMU's CD-ROM SUPPORT
|
||||
With release 1.20 aztcd was modified to allow access to CD-ROMS when running
|
||||
under dosemu-0.60.0 aztcd-versions before 1.20 are most likely to crash
|
||||
Linux, when a CD-ROM is accessed under dosemu. This problem has partly been
|
||||
fixed, but still when accessing a directory for the first time the system
|
||||
might hang for some 30sec. So be patient, when using dosemu's CD-ROM support
|
||||
in combination with aztcd :-) !
|
||||
This problem has now (July 1995) been fixed by a modification to dosemu's
|
||||
CD-ROM driver. The new version came with dosemu-0.60.2, see dosemu's
|
||||
README.CDROM.
|
||||
|
||||
6. BUG REPORTS
|
||||
Please send detailed bug reports and bug fixes via EMail to
|
||||
|
||||
Werner.Zimmermann@fht-esslingen.de
|
||||
|
||||
Please include a description of your CD-ROM drive type and interface card,
|
||||
the exact firmware message during Linux bootup, the version number of the
|
||||
AZTECH-CDROM-driver and the Linux kernel version. Also a description of your
|
||||
system's other hardware could be of interest, especially microprocessor type,
|
||||
clock frequency, other interface cards such as soundcards, ethernet adapter,
|
||||
game cards etc..
|
||||
|
||||
I will try to collect the reports and make the necessary modifications from
|
||||
time to time. I may also come back to you directly with some bug fixes and
|
||||
ask you to do further testing and debugging.
|
||||
|
||||
Editors of CD-ROMs are invited to send a 'cooperation' copy of their
|
||||
CD-ROMs to the volunteers, who provided the CD-ROM support for Linux. My
|
||||
snail mail address for such 'stuff' is
|
||||
Prof. Dr. W. Zimmermann
|
||||
Fachhochschule fuer Technik Esslingen
|
||||
Fachbereich IT
|
||||
Flandernstrasse 101
|
||||
D-73732 Esslingen
|
||||
Germany
|
||||
|
||||
|
||||
7. OTHER DRIVES
|
||||
The following drives ORCHID CDS3110, OKANO CDD110, WEARNES CDD110 and Conrad
|
||||
TXC Nr. 993123-series 04 nearly look the same as AZTECH CDA268-01A, especially
|
||||
they seem to use the same command codes. So it was quite simple to make the
|
||||
AZTECH driver work with these drives.
|
||||
|
||||
Unfortunately I do not have any of these drives available, so I couldn't test
|
||||
it myself. In some installations, it seems necessary to initialize the drive
|
||||
with the DOS driver before (especially if combined with a sound card) and then
|
||||
do a warm boot (CTRL-ALT-RESET) or start Linux from DOS, e.g. with 'loadlin'.
|
||||
|
||||
If you do not succeed, read chapter DEBUGGING. Thanks in advance!
|
||||
|
||||
Sorry for the inconvenience, but it is difficult to develop for hardware,
|
||||
which you don't have available for testing. So if you like, please help us.
|
||||
|
||||
If you do have a CyCDROM CR520ie thanks to Hilmar Berger's help your chances
|
||||
are good, that it will work with aztcd. The CR520ie is sold as an IDE-drive
|
||||
and really is connected to the IDE interface (primary at 0x1F0 or secondary
|
||||
at 0x170, configured as slave, not as master). Nevertheless it is not ATAPI
|
||||
compatible but still uses Aztech's command codes.
|
||||
|
||||
|
||||
8. DEBUGGING : IF YOU DON'T SUCCEED, TRY THE FOLLOWING
|
||||
-reread the complete README file
|
||||
-make sure, that your drive is hardware configured for
|
||||
transfer mode: polled
|
||||
IRQ: not used
|
||||
DMA: not used
|
||||
Base Address: something like 300, 320 ...
|
||||
You can check this, when you start the DOS driver, which came with your
|
||||
drive. By appropriately configuring the drive and the DOS driver you can
|
||||
check, whether your drive does operate in this mode correctly under DOS. If
|
||||
it does not operate under DOS, it won't under Linux.
|
||||
If your drive's base address is something like 0x170 or 0x1F0 (and it is
|
||||
not a CyCDROM CR520ie or CR 940ie) you most likely are having an IDE/ATAPI-
|
||||
compatible drive, which is not supported by aztcd.c, use ide-cd.c instead.
|
||||
Make sure the Base Address is configured correctly in aztcd.h, also make
|
||||
sure, that /dev/aztcd0 exists with the correct major number (compare it with
|
||||
the entry in file /usr/include/linux/major.h for the Aztech drive).
|
||||
-insert a CD-ROM and close the tray
|
||||
-cold boot your PC (i.e. via the power on switch or the reset button)
|
||||
-if you start Linux via DOS, e.g. using loadlin, make sure, that the DOS
|
||||
driver for the CD-ROM drive is not loaded (comment out the calling lines
|
||||
in DOS' config.sys!)
|
||||
-look for the aztcd: init message during Linux init and note them exactly
|
||||
-log in as root and do a mount -t iso9660 /dev/aztcd0 /mnt
|
||||
-if you don't succeed in the first time, try several times. Try also to open
|
||||
and close the tray, then mount again. Please note carefully all commands
|
||||
you typed in and the aztcd-messages, which you get.
|
||||
-if you get an 'Aztech CD-ROM init: aborted' message, read the remarks about
|
||||
the version string below.
|
||||
|
||||
If this does not help, do the same with the following differences
|
||||
-start DOS before; make now sure, that the DOS driver for the CD-ROM is
|
||||
loaded under DOS (i.e. uncomment it again in config.sys)
|
||||
-warm boot your PC (i.e. via CTRL-ALT-DEL)
|
||||
if you have it, you can also start via loadlin (try both).
|
||||
...
|
||||
Again note all commands and the aztcd-messages.
|
||||
|
||||
If you see STEN_LOW or STEN_LOW_WAIT error messages, increase the timeout
|
||||
values.
|
||||
|
||||
If this still does not help,
|
||||
-look in aztcd.c for the lines #if 0
|
||||
#define AZT_TEST1
|
||||
...
|
||||
#endif
|
||||
and substitute '#if 0' by '#if 1'.
|
||||
-recompile your kernel and repeat the above two procedures. You will now get
|
||||
a bundle of debugging messages from the driver. Again note your commands
|
||||
and the appropriate messages. If you have syslogd running, these messages
|
||||
may also be found in syslogd's kernel log file. Nevertheless in some
|
||||
installations syslogd does not yet run, when init() is called, thus look for
|
||||
the aztcd-messages during init, before the login-prompt appears.
|
||||
Then look in aztcd.c, to find out, what happened. The normal calling sequence
|
||||
is: aztcd_init() during Linux bootup procedure init()
|
||||
after doing a 'mount -t iso9660 /dev/aztcd0 /mnt' the normal calling sequence is
|
||||
aztcd_open() -> Status 2c after cold reboot with CDROM or audio CD inserted
|
||||
-> Status 8 after warm reboot with CDROM inserted
|
||||
-> Status 2e after cold reboot with no disk, closed tray
|
||||
-> Status 6e after cold reboot, mount with door open
|
||||
aztUpdateToc()
|
||||
aztGetDiskInfo()
|
||||
aztGetQChannelInfo() repeated several times
|
||||
aztGetToc()
|
||||
aztGetQChannelInfo() repeated several times
|
||||
a list of track information
|
||||
do_aztcd_request() }
|
||||
azt_transfer() } repeated several times
|
||||
azt_poll }
|
||||
Check, if there is a difference in the calling sequence or the status flags!
|
||||
|
||||
There are a lot of other messages, eg. the ACMD-command code (defined in
|
||||
aztcd.h), status info from the getAztStatus-command and the state sequence of
|
||||
the finite state machine in azt_poll(). The most important are the status
|
||||
messages, look how they are defined and try to understand, if they make
|
||||
sense in the context where they appear. With a CD-ROM inserted the status
|
||||
should always be 8, except in aztcd_open(). Try to open the tray, insert an
|
||||
audio disk, insert no disk or reinsert the CD-ROM and check, if the status
|
||||
bits change accordingly. The status bits are the most likely point, where
|
||||
the drive manufacturers may implement changes.
|
||||
|
||||
If you still don't succeed, a good point to start is to look in aztcd.c in
|
||||
function aztcd_init, where the drive should be detected during init. Do the
|
||||
following:
|
||||
-reboot the system with boot parameter 'aztcd=<your base address>,0x79'. With
|
||||
parameter 0x79 most of the drive version detection is bypassed. After that
|
||||
you should see the complete version string including leading and trailing
|
||||
blanks during init.
|
||||
Now adapt the statement
|
||||
if ((result[1]=='A')&&(result[2]=='Z' ...)
|
||||
in aztcd_init() to exactly match the first 3 or 4 letters you have seen.
|
||||
-Another point is the 'smart' card detection feature in aztcd_init(). Normally
|
||||
the CD-ROM drive is ready, when aztcd_init is trying to read the version
|
||||
string and a time consuming ACMD_SOFT_RESET command can be avoided. This is
|
||||
detected by looking, if AFL_OP_OK can be read correctly. If the CD-ROM drive
|
||||
hangs in some unknown state, e.g. because of an error before a warm start or
|
||||
because you first operated under DOS, even the version string may be correct,
|
||||
but the following commands will not. Then change the code in such a way,
|
||||
that the ACMD_SOFT_RESET is issued in any case, by substituting the
|
||||
if-statement 'if ( ...=AFL_OP_OK)' by 'if (1)'.
|
||||
|
||||
If you succeed, please mail me the exact version string of your drive and
|
||||
the code modifications, you have made together with a short explanation.
|
||||
If you don't succeed, you may mail me the output of the debugging messages.
|
||||
But remember, they are only useful, if they are exact and complete and you
|
||||
describe in detail your hardware setup and what you did (cold/warm reboot,
|
||||
with/without DOS, DOS-driver started/not started, which Linux-commands etc.)
|
||||
|
||||
|
||||
9. TECHNICAL HISTORY OF THE DRIVER
|
||||
The AZTECH-Driver is a rework of the Mitsumi-Driver. Four major items had to
|
||||
be reworked:
|
||||
|
||||
a) The Mitsumi drive does issue complete status information acknowledging
|
||||
each command, the Aztech drive does only signal that the command was
|
||||
processed. So whenever the complete status information is needed, an extra
|
||||
ACMD_GET_STATUS command is issued. The handshake procedure for the drive
|
||||
can be found in the functions aztSendCmd(), sendAztCmd() and getAztStatus().
|
||||
|
||||
b) The Aztech Drive does not have a ACMD_GET_DISK_INFO command, so the
|
||||
necessary info about the number of tracks (firstTrack, lastTrack), disk
|
||||
length etc. has to be read from the TOC in the lead in track (see function
|
||||
aztGetDiskInfo()).
|
||||
|
||||
c) Whenever data is read from the drive, the Mitsumi drive is started with a
|
||||
command to read an indefinite (0xffffff) number of sectors. When the appropriate
|
||||
number of sectors is read, the drive is stopped by a ACDM_STOP command. This
|
||||
does not work with the Aztech drive. I did not find a way to stop it. The
|
||||
stop and pause commands do only work in AUDIO mode but not in DATA mode.
|
||||
Therefore I had to modify the 'finite state machine' in function azt_poll to
|
||||
only read a certain number of sectors and then start a new read on demand. As I
|
||||
have not completely understood, how the buffer/caching scheme of the Mitsumi
|
||||
driver was implemented, I am not sure, if I have covered all cases correctly,
|
||||
whenever you get timeout messages, the bug is most likely to be in that
|
||||
function azt_poll() around switch(cmd) .... case ACD_S_DATA.
|
||||
|
||||
d) I did not get information about changing drive mode. So I doubt, that the
|
||||
code around function azt_poll() case AZT_S_MODE does work. In my test I have
|
||||
not been able to switch to reading in raw mode. For reading raw mode, Aztech
|
||||
uses a different command than for cooked mode, which I only have implemen-
|
||||
ted in the ioctl-section but not in the section which is used by the ISO9660.
|
||||
|
||||
The driver was developed on an AST PC with Intel 486/DX2, 8MB RAM, 340MB IDE
|
||||
hard disk and on an AST PC with Intel Pentium 60MHz, 16MB RAM, 520MB IDE
|
||||
running Linux kernel version 1.0.9 from the LST 1.8 Distribution. The kernel
|
||||
was compiled with gcc.2.5.8. My CD-ROM drive is an Aztech CDA268-01A. My
|
||||
drive says, that it has Firmware Version AZT26801A1.3. It came with an ISA-bus
|
||||
interface card and works with polled I/O without DMA and without interrupts.
|
||||
The code for all other drives was 'remote' tested and debugged by a number of
|
||||
volunteers on the Internet.
|
||||
|
||||
Points, where I feel that possible problems might be and all points where I
|
||||
did not completely understand the drive's behaviour or trust my own code are
|
||||
marked with /*???*/ in the source code. There are also some parts in the
|
||||
Mitsumi driver, where I did not completely understand their code.
|
||||
|
||||
|
||||
10. ACKNOWLEDGMENTS
|
||||
Without the help of P.Bush, Aztech, who delivered technical information
|
||||
about the Aztech Drive and without the help of E.Moenkeberg, GWDG, who did a
|
||||
great job in analyzing the command structure of various CD-ROM drives, this
|
||||
work would not have been possible. E.Moenkeberg was also a great help in
|
||||
making the software 'kernel ready' and in answering many of the CDROM-related
|
||||
questions in the newsgroups. He really is *the* Linux CD-ROM guru. Thanks
|
||||
also to all the guys on the Internet, who collected valuable technical
|
||||
information about CDROMs.
|
||||
|
||||
Joe Nardone (joe@access.digex.net) was a patient tester even for my first
|
||||
trial, which was more than slow, and made suggestions for code improvement.
|
||||
Especially the 'finite state machine' azt_poll() was rewritten by Joe to get
|
||||
clean C code and avoid the ugly 'gotos', which I copied from mcd.c.
|
||||
|
||||
Robby Schirmer (schirmer@fmi.uni-passau.de) tested the audio stuff (ioctls)
|
||||
and suggested a lot of patches for them.
|
||||
|
||||
Joseph Piskor and Peter Nugent were the first users with the ORCHID CD3110
|
||||
and also were very patient with the problems which occurred.
|
||||
|
||||
Reinhard Max delivered the information for the CDROM-interface of the
|
||||
SoundWave32 soundcards.
|
||||
|
||||
Jochen Kunz and Olaf Kaluza delivered the information for supporting Conrad's
|
||||
TXC drive.
|
||||
|
||||
Hilmar Berger delivered the patches for supporting CyCDROM CR520ie.
|
||||
|
||||
Anybody, who is interested in these items should have a look at 'ftp.gwdg.de',
|
||||
directory 'pub/linux/cdrom' and at 'ftp.cdrom.com', directory 'pub/cdrom'.
|
||||
|
||||
11. PROGRAMMING ADD ONs: cdplay.c
|
||||
You can use the ioctl-functions included in aztcd.c in your own programs. As
|
||||
an example on how to do this, you will find a tiny CD Player for audio CDs
|
||||
named 'cdplay.c'. It allows you to play audio CDs. You can play a specified
|
||||
track, pause and resume or skip tracks forward and backwards. If you quit the
|
||||
program without stopping the drive, playing is continued. You can also
|
||||
(mis)use cdplay to read and hexdump data disks. You can find the code in the
|
||||
APPENDIX of this file, which you should cut out with an editor and store in a
|
||||
separate file 'cdplay.c'. To compile it and make it executable, do
|
||||
gcc -s -Wall -O2 -L/usr/lib cdplay.c -o /usr/local/bin/cdplay # compiles it
|
||||
chmod +755 /usr/local/bin/cdplay # makes it executable
|
||||
ln -s /dev/aztcd0 /dev/cdrom # creates a link
|
||||
(for /usr/lib substitute the top level directory, where your include files
|
||||
reside, and for /usr/local/bin the directory, where you want the executable
|
||||
binary to reside )
|
||||
|
||||
You have to set the correct permissions for cdplay *and* for /dev/mcd0 or
|
||||
/dev/aztcd0 in order to use it. Remember, that you should not have /dev/cdrom
|
||||
mounted, when you're playing audio CDs.
|
||||
|
||||
This program is just a hack for testing the ioctl-functions in aztcd.c. I will
|
||||
not maintain it, so if you run into problems, discard it or have a look into
|
||||
the source code 'cdplay.c'. The program does only contain a minimum of user
|
||||
protection and input error detection. If you use the commands in the wrong
|
||||
order or if you try to read a CD at wrong addresses, you may get error messages
|
||||
or even hang your machine. If you get STEN_LOW, STEN_LOW_WAIT or segment violation
|
||||
error messages when using cdplay, after that, the system might not be stable
|
||||
any more, so you'd better reboot. As the ioctl-functions run in kernel mode,
|
||||
most normal Linux-multitasking protection features do not work. By using
|
||||
uninitialized 'wild' pointers etc., it is easy to write to other users' data
|
||||
and program areas, destroy kernel tables etc.. So if you experiment with ioctls
|
||||
as always when you are doing systems programming and kernel hacking, you
|
||||
should have a backup copy of your system in a safe place (and you also
|
||||
should try restoring from a backup copy first)!
|
||||
|
||||
A reworked and improved version called 'cdtester.c', which has yet more
|
||||
features for testing CDROM-drives can be found in
|
||||
Documentation/cdrom/sbpcd, written by E.Moenkeberg.
|
||||
|
||||
Werner Zimmermann
|
||||
Fachhochschule fuer Technik Esslingen
|
||||
(EMail: Werner.Zimmermann@fht-esslingen.de)
|
||||
October, 1997
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
APPENDIX: Source code of cdplay.c
|
||||
|
||||
/* Tiny Audio CD Player
|
||||
|
||||
Copyright 1994, 1995, 1996 Werner Zimmermann (Werner.Zimmermann@fht-esslingen.de)
|
||||
|
||||
This program originally was written to test the audio functions of the
|
||||
AZTECH.CDROM-driver, but it should work with every CD-ROM drive. Before
|
||||
using it, you should set a symlink from /dev/cdrom to your real CDROM
|
||||
device.
|
||||
|
||||
The GNU General Public License applies to this program.
|
||||
|
||||
History: V0.1 W.Zimmermann: First release. Nov. 8, 1994
|
||||
V0.2 W.Zimmermann: Enhanced functionality. Nov. 9, 1994
|
||||
V0.3 W.Zimmermann: Additional functions. Nov. 28, 1994
|
||||
V0.4 W.Zimmermann: fixed some bugs. Dec. 17, 1994
|
||||
V0.5 W.Zimmermann: clean 'scanf' commands without compiler warnings
|
||||
Jan. 6, 1995
|
||||
V0.6 W.Zimmermann: volume control (still experimental). Jan. 24, 1995
|
||||
V0.7 W.Zimmermann: read raw modified. July 26, 95
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/cdrom.h>
|
||||
#include <linux/../../drivers/cdrom/aztcd.h>
|
||||
|
||||
void help(void)
|
||||
{ printf("Available Commands: STOP s EJECT/CLOSE e QUIT q\n");
|
||||
printf(" PLAY TRACK t PAUSE p RESUME r\n");
|
||||
printf(" NEXT TRACK n REPEAT LAST l HELP h\n");
|
||||
printf(" SUB CHANNEL c TRACK INFO i PLAY AT a\n");
|
||||
printf(" READ d READ RAW w VOLUME v\n");
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{ int handle;
|
||||
unsigned char command=' ', ini=0, first=1, last=1;
|
||||
unsigned int cmd, i,j,k, arg1,arg2,arg3;
|
||||
struct cdrom_ti ti;
|
||||
struct cdrom_tochdr tocHdr;
|
||||
struct cdrom_subchnl subchnl;
|
||||
struct cdrom_tocentry entry;
|
||||
struct cdrom_msf msf;
|
||||
union { struct cdrom_msf msf;
|
||||
unsigned char buf[CD_FRAMESIZE_RAW];
|
||||
} azt;
|
||||
struct cdrom_volctrl volctrl;
|
||||
|
||||
printf("\nMini-Audio CD-Player V0.72 (C) 1994,1995,1996 W.Zimmermann\n");
|
||||
handle=open("/dev/cdrom",O_RDWR);
|
||||
ioctl(handle,CDROMRESUME);
|
||||
|
||||
if (handle<=0)
|
||||
{ printf("Drive Error: already playing, no audio disk, door open\n");
|
||||
printf(" or no permission (you must be ROOT in order to use this program)\n");
|
||||
}
|
||||
else
|
||||
{ help();
|
||||
while (1)
|
||||
{ printf("Type command (h = help): ");
|
||||
scanf("%s",&command);
|
||||
switch (command)
|
||||
{ case 'e': cmd=CDROMEJECT;
|
||||
ioctl(handle,cmd);
|
||||
break;
|
||||
case 'p': if (!ini)
|
||||
{ printf("Command not allowed - play track first\n");
|
||||
}
|
||||
else
|
||||
{ cmd=CDROMPAUSE;
|
||||
if (ioctl(handle,cmd)) printf("Drive Error\n");
|
||||
}
|
||||
break;
|
||||
case 'r': if (!ini)
|
||||
{ printf("Command not allowed - play track first\n");
|
||||
}
|
||||
else
|
||||
{ cmd=CDROMRESUME;
|
||||
if (ioctl(handle,cmd)) printf("Drive Error\n");
|
||||
}
|
||||
break;
|
||||
case 's': cmd=CDROMPAUSE;
|
||||
if (ioctl(handle,cmd)) printf("Drive error or already stopped\n");
|
||||
cmd=CDROMSTOP;
|
||||
if (ioctl(handle,cmd)) printf("Drive error\n");
|
||||
break;
|
||||
case 't': cmd=CDROMREADTOCHDR;
|
||||
if (ioctl(handle,cmd,&tocHdr)) printf("Drive Error\n");
|
||||
first=tocHdr.cdth_trk0;
|
||||
last= tocHdr.cdth_trk1;
|
||||
if ((first==0)||(first>last))
|
||||
{ printf ("--could not read TOC\n");
|
||||
}
|
||||
else
|
||||
{ printf("--first track: %d --last track: %d --enter track number: ",first,last);
|
||||
cmd=CDROMPLAYTRKIND;
|
||||
scanf("%i",&arg1);
|
||||
ti.cdti_trk0=arg1;
|
||||
if (ti.cdti_trk0<first) ti.cdti_trk0=first;
|
||||
if (ti.cdti_trk0>last) ti.cdti_trk0=last;
|
||||
ti.cdti_ind0=0;
|
||||
ti.cdti_trk1=last;
|
||||
ti.cdti_ind1=0;
|
||||
if (ioctl(handle,cmd,&ti)) printf("Drive Error\n");
|
||||
ini=1;
|
||||
}
|
||||
break;
|
||||
case 'n': if (!ini++)
|
||||
{ if (ioctl(handle,CDROMREADTOCHDR,&tocHdr)) printf("Drive Error\n");
|
||||
first=tocHdr.cdth_trk0;
|
||||
last= tocHdr.cdth_trk1;
|
||||
ti.cdti_trk0=first-1;
|
||||
}
|
||||
if ((first==0)||(first>last))
|
||||
{ printf ("--could not read TOC\n");
|
||||
}
|
||||
else
|
||||
{ cmd=CDROMPLAYTRKIND;
|
||||
if (++ti.cdti_trk0 > last) ti.cdti_trk0=last;
|
||||
ti.cdti_ind0=0;
|
||||
ti.cdti_trk1=last;
|
||||
ti.cdti_ind1=0;
|
||||
if (ioctl(handle,cmd,&ti)) printf("Drive Error\n");
|
||||
ini=1;
|
||||
}
|
||||
break;
|
||||
case 'l': if (!ini++)
|
||||
{ if (ioctl(handle,CDROMREADTOCHDR,&tocHdr)) printf("Drive Error\n");
|
||||
first=tocHdr.cdth_trk0;
|
||||
last= tocHdr.cdth_trk1;
|
||||
ti.cdti_trk0=first+1;
|
||||
}
|
||||
if ((first==0)||(first>last))
|
||||
{ printf ("--could not read TOC\n");
|
||||
}
|
||||
else
|
||||
{ cmd=CDROMPLAYTRKIND;
|
||||
if (--ti.cdti_trk0 < first) ti.cdti_trk0=first;
|
||||
ti.cdti_ind0=0;
|
||||
ti.cdti_trk1=last;
|
||||
ti.cdti_ind1=0;
|
||||
if (ioctl(handle,cmd,&ti)) printf("Drive Error\n");
|
||||
ini=1;
|
||||
}
|
||||
break;
|
||||
case 'c': subchnl.cdsc_format=CDROM_MSF;
|
||||
if (ioctl(handle,CDROMSUBCHNL,&subchnl))
|
||||
printf("Drive Error\n");
|
||||
else
|
||||
{ printf("AudioStatus:%s Track:%d Mode:%d MSF=%d:%d:%d\n", \
|
||||
subchnl.cdsc_audiostatus==CDROM_AUDIO_PLAY ? "PLAYING":"NOT PLAYING",\
|
||||
subchnl.cdsc_trk,subchnl.cdsc_adr, \
|
||||
subchnl.cdsc_absaddr.msf.minute, subchnl.cdsc_absaddr.msf.second, \
|
||||
subchnl.cdsc_absaddr.msf.frame);
|
||||
}
|
||||
break;
|
||||
case 'i': if (!ini)
|
||||
{ printf("Command not allowed - play track first\n");
|
||||
}
|
||||
else
|
||||
{ cmd=CDROMREADTOCENTRY;
|
||||
printf("Track No.: ");
|
||||
scanf("%d",&arg1);
|
||||
entry.cdte_track=arg1;
|
||||
if (entry.cdte_track<first) entry.cdte_track=first;
|
||||
if (entry.cdte_track>last) entry.cdte_track=last;
|
||||
entry.cdte_format=CDROM_MSF;
|
||||
if (ioctl(handle,cmd,&entry))
|
||||
{ printf("Drive error or invalid track no.\n");
|
||||
}
|
||||
else
|
||||
{ printf("Mode %d Track, starts at %d:%d:%d\n", \
|
||||
entry.cdte_adr,entry.cdte_addr.msf.minute, \
|
||||
entry.cdte_addr.msf.second,entry.cdte_addr.msf.frame);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'a': cmd=CDROMPLAYMSF;
|
||||
printf("Address (min:sec:frame) ");
|
||||
scanf("%d:%d:%d",&arg1,&arg2,&arg3);
|
||||
msf.cdmsf_min0 =arg1;
|
||||
msf.cdmsf_sec0 =arg2;
|
||||
msf.cdmsf_frame0=arg3;
|
||||
if (msf.cdmsf_sec0 > 59) msf.cdmsf_sec0 =59;
|
||||
if (msf.cdmsf_frame0> 74) msf.cdmsf_frame0=74;
|
||||
msf.cdmsf_min1=60;
|
||||
msf.cdmsf_sec1=00;
|
||||
msf.cdmsf_frame1=00;
|
||||
if (ioctl(handle,cmd,&msf))
|
||||
{ printf("Drive error or invalid address\n");
|
||||
}
|
||||
break;
|
||||
#ifdef AZT_PRIVATE_IOCTLS /*not supported by every CDROM driver*/
|
||||
case 'd': cmd=CDROMREADCOOKED;
|
||||
printf("Address (min:sec:frame) ");
|
||||
scanf("%d:%d:%d",&arg1,&arg2,&arg3);
|
||||
azt.msf.cdmsf_min0 =arg1;
|
||||
azt.msf.cdmsf_sec0 =arg2;
|
||||
azt.msf.cdmsf_frame0=arg3;
|
||||
if (azt.msf.cdmsf_sec0 > 59) azt.msf.cdmsf_sec0 =59;
|
||||
if (azt.msf.cdmsf_frame0> 74) azt.msf.cdmsf_frame0=74;
|
||||
if (ioctl(handle,cmd,&azt.msf))
|
||||
{ printf("Drive error, invalid address or unsupported command\n");
|
||||
}
|
||||
k=0;
|
||||
getchar();
|
||||
for (i=0;i<128;i++)
|
||||
{ printf("%4d:",i*16);
|
||||
for (j=0;j<16;j++)
|
||||
{ printf("%2x ",azt.buf[i*16+j]);
|
||||
}
|
||||
for (j=0;j<16;j++)
|
||||
{ if (isalnum(azt.buf[i*16+j]))
|
||||
printf("%c",azt.buf[i*16+j]);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
printf("\n");
|
||||
k++;
|
||||
if (k>=20)
|
||||
{ printf("press ENTER to continue\n");
|
||||
getchar();
|
||||
k=0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'w': cmd=CDROMREADRAW;
|
||||
printf("Address (min:sec:frame) ");
|
||||
scanf("%d:%d:%d",&arg1,&arg2,&arg3);
|
||||
azt.msf.cdmsf_min0 =arg1;
|
||||
azt.msf.cdmsf_sec0 =arg2;
|
||||
azt.msf.cdmsf_frame0=arg3;
|
||||
if (azt.msf.cdmsf_sec0 > 59) azt.msf.cdmsf_sec0 =59;
|
||||
if (azt.msf.cdmsf_frame0> 74) azt.msf.cdmsf_frame0=74;
|
||||
if (ioctl(handle,cmd,&azt))
|
||||
{ printf("Drive error, invalid address or unsupported command\n");
|
||||
}
|
||||
k=0;
|
||||
for (i=0;i<147;i++)
|
||||
{ printf("%4d:",i*16);
|
||||
for (j=0;j<16;j++)
|
||||
{ printf("%2x ",azt.buf[i*16+j]);
|
||||
}
|
||||
for (j=0;j<16;j++)
|
||||
{ if (isalnum(azt.buf[i*16+j]))
|
||||
printf("%c",azt.buf[i*16+j]);
|
||||
else
|
||||
printf(".");
|
||||
}
|
||||
printf("\n");
|
||||
k++;
|
||||
if (k>=20)
|
||||
{ getchar();
|
||||
k=0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case 'v': cmd=CDROMVOLCTRL;
|
||||
printf("--Channel 0 Left (0-255): ");
|
||||
scanf("%d",&arg1);
|
||||
printf("--Channel 1 Right (0-255): ");
|
||||
scanf("%d",&arg2);
|
||||
volctrl.channel0=arg1;
|
||||
volctrl.channel1=arg2;
|
||||
volctrl.channel2=0;
|
||||
volctrl.channel3=0;
|
||||
if (ioctl(handle,cmd,&volctrl))
|
||||
{ printf("Drive error or unsupported command\n");
|
||||
}
|
||||
break;
|
||||
case 'q': if (close(handle)) printf("Drive Error: CLOSE\n");
|
||||
exit(0);
|
||||
case 'h': help();
|
||||
break;
|
||||
default: printf("unknown command\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -1,196 +0,0 @@
|
||||
|
||||
CDU31A/CDU33A Driver Info
|
||||
-------------------------
|
||||
|
||||
Information on the Sony CDU31A/CDU33A CDROM driver for the Linux
|
||||
kernel.
|
||||
|
||||
Corey Minyard (minyard@metronet.com)
|
||||
|
||||
Colossians 3:17
|
||||
|
||||
Crude Table of Contents
|
||||
-----------------------
|
||||
|
||||
Setting Up the Hardware
|
||||
Configuring the Kernel
|
||||
Configuring as a Module
|
||||
Driver Special Features
|
||||
|
||||
|
||||
This device driver handles Sony CDU31A/CDU33A CDROM drives and
|
||||
provides a complete block-level interface as well as an ioctl()
|
||||
interface as specified in include/linux/cdrom.h). With this
|
||||
interface, CDROMs can be accessed, standard audio CDs can be played
|
||||
back normally, and CD audio information can be read off the drive.
|
||||
|
||||
Note that this will only work for CDU31A/CDU33A drives. Some vendors
|
||||
market their drives as CDU31A compatible. They lie. Their drives are
|
||||
really CDU31A hardware interface compatible (they can plug into the
|
||||
same card). They are not software compatible.
|
||||
|
||||
Setting Up the Hardware
|
||||
-----------------------
|
||||
|
||||
The CDU31A driver is unable to safely tell if an interface card is
|
||||
present that it can use because the interface card does not announce
|
||||
its presence in any way besides placing 4 I/O locations in memory. It
|
||||
used to just probe memory and attempt commands, but Linus wisely asked
|
||||
me to remove that because it could really screw up other hardware in
|
||||
the system.
|
||||
|
||||
Because of this, you must tell the kernel where the drive interface
|
||||
is, what interrupts are used, and possibly if you are on a PAS-16
|
||||
soundcard.
|
||||
|
||||
If you have the Sony CDU31A/CDU33A drive interface card, the following
|
||||
diagram will help you set it up. If you have another card, you are on
|
||||
your own. You need to make sure that the I/O address and interrupt is
|
||||
not used by another card in the system. You will need to know the I/O
|
||||
address and interrupt you have set. Note that use of interrupts is
|
||||
highly recommended, if possible, it really cuts down on CPU used.
|
||||
Unfortunately, most soundcards do not support interrupts for their
|
||||
CDROM interfaces. By default, the Sony interface card comes with
|
||||
interrupts disabled.
|
||||
|
||||
+----------+-----------------+----------------------+
|
||||
| JP1 | 34 Pin Conn | |
|
||||
| JP2 +-----------------+ |
|
||||
| JP3 |
|
||||
| JP4 |
|
||||
| +--+
|
||||
| | +-+
|
||||
| | | | External
|
||||
| | | | Connector
|
||||
| | | |
|
||||
| | +-+
|
||||
| +--+
|
||||
| |
|
||||
| +--------+
|
||||
| |
|
||||
+------------------------------------------+
|
||||
|
||||
JP1 sets the Base Address, using the following settings:
|
||||
|
||||
Address Pin 1 Pin 2
|
||||
------- ----- -----
|
||||
0x320 Short Short
|
||||
0x330 Short Open
|
||||
0x340 Open Short
|
||||
0x360 Open Open
|
||||
|
||||
JP2 and JP3 configure the DMA channel; they must be set the same.
|
||||
|
||||
DMA Pin 1 Pin 2 Pin 3
|
||||
--- ----- ----- -----
|
||||
1 On Off On
|
||||
2 Off On Off
|
||||
3 Off Off On
|
||||
|
||||
JP4 Configures the IRQ:
|
||||
|
||||
IRQ Pin 1 Pin 2 Pin 3 Pin 4
|
||||
--- ----- ----- ----- -----
|
||||
3 Off Off On Off
|
||||
4 Off Off* Off On
|
||||
5 On Off Off Off
|
||||
6 Off On Off Off
|
||||
|
||||
The documentation states to set this for interrupt
|
||||
4, but I think that is a mistake.
|
||||
|
||||
Note that if you have another interface card, you will need to look at
|
||||
the documentation to find the I/O base address. This is specified to
|
||||
the SLCD.SYS driver for DOS with the /B: parameter, so you can look at
|
||||
you DOS driver setup to find the address, if necessary.
|
||||
|
||||
Configuring the Kernel
|
||||
----------------------
|
||||
|
||||
You must tell the kernel where the drive is at boot time. This can be
|
||||
done at the Linux boot prompt, by using LILO, or by using Bootlin.
|
||||
Note that this is no substitute for HOWTOs and LILO documentation, if
|
||||
you are confused please read those for info on bootline configuration
|
||||
and LILO.
|
||||
|
||||
At the linux boot prompt, press the ALT key and add the following line
|
||||
after the boot name (you can let the kernel boot, it will tell you the
|
||||
default boot name while booting):
|
||||
|
||||
cdu31a=<base address>,<interrupt>[,PAS]
|
||||
|
||||
The base address needs to have "0x" in front of it, since it is in
|
||||
hex. For instance, to configure a drive at address 320 on interrupt 5,
|
||||
use the following:
|
||||
|
||||
cdu31a=0x320,5
|
||||
|
||||
I use the following boot line:
|
||||
|
||||
cdu31a=0x1f88,0,PAS
|
||||
|
||||
because I have a PAS-16 which does not support interrupt for the
|
||||
CDU31A interface.
|
||||
|
||||
Adding this as an append line at the beginning of the /etc/lilo.conf
|
||||
file will set it for lilo configurations. I have the following as the
|
||||
first line in my lilo.conf file:
|
||||
|
||||
append="cdu31a=0x1f88,0"
|
||||
|
||||
I'm not sure how to set up Bootlin (I have never used it), if someone
|
||||
would like to fill in this section please do.
|
||||
|
||||
|
||||
Configuring as a Module
|
||||
-----------------------
|
||||
|
||||
The driver supports loading as a module. However, you must specify
|
||||
the boot address and interrupt on the boot line to insmod. You can't
|
||||
use modprobe to load it, since modprobe doesn't support setting
|
||||
variables.
|
||||
|
||||
Anyway, I use the following line to load my driver as a module
|
||||
|
||||
/sbin/insmod /lib/modules/`uname -r`/misc/cdu31a.o cdu31a_port=0x1f88
|
||||
|
||||
You can set the following variables in the driver:
|
||||
|
||||
cdu31a_port=<I/O address> - sets the base I/O. If hex, put 0x in
|
||||
front of it. This must be specified.
|
||||
|
||||
cdu31a_irq=<interrupt> - Sets the interrupt number. Leaving this
|
||||
off will turn interrupts off.
|
||||
|
||||
|
||||
Driver Special Features
|
||||
-----------------------
|
||||
|
||||
This section describes features beyond the normal audio and CD-ROM
|
||||
functions of the drive.
|
||||
|
||||
2048 byte buffer mode
|
||||
|
||||
If a disk is mounted with -o block=2048, data is copied straight from
|
||||
the drive data port to the buffer. Otherwise, the readahead buffer
|
||||
must be involved to hold the other 1K of data when a 1K block
|
||||
operation is done. Note that with 2048 byte blocks you cannot execute
|
||||
files from the CD.
|
||||
|
||||
XA compatibility
|
||||
|
||||
The driver should support XA disks for both the CDU31A and CDU33A. It
|
||||
does this transparently, the using program doesn't need to set it.
|
||||
|
||||
Multi-Session
|
||||
|
||||
A multi-session disk looks just like a normal disk to the user. Just
|
||||
mount one normally, and all the data should be there. A special
|
||||
thanks to Koen for help with this!
|
||||
|
||||
Raw sector I/O
|
||||
|
||||
Using the CDROMREADAUDIO it is possible to read raw audio and data
|
||||
tracks. Both operations return 2352 bytes per sector. On the data
|
||||
tracks, the first 12 bytes is not returned by the drive and the value
|
||||
of that data is indeterminate.
|
@ -1,185 +0,0 @@
|
||||
This is the readme file for the driver for the Philips/LMS cdrom drive
|
||||
cm206 in combination with the cm260 host adapter card.
|
||||
|
||||
(c) 1995 David A. van Leeuwen
|
||||
|
||||
Changes since version 0.99
|
||||
--------------------------
|
||||
- Interfacing to the kernel is routed though an extra interface layer,
|
||||
cdrom.c. This allows runtime-configurable `behavior' of the cdrom-drive,
|
||||
independent of the driver.
|
||||
|
||||
Features since version 0.33
|
||||
---------------------------
|
||||
- Full audio support, that is, both workman, workbone and cdp work
|
||||
now reasonably. Reading TOC still takes some time. xmcd has been
|
||||
reported to run successfully.
|
||||
- Made auto-probe code a little better, I hope
|
||||
|
||||
Features since version 0.28
|
||||
---------------------------
|
||||
- Full speed transfer rate (300 kB/s).
|
||||
- Minimum kernel memory usage for buffering (less than 3 kB).
|
||||
- Multisession support.
|
||||
- Tray locking.
|
||||
- Statistics of driver accessible to the user.
|
||||
- Module support.
|
||||
- Auto-probing of adapter card's base port and irq line,
|
||||
also configurable at boot time or module load time.
|
||||
|
||||
|
||||
Decide how you are going to use the driver. There are two
|
||||
options:
|
||||
|
||||
(a) installing the driver as a resident part of the kernel
|
||||
(b) compiling the driver as a loadable module
|
||||
|
||||
Further, you must decide if you are going to specify the base port
|
||||
address and the interrupt request line of the adapter card cm260 as
|
||||
boot options for (a), module parameters for (b), use automatic
|
||||
probing of these values, or hard-wire your adaptor card's settings
|
||||
into the source code. If you don't care, you can choose
|
||||
autoprobing, which is the default. In that case you can move on to
|
||||
the next step.
|
||||
|
||||
Compiling the kernel
|
||||
--------------------
|
||||
1) move to /usr/src/linux and do a
|
||||
|
||||
make config
|
||||
|
||||
If you have chosen option (a), answer yes to CONFIG_CM206 and
|
||||
CONFIG_ISO9660_FS.
|
||||
|
||||
If you have chosen option (b), answer yes to CONFIG_MODVERSIONS
|
||||
and no (!) to CONFIG_CM206 and CONFIG_ISO9660_FS.
|
||||
|
||||
2) then do a
|
||||
|
||||
make clean; make zImage; make modules
|
||||
|
||||
3) do the usual things to install a new image (backup the old one, run
|
||||
`rdev -R zImage 1', copy the new image in place, run lilo). Might
|
||||
be `make zlilo'.
|
||||
|
||||
Using the driver as a module
|
||||
----------------------------
|
||||
If you will only occasionally use the cd-rom driver, you can choose
|
||||
option (b), install as a loadable module. You may have to re-compile
|
||||
the module when you upgrade the kernel to a new version.
|
||||
|
||||
Since version 0.96, much of the functionality has been transferred to
|
||||
a generic cdrom interface in the file cdrom.c. The module cm206.o
|
||||
depends on cdrom.o. If the latter is not compiled into the kernel,
|
||||
you must explicitly load it before cm206.o:
|
||||
|
||||
insmod /usr/src/linux/modules/cdrom.o
|
||||
|
||||
To install the module, you use the command, as root
|
||||
|
||||
insmod /usr/src/linux/modules/cm206.o
|
||||
|
||||
You can specify the base address on the command line as well as the irq
|
||||
line to be used, e.g.
|
||||
|
||||
insmod /usr/src/linux/modules/cm206.o cm206=0x300,11
|
||||
|
||||
The order of base port and irq line doesn't matter; if you specify only
|
||||
one, the other will have the value of the compiled-in default. You
|
||||
may also have to install the file-system module `iso9660.o', if you
|
||||
didn't compile that into the kernel.
|
||||
|
||||
|
||||
Using the driver as part of the kernel
|
||||
--------------------------------------
|
||||
If you have chosen option (a), you can specify the base-port
|
||||
address and irq on the lilo boot command line, e.g.:
|
||||
|
||||
LILO: linux cm206=0x340,11
|
||||
|
||||
This assumes that your linux kernel image keyword is `linux'.
|
||||
If you specify either IRQ (3--11) or base port (0x300--0x370),
|
||||
auto probing is turned off for both settings, thus setting the
|
||||
other value to the compiled-in default.
|
||||
|
||||
Note that you can also put these parameters in the lilo configuration file:
|
||||
|
||||
# linux config
|
||||
image = /vmlinuz
|
||||
root = /dev/hda1
|
||||
label = Linux
|
||||
append = "cm206=0x340,11"
|
||||
read-only
|
||||
|
||||
|
||||
If module parameters and LILO config options don't work
|
||||
-------------------------------------------------------
|
||||
If autoprobing does not work, you can hard-wire the default values
|
||||
of the base port address (CM206_BASE) and interrupt request line
|
||||
(CM206_IRQ) into the file /usr/src/linux/drivers/cdrom/cm206.h. Change
|
||||
the defines of CM206_IRQ and CM206_BASE.
|
||||
|
||||
|
||||
Mounting the cdrom
|
||||
------------------
|
||||
1) Make sure that the right device is installed in /dev.
|
||||
|
||||
mknod /dev/cm206cd b 32 0
|
||||
|
||||
2) Make sure there is a mount point, e.g., /cdrom
|
||||
|
||||
mkdir /cdrom
|
||||
|
||||
3) mount using a command like this (run as root):
|
||||
|
||||
mount -rt iso9660 /dev/cm206cd /cdrom
|
||||
|
||||
4) For user-mounts, add a line in /etc/fstab
|
||||
|
||||
/dev/cm206cd /cdrom iso9660 ro,noauto,user
|
||||
|
||||
This will allow users to give the commands
|
||||
|
||||
mount /cdrom
|
||||
umount /cdrom
|
||||
|
||||
If things don't work
|
||||
--------------------
|
||||
|
||||
- Try to do a `dmesg' to find out if the driver said anything about
|
||||
what is going wrong during the initialization.
|
||||
|
||||
- Try to do a `dd if=/dev/cm206cd | od -tc | less' to read from the
|
||||
CD.
|
||||
|
||||
- Look in the /proc directory to see if `cm206' shows up under one of
|
||||
`interrupts', `ioports', `devices' or `modules' (if applicable).
|
||||
|
||||
|
||||
DISCLAIMER
|
||||
----------
|
||||
I cannot guarantee that this driver works, or that the hardware will
|
||||
not be harmed, although I consider it most unlikely.
|
||||
|
||||
I hope that you'll find this driver in some way useful.
|
||||
|
||||
David van Leeuwen
|
||||
david@tm.tno.nl
|
||||
|
||||
Note for Linux CDROM vendors
|
||||
-----------------------------
|
||||
You are encouraged to include this driver on your Linux CDROM. If
|
||||
you do, you might consider sending me a free copy of that cd-rom.
|
||||
You can contact me through my e-mail address, david@tm.tno.nl.
|
||||
If this driver is compiled into a kernel to boot off a cdrom,
|
||||
you should actually send me a free copy of that cd-rom.
|
||||
|
||||
Copyright
|
||||
---------
|
||||
The copyright of the cm206 driver for Linux is
|
||||
|
||||
(c) 1995 David A. van Leeuwen
|
||||
|
||||
The driver is released under the conditions of the GNU general public
|
||||
license, which can be found in the file COPYING in the root of this
|
||||
source tree.
|
@ -1,60 +0,0 @@
|
||||
Goldstar R420 CD-Rom device driver README
|
||||
|
||||
For all kind of other information about the GoldStar R420 CDROM
|
||||
and this Linux device driver see the WWW page:
|
||||
|
||||
http://linux.rz.fh-hannover.de/~raupach
|
||||
|
||||
|
||||
If you are the editor of a Linux CD, you should
|
||||
enable gscd.c within your boot floppy kernel. Please,
|
||||
send me one of your CDs for free.
|
||||
|
||||
|
||||
This current driver version 0.4a only supports reading data from the disk.
|
||||
Currently we have no audio and no multisession or XA support.
|
||||
The polling interface is used, no DMA.
|
||||
|
||||
|
||||
Sometimes the GoldStar R420 is sold in a 'Reveal Multimedia Kit'. This kit's
|
||||
drive interface is compatible, too.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Change to '/usr/src/linux/drivers/cdrom' and edit the file 'gscd.h'. Insert
|
||||
the i/o address of your interface card.
|
||||
|
||||
The default base address is 0x340. This will work for most applications.
|
||||
Address selection is accomplished by jumpers PN801-1 to PN801-4 on the
|
||||
GoldStar Interface Card.
|
||||
Appropriate settings are: 0x300, 0x310, 0x320, 0x330, 0x340, 0x350, 0x360
|
||||
0x370, 0x380, 0x390, 0x3A0, 0x3B0, 0x3C0, 0x3D0, 0x3E0, 0x3F0
|
||||
|
||||
Then go back to '/usr/src/linux/' and 'make config' to build the new
|
||||
configuration for your kernel. If you want to use the GoldStar driver
|
||||
like a module, don't select 'GoldStar CDROM support'. By the way, you
|
||||
have to include the iso9660 filesystem.
|
||||
|
||||
Now start compiling the kernel with 'make zImage'.
|
||||
If you want to use the driver as a module, you have to do 'make modules'
|
||||
and 'make modules_install', additionally.
|
||||
Install your new kernel as usual - maybe you do it with 'make zlilo'.
|
||||
|
||||
Before you can use the driver, you have to
|
||||
mknod /dev/gscd0 b 16 0
|
||||
to create the appropriate device file (you only need to do this once).
|
||||
|
||||
If you use modules, you can try to insert the driver.
|
||||
Say: 'insmod /usr/src/linux/modules/gscd.o'
|
||||
or: 'insmod /usr/src/linux/modules/gscd.o gscd=<address>'
|
||||
The driver should report its results.
|
||||
|
||||
That's it! Mount a disk, i.e. 'mount -rt iso9660 /dev/gscd0 /cdrom'
|
||||
|
||||
Feel free to report errors and suggestions to the following address.
|
||||
Be sure, I'm very happy to receive your comments!
|
||||
|
||||
Oliver Raupach Hannover, Juni 1995
|
||||
(raupach@nwfs1.rz.fh-hannover.de)
|
@ -1,100 +0,0 @@
|
||||
-- Documentation/cdrom/isp16
|
||||
|
||||
Docs by Eric van der Maarel <H.T.M.v.d.Maarel@marin.nl>
|
||||
|
||||
This is the README for version 0.6 of the cdrom interface on an
|
||||
ISP16, MAD16 or Mozart sound card.
|
||||
|
||||
The detection and configuration of this interface used to be included
|
||||
in both the sjcd and optcd cdrom driver. Drives supported by these
|
||||
drivers came packed with Media Magic's multi media kit, which also
|
||||
included the ISP16 card. The idea (thanks Leo Spiekman)
|
||||
to move it from these drivers into a separate module and moreover, not to
|
||||
rely on the MAD16 sound driver, are as follows:
|
||||
-duplication of code in the kernel is a waste of resources and should
|
||||
be avoided;
|
||||
-however, kernels and notably those included with Linux distributions
|
||||
(cf Slackware 3.0 included version 0.5 of the isp16 configuration
|
||||
code included in the drivers) don't always come with sound support
|
||||
included. Especially when they already include a bunch of cdrom drivers.
|
||||
Hence, the cdrom interface should be configurable _independently_ of
|
||||
sound support.
|
||||
|
||||
The ISP16, MAD16 and Mozart sound cards have an OPTi 82C928 or an
|
||||
OPTi 82C929 chip. The interface on these cards should work with
|
||||
any cdrom attached to the card, which is 'electrically' compatible
|
||||
with Sanyo/Panasonic, Sony or Mitsumi non-ide drives. However, the
|
||||
command sets for any proprietary drives may differ
|
||||
(and hence may not be supported in the kernel) from these four types.
|
||||
For a fact I know the interface works and the way of configuration
|
||||
as described in this documentation works in combination with the
|
||||
sjcd (in Sanyo/Panasonic compatibility mode) cdrom drivers
|
||||
(probably with the optcd (in Sony compatibility mode) as well).
|
||||
If you have such an OPTi based sound card and you want to use the
|
||||
cdrom interface with a cdrom drive supported by any of the other cdrom
|
||||
drivers, it will probably work. Please let me know any experience you
|
||||
might have).
|
||||
I understand that cards based on the OPTi 82C929 chips may be configured
|
||||
(hardware jumpers that is) as an IDE interface. Initialisation of such a
|
||||
card in this mode is not supported (yet?).
|
||||
|
||||
The suggestion to configure the ISP16 etc. sound card by booting DOS and
|
||||
do a warm reboot to boot Linux somehow doesn't work, at least not
|
||||
on my machine (IPC P90), with the OPTi 82C928 based card.
|
||||
|
||||
Booting the kernel through the boot manager LILO allows the use
|
||||
of some command line options on the 'LILO boot:' prompt. At boot time
|
||||
press Alt or Shift while the LILO prompt is written on the screen and enter
|
||||
any kernel options. Alternatively these options may be used in
|
||||
the appropriate section in /etc/lilo.conf. Adding 'append="<cmd_line_options>"'
|
||||
will do the trick as well.
|
||||
The syntax of 'cmd_line_options' is
|
||||
|
||||
isp16=[<port>[,<irq>[,<dma>]]][[,]<drive_type>]
|
||||
|
||||
If there is no ISP16 or compatibles detected, there's probably no harm done.
|
||||
These options indicate the values that your cdrom drive has been (or will be)
|
||||
configured to use.
|
||||
Valid values for the base i/o address are:
|
||||
port=0x340,0x320,0x330,0x360
|
||||
for the interrupt request number
|
||||
irq=0,3,5,7,9,10,11
|
||||
for the direct memory access line
|
||||
dma=0,3,5,6,7
|
||||
and for the type of drive
|
||||
drive_type=noisp16,Sanyo,Panasonic,Sony,Mitsumi.
|
||||
Note that these options are case sensitive.
|
||||
The values 0 for irq and dma indicate that they are not used, and
|
||||
the drive will be used in 'polling' mode. The values 5 and 7 for irq
|
||||
should be avoided in order to avoid any conflicts with optional
|
||||
sound card configuration.
|
||||
The syntax of the command line does not allow the specification of
|
||||
irq when there's nothing specified for the base address and no
|
||||
specification of dma when there is no specification of irq.
|
||||
The value 'noisp16' for drive_type, which may be used as the first
|
||||
non-integer option value (e.g. 'isp16=noisp16'), makes sure that probing
|
||||
for and subsequent configuration of an ISP16-compatible card is skipped
|
||||
all together. This can be useful to overcome possible conflicts which
|
||||
may arise while the kernel is probing your hardware.
|
||||
The default values are
|
||||
port=0x340
|
||||
irq=0
|
||||
dma=0
|
||||
drive_type=Sanyo
|
||||
reflecting my own configuration. The defaults can be changed in
|
||||
the file linux/drivers/cdrom/ips16.h.
|
||||
|
||||
The cdrom interface can be configured at run time by loading the
|
||||
initialisation driver as a module. In that case, the interface
|
||||
parameters can be set by giving appropriate values on the command
|
||||
line. Configuring the driver can then be done by the following
|
||||
command (assuming you have iso16.o installed in a proper place):
|
||||
|
||||
insmod isp16.o isp16_cdrom_base=<port> isp16_cdrom_irq=<irq> \
|
||||
isp16_cdrom_dma=<dma> isp16_cdrom_type=<drive_type>
|
||||
|
||||
where port, irq, dma and drive_type can have any of the values mentioned
|
||||
above.
|
||||
|
||||
|
||||
Have fun!
|
@ -1,29 +0,0 @@
|
||||
If you are using the driver as a module, you can specify your ports and IRQs
|
||||
like
|
||||
|
||||
# insmod mcdx.o mcdx=0x300,11,0x304,5
|
||||
|
||||
and so on ("address,IRQ" pairs).
|
||||
This will override the configuration in mcdx.h.
|
||||
|
||||
This driver:
|
||||
|
||||
o handles XA and (hopefully) multi session CDs as well as
|
||||
ordinary CDs;
|
||||
o supports up to 5 drives (of course, you'll need free
|
||||
IRQs, i/o ports and slots);
|
||||
o plays audio
|
||||
|
||||
This version doesn't support yet:
|
||||
|
||||
o shared IRQs (but it seems to be possible - I've successfully
|
||||
connected two drives to the same irq. So it's `only' a
|
||||
problem of the driver.)
|
||||
|
||||
This driver never will:
|
||||
|
||||
o Read digital audio (i.e. copy directly), due to missing
|
||||
hardware features.
|
||||
|
||||
|
||||
heiko@lotte.sax.de
|
@ -1,57 +0,0 @@
|
||||
This is the README file for the Optics Storage 8000 AT CDROM device driver.
|
||||
|
||||
This is the driver for the so-called 'DOLPHIN' drive, with the 34-pin
|
||||
Sony-compatible interface. For the IDE-compatible Optics Storage 8001
|
||||
drive, you will want the ATAPI CDROM driver. The driver also seems to
|
||||
work with the Lasermate CR328A. If you have a drive that works with
|
||||
this driver, and that doesn't report itself as DOLPHIN, please drop me
|
||||
a mail.
|
||||
|
||||
The support for multisession CDs is in ALPHA stage. If you use it,
|
||||
please mail me your experiences. Multisession support can be disabled
|
||||
at compile time.
|
||||
|
||||
You can find some older versions of the driver at
|
||||
dutette.et.tudelft.nl:/pub/linux/
|
||||
and at Eberhard's mirror
|
||||
ftp.gwdg.de:/pub/linux/cdrom/drivers/optics/
|
||||
|
||||
Before you can use the driver, you have to create the device file once:
|
||||
# mknod /dev/optcd0 b 17 0
|
||||
|
||||
To specify the base address if the driver is "compiled-in" to your kernel,
|
||||
you can use the kernel command line item (LILO option)
|
||||
optcd=0x340
|
||||
with the right address.
|
||||
|
||||
If you have compiled optcd as a module, you can load it with
|
||||
# insmod /usr/src/linux/modules/optcd.o
|
||||
or
|
||||
# insmod /usr/src/linux/modules/optcd.o optcd=0x340
|
||||
with the matching address value of your interface card.
|
||||
|
||||
The driver employs a number of buffers to do read-ahead and block size
|
||||
conversion. The number of buffers is configurable in optcd.h, and has
|
||||
influence on the driver performance. For my machine (a P75), 6 buffers
|
||||
seems optimal, as can be seen from this table:
|
||||
|
||||
#bufs kb/s %cpu
|
||||
1 97 0.1
|
||||
2 191 0.3
|
||||
3 188 0.2
|
||||
4 246 0.3
|
||||
5 189 19
|
||||
6 280 0.4
|
||||
7 281 7.0
|
||||
8 246 2.8
|
||||
16 281 3.4
|
||||
|
||||
If you get a throughput significantly below 300 kb/s, try tweaking
|
||||
N_BUFS, and don't forget to mail me your results!
|
||||
|
||||
I'd appreciate success/failure reports. If you find a bug, try
|
||||
recompiling the driver with some strategically chosen debug options
|
||||
(these can be found in optcd.h) and include the messages generated in
|
||||
your bug report. Good luck.
|
||||
|
||||
Leo Spiekman (spiekman@dutette.et.tudelft.nl)
|
File diff suppressed because it is too large
Load Diff
@ -1,60 +0,0 @@
|
||||
-- Documentation/cdrom/sjcd
|
||||
80% of the work takes 20% of the time,
|
||||
20% of the work takes 80% of the time...
|
||||
(Murphy's law)
|
||||
|
||||
Once started, training can not be stopped...
|
||||
(Star Wars)
|
||||
|
||||
This is the README for the sjcd cdrom driver, version 1.6.
|
||||
|
||||
This file is meant as a tips & tricks edge for the usage of the SANYO CDR-H94A
|
||||
cdrom drive. It will grow as the questions arise. ;-)
|
||||
For info on configuring the ISP16 sound card look at Documentation/cdrom/isp16.
|
||||
|
||||
The driver should work with any of the Panasonic, Sony or Mitsumi style
|
||||
CDROM interfaces.
|
||||
The cdrom interface on Media Magic's soft configurable sound card ISP16,
|
||||
which used to be included in the driver, is now supported in a separate module.
|
||||
This initialisation module will probably also work with other interfaces
|
||||
based on an OPTi 82C928 or 82C929 chip (like MAD16 and Mozart): see the
|
||||
documentation Documentation/cdrom/isp16.
|
||||
|
||||
The device major for sjcd is 18, and minor is 0. Create a block special
|
||||
file in your /dev directory (e.g., /dev/sjcd) with these numbers.
|
||||
(For those who don't know, being root and doing the following should do
|
||||
the trick:
|
||||
mknod -m 644 /dev/sjcd b 18 0
|
||||
and mount the cdrom by /dev/sjcd).
|
||||
|
||||
The default configuration parameters are:
|
||||
base address 0x340
|
||||
no irq
|
||||
no dma
|
||||
(Actually the CDR-H94A doesn't know how to use irq and dma.)
|
||||
As of version 1.2, setting base address at boot time is supported
|
||||
through the use of command line options: type at the "boot:" prompt:
|
||||
linux sjcd=<base_address>
|
||||
(where you would use the kernel labeled "linux" in lilo's configuration
|
||||
file /etc/lilo.conf). You could also use 'append="sjcd=<configuration_info>"'
|
||||
in the appropriate section of /etc/lilo.conf
|
||||
If you're building a kernel yourself you can set your default base
|
||||
i/o address with SJCD_BASE_ADDR in /usr/src/linux/drivers/cdrom/sjcd.h.
|
||||
|
||||
The sjcd driver supports being loaded as a module. The following
|
||||
command will set the base i/o address on the fly (assuming you
|
||||
have installed the module in an appropriate place).
|
||||
insmod sjcd.o sjcd_base=<base_address>
|
||||
|
||||
|
||||
Have fun!
|
||||
|
||||
If something is wrong, please email to vadim@rbrf.ru
|
||||
or vadim@ipsun.ras.ru
|
||||
or model@cecmow.enet.dec.com
|
||||
or H.T.M.v.d.Maarel@marin.nl
|
||||
|
||||
It happens sometimes that Vadim is not reachable by mail. For these
|
||||
instances, Eric van der Maarel will help too.
|
||||
|
||||
Vadim V. Model, Eric van der Maarel, Eberhard Moenkeberg
|
@ -1,122 +0,0 @@
|
||||
README FOR LINUX SONY CDU-535/531 DRIVER
|
||||
========================================
|
||||
|
||||
This is the Sony CDU-535 (and 531) driver version 0.7 for Linux.
|
||||
I do not think I have the documentation to add features like DMA support
|
||||
so if anyone else wants to pursue it or help me with it, please do.
|
||||
(I need to see what was done for the CDU-31A driver -- perhaps I can
|
||||
steal some of that code.)
|
||||
|
||||
This is a Linux device driver for the Sony CDU-535 CDROM drive. This is
|
||||
one of the older Sony drives with its own interface card (Sony bus).
|
||||
The DOS driver for this drive is named SONY_CDU.SYS - when you boot DOS
|
||||
your drive should be identified as a SONY CDU-535. The driver works
|
||||
with a CDU-531 also. One user reported that the driver worked on drives
|
||||
OEM'ed by Procomm, drive and interface board were labelled Procomm.
|
||||
|
||||
The Linux driver is based on Corey Minyard's sonycd 0.3 driver for
|
||||
the CDU-31A. Ron Jeppesen just changed the commands that were sent
|
||||
to the drive to correspond to the CDU-535 commands and registers.
|
||||
There were enough changes to let bugs creep in but it seems to be stable.
|
||||
Ron was able to tar an entire CDROM (should read all blocks) and built
|
||||
ghostview and xfig off Walnut Creek's X11R5/GNU CDROM. xcdplayer and
|
||||
workman work with the driver. Others have used the driver without
|
||||
problems except those dealing with wait loops (fixed in third release).
|
||||
Like Minyard's original driver this one uses a polled interface (this
|
||||
is also the default setup for the DOS driver). It has not been tried
|
||||
with interrupts or DMA enabled on the board.
|
||||
|
||||
REQUIREMENTS
|
||||
============
|
||||
|
||||
- Sony CDU-535 drive, preferably without interrupts and DMA
|
||||
enabled on the card.
|
||||
|
||||
- Drive must be set up as unit 1. Only the first unit will be
|
||||
recognized
|
||||
|
||||
- You must enter your interface address into
|
||||
/usr/src/linux/drivers/cdrom/sonycd535.h and build the
|
||||
appropriate kernel or use the "kernel command line" parameter
|
||||
sonycd535=0x320
|
||||
with the correct interface address.
|
||||
|
||||
NOTES:
|
||||
======
|
||||
|
||||
1) The drive MUST be turned on when booting or it will not be recognized!
|
||||
(but see comments on modularized version below)
|
||||
|
||||
2) when the cdrom device is opened the eject button is disabled to keep the
|
||||
user from ejecting a mounted disk and replacing it with another.
|
||||
Unfortunately xcdplayer and workman also open the cdrom device so you
|
||||
have to use the eject button in the software. Keep this in mind if your
|
||||
cdrom player refuses to give up its disk -- exit workman or xcdplayer, or
|
||||
umount the drive if it has been mounted.
|
||||
|
||||
THANKS
|
||||
======
|
||||
|
||||
Many thanks to Ron Jeppesen (ronj.an@site007.saic.com) for getting
|
||||
this project off the ground. He wrote the initial release
|
||||
and the first two patches to this driver (0.1, 0.2, and 0.3).
|
||||
Thanks also to Eberhard Moenkeberg (emoenke@gwdg.de) for prodding
|
||||
me to place this code into the mainstream Linux source tree
|
||||
(as of Linux version 1.1.91), as well as some patches to make
|
||||
it a better device citizen. Further thanks to Joel Katz
|
||||
<joelkatz@webchat.org> for his MODULE patches (see details below),
|
||||
Porfiri Claudio <C.Porfiri@nisms.tei.ericsson.se> for patches
|
||||
to make the driver work with the older CDU-510/515 series, and
|
||||
Heiko Eissfeldt <heiko@colossus.escape.de> for pointing out that
|
||||
the verify_area() checks were ignoring the results of said checks
|
||||
(note: verify_area() has since been replaced by access_ok()).
|
||||
|
||||
(Acknowledgments from Ron Jeppesen in the 0.3 release:)
|
||||
Thanks to Corey Minyard who wrote the original CDU-31A driver on which
|
||||
this driver is based. Thanks to Ken Pizzini and Bob Blair who provided
|
||||
patches and feedback on the first release of this driver.
|
||||
|
||||
Ken Pizzini
|
||||
ken@halcyon.com
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
(The following is from Joel Katz <joelkatz@webchat.org>.)
|
||||
|
||||
To build a version of sony535.o that can be installed as a module,
|
||||
use the following command:
|
||||
|
||||
gcc -c -D__KERNEL__ -DMODULE -O2 sonycd535.c -o sonycd535.o
|
||||
|
||||
To install the module, simply type:
|
||||
|
||||
insmod sony535.o
|
||||
or
|
||||
insmod sony535.o sonycd535=<address>
|
||||
|
||||
And to remove it:
|
||||
|
||||
rmmod sony535
|
||||
|
||||
The code checks to see if MODULE is defined and behaves as it used
|
||||
to if MODULE is not defined. That means your patched file should behave
|
||||
exactly as it used to if compiled into the kernel.
|
||||
|
||||
I have an external drive, and I usually leave it powered off. I used
|
||||
to have to reboot if I needed to use the CDROM drive. Now I don't.
|
||||
|
||||
Even if you have an internal drive, why waste the 96K of memory
|
||||
(unswappable) that the driver uses if you use your CD-ROM drive infrequently?
|
||||
|
||||
This driver will not install (whether compiled in or loaded as a
|
||||
module) if the CDROM drive is not available during its initialization. This
|
||||
means that you can have the driver compiled into the kernel and still load
|
||||
the module later (assuming the driver doesn't install itself during
|
||||
power-on). This only wastes 12K when you boot with the CDROM drive off.
|
||||
|
||||
This is what I usually do; I leave the driver compiled into the
|
||||
kernel, but load it as a module if I powered the system up with the drive
|
||||
off and then later decided to use the CDROM drive.
|
||||
|
||||
Since the driver only uses a single page to point to the chunks,
|
||||
attempting to set the buffer cache to more than 2 Megabytes would be very
|
||||
bad; don't do that.
|
@ -124,9 +124,8 @@ static void cn_test_timer_func(unsigned long __data)
|
||||
struct cn_msg *m;
|
||||
char data[32];
|
||||
|
||||
m = kmalloc(sizeof(*m) + sizeof(data), GFP_ATOMIC);
|
||||
m = kzalloc(sizeof(*m) + sizeof(data), GFP_ATOMIC);
|
||||
if (m) {
|
||||
memset(m, 0, sizeof(*m) + sizeof(data));
|
||||
|
||||
memcpy(&m->id, &cn_test_id, sizeof(m->id));
|
||||
m->seq = cn_test_timer_counter;
|
||||
|
@ -29,7 +29,7 @@ In newer kernels, the following are also available:
|
||||
|
||||
If sysfs is enabled, the contents of /sys/class/vtconsole can be
|
||||
examined. This shows the console backends currently registered by the
|
||||
system which are named vtcon<n> where <n> is an integer fro 0 to 15. Thus:
|
||||
system which are named vtcon<n> where <n> is an integer from 0 to 15. Thus:
|
||||
|
||||
ls /sys/class/vtconsole
|
||||
. .. vtcon0 vtcon1
|
||||
|
@ -207,7 +207,7 @@ responsibility. This is usually non-issue because bus ops and
|
||||
resource allocations already do the job.
|
||||
|
||||
For an example of single-instance devres type, read pcim_iomap_table()
|
||||
in lib/iomap.c.
|
||||
in lib/devres.c.
|
||||
|
||||
All devres interface functions can be called without context if the
|
||||
right gfp mask is given.
|
||||
|
@ -2,22 +2,42 @@
|
||||
|
||||
EDAC - Error Detection And Correction
|
||||
|
||||
Written by Doug Thompson <norsk5@xmission.com>
|
||||
Written by Doug Thompson <dougthompson@xmission.com>
|
||||
7 Dec 2005
|
||||
17 Jul 2007 Updated
|
||||
|
||||
|
||||
EDAC was written by:
|
||||
Thayne Harbaugh,
|
||||
modified by Dave Peterson, Doug Thompson, et al,
|
||||
from the bluesmoke.sourceforge.net project.
|
||||
EDAC is maintained and written by:
|
||||
|
||||
Doug Thompson, Dave Jiang, Dave Peterson et al,
|
||||
original author: Thayne Harbaugh,
|
||||
|
||||
Contact:
|
||||
website: bluesmoke.sourceforge.net
|
||||
mailing list: bluesmoke-devel@lists.sourceforge.net
|
||||
|
||||
"bluesmoke" was the name for this device driver when it was "out-of-tree"
|
||||
and maintained at sourceforge.net. When it was pushed into 2.6.16 for the
|
||||
first time, it was renamed to 'EDAC'.
|
||||
|
||||
The bluesmoke project at sourceforge.net is now utilized as a 'staging area'
|
||||
for EDAC development, before it is sent upstream to kernel.org
|
||||
|
||||
At the bluesmoke/EDAC project site, is a series of quilt patches against
|
||||
recent kernels, stored in a SVN respository. For easier downloading, there
|
||||
is also a tarball snapshot available.
|
||||
|
||||
============================================================================
|
||||
EDAC PURPOSE
|
||||
|
||||
The 'edac' kernel module goal is to detect and report errors that occur
|
||||
within the computer system. In the initial release, memory Correctable Errors
|
||||
(CE) and Uncorrectable Errors (UE) are the primary errors being harvested.
|
||||
within the computer system running under linux.
|
||||
|
||||
MEMORY
|
||||
|
||||
In the initial release, memory Correctable Errors (CE) and Uncorrectable
|
||||
Errors (UE) are the primary errors being harvested. These types of errors
|
||||
are harvested by the 'edac_mc' class of device.
|
||||
|
||||
Detecting CE events, then harvesting those events and reporting them,
|
||||
CAN be a predictor of future UE events. With CE events, the system can
|
||||
@ -25,9 +45,27 @@ continue to operate, but with less safety. Preventive maintenance and
|
||||
proactive part replacement of memory DIMMs exhibiting CEs can reduce
|
||||
the likelihood of the dreaded UE events and system 'panics'.
|
||||
|
||||
NON-MEMORY
|
||||
|
||||
A new feature for EDAC, the edac_device class of device, was added in
|
||||
the 2.6.23 version of the kernel.
|
||||
|
||||
This new device type allows for non-memory type of ECC hardware detectors
|
||||
to have their states harvested and presented to userspace via the sysfs
|
||||
interface.
|
||||
|
||||
Some architectures have ECC detectors for L1, L2 and L3 caches, along with DMA
|
||||
engines, fabric switches, main data path switches, interconnections,
|
||||
and various other hardware data paths. If the hardware reports it, then
|
||||
a edac_device device probably can be constructed to harvest and present
|
||||
that to userspace.
|
||||
|
||||
|
||||
PCI BUS SCANNING
|
||||
|
||||
In addition, PCI Bus Parity and SERR Errors are scanned for on PCI devices
|
||||
in order to determine if errors are occurring on data transfers.
|
||||
|
||||
The presence of PCI Parity errors must be examined with a grain of salt.
|
||||
There are several add-in adapters that do NOT follow the PCI specification
|
||||
with regards to Parity generation and reporting. The specification says
|
||||
@ -35,11 +73,17 @@ the vendor should tie the parity status bits to 0 if they do not intend
|
||||
to generate parity. Some vendors do not do this, and thus the parity bit
|
||||
can "float" giving false positives.
|
||||
|
||||
[There are patches in the kernel queue which will allow for storage of
|
||||
quirks of PCI devices reporting false parity positives. The 2.6.18
|
||||
kernel should have those patches included. When that becomes available,
|
||||
then EDAC will be patched to utilize that information to "skip" such
|
||||
devices.]
|
||||
In the kernel there is a pci device attribute located in sysfs that is
|
||||
checked by the EDAC PCI scanning code. If that attribute is set,
|
||||
PCI parity/error scannining is skipped for that device. The attribute
|
||||
is:
|
||||
|
||||
broken_parity_status
|
||||
|
||||
as is located in /sys/devices/pci<XXX>/0000:XX:YY.Z directorys for
|
||||
PCI devices.
|
||||
|
||||
FUTURE HARDWARE SCANNING
|
||||
|
||||
EDAC will have future error detectors that will be integrated with
|
||||
EDAC or added to it, in the following list:
|
||||
@ -57,13 +101,14 @@ and the like.
|
||||
============================================================================
|
||||
EDAC VERSIONING
|
||||
|
||||
EDAC is composed of a "core" module (edac_mc.ko) and several Memory
|
||||
EDAC is composed of a "core" module (edac_core.ko) and several Memory
|
||||
Controller (MC) driver modules. On a given system, the CORE
|
||||
is loaded and one MC driver will be loaded. Both the CORE and
|
||||
the MC driver have individual versions that reflect current release
|
||||
level of their respective modules. Thus, to "report" on what version
|
||||
a system is running, one must report both the CORE's and the
|
||||
MC driver's versions.
|
||||
the MC driver (or edac_device driver) have individual versions that reflect
|
||||
current release level of their respective modules.
|
||||
|
||||
Thus, to "report" on what version a system is running, one must report both
|
||||
the CORE's and the MC driver's versions.
|
||||
|
||||
|
||||
LOADING
|
||||
@ -88,8 +133,9 @@ EDAC sysfs INTERFACE
|
||||
EDAC presents a 'sysfs' interface for control, reporting and attribute
|
||||
reporting purposes.
|
||||
|
||||
EDAC lives in the /sys/devices/system/edac directory. Within this directory
|
||||
there currently reside 2 'edac' components:
|
||||
EDAC lives in the /sys/devices/system/edac directory.
|
||||
|
||||
Within this directory there currently reside 2 'edac' components:
|
||||
|
||||
mc memory controller(s) system
|
||||
pci PCI control and status system
|
||||
@ -188,7 +234,7 @@ In directory 'mc' are EDAC system overall control and attribute files:
|
||||
|
||||
Panic on UE control file:
|
||||
|
||||
'panic_on_ue'
|
||||
'edac_mc_panic_on_ue'
|
||||
|
||||
An uncorrectable error will cause a machine panic. This is usually
|
||||
desirable. It is a bad idea to continue when an uncorrectable error
|
||||
@ -199,12 +245,12 @@ Panic on UE control file:
|
||||
|
||||
LOAD TIME: module/kernel parameter: panic_on_ue=[0|1]
|
||||
|
||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/panic_on_ue
|
||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_panic_on_ue
|
||||
|
||||
|
||||
Log UE control file:
|
||||
|
||||
'log_ue'
|
||||
'edac_mc_log_ue'
|
||||
|
||||
Generate kernel messages describing uncorrectable errors. These errors
|
||||
are reported through the system message log system. UE statistics
|
||||
@ -212,12 +258,12 @@ Log UE control file:
|
||||
|
||||
LOAD TIME: module/kernel parameter: log_ue=[0|1]
|
||||
|
||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/log_ue
|
||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_log_ue
|
||||
|
||||
|
||||
Log CE control file:
|
||||
|
||||
'log_ce'
|
||||
'edac_mc_log_ce'
|
||||
|
||||
Generate kernel messages describing correctable errors. These
|
||||
errors are reported through the system message log system.
|
||||
@ -225,12 +271,12 @@ Log CE control file:
|
||||
|
||||
LOAD TIME: module/kernel parameter: log_ce=[0|1]
|
||||
|
||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/log_ce
|
||||
RUN TIME: echo "1" >/sys/devices/system/edac/mc/edac_mc_log_ce
|
||||
|
||||
|
||||
Polling period control file:
|
||||
|
||||
'poll_msec'
|
||||
'edac_mc_poll_msec'
|
||||
|
||||
The time period, in milliseconds, for polling for error information.
|
||||
Too small a value wastes resources. Too large a value might delay
|
||||
@ -241,7 +287,7 @@ Polling period control file:
|
||||
|
||||
LOAD TIME: module/kernel parameter: poll_msec=[0|1]
|
||||
|
||||
RUN TIME: echo "1000" >/sys/devices/system/edac/mc/poll_msec
|
||||
RUN TIME: echo "1000" >/sys/devices/system/edac/mc/edac_mc_poll_msec
|
||||
|
||||
|
||||
============================================================================
|
||||
@ -587,3 +633,95 @@ Parity Count:
|
||||
|
||||
|
||||
=======================================================================
|
||||
|
||||
|
||||
EDAC_DEVICE type of device
|
||||
|
||||
In the header file, edac_core.h, there is a series of edac_device structures
|
||||
and APIs for the EDAC_DEVICE.
|
||||
|
||||
User space access to an edac_device is through the sysfs interface.
|
||||
|
||||
At the location /sys/devices/system/edac (sysfs) new edac_device devices will
|
||||
appear.
|
||||
|
||||
There is a three level tree beneath the above 'edac' directory. For example,
|
||||
the 'test_device_edac' device (found at the bluesmoke.sourceforget.net website)
|
||||
installs itself as:
|
||||
|
||||
/sys/devices/systm/edac/test-instance
|
||||
|
||||
in this directory are various controls, a symlink and one or more 'instance'
|
||||
directorys.
|
||||
|
||||
The standard default controls are:
|
||||
|
||||
log_ce boolean to log CE events
|
||||
log_ue boolean to log UE events
|
||||
panic_on_ue boolean to 'panic' the system if an UE is encountered
|
||||
(default off, can be set true via startup script)
|
||||
poll_msec time period between POLL cycles for events
|
||||
|
||||
The test_device_edac device adds at least one of its own custom control:
|
||||
|
||||
test_bits which in the current test driver does nothing but
|
||||
show how it is installed. A ported driver can
|
||||
add one or more such controls and/or attributes
|
||||
for specific uses.
|
||||
One out-of-tree driver uses controls here to allow
|
||||
for ERROR INJECTION operations to hardware
|
||||
injection registers
|
||||
|
||||
The symlink points to the 'struct dev' that is registered for this edac_device.
|
||||
|
||||
INSTANCES
|
||||
|
||||
One or more instance directories are present. For the 'test_device_edac' case:
|
||||
|
||||
test-instance0
|
||||
|
||||
|
||||
In this directory there are two default counter attributes, which are totals of
|
||||
counter in deeper subdirectories.
|
||||
|
||||
ce_count total of CE events of subdirectories
|
||||
ue_count total of UE events of subdirectories
|
||||
|
||||
BLOCKS
|
||||
|
||||
At the lowest directory level is the 'block' directory. There can be 0, 1
|
||||
or more blocks specified in each instance.
|
||||
|
||||
test-block0
|
||||
|
||||
|
||||
In this directory the default attributes are:
|
||||
|
||||
ce_count which is counter of CE events for this 'block'
|
||||
of hardware being monitored
|
||||
ue_count which is counter of UE events for this 'block'
|
||||
of hardware being monitored
|
||||
|
||||
|
||||
The 'test_device_edac' device adds 4 attributes and 1 control:
|
||||
|
||||
test-block-bits-0 for every POLL cycle this counter
|
||||
is incremented
|
||||
test-block-bits-1 every 10 cycles, this counter is bumped once,
|
||||
and test-block-bits-0 is set to 0
|
||||
test-block-bits-2 every 100 cycles, this counter is bumped once,
|
||||
and test-block-bits-1 is set to 0
|
||||
test-block-bits-3 every 1000 cycles, this counter is bumped once,
|
||||
and test-block-bits-2 is set to 0
|
||||
|
||||
|
||||
reset-counters writing ANY thing to this control will
|
||||
reset all the above counters.
|
||||
|
||||
|
||||
Use of the 'test_device_edac' driver should any others to create their own
|
||||
unique drivers for their hardware systems.
|
||||
|
||||
The 'test_device_edac' sample driver is located at the
|
||||
bluesmoke.sourceforge.net project site for EDAC.
|
||||
|
||||
|
@ -9,19 +9,29 @@ for accessing the i2c bus and the gpio pins of the bt8xx chipset.
|
||||
Please see Documentation/dvb/cards.txt => o Cards based on the Conexant Bt8xx PCI bridge:
|
||||
|
||||
Compiling kernel please enable:
|
||||
a.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "BT848 Video For Linux"
|
||||
b.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Bt8xx based PCI Cards"
|
||||
a.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "Enable Video for Linux API 1 (DEPRECATED)"
|
||||
b.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "Video Capture Adapters" => "BT848 Video For Linux"
|
||||
c.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices" => "DVB for Linux" "DVB Core Support" "Bt8xx based PCI Cards"
|
||||
|
||||
Please use the following options with care as deselection of drivers which are in fact necessary
|
||||
may result in DVB devices that cannot be tuned due to lack of driver support:
|
||||
You can save RAM by deselecting every frontend module that your DVB card does not need.
|
||||
|
||||
First please remove the static dependency of DVB card drivers on all frontend modules for all possible card variants by enabling:
|
||||
d.) "Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Load and attach frontend modules as needed"
|
||||
|
||||
If you know the frontend driver that your card needs please enable:
|
||||
e.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Customise DVB Frontends" => "Customise the frontend modules to build"
|
||||
Then please select your card-specific frontend module.
|
||||
|
||||
2) Loading Modules
|
||||
==================
|
||||
|
||||
In default cases bttv is loaded automatically.
|
||||
To load the backend either place dvb-bt8xx in etc/modules, or apply manually:
|
||||
|
||||
$ modprobe dvb-bt8xx
|
||||
|
||||
All frontends will be loaded automatically.
|
||||
Regular case: If the bttv driver detects a bt8xx-based DVB card, all frontend and backend modules will be loaded automatically.
|
||||
Exceptions are:
|
||||
- Old TwinHan DST cards or clones with or without CA slot and not containing an Eeprom.
|
||||
People running udev please see Documentation/dvb/udev.txt.
|
||||
|
||||
In the following cases overriding the PCI type detection for dvb-bt8xx might be necessary:
|
||||
@ -30,7 +40,6 @@ In the following cases overriding the PCI type detection for dvb-bt8xx might be
|
||||
------------------------------
|
||||
|
||||
$ modprobe bttv card=113
|
||||
$ modprobe dvb-bt8xx
|
||||
$ modprobe dst
|
||||
|
||||
Useful parameters for verbosity level and debugging the dst module:
|
||||
@ -65,10 +74,9 @@ DViCO FusionHDTV 5 Lite: 135
|
||||
Notice: The order of the card ID should be uprising:
|
||||
Example:
|
||||
$ modprobe bttv card=113 card=135
|
||||
$ modprobe dvb-bt8xx
|
||||
|
||||
For a full list of card ID's please see Documentation/video4linux/CARDLIST.bttv.
|
||||
In case of further problems send questions to the mailing list: www.linuxdvb.org.
|
||||
In case of further problems please subscribe and send questions to the mailing list: linux-dvb@linuxtv.org.
|
||||
|
||||
Authors: Richard Walker,
|
||||
Jamie Honan,
|
||||
|
@ -24,7 +24,8 @@ use IO::Handle;
|
||||
@components = ( "sp8870", "sp887x", "tda10045", "tda10046",
|
||||
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
||||
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird");
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||
"opera1");
|
||||
|
||||
# Check args
|
||||
syntax() if (scalar(@ARGV) != 1);
|
||||
@ -56,7 +57,7 @@ syntax();
|
||||
|
||||
sub sp8870 {
|
||||
my $sourcefile = "tt_Premium_217g.zip";
|
||||
my $url = "http://www.technotrend.de/new/217g/$sourcefile";
|
||||
my $url = "http://www.softwarepatch.pl/9999ccd06a4813cb827dbb0005071c71/$sourcefile";
|
||||
my $hash = "53970ec17a538945a6d8cb608a7b3899";
|
||||
my $outfile = "dvb-fe-sp8870.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
@ -210,6 +211,45 @@ sub dec3000s {
|
||||
|
||||
$outfile;
|
||||
}
|
||||
sub opera1{
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0);
|
||||
|
||||
checkstandard();
|
||||
my $fwfile1="dvb-usb-opera1-fpga-01.fw";
|
||||
my $fwfile2="dvb-usb-opera-01.fw";
|
||||
extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw");
|
||||
extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1");
|
||||
extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2");
|
||||
delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1");
|
||||
delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1");
|
||||
verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70");
|
||||
verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1");
|
||||
verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d");
|
||||
|
||||
my $RES1="\x01\x92\x7f\x00\x01\x00";
|
||||
my $RES0="\x01\x92\x7f\x00\x00\x00";
|
||||
my $DAT1="\x01\x00\xe6\x00\x01\x00";
|
||||
my $DAT0="\x01\x00\xe6\x00\x00\x00";
|
||||
open FW,">$tmpdir/opera.fw";
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
appendfile(FW,"$tmpdir/fw1part1-1");
|
||||
print FW "$RES0";
|
||||
print FW "$DAT0";
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
appendfile(FW,"$tmpdir/fw1part2-1");
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
print FW "$RES0";
|
||||
print FW "$DAT0";
|
||||
copy ("$tmpdir/opera1-fpga.fw",$fwfile1);
|
||||
copy ("$tmpdir/opera.fw",$fwfile2);
|
||||
|
||||
$fwfile1.",".$fwfile2;
|
||||
}
|
||||
|
||||
sub vp7041 {
|
||||
my $sourcefile = "2.422.zip";
|
||||
@ -440,6 +480,25 @@ sub appendfile {
|
||||
close(INFILE);
|
||||
}
|
||||
|
||||
sub delzero{
|
||||
my ($infile,$outfile) =@_;
|
||||
|
||||
open INFILE,"<$infile";
|
||||
open OUTFILE,">$outfile";
|
||||
while (1){
|
||||
$rcount=sysread(INFILE,$buf,22);
|
||||
$len=ord(substr($buf,0,1));
|
||||
print OUTFILE substr($buf,0,1);
|
||||
print OUTFILE substr($buf,2,$len+3);
|
||||
last if ($rcount<1);
|
||||
printf OUTFILE "%c",0;
|
||||
#print $len." ".length($buf)."\n";
|
||||
|
||||
}
|
||||
close(INFILE);
|
||||
close(OUTFILE);
|
||||
}
|
||||
|
||||
sub syntax() {
|
||||
print STDERR "syntax: get_dvb_firmware <component>\n";
|
||||
print STDERR "Supported components:\n";
|
||||
|
27
Documentation/dvb/opera-firmware.txt
Normal file
27
Documentation/dvb/opera-firmware.txt
Normal file
@ -0,0 +1,27 @@
|
||||
To extract the firmware for the Opera DVB-S1 USB-Box
|
||||
you need to copy the files:
|
||||
|
||||
2830SCap2.sys
|
||||
2830SLoad2.sys
|
||||
|
||||
from the windriver disk into this directory.
|
||||
|
||||
Then run
|
||||
|
||||
./get_dvb_firware opera1
|
||||
|
||||
and after that you have 2 files:
|
||||
|
||||
dvb-usb-opera-01.fw
|
||||
dvb-usb-opera1-fpga-01.fw
|
||||
|
||||
in here.
|
||||
|
||||
Copy them into /lib/firmware/ .
|
||||
|
||||
After that the driver can load the firmware
|
||||
(if you have enabled firmware loading
|
||||
in kernel config and have hotplug running).
|
||||
|
||||
|
||||
Marco Gittler <g.marco@freenet.de>
|
@ -1,4 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo 1 > /proc/self/make-it-fail
|
||||
exec $*
|
@ -1,31 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Usage: failmodule <failname> <modulename> [stacktrace-depth]
|
||||
#
|
||||
# <failname>: "failslab", "fail_alloc_page", or "fail_make_request"
|
||||
#
|
||||
# <modulename>: module name that you want to inject faults.
|
||||
#
|
||||
# [stacktrace-depth]: the maximum number of stacktrace walking allowed
|
||||
#
|
||||
|
||||
STACKTRACE_DEPTH=5
|
||||
if [ $# -gt 2 ]; then
|
||||
STACKTRACE_DEPTH=$3
|
||||
fi
|
||||
|
||||
if [ ! -d /debug/$1 ]; then
|
||||
echo "Fault-injection $1 does not exist" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -d /sys/module/$2 ]; then
|
||||
echo "Module $2 does not exist" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Disable any fault injection
|
||||
echo 0 > /debug/$1/stacktrace-depth
|
||||
|
||||
echo `cat /sys/module/$2/sections/.text` > /debug/$1/require-start
|
||||
echo `cat /sys/module/$2/sections/.exit.text` > /debug/$1/require-end
|
||||
echo $STACKTRACE_DEPTH > /debug/$1/stacktrace-depth
|
@ -103,6 +103,11 @@ configuration of fault-injection capabilities.
|
||||
default is 'N', setting it to 'Y' will inject failures
|
||||
only into non-sleep allocations (GFP_ATOMIC allocations).
|
||||
|
||||
- /debug/fail_page_alloc/min-order:
|
||||
|
||||
specifies the minimum page allocation order to be injected
|
||||
failures.
|
||||
|
||||
o Boot option
|
||||
|
||||
In order to inject faults while debugfs is not available (early boot time),
|
||||
@ -156,70 +161,77 @@ o add a hook to insert failures
|
||||
Application Examples
|
||||
--------------------
|
||||
|
||||
o inject slab allocation failures into module init/cleanup code
|
||||
o Inject slab allocation failures into module init/exit code
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
#!/bin/bash
|
||||
|
||||
FAILCMD=Documentation/fault-injection/failcmd.sh
|
||||
BLACKLIST="root_plug evbug"
|
||||
FAILTYPE=failslab
|
||||
echo Y > /debug/$FAILTYPE/task-filter
|
||||
echo 10 > /debug/$FAILTYPE/probability
|
||||
echo 100 > /debug/$FAILTYPE/interval
|
||||
echo -1 > /debug/$FAILTYPE/times
|
||||
echo 0 > /debug/$FAILTYPE/space
|
||||
echo 2 > /debug/$FAILTYPE/verbose
|
||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
|
||||
|
||||
FAILNAME=failslab
|
||||
echo Y > /debug/$FAILNAME/task-filter
|
||||
echo 10 > /debug/$FAILNAME/probability
|
||||
echo 100 > /debug/$FAILNAME/interval
|
||||
echo -1 > /debug/$FAILNAME/times
|
||||
echo 2 > /debug/$FAILNAME/verbose
|
||||
echo 1 > /debug/$FAILNAME/ignore-gfp-wait
|
||||
|
||||
blacklist()
|
||||
faulty_system()
|
||||
{
|
||||
echo $BLACKLIST | grep $1 > /dev/null 2>&1
|
||||
bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
|
||||
}
|
||||
|
||||
oops()
|
||||
{
|
||||
dmesg | grep BUG > /dev/null 2>&1
|
||||
}
|
||||
if [ $# -eq 0 ]
|
||||
then
|
||||
echo "Usage: $0 modulename [ modulename ... ]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
find /lib/modules/`uname -r` -name '*.ko' -exec basename {} .ko \; |
|
||||
while read i
|
||||
do
|
||||
oops && exit 1
|
||||
for m in $*
|
||||
do
|
||||
echo inserting $m...
|
||||
faulty_system modprobe $m
|
||||
|
||||
if ! blacklist $i
|
||||
then
|
||||
echo inserting $i...
|
||||
bash $FAILCMD modprobe $i
|
||||
fi
|
||||
done
|
||||
|
||||
lsmod | awk '{ if ($3 == 0) { print $1 } }' |
|
||||
while read i
|
||||
do
|
||||
oops && exit 1
|
||||
|
||||
if ! blacklist $i
|
||||
then
|
||||
echo removing $i...
|
||||
bash $FAILCMD modprobe -r $i
|
||||
fi
|
||||
done
|
||||
echo removing $m...
|
||||
faulty_system modprobe -r $m
|
||||
done
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
o inject slab allocation failures only for a specific module
|
||||
o Inject page allocation failures only for a specific module
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
#!/bin/bash
|
||||
|
||||
FAILMOD=Documentation/fault-injection/failmodule.sh
|
||||
FAILTYPE=fail_page_alloc
|
||||
module=$1
|
||||
|
||||
echo injecting errors into the module $1...
|
||||
if [ -z $module ]
|
||||
then
|
||||
echo "Usage: $0 <modulename>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
modprobe $1
|
||||
bash $FAILMOD failslab $1 10
|
||||
echo 25 > /debug/failslab/probability
|
||||
modprobe $module
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
if [ ! -d /sys/module/$module/sections ]
|
||||
then
|
||||
echo Module $module is not loaded
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat /sys/module/$module/sections/.text > /debug/$FAILTYPE/require-start
|
||||
cat /sys/module/$module/sections/.data > /debug/$FAILTYPE/require-end
|
||||
|
||||
echo N > /debug/$FAILTYPE/task-filter
|
||||
echo 10 > /debug/$FAILTYPE/probability
|
||||
echo 100 > /debug/$FAILTYPE/interval
|
||||
echo -1 > /debug/$FAILTYPE/times
|
||||
echo 0 > /debug/$FAILTYPE/space
|
||||
echo 2 > /debug/$FAILTYPE/verbose
|
||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
|
||||
echo 1 > /debug/$FAILTYPE/ignore-gfp-highmem
|
||||
echo 10 > /debug/$FAILTYPE/stacktrace-depth
|
||||
|
||||
trap "echo 0 > /debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
|
||||
|
||||
echo "Injecting errors into the module $module... (interrupt to stop)"
|
||||
sleep 1000000
|
||||
|
||||
|
@ -26,9 +26,7 @@ Who: Hans Verkuil <hverkuil@xs4all.nl> and
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/devices/.../power/state
|
||||
dev->power.power_state
|
||||
dpm_runtime_{suspend,resume)()
|
||||
What: dev->power.power_state
|
||||
When: July 2007
|
||||
Why: Broken design for runtime control over driver power states, confusing
|
||||
driver-internal runtime power management with: mechanisms to support
|
||||
@ -41,14 +39,6 @@ Who: Pavel Machek <pavel@suse.cz>
|
||||
|
||||
---------------------------
|
||||
|
||||
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: old NCR53C9x driver
|
||||
When: October 2007
|
||||
Why: Replaced by the much better esp_scsi driver. Actual low-level
|
||||
@ -61,6 +51,7 @@ Who: David Miller <davem@davemloft.net>
|
||||
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
|
||||
When: December 2006
|
||||
Files: include/linux/video_decoder.h
|
||||
Check: include/linux/video_decoder.h
|
||||
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
|
||||
series. The old API have lots of drawbacks and don't provide enough
|
||||
means to work with all video and audio standards. The newer API is
|
||||
@ -94,7 +85,7 @@ Who: Dominik Brodowski <linux@brodo.de>
|
||||
What: remove EXPORT_SYMBOL(kernel_thread)
|
||||
When: August 2006
|
||||
Files: arch/*/kernel/*_ksyms.c
|
||||
Funcs: kernel_thread
|
||||
Check: kernel_thread
|
||||
Why: kernel_thread is a low-level implementation detail. Drivers should
|
||||
use the <linux/kthread.h> API instead which shields them from
|
||||
implementation details and provides a higherlevel interface that
|
||||
@ -119,13 +110,6 @@ Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: drivers depending on OSS_OBSOLETE_DRIVER
|
||||
When: options in 2.6.20, code in 2.6.22
|
||||
Why: OSS drivers with ALSA replacements
|
||||
Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports
|
||||
(temporary transition config option provided until then)
|
||||
The transition config option will also be removed at the same time.
|
||||
@ -152,6 +136,15 @@ Who: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: vm_ops.nopage
|
||||
When: Soon, provided in-kernel callers have been converted
|
||||
Why: This interface is replaced by vm_ops.fault, but it has been around
|
||||
forever, is used by a lot of drivers, and doesn't cost much to
|
||||
maintain.
|
||||
Who: Nick Piggin <npiggin@suse.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Interrupt only SA_* flags
|
||||
When: September 2007
|
||||
Why: The interrupt related SA_* flags are replaced by IRQF_* to move them
|
||||
@ -171,15 +164,6 @@ Who: Kay Sievers <kay.sievers@suse.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: i2c-isa
|
||||
When: December 2006
|
||||
Why: i2c-isa is a non-sense and doesn't fit in the device driver
|
||||
model. Drivers relying on it are better implemented as platform
|
||||
drivers.
|
||||
Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: i2c_adapter.list
|
||||
When: July 2007
|
||||
Why: Superfluous, this list duplicates the one maintained by the driver
|
||||
@ -196,46 +180,11 @@ Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: ACPI hooks (X86_SPEEDSTEP_CENTRINO_ACPI) in speedstep-centrino driver
|
||||
When: December 2006
|
||||
Why: Speedstep-centrino driver with ACPI hooks and acpi-cpufreq driver are
|
||||
functionally very much similar. They talk to ACPI in same way. Only
|
||||
difference between them is the way they do frequency transitions.
|
||||
One uses MSRs and the other one uses IO ports. Functionaliy of
|
||||
speedstep_centrino with ACPI hooks is now merged into acpi-cpufreq.
|
||||
That means one common driver will support all Intel Enhanced Speedstep
|
||||
capable CPUs. That means less confusion over name of
|
||||
speedstep-centrino driver (with that driver supposed to be used on
|
||||
non-centrino platforms). That means less duplication of code and
|
||||
less maintenance effort and no possibility of these two drivers
|
||||
going out of sync.
|
||||
Current users of speedstep_centrino with ACPI hooks are requested to
|
||||
switch over to acpi-cpufreq driver. speedstep-centrino will continue
|
||||
to work using older non-ACPI static table based scheme even after this
|
||||
date.
|
||||
|
||||
Who: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/firmware/acpi/namespace
|
||||
When: 2.6.21
|
||||
Why: The ACPI namespace is effectively the symbol list for
|
||||
the BIOS. The device names are completely arbitrary
|
||||
and have no place being exposed to user-space.
|
||||
|
||||
For those interested in the BIOS ACPI namespace,
|
||||
the BIOS can be extracted and disassembled with acpidump
|
||||
and iasl as documented in the pmtools package here:
|
||||
http://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/utils
|
||||
Who: Len Brown <len.brown@intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: ACPI procfs interface
|
||||
When: July 2007
|
||||
Why: After ACPI sysfs conversion, ACPI attributes will be duplicated
|
||||
in sysfs and the ACPI procfs interface should be removed.
|
||||
When: July 2008
|
||||
Why: ACPI sysfs conversion should be finished by January 2008.
|
||||
ACPI procfs interface will be removed in July 2008 so that
|
||||
there is enough time for the user space to catch up.
|
||||
Who: Zhang Rui <rui.zhang@intel.com>
|
||||
|
||||
---------------------------
|
||||
@ -262,25 +211,6 @@ Who: Richard Purdie <rpurdie@rpsys.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Multipath cached routing support in ipv4
|
||||
When: in 2.6.23
|
||||
Why: Code was merged, then submitter immediately disappeared leaving
|
||||
us with no maintainer and lots of bugs. The code should not have
|
||||
been merged in the first place, and many aspects of it's
|
||||
implementation are blocking more critical core networking
|
||||
development. It's marked EXPERIMENTAL and no distribution
|
||||
enables it because it cause obscure crashes due to unfixable bugs
|
||||
(interfaces don't return errors so memory allocation can't be
|
||||
handled, calling contexts of these interfaces make handling
|
||||
errors impossible too because they get called after we've
|
||||
totally commited to creating a route object, for example).
|
||||
This problem has existed for years and no forward progress
|
||||
has ever been made, and nobody steps up to try and salvage
|
||||
this code, so we're going to finally just get rid of it.
|
||||
Who: David S. Miller <davem@davemloft.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: read_dev_chars(), read_conf_data{,_lpm}() (s390 common I/O layer)
|
||||
When: December 2007
|
||||
Why: These functions are a leftover from 2.4 times. They have several
|
||||
@ -305,6 +235,14 @@ Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: 'time' kernel boot parameter
|
||||
When: January 2008
|
||||
Why: replaced by 'printk.time=<value>' so that printk timestamps can be
|
||||
enabled or disabled as needed
|
||||
Who: Randy Dunlap <randy.dunlap@oracle.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: drivers depending on OSS_OBSOLETE
|
||||
When: options in 2.6.23, code in 2.6.25
|
||||
Why: obsolete OSS drivers
|
||||
@ -330,3 +268,41 @@ Who: Tejun Heo <htejun@gmail.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Legacy RTC drivers (under drivers/i2c/chips)
|
||||
When: November 2007
|
||||
Why: Obsolete. We have a RTC subsystem with better drivers.
|
||||
Who: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: iptables SAME target
|
||||
When: 1.1. 2008
|
||||
Files: net/ipv4/netfilter/ipt_SAME.c, include/linux/netfilter_ipv4/ipt_SAME.h
|
||||
Why: Obsolete for multiple years now, NAT core provides the same behaviour.
|
||||
Unfixable broken wrt. 32/64 bit cleanness.
|
||||
Who: Patrick McHardy <kaber@trash.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: The arch/ppc and include/asm-ppc directories
|
||||
When: Jun 2008
|
||||
Why: The arch/powerpc tree is the merged architecture for ppc32 and ppc64
|
||||
platforms. Currently there are efforts underway to port the remaining
|
||||
arch/ppc platforms to the merged tree. New submissions to the arch/ppc
|
||||
tree have been frozen with the 2.6.22 kernel release and that tree will
|
||||
remain in bug-fix only mode until its scheduled removal. Platforms
|
||||
that are not ported by June 2008 will be removed due to the lack of an
|
||||
interested maintainer.
|
||||
Who: linuxppc-dev@ozlabs.org
|
||||
|
||||
---------------------------
|
||||
|
||||
What: mthca driver's MSI support
|
||||
When: January 2008
|
||||
Files: drivers/infiniband/hw/mthca/*.[ch]
|
||||
Why: All mthca hardware also supports MSI-X, which provides
|
||||
strictly more functionality than MSI. So there is no point in
|
||||
having both MSI-X and MSI support in the driver.
|
||||
Who: Roland Dreier <rolandd@cisco.com>
|
||||
|
||||
---------------------------
|
||||
|
@ -510,13 +510,24 @@ More details about quota locking can be found in fs/dquot.c.
|
||||
prototypes:
|
||||
void (*open)(struct vm_area_struct*);
|
||||
void (*close)(struct vm_area_struct*);
|
||||
int (*fault)(struct vm_area_struct*, struct vm_fault *);
|
||||
struct page *(*nopage)(struct vm_area_struct*, unsigned long, int *);
|
||||
int (*page_mkwrite)(struct vm_area_struct *, struct page *);
|
||||
|
||||
locking rules:
|
||||
BKL mmap_sem
|
||||
BKL mmap_sem PageLocked(page)
|
||||
open: no yes
|
||||
close: no yes
|
||||
fault: no yes
|
||||
nopage: no yes
|
||||
page_mkwrite: no yes no
|
||||
|
||||
->page_mkwrite() is called when a previously read-only page is
|
||||
about to become writeable. The file system is responsible for
|
||||
protecting against truncate races. Once appropriate action has been
|
||||
taking to lock out truncate, the page range should be verified to be
|
||||
within i_size. The page mapping should also be checked that it is not
|
||||
NULL.
|
||||
|
||||
================================================================================
|
||||
Dubious stuff
|
||||
|
@ -238,6 +238,8 @@ config_item_type.
|
||||
struct config_group *(*make_group)(struct config_group *group,
|
||||
const char *name);
|
||||
int (*commit_item)(struct config_item *item);
|
||||
void (*disconnect_notify)(struct config_group *group,
|
||||
struct config_item *item);
|
||||
void (*drop_item)(struct config_group *group,
|
||||
struct config_item *item);
|
||||
};
|
||||
@ -268,6 +270,16 @@ the item in other threads, the memory is safe. It may take some time
|
||||
for the item to actually disappear from the subsystem's usage. But it
|
||||
is gone from configfs.
|
||||
|
||||
When drop_item() is called, the item's linkage has already been torn
|
||||
down. It no longer has a reference on its parent and has no place in
|
||||
the item hierarchy. If a client needs to do some cleanup before this
|
||||
teardown happens, the subsystem can implement the
|
||||
ct_group_ops->disconnect_notify() method. The method is called after
|
||||
configfs has removed the item from the filesystem view but before the
|
||||
item is removed from its parent group. Like drop_item(),
|
||||
disconnect_notify() is void and cannot fail. Client subsystems should
|
||||
not drop any references here, as they still must do it in drop_item().
|
||||
|
||||
A config_group cannot be removed while it still has child items. This
|
||||
is implemented in the configfs rmdir(2) code. ->drop_item() will not be
|
||||
called, as the item has not been dropped. rmdir(2) will fail, as the
|
||||
@ -280,18 +292,18 @@ tells configfs to make the subsystem appear in the file tree.
|
||||
|
||||
struct configfs_subsystem {
|
||||
struct config_group su_group;
|
||||
struct semaphore su_sem;
|
||||
struct mutex su_mutex;
|
||||
};
|
||||
|
||||
int configfs_register_subsystem(struct configfs_subsystem *subsys);
|
||||
void configfs_unregister_subsystem(struct configfs_subsystem *subsys);
|
||||
|
||||
A subsystem consists of a toplevel config_group and a semaphore.
|
||||
A subsystem consists of a toplevel config_group and a mutex.
|
||||
The group is where child config_items are created. For a subsystem,
|
||||
this group is usually defined statically. Before calling
|
||||
configfs_register_subsystem(), the subsystem must have initialized the
|
||||
group via the usual group _init() functions, and it must also have
|
||||
initialized the semaphore.
|
||||
initialized the mutex.
|
||||
When the register call returns, the subsystem is live, and it
|
||||
will be visible via configfs. At that point, mkdir(2) can be called and
|
||||
the subsystem must be ready for it.
|
||||
@ -303,7 +315,7 @@ subsystem/group and the simple_child item in configfs_example.c It
|
||||
shows a trivial object displaying and storing an attribute, and a simple
|
||||
group creating and destroying these children.
|
||||
|
||||
[Hierarchy Navigation and the Subsystem Semaphore]
|
||||
[Hierarchy Navigation and the Subsystem Mutex]
|
||||
|
||||
There is an extra bonus that configfs provides. The config_groups and
|
||||
config_items are arranged in a hierarchy due to the fact that they
|
||||
@ -314,19 +326,19 @@ and config_item->ci_parent structure members.
|
||||
|
||||
A subsystem can navigate the cg_children list and the ci_parent pointer
|
||||
to see the tree created by the subsystem. This can race with configfs'
|
||||
management of the hierarchy, so configfs uses the subsystem semaphore to
|
||||
management of the hierarchy, so configfs uses the subsystem mutex to
|
||||
protect modifications. Whenever a subsystem wants to navigate the
|
||||
hierarchy, it must do so under the protection of the subsystem
|
||||
semaphore.
|
||||
mutex.
|
||||
|
||||
A subsystem will be prevented from acquiring the semaphore while a newly
|
||||
A subsystem will be prevented from acquiring the mutex while a newly
|
||||
allocated item has not been linked into this hierarchy. Similarly, it
|
||||
will not be able to acquire the semaphore while a dropping item has not
|
||||
will not be able to acquire the mutex while a dropping item has not
|
||||
yet been unlinked. This means that an item's ci_parent pointer will
|
||||
never be NULL while the item is in configfs, and that an item will only
|
||||
be in its parent's cg_children list for the same duration. This allows
|
||||
a subsystem to trust ci_parent and cg_children while they hold the
|
||||
semaphore.
|
||||
mutex.
|
||||
|
||||
[Item Aggregation Via symlink(2)]
|
||||
|
||||
@ -386,6 +398,33 @@ As a consequence of this, default_groups cannot be removed directly via
|
||||
rmdir(2). They also are not considered when rmdir(2) on the parent
|
||||
group is checking for children.
|
||||
|
||||
[Dependant Subsystems]
|
||||
|
||||
Sometimes other drivers depend on particular configfs items. For
|
||||
example, ocfs2 mounts depend on a heartbeat region item. If that
|
||||
region item is removed with rmdir(2), the ocfs2 mount must BUG or go
|
||||
readonly. Not happy.
|
||||
|
||||
configfs provides two additional API calls: configfs_depend_item() and
|
||||
configfs_undepend_item(). A client driver can call
|
||||
configfs_depend_item() on an existing item to tell configfs that it is
|
||||
depended on. configfs will then return -EBUSY from rmdir(2) for that
|
||||
item. When the item is no longer depended on, the client driver calls
|
||||
configfs_undepend_item() on it.
|
||||
|
||||
These API cannot be called underneath any configfs callbacks, as
|
||||
they will conflict. They can block and allocate. A client driver
|
||||
probably shouldn't calling them of its own gumption. Rather it should
|
||||
be providing an API that external subsystems call.
|
||||
|
||||
How does this work? Imagine the ocfs2 mount process. When it mounts,
|
||||
it asks for a heartbeat region item. This is done via a call into the
|
||||
heartbeat code. Inside the heartbeat code, the region item is looked
|
||||
up. Here, the heartbeat code calls configfs_depend_item(). If it
|
||||
succeeds, then heartbeat knows the region is safe to give to ocfs2.
|
||||
If it fails, it was being torn down anyway, and heartbeat can gracefully
|
||||
pass up an error.
|
||||
|
||||
[Committable Items]
|
||||
|
||||
NOTE: Committable items are currently unimplemented.
|
||||
|
@ -277,11 +277,10 @@ static struct config_item *simple_children_make_item(struct config_group *group,
|
||||
{
|
||||
struct simple_child *simple_child;
|
||||
|
||||
simple_child = kmalloc(sizeof(struct simple_child), GFP_KERNEL);
|
||||
simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL);
|
||||
if (!simple_child)
|
||||
return NULL;
|
||||
|
||||
memset(simple_child, 0, sizeof(struct simple_child));
|
||||
|
||||
config_item_init_type_name(&simple_child->item, name,
|
||||
&simple_child_type);
|
||||
@ -364,12 +363,11 @@ static struct config_group *group_children_make_group(struct config_group *group
|
||||
{
|
||||
struct simple_children *simple_children;
|
||||
|
||||
simple_children = kmalloc(sizeof(struct simple_children),
|
||||
simple_children = kzalloc(sizeof(struct simple_children),
|
||||
GFP_KERNEL);
|
||||
if (!simple_children)
|
||||
return NULL;
|
||||
|
||||
memset(simple_children, 0, sizeof(struct simple_children));
|
||||
|
||||
config_group_init_type_name(&simple_children->group, name,
|
||||
&simple_children_type);
|
||||
@ -453,7 +451,7 @@ static int __init configfs_example_init(void)
|
||||
subsys = example_subsys[i];
|
||||
|
||||
config_group_init(&subsys->su_group);
|
||||
init_MUTEX(&subsys->su_sem);
|
||||
mutex_init(&subsys->su_mutex);
|
||||
ret = configfs_register_subsystem(subsys);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Error %d while registering subsystem %s\n",
|
||||
|
@ -42,6 +42,7 @@ Table of Contents
|
||||
2.12 /proc/<pid>/oom_adj - Adjust the oom-killer score
|
||||
2.13 /proc/<pid>/oom_score - Display current oom-killer score
|
||||
2.14 /proc/<pid>/io - Display the IO accounting fields
|
||||
2.15 /proc/<pid>/coredump_filter - Core dump filtering settings
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Preface
|
||||
@ -171,7 +172,9 @@ read the file /proc/PID/status:
|
||||
This shows you nearly the same information you would get if you viewed it with
|
||||
the ps command. In fact, ps uses the proc file system to obtain its
|
||||
information. The statm file contains more detailed information about the
|
||||
process memory usage. Its seven fields are explained in Table 1-2.
|
||||
process memory usage. Its seven fields are explained in Table 1-2. The stat
|
||||
file contains details information about the process itself. Its fields are
|
||||
explained in Table 1-3.
|
||||
|
||||
|
||||
Table 1-2: Contents of the statm files (as of 2.6.8-rc3)
|
||||
@ -188,16 +191,65 @@ Table 1-2: Contents of the statm files (as of 2.6.8-rc3)
|
||||
dt number of dirty pages (always 0 on 2.6)
|
||||
..............................................................................
|
||||
|
||||
|
||||
Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
|
||||
..............................................................................
|
||||
Field Content
|
||||
pid process id
|
||||
tcomm filename of the executable
|
||||
state state (R is running, S is sleeping, D is sleeping in an
|
||||
uninterruptible wait, Z is zombie, T is traced or stopped)
|
||||
ppid process id of the parent process
|
||||
pgrp pgrp of the process
|
||||
sid session id
|
||||
tty_nr tty the process uses
|
||||
tty_pgrp pgrp of the tty
|
||||
flags task flags
|
||||
min_flt number of minor faults
|
||||
cmin_flt number of minor faults with child's
|
||||
maj_flt number of major faults
|
||||
cmaj_flt number of major faults with child's
|
||||
utime user mode jiffies
|
||||
stime kernel mode jiffies
|
||||
cutime user mode jiffies with child's
|
||||
cstime kernel mode jiffies with child's
|
||||
priority priority level
|
||||
nice nice level
|
||||
num_threads number of threads
|
||||
start_time time the process started after system boot
|
||||
vsize virtual memory size
|
||||
rss resident set memory size
|
||||
rsslim current limit in bytes on the rss
|
||||
start_code address above which program text can run
|
||||
end_code address below which program text can run
|
||||
start_stack address of the start of the stack
|
||||
esp current value of ESP
|
||||
eip current value of EIP
|
||||
pending bitmap of pending signals (obsolete)
|
||||
blocked bitmap of blocked signals (obsolete)
|
||||
sigign bitmap of ignored signals (obsolete)
|
||||
sigcatch bitmap of catched signals (obsolete)
|
||||
wchan address where process went to sleep
|
||||
0 (place holder)
|
||||
0 (place holder)
|
||||
exit_signal signal to send to parent thread on exit
|
||||
task_cpu which CPU the task is scheduled on
|
||||
rt_priority realtime priority
|
||||
policy scheduling policy (man sched_setscheduler)
|
||||
blkio_ticks time spent waiting for block IO
|
||||
..............................................................................
|
||||
|
||||
|
||||
1.2 Kernel data
|
||||
---------------
|
||||
|
||||
Similar to the process entries, the kernel data files give information about
|
||||
the running kernel. The files used to obtain this information are contained in
|
||||
/proc and are listed in Table 1-3. Not all of these will be present in your
|
||||
/proc and are listed in Table 1-4. Not all of these will be present in your
|
||||
system. It depends on the kernel configuration and the loaded modules, which
|
||||
files are there, and which are missing.
|
||||
|
||||
Table 1-3: Kernel info in /proc
|
||||
Table 1-4: Kernel info in /proc
|
||||
..............................................................................
|
||||
File Content
|
||||
apm Advanced power management info
|
||||
@ -473,10 +525,10 @@ IDE devices:
|
||||
|
||||
More detailed information can be found in the controller specific
|
||||
subdirectories. These are named ide0, ide1 and so on. Each of these
|
||||
directories contains the files shown in table 1-4.
|
||||
directories contains the files shown in table 1-5.
|
||||
|
||||
|
||||
Table 1-4: IDE controller info in /proc/ide/ide?
|
||||
Table 1-5: IDE controller info in /proc/ide/ide?
|
||||
..............................................................................
|
||||
File Content
|
||||
channel IDE channel (0 or 1)
|
||||
@ -486,11 +538,11 @@ Table 1-4: IDE controller info in /proc/ide/ide?
|
||||
..............................................................................
|
||||
|
||||
Each device connected to a controller has a separate subdirectory in the
|
||||
controllers directory. The files listed in table 1-5 are contained in these
|
||||
controllers directory. The files listed in table 1-6 are contained in these
|
||||
directories.
|
||||
|
||||
|
||||
Table 1-5: IDE device information
|
||||
Table 1-6: IDE device information
|
||||
..............................................................................
|
||||
File Content
|
||||
cache The cache
|
||||
@ -1014,6 +1066,13 @@ check the amount of free space (value is in seconds). Default settings are: 4,
|
||||
resume it if we have a value of 3 or more percent; consider information about
|
||||
the amount of free space valid for 30 seconds
|
||||
|
||||
audit_argv_kb
|
||||
-------------
|
||||
|
||||
The file contains a single value denoting the limit on the argv array size
|
||||
for execve (in KiB). This limit is only applied when system call auditing for
|
||||
execve is enabled, otherwise the value is ignored.
|
||||
|
||||
ctrl-alt-del
|
||||
------------
|
||||
|
||||
@ -1297,6 +1356,21 @@ nr_hugepages configures number of hugetlb page reserved for the system.
|
||||
hugetlb_shm_group contains group id that is allowed to create SysV shared
|
||||
memory segment using hugetlb page.
|
||||
|
||||
hugepages_treat_as_movable
|
||||
--------------------------
|
||||
|
||||
This parameter is only useful when kernelcore= is specified at boot time to
|
||||
create ZONE_MOVABLE for pages that may be reclaimed or migrated. Huge pages
|
||||
are not movable so are not normally allocated from ZONE_MOVABLE. A non-zero
|
||||
value written to hugepages_treat_as_movable allows huge pages to be allocated
|
||||
from ZONE_MOVABLE.
|
||||
|
||||
Once enabled, the ZONE_MOVABLE is treated as an area of memory the huge
|
||||
pages pool can easily grow or shrink within. Assuming that applications are
|
||||
not running that mlock() a lot of memory, it is likely the huge pages pool
|
||||
can grow to the size of ZONE_MOVABLE by repeatedly entering the desired value
|
||||
into nr_hugepages and triggering page reclaim.
|
||||
|
||||
laptop_mode
|
||||
-----------
|
||||
|
||||
@ -2111,4 +2185,41 @@ those 64-bit counters, process A could see an intermediate result.
|
||||
More information about this can be found within the taskstats documentation in
|
||||
Documentation/accounting.
|
||||
|
||||
2.15 /proc/<pid>/coredump_filter - Core dump filtering settings
|
||||
---------------------------------------------------------------
|
||||
When a process is dumped, all anonymous memory is written to a core file as
|
||||
long as the size of the core file isn't limited. But sometimes we don't want
|
||||
to dump some memory segments, for example, huge shared memory. Conversely,
|
||||
sometimes we want to save file-backed memory segments into a core file, not
|
||||
only the individual files.
|
||||
|
||||
/proc/<pid>/coredump_filter allows you to customize which memory segments
|
||||
will be dumped when the <pid> process is dumped. coredump_filter is a bitmask
|
||||
of memory types. If a bit of the bitmask is set, memory segments of the
|
||||
corresponding memory type are dumped, otherwise they are not dumped.
|
||||
|
||||
The following 4 memory types are supported:
|
||||
- (bit 0) anonymous private memory
|
||||
- (bit 1) anonymous shared memory
|
||||
- (bit 2) file-backed private memory
|
||||
- (bit 3) file-backed shared memory
|
||||
|
||||
Note that MMIO pages such as frame buffer are never dumped and vDSO pages
|
||||
are always dumped regardless of the bitmask status.
|
||||
|
||||
Default value of coredump_filter is 0x3; this means all anonymous memory
|
||||
segments are dumped.
|
||||
|
||||
If you don't want to dump all shared memory segments attached to pid 1234,
|
||||
write 1 to the process's proc file.
|
||||
|
||||
$ echo 0x1 > /proc/1234/coredump_filter
|
||||
|
||||
When a new process is created, the process inherits the bitmask status from its
|
||||
parent. It is useful to set up coredump_filter before the program runs.
|
||||
For example:
|
||||
|
||||
$ echo 0x7 > /proc/self/coredump_filter
|
||||
$ ./some_program
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
Original author: Richard Gooch <rgooch@atnf.csiro.au>
|
||||
|
||||
Last updated on October 28, 2005
|
||||
Last updated on June 24, 2007.
|
||||
|
||||
Copyright (C) 1999 Richard Gooch
|
||||
Copyright (C) 2005 Pekka Enberg
|
||||
@ -107,7 +107,7 @@ file /proc/filesystems.
|
||||
struct file_system_type
|
||||
-----------------------
|
||||
|
||||
This describes the filesystem. As of kernel 2.6.13, the following
|
||||
This describes the filesystem. As of kernel 2.6.22, the following
|
||||
members are defined:
|
||||
|
||||
struct file_system_type {
|
||||
@ -119,6 +119,8 @@ struct file_system_type {
|
||||
struct module *owner;
|
||||
struct file_system_type * next;
|
||||
struct list_head fs_supers;
|
||||
struct lock_class_key s_lock_key;
|
||||
struct lock_class_key s_umount_key;
|
||||
};
|
||||
|
||||
name: the name of the filesystem type, such as "ext2", "iso9660",
|
||||
@ -137,11 +139,12 @@ struct file_system_type {
|
||||
|
||||
next: for internal VFS use: you should initialize this to NULL
|
||||
|
||||
s_lock_key, s_umount_key: lockdep-specific
|
||||
|
||||
The get_sb() method has the following arguments:
|
||||
|
||||
struct super_block *sb: the superblock structure. This is partially
|
||||
initialized by the VFS and the rest must be initialized by the
|
||||
get_sb() method
|
||||
struct file_system_type *fs_type: decribes the filesystem, partly initialized
|
||||
by the specific filesystem code
|
||||
|
||||
int flags: mount flags
|
||||
|
||||
@ -150,12 +153,13 @@ The get_sb() method has the following arguments:
|
||||
void *data: arbitrary mount options, usually comes as an ASCII
|
||||
string
|
||||
|
||||
int silent: whether or not to be silent on error
|
||||
struct vfsmount *mnt: a vfs-internal representation of a mount point
|
||||
|
||||
The get_sb() method must determine if the block device specified
|
||||
in the superblock contains a filesystem of the type the method
|
||||
supports. On success the method returns the superblock pointer, on
|
||||
failure it returns NULL.
|
||||
in the dev_name and fs_type contains a filesystem of the type the method
|
||||
supports. If it succeeds in opening the named block device, it initializes a
|
||||
struct super_block descriptor for the filesystem contained by the block device.
|
||||
On failure it returns an error.
|
||||
|
||||
The most interesting member of the superblock structure that the
|
||||
get_sb() method fills in is the "s_op" field. This is a pointer to
|
||||
@ -193,7 +197,7 @@ struct super_operations
|
||||
-----------------------
|
||||
|
||||
This describes how the VFS can manipulate the superblock of your
|
||||
filesystem. As of kernel 2.6.13, the following members are defined:
|
||||
filesystem. As of kernel 2.6.22, the following members are defined:
|
||||
|
||||
struct super_operations {
|
||||
struct inode *(*alloc_inode)(struct super_block *sb);
|
||||
@ -216,8 +220,6 @@ struct super_operations {
|
||||
void (*clear_inode) (struct inode *);
|
||||
void (*umount_begin) (struct super_block *);
|
||||
|
||||
void (*sync_inodes) (struct super_block *sb,
|
||||
struct writeback_control *wbc);
|
||||
int (*show_options)(struct seq_file *, struct vfsmount *);
|
||||
|
||||
ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
|
||||
@ -300,9 +302,6 @@ or bottom half).
|
||||
|
||||
umount_begin: called when the VFS is unmounting a filesystem.
|
||||
|
||||
sync_inodes: called when the VFS is writing out dirty data associated with
|
||||
a superblock.
|
||||
|
||||
show_options: called by the VFS to show mount options for /proc/<pid>/mounts.
|
||||
|
||||
quota_read: called by the VFS to read from filesystem quota file.
|
||||
@ -324,7 +323,7 @@ struct inode_operations
|
||||
-----------------------
|
||||
|
||||
This describes how the VFS can manipulate an inode in your
|
||||
filesystem. As of kernel 2.6.13, the following members are defined:
|
||||
filesystem. As of kernel 2.6.22, the following members are defined:
|
||||
|
||||
struct inode_operations {
|
||||
int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
|
||||
@ -348,6 +347,7 @@ struct inode_operations {
|
||||
ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
|
||||
ssize_t (*listxattr) (struct dentry *, char *, size_t);
|
||||
int (*removexattr) (struct dentry *, const char *);
|
||||
void (*truncate_range)(struct inode *, loff_t, loff_t);
|
||||
};
|
||||
|
||||
Again, all methods are called without any locks being held, unless
|
||||
@ -444,6 +444,9 @@ otherwise noted.
|
||||
removexattr: called by the VFS to remove an extended attribute from
|
||||
a file. This method is called by removexattr(2) system call.
|
||||
|
||||
truncate_range: a method provided by the underlying filesystem to truncate a
|
||||
range of blocks , i.e. punch a hole somewhere in a file.
|
||||
|
||||
|
||||
The Address Space Object
|
||||
========================
|
||||
@ -522,7 +525,7 @@ struct address_space_operations
|
||||
-------------------------------
|
||||
|
||||
This describes how the VFS can manipulate mapping of a file to page cache in
|
||||
your filesystem. As of kernel 2.6.16, the following members are defined:
|
||||
your filesystem. As of kernel 2.6.22, the following members are defined:
|
||||
|
||||
struct address_space_operations {
|
||||
int (*writepage)(struct page *page, struct writeback_control *wbc);
|
||||
@ -543,6 +546,7 @@ struct address_space_operations {
|
||||
int);
|
||||
/* migrate the contents of a page to the specified target */
|
||||
int (*migratepage) (struct page *, struct page *);
|
||||
int (*launder_page) (struct page *);
|
||||
};
|
||||
|
||||
writepage: called by the VM to write a dirty page to backing store.
|
||||
@ -689,6 +693,10 @@ struct address_space_operations {
|
||||
transfer any private data across and update any references
|
||||
that it has to the page.
|
||||
|
||||
launder_page: Called before freeing a page - it writes back the dirty page. To
|
||||
prevent redirtying the page, it is kept locked during the whole
|
||||
operation.
|
||||
|
||||
The File Object
|
||||
===============
|
||||
|
||||
@ -699,9 +707,10 @@ struct file_operations
|
||||
----------------------
|
||||
|
||||
This describes how the VFS can manipulate an open file. As of kernel
|
||||
2.6.17, the following members are defined:
|
||||
2.6.22, the following members are defined:
|
||||
|
||||
struct file_operations {
|
||||
struct module *owner;
|
||||
loff_t (*llseek) (struct file *, loff_t, int);
|
||||
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
|
||||
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
|
||||
@ -728,10 +737,8 @@ struct file_operations {
|
||||
int (*check_flags)(int);
|
||||
int (*dir_notify)(struct file *filp, unsigned long arg);
|
||||
int (*flock) (struct file *, int, struct file_lock *);
|
||||
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned
|
||||
int);
|
||||
ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned
|
||||
int);
|
||||
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned int);
|
||||
ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int);
|
||||
};
|
||||
|
||||
Again, all methods are called without any locks being held, unless
|
||||
|
@ -78,6 +78,7 @@ static CLASS_DEVICE_ATTR(loading, 0644,
|
||||
firmware_loading_show, firmware_loading_store);
|
||||
|
||||
static ssize_t firmware_data_read(struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
char *buffer, loff_t offset, size_t count)
|
||||
{
|
||||
struct class_device *class_dev = to_class_dev(kobj);
|
||||
@ -88,6 +89,7 @@ static ssize_t firmware_data_read(struct kobject *kobj,
|
||||
return count;
|
||||
}
|
||||
static ssize_t firmware_data_write(struct kobject *kobj,
|
||||
struct bin_attribute *bin_attr,
|
||||
char *buffer, loff_t offset, size_t count)
|
||||
{
|
||||
struct class_device *class_dev = to_class_dev(kobj);
|
||||
|
@ -75,6 +75,9 @@ using the include file:
|
||||
If you stick to this convention then it'll be easier for other developers to
|
||||
see what your code is doing, and help maintain it.
|
||||
|
||||
Note that these operations include I/O barriers on platforms which need to
|
||||
use them; drivers don't need to add them explicitly.
|
||||
|
||||
|
||||
Identifying GPIOs
|
||||
-----------------
|
||||
|
@ -67,3 +67,7 @@ executed on expiry.
|
||||
|
||||
Thomas, Ingo
|
||||
|
||||
Added flag to indicate 'deferrable timer' in /proc/timer_stats. A deferrable
|
||||
timer will appear as follows
|
||||
10D, 1 swapper queue_delayed_work_on (delayed_work_timer_fn)
|
||||
|
||||
|
@ -2,7 +2,7 @@ Kernel driver abituguru
|
||||
=======================
|
||||
|
||||
Supported chips:
|
||||
* Abit uGuru revision 1-3 (Hardware Monitor part only)
|
||||
* Abit uGuru revision 1 & 2 (Hardware Monitor part only)
|
||||
Prefix: 'abituguru'
|
||||
Addresses scanned: ISA 0x0E0
|
||||
Datasheet: Not available, this driver is based on reverse engineering.
|
||||
@ -20,8 +20,8 @@ Supported chips:
|
||||
uGuru 2.1.0.0 ~ 2.1.2.8 (AS8, AV8, AA8, AG8, AA8XE, AX8)
|
||||
uGuru 2.2.0.0 ~ 2.2.0.6 (AA8 Fatal1ty)
|
||||
uGuru 2.3.0.0 ~ 2.3.0.9 (AN8)
|
||||
uGuru 3.0.0.0 ~ 3.0.1.2 (AW8, AL8, NI8)
|
||||
uGuru 4.xxxxx? (AT8 32X) (2)
|
||||
uGuru 3.0.0.0 ~ 3.0.x.x (AW8, AL8, AT8, NI8 SLI, AT8 32X, AN8 32X,
|
||||
AW9D-MAX) (2)
|
||||
1) For revisions 2 and 3 uGuru's the driver can autodetect the
|
||||
sensortype (Volt or Temp) for bank1 sensors, for revision 1 uGuru's
|
||||
this doesnot always work. For these uGuru's the autodection can
|
||||
@ -30,8 +30,9 @@ Supported chips:
|
||||
bank1_types=1,1,0,0,0,0,0,2,0,0,0,0,2,0,0,1
|
||||
You may also need to specify the fan_sensors option for these boards
|
||||
fan_sensors=5
|
||||
2) The current version of the abituguru driver is known to NOT work
|
||||
on these Motherboards
|
||||
2) There is a seperate abituguru3 driver for these motherboards,
|
||||
the abituguru (without the 3 !) driver will not work on these
|
||||
motherboards (and visa versa)!
|
||||
|
||||
Authors:
|
||||
Hans de Goede <j.w.r.degoede@hhs.nl>,
|
||||
@ -43,8 +44,10 @@ Module Parameters
|
||||
-----------------
|
||||
|
||||
* force: bool Force detection. Note this parameter only causes the
|
||||
detection to be skipped, if the uGuru can't be read
|
||||
the module initialization (insmod) will still fail.
|
||||
detection to be skipped, and thus the insmod to
|
||||
succeed. If the uGuru can't be read the actual hwmon
|
||||
driver will not load and thus no hwmon device will get
|
||||
registered.
|
||||
* bank1_types: int[] Bank1 sensortype autodetection override:
|
||||
-1 autodetect (default)
|
||||
0 volt sensor
|
||||
@ -69,13 +72,15 @@ dmesg | grep abituguru
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports the hardware monitoring features of the Abit uGuru chip
|
||||
found on Abit uGuru featuring motherboards (most modern Abit motherboards).
|
||||
This driver supports the hardware monitoring features of the first and
|
||||
second revision of the Abit uGuru chip found on Abit uGuru featuring
|
||||
motherboards (most modern Abit motherboards).
|
||||
|
||||
The uGuru chip in reality is a Winbond W83L950D in disguise (despite Abit
|
||||
claiming it is "a new microprocessor designed by the ABIT Engineers").
|
||||
Unfortunatly this doesn't help since the W83L950D is a generic
|
||||
microcontroller with a custom Abit application running on it.
|
||||
The first and second revision of the uGuru chip in reality is a Winbond
|
||||
W83L950D in disguise (despite Abit claiming it is "a new microprocessor
|
||||
designed by the ABIT Engineers"). Unfortunatly this doesn't help since the
|
||||
W83L950D is a generic microcontroller with a custom Abit application running
|
||||
on it.
|
||||
|
||||
Despite Abit not releasing any information regarding the uGuru, Olle
|
||||
Sandberg <ollebull@gmail.com> has managed to reverse engineer the sensor part
|
||||
|
65
Documentation/hwmon/abituguru3
Normal file
65
Documentation/hwmon/abituguru3
Normal file
@ -0,0 +1,65 @@
|
||||
Kernel driver abituguru3
|
||||
========================
|
||||
|
||||
Supported chips:
|
||||
* Abit uGuru revision 3 (Hardware Monitor part, reading only)
|
||||
Prefix: 'abituguru3'
|
||||
Addresses scanned: ISA 0x0E0
|
||||
Datasheet: Not available, this driver is based on reverse engineering.
|
||||
Note:
|
||||
The uGuru is a microcontroller with onboard firmware which programs
|
||||
it to behave as a hwmon IC. There are many different revisions of the
|
||||
firmware and thus effectivly many different revisions of the uGuru.
|
||||
Below is an incomplete list with which revisions are used for which
|
||||
Motherboards:
|
||||
uGuru 1.00 ~ 1.24 (AI7, KV8-MAX3, AN7)
|
||||
uGuru 2.0.0.0 ~ 2.0.4.2 (KV8-PRO)
|
||||
uGuru 2.1.0.0 ~ 2.1.2.8 (AS8, AV8, AA8, AG8, AA8XE, AX8)
|
||||
uGuru 2.3.0.0 ~ 2.3.0.9 (AN8)
|
||||
uGuru 3.0.0.0 ~ 3.0.x.x (AW8, AL8, AT8, NI8 SLI, AT8 32X, AN8 32X,
|
||||
AW9D-MAX)
|
||||
The abituguru3 driver is only for revison 3.0.x.x motherboards,
|
||||
this driver will not work on older motherboards. For older
|
||||
motherboards use the abituguru (without the 3 !) driver.
|
||||
|
||||
Authors:
|
||||
Hans de Goede <j.w.r.degoede@hhs.nl>,
|
||||
(Initial reverse engineering done by Louis Kruger)
|
||||
|
||||
|
||||
Module Parameters
|
||||
-----------------
|
||||
|
||||
* force: bool Force detection. Note this parameter only causes the
|
||||
detection to be skipped, and thus the insmod to
|
||||
succeed. If the uGuru can't be read the actual hwmon
|
||||
driver will not load and thus no hwmon device will get
|
||||
registered.
|
||||
* verbose: bool Should the driver be verbose?
|
||||
0/off/false normal output
|
||||
1/on/true + verbose error reporting (default)
|
||||
Default: 1 (the driver is still in the testing phase)
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports the hardware monitoring features of the third revision of
|
||||
the Abit uGuru chip, found on recent Abit uGuru featuring motherboards.
|
||||
|
||||
The 3rd revision of the uGuru chip in reality is a Winbond W83L951G.
|
||||
Unfortunatly this doesn't help since the W83L951G is a generic microcontroller
|
||||
with a custom Abit application running on it.
|
||||
|
||||
Despite Abit not releasing any information regarding the uGuru revision 3,
|
||||
Louis Kruger has managed to reverse engineer the sensor part of the uGuru.
|
||||
Without his work this driver would not have been possible.
|
||||
|
||||
Known Issues
|
||||
------------
|
||||
|
||||
The voltage and frequency control parts of the Abit uGuru are not supported,
|
||||
neither is writing any of the sensor settings and writing / reading the
|
||||
fanspeed control registers (FanEQ)
|
||||
|
||||
If you encounter any problems please mail me <j.w.r.degoede@hhs.nl> and
|
||||
include the output of: "dmesg | grep abituguru"
|
257
Documentation/hwmon/dme1737
Normal file
257
Documentation/hwmon/dme1737
Normal file
@ -0,0 +1,257 @@
|
||||
Kernel driver dme1737
|
||||
=====================
|
||||
|
||||
Supported chips:
|
||||
* SMSC DME1737 and compatibles (like Asus A8000)
|
||||
Prefix: 'dme1737'
|
||||
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
||||
Datasheet: Provided by SMSC upon request and under NDA
|
||||
|
||||
Authors:
|
||||
Juerg Haefliger <juergh@gmail.com>
|
||||
|
||||
|
||||
Module Parameters
|
||||
-----------------
|
||||
|
||||
* force_start: bool Enables the monitoring of voltage, fan and temp inputs
|
||||
and PWM output control functions. Using this parameter
|
||||
shouldn't be required since the BIOS usually takes care
|
||||
of this.
|
||||
|
||||
Note that there is no need to use this parameter if the driver loads without
|
||||
complaining. The driver will say so if it is necessary.
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the hardware monitoring capabilities of the
|
||||
SMSC DME1737 and Asus A8000 (which are the same) Super-I/O chips. This chip
|
||||
features monitoring of 3 temp sensors temp[1-3] (2 remote diodes and 1
|
||||
internal), 7 voltages in[0-6] (6 external and 1 internal) and 6 fan speeds
|
||||
fan[1-6]. Additionally, the chip implements 5 PWM outputs pwm[1-3,5-6] for
|
||||
controlling fan speeds both manually and automatically.
|
||||
|
||||
Fan[3-6] and pwm[3,5-6] are optional features and their availability is
|
||||
dependent on the configuration of the chip. The driver will detect which
|
||||
features are present during initialization and create the sysfs attributes
|
||||
accordingly.
|
||||
|
||||
|
||||
Voltage Monitoring
|
||||
------------------
|
||||
|
||||
The voltage inputs are sampled with 12-bit resolution and have internal
|
||||
scaling resistors. The values returned by the driver therefore reflect true
|
||||
millivolts and don't need scaling. The voltage inputs are mapped as follows
|
||||
(the last column indicates the input ranges):
|
||||
|
||||
in0: +5VTR (+5V standby) 0V - 6.64V
|
||||
in1: Vccp (processor core) 0V - 3V
|
||||
in2: VCC (internal +3.3V) 0V - 4.38V
|
||||
in3: +5V 0V - 6.64V
|
||||
in4: +12V 0V - 16V
|
||||
in5: VTR (+3.3V standby) 0V - 4.38V
|
||||
in6: Vbat (+3.0V) 0V - 4.38V
|
||||
|
||||
Each voltage input has associated min and max limits which trigger an alarm
|
||||
when crossed.
|
||||
|
||||
|
||||
Temperature Monitoring
|
||||
----------------------
|
||||
|
||||
Temperatures are measured with 12-bit resolution and reported in millidegree
|
||||
Celsius. The chip also features offsets for all 3 temperature inputs which -
|
||||
when programmed - get added to the input readings. The chip does all the
|
||||
scaling by itself and the driver therefore reports true temperatures that don't
|
||||
need any user-space adjustments. The temperature inputs are mapped as follows
|
||||
(the last column indicates the input ranges):
|
||||
|
||||
temp1: Remote diode 1 (3904 type) temperature -127C - +127C
|
||||
temp2: DME1737 internal temperature -127C - +127C
|
||||
temp3: Remote diode 2 (3904 type) temperature -127C - +127C
|
||||
|
||||
Each temperature input has associated min and max limits which trigger an alarm
|
||||
when crossed. Additionally, each temperature input has a fault attribute that
|
||||
returns 1 when a faulty diode or an unconnected input is detected and 0
|
||||
otherwise.
|
||||
|
||||
|
||||
Fan Monitoring
|
||||
--------------
|
||||
|
||||
Fan RPMs are measured with 16-bit resolution. The chip provides inputs for 6
|
||||
fan tachometers. All 6 inputs have an associated min limit which triggers an
|
||||
alarm when crossed. Fan inputs 1-4 provide type attributes that need to be set
|
||||
to the number of pulses per fan revolution that the connected tachometer
|
||||
generates. Supported values are 1, 2, and 4. Fan inputs 5-6 only support fans
|
||||
that generate 2 pulses per revolution. Fan inputs 5-6 also provide a max
|
||||
attribute that needs to be set to the maximum attainable RPM (fan at 100% duty-
|
||||
cycle) of the input. The chip adjusts the sampling rate based on this value.
|
||||
|
||||
|
||||
PWM Output Control
|
||||
------------------
|
||||
|
||||
This chip features 5 PWM outputs. PWM outputs 1-3 are associated with fan
|
||||
inputs 1-3 and PWM outputs 5-6 are associated with fan inputs 5-6. PWM outputs
|
||||
1-3 can be configured to operate either in manual or automatic mode by setting
|
||||
the appropriate enable attribute accordingly. PWM outputs 5-6 can only operate
|
||||
in manual mode, their enable attributes are therefore read-only. When set to
|
||||
manual mode, the fan speed is set by writing the duty-cycle value to the
|
||||
appropriate PWM attribute. In automatic mode, the PWM attribute returns the
|
||||
current duty-cycle as set by the fan controller in the chip. All PWM outputs
|
||||
support the setting of the output frequency via the freq attribute.
|
||||
|
||||
In automatic mode, the chip supports the setting of the PWM ramp rate which
|
||||
defines how fast the PWM output is adjusting to changes of the associated
|
||||
temperature input. Associating PWM outputs to temperature inputs is done via
|
||||
temperature zones. The chip features 3 zones whose assignments to temperature
|
||||
inputs is static and determined during initialization. These assignments can
|
||||
be retrieved via the zone[1-3]_auto_channels_temp attributes. Each PWM output
|
||||
is assigned to one (or hottest of multiple) temperature zone(s) through the
|
||||
pwm[1-3]_auto_channels_zone attributes. Each PWM output has 3 distinct output
|
||||
duty-cycles: full, low, and min. Full is internally hard-wired to 255 (100%)
|
||||
and low and min can be programmed via pwm[1-3]_auto_point1_pwm and
|
||||
pwm[1-3]_auto_pwm_min, respectively. The thermal thresholds of the zones are
|
||||
programmed via zone[1-3]_auto_point[1-3]_temp and
|
||||
zone[1-3]_auto_point1_temp_hyst:
|
||||
|
||||
pwm[1-3]_auto_point2_pwm full-speed duty-cycle (255, i.e., 100%)
|
||||
pwm[1-3]_auto_point1_pwm low-speed duty-cycle
|
||||
pwm[1-3]_auto_pwm_min min-speed duty-cycle
|
||||
|
||||
zone[1-3]_auto_point3_temp full-speed temp (all outputs)
|
||||
zone[1-3]_auto_point2_temp full-speed temp
|
||||
zone[1-3]_auto_point1_temp low-speed temp
|
||||
zone[1-3]_auto_point1_temp_hyst min-speed temp
|
||||
|
||||
The chip adjusts the output duty-cycle linearly in the range of auto_point1_pwm
|
||||
to auto_point2_pwm if the temperature of the associated zone is between
|
||||
auto_point1_temp and auto_point2_temp. If the temperature drops below the
|
||||
auto_point1_temp_hyst value, the output duty-cycle is set to the auto_pwm_min
|
||||
value which only supports two values: 0 or auto_point1_pwm. That means that the
|
||||
fan either turns completely off or keeps spinning with the low-speed
|
||||
duty-cycle. If any of the temperatures rise above the auto_point3_temp value,
|
||||
all PWM outputs are set to 100% duty-cycle.
|
||||
|
||||
Following is another representation of how the chip sets the output duty-cycle
|
||||
based on the temperature of the associated thermal zone:
|
||||
|
||||
Duty-Cycle Duty-Cycle
|
||||
Temperature Rising Temp Falling Temp
|
||||
----------- ----------- ------------
|
||||
full-speed full-speed full-speed
|
||||
|
||||
< linearly adjusted duty-cycle >
|
||||
|
||||
low-speed low-speed low-speed
|
||||
min-speed low-speed
|
||||
min-speed min-speed min-speed
|
||||
min-speed min-speed
|
||||
|
||||
|
||||
Sysfs Attributes
|
||||
----------------
|
||||
|
||||
Following is a list of all sysfs attributes that the driver provides, their
|
||||
permissions and a short description:
|
||||
|
||||
Name Perm Description
|
||||
---- ---- -----------
|
||||
cpu0_vid RO CPU core reference voltage in
|
||||
millivolts.
|
||||
vrm RW Voltage regulator module version
|
||||
number.
|
||||
|
||||
in[0-6]_input RO Measured voltage in millivolts.
|
||||
in[0-6]_min RW Low limit for voltage input.
|
||||
in[0-6]_max RW High limit for voltage input.
|
||||
in[0-6]_alarm RO Voltage input alarm. Returns 1 if
|
||||
voltage input is or went outside the
|
||||
associated min-max range, 0 otherwise.
|
||||
|
||||
temp[1-3]_input RO Measured temperature in millidegree
|
||||
Celsius.
|
||||
temp[1-3]_min RW Low limit for temp input.
|
||||
temp[1-3]_max RW High limit for temp input.
|
||||
temp[1-3]_offset RW Offset for temp input. This value will
|
||||
be added by the chip to the measured
|
||||
temperature.
|
||||
temp[1-3]_alarm RO Alarm for temp input. Returns 1 if temp
|
||||
input is or went outside the associated
|
||||
min-max range, 0 otherwise.
|
||||
temp[1-3]_fault RO Temp input fault. Returns 1 if the chip
|
||||
detects a faulty thermal diode or an
|
||||
unconnected temp input, 0 otherwise.
|
||||
|
||||
zone[1-3]_auto_channels_temp RO Temperature zone to temperature input
|
||||
mapping. This attribute is a bitfield
|
||||
and supports the following values:
|
||||
1: temp1
|
||||
2: temp2
|
||||
4: temp3
|
||||
zone[1-3]_auto_point1_temp_hyst RW Auto PWM temp point1 hysteresis. The
|
||||
output of the corresponding PWM is set
|
||||
to the pwm_auto_min value if the temp
|
||||
falls below the auto_point1_temp_hyst
|
||||
value.
|
||||
zone[1-3]_auto_point[1-3]_temp RW Auto PWM temp points. Auto_point1 is
|
||||
the low-speed temp, auto_point2 is the
|
||||
full-speed temp, and auto_point3 is the
|
||||
temp at which all PWM outputs are set
|
||||
to full-speed (100% duty-cycle).
|
||||
|
||||
fan[1-6]_input RO Measured fan speed in RPM.
|
||||
fan[1-6]_min RW Low limit for fan input.
|
||||
fan[1-6]_alarm RO Alarm for fan input. Returns 1 if fan
|
||||
input is or went below the associated
|
||||
min value, 0 otherwise.
|
||||
fan[1-4]_type RW Type of attached fan. Expressed in
|
||||
number of pulses per revolution that
|
||||
the fan generates. Supported values are
|
||||
1, 2, and 4.
|
||||
fan[5-6]_max RW Max attainable RPM at 100% duty-cycle.
|
||||
Required for chip to adjust the
|
||||
sampling rate accordingly.
|
||||
|
||||
pmw[1-3,5-6] RO/RW Duty-cycle of PWM output. Supported
|
||||
values are 0-255 (0%-100%). Only
|
||||
writeable if the associated PWM is in
|
||||
manual mode.
|
||||
pwm[1-3]_enable RW Enable of PWM outputs 1-3. Supported
|
||||
values are:
|
||||
0: turned off (output @ 100%)
|
||||
1: manual mode
|
||||
2: automatic mode
|
||||
pwm[5-6]_enable RO Enable of PWM outputs 5-6. Always
|
||||
returns 1 since these 2 outputs are
|
||||
hard-wired to manual mode.
|
||||
pmw[1-3,5-6]_freq RW Frequency of PWM output. Supported
|
||||
values are in the range 11Hz-30000Hz
|
||||
(default is 25000Hz).
|
||||
pmw[1-3]_ramp_rate RW Ramp rate of PWM output. Determines how
|
||||
fast the PWM duty-cycle will change
|
||||
when the PWM is in automatic mode.
|
||||
Expressed in ms per PWM step. Supported
|
||||
values are in the range 0ms-206ms
|
||||
(default is 0, which means the duty-
|
||||
cycle changes instantly).
|
||||
pwm[1-3]_auto_channels_zone RW PWM output to temperature zone mapping.
|
||||
This attribute is a bitfield and
|
||||
supports the following values:
|
||||
1: zone1
|
||||
2: zone2
|
||||
4: zone3
|
||||
6: highest of zone[2-3]
|
||||
7: highest of zone[1-3]
|
||||
pwm[1-3]_auto_pwm_min RW Auto PWM min pwm. Minimum PWM duty-
|
||||
cycle. Supported values are 0 or
|
||||
auto_point1_pwm.
|
||||
pwm[1-3]_auto_point1_pwm RW Auto PWM pwm point. Auto_point1 is the
|
||||
low-speed duty-cycle.
|
||||
pwm[1-3]_auto_point2_pwm RO Auto PWM pwm point. Auto_point2 is the
|
||||
full-speed duty-cycle which is hard-
|
||||
wired to 255 (100% duty-cycle).
|
@ -5,11 +5,11 @@ Supported chips:
|
||||
* Fintek F71805F/FG
|
||||
Prefix: 'f71805f'
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
Datasheet: Provided by Fintek on request
|
||||
Datasheet: Available from the Fintek website
|
||||
* Fintek F71872F/FG
|
||||
Prefix: 'f71872f'
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
Datasheet: Provided by Fintek on request
|
||||
Datasheet: Available from the Fintek website
|
||||
|
||||
Author: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
@ -128,7 +128,9 @@ it.
|
||||
When the PWM method is used, you can select the operating frequency,
|
||||
from 187.5 kHz (default) to 31 Hz. The best frequency depends on the
|
||||
fan model. As a rule of thumb, lower frequencies seem to give better
|
||||
control, but may generate annoying high-pitch noise. Fintek recommends
|
||||
control, but may generate annoying high-pitch noise. So a frequency just
|
||||
above the audible range, such as 25 kHz, may be a good choice; if this
|
||||
doesn't give you good linear control, try reducing it. Fintek recommends
|
||||
not going below 1 kHz, as the fan tachometers get confused by lower
|
||||
frequencies as well.
|
||||
|
||||
@ -136,16 +138,23 @@ When the DC method is used, Fintek recommends not going below 5 V, which
|
||||
corresponds to a pwm value of 106 for the driver. The driver doesn't
|
||||
enforce this limit though.
|
||||
|
||||
Three different fan control modes are supported:
|
||||
Three different fan control modes are supported; the mode number is written
|
||||
to the pwm<n>_enable file.
|
||||
|
||||
* Manual mode
|
||||
You ask for a specific PWM duty cycle or DC voltage.
|
||||
* 1: Manual mode
|
||||
You ask for a specific PWM duty cycle or DC voltage by writing to the
|
||||
pwm<n> file.
|
||||
|
||||
* Fan speed mode
|
||||
You ask for a specific fan speed. This mode assumes that pwm1
|
||||
corresponds to fan1, pwm2 to fan2 and pwm3 to fan3.
|
||||
* 2: Temperature mode
|
||||
You define 3 temperature/fan speed trip points using the
|
||||
pwm<n>_auto_point<m>_temp and _fan files. These define a staircase
|
||||
relationship between temperature and fan speed with two additional points
|
||||
interpolated between the values that you define. When the temperature
|
||||
is below auto_point1_temp the fan is switched off.
|
||||
|
||||
* Temperature mode
|
||||
You define 3 temperature/fan speed trip points, and the fan speed is
|
||||
adjusted depending on the measured temperature, using interpolation.
|
||||
This mode is not yet supported by the driver.
|
||||
* 3: Fan speed mode
|
||||
You ask for a specific fan speed by writing to the fan<n>_target file.
|
||||
|
||||
Both of the automatic modes require that pwm1 corresponds to fan1, pwm2 to
|
||||
fan2 and pwm3 to fan3. Temperature mode also requires that temp1 corresponds
|
||||
to pwm1 and fan1, etc.
|
||||
|
@ -12,11 +12,12 @@ Supported chips:
|
||||
Addresses scanned: from Super I/O config space (8 I/O ports)
|
||||
Datasheet: Publicly available at the ITE website
|
||||
http://www.ite.com.tw/
|
||||
* IT8716F
|
||||
* IT8716F/IT8726F
|
||||
Prefix: 'it8716'
|
||||
Addresses scanned: from Super I/O config space (8 I/O ports)
|
||||
Datasheet: Publicly available at the ITE website
|
||||
http://www.ite.com.tw/product_info/file/pc/IT8716F_V0.3.ZIP
|
||||
http://www.ite.com.tw/product_info/file/pc/IT8726F_V0.3.pdf
|
||||
* IT8718F
|
||||
Prefix: 'it8718'
|
||||
Addresses scanned: from Super I/O config space (8 I/O ports)
|
||||
@ -68,7 +69,7 @@ Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the IT8705F, IT8712F, IT8716F,
|
||||
IT8718F and SiS950 chips.
|
||||
IT8718F, IT8726F and SiS950 chips.
|
||||
|
||||
These chips are 'Super I/O chips', supporting floppy disks, infrared ports,
|
||||
joysticks and other miscellaneous stuff. For hardware monitoring, they
|
||||
@ -97,6 +98,10 @@ clock divider mess) but not compatible with the older chips and
|
||||
revisions. For now, the driver only uses the 16-bit mode on the
|
||||
IT8716F and IT8718F.
|
||||
|
||||
The IT8726F is just bit enhanced IT8716F with additional hardware
|
||||
for AMD power sequencing. Therefore the chip will appear as IT8716F
|
||||
to userspace applications.
|
||||
|
||||
Temperatures are measured in degrees Celsius. An alarm is triggered once
|
||||
when the Overtemperature Shutdown limit is crossed.
|
||||
|
||||
|
@ -48,6 +48,18 @@ Supported chips:
|
||||
Addresses scanned: I2C 0x4c, 0x4d (unsupported 0x4e)
|
||||
Datasheet: Publicly available at the Maxim website
|
||||
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2578
|
||||
* Maxim MAX6680
|
||||
Prefix: 'max6680'
|
||||
Addresses scanned: I2C 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
|
||||
0x4c, 0x4d and 0x4e
|
||||
Datasheet: Publicly available at the Maxim website
|
||||
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3370
|
||||
* Maxim MAX6681
|
||||
Prefix: 'max6680'
|
||||
Addresses scanned: I2C 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b,
|
||||
0x4c, 0x4d and 0x4e
|
||||
Datasheet: Publicly available at the Maxim website
|
||||
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3370
|
||||
|
||||
|
||||
Author: Jean Delvare <khali@linux-fr.org>
|
||||
@ -59,11 +71,15 @@ Description
|
||||
The LM90 is a digital temperature sensor. It senses its own temperature as
|
||||
well as the temperature of up to one external diode. It is compatible
|
||||
with many other devices such as the LM86, the LM89, the LM99, the ADM1032,
|
||||
the MAX6657, MAX6658 and the MAX6659 all of which are supported by this driver.
|
||||
Note that there is no easy way to differentiate between the last three
|
||||
variants. The extra address and features of the MAX6659 are not supported by
|
||||
this driver. Additionally, the ADT7461 is supported if found in ADM1032
|
||||
compatibility mode.
|
||||
the MAX6657, MAX6658, MAX6659, MAX6680 and the MAX6681 all of which are
|
||||
supported by this driver.
|
||||
|
||||
Note that there is no easy way to differentiate between the MAX6657,
|
||||
MAX6658 and MAX6659 variants. The extra address and features of the
|
||||
MAX6659 are not supported by this driver. The MAX6680 and MAX6681 only
|
||||
differ in their pinout, therefore they obviously can't (and don't need to)
|
||||
be distinguished. Additionally, the ADT7461 is supported if found in
|
||||
ADM1032 compatibility mode.
|
||||
|
||||
The specificity of this family of chipsets over the ADM1021/LM84
|
||||
family is that it features critical limits with hysteresis, and an
|
||||
@ -93,18 +109,22 @@ ADM1032:
|
||||
* ALERT is triggered by open remote sensor.
|
||||
* SMBus PEC support for Write Byte and Receive Byte transactions.
|
||||
|
||||
ADT7461
|
||||
ADT7461:
|
||||
* Extended temperature range (breaks compatibility)
|
||||
* Lower resolution for remote temperature
|
||||
|
||||
MAX6657 and MAX6658:
|
||||
* Remote sensor type selection
|
||||
|
||||
MAX6659
|
||||
MAX6659:
|
||||
* Selectable address
|
||||
* Second critical temperature limit
|
||||
* Remote sensor type selection
|
||||
|
||||
MAX6680 and MAX6681:
|
||||
* Selectable address
|
||||
* Remote sensor type selection
|
||||
|
||||
All temperature values are given in degrees Celsius. Resolution
|
||||
is 1.0 degree for the local temperature, 0.125 degree for the remote
|
||||
temperature.
|
||||
@ -141,7 +161,7 @@ SMBus Read Byte, and PEC will work properly.
|
||||
Additionally, the ADM1032 doesn't support SMBus Send Byte with PEC.
|
||||
Instead, it will try to write the PEC value to the register (because the
|
||||
SMBus Send Byte transaction with PEC is similar to a Write Byte transaction
|
||||
without PEC), which is not what we want. Thus, PEC is explicitely disabled
|
||||
without PEC), which is not what we want. Thus, PEC is explicitly disabled
|
||||
on SMBus Send Byte transactions in the lm90 driver.
|
||||
|
||||
PEC on byte data transactions represents a significant increase in bandwidth
|
||||
|
412
Documentation/hwmon/lm93
Normal file
412
Documentation/hwmon/lm93
Normal file
@ -0,0 +1,412 @@
|
||||
Kernel driver lm93
|
||||
==================
|
||||
|
||||
Supported chips:
|
||||
* National Semiconductor LM93
|
||||
Prefix 'lm93'
|
||||
Addresses scanned: I2C 0x2c-0x2e
|
||||
Datasheet: http://www.national.com/ds.cgi/LM/LM93.pdf
|
||||
|
||||
Author:
|
||||
Mark M. Hoffman <mhoffman@lightlink.com>
|
||||
Ported to 2.6 by Eric J. Bowersox <ericb@aspsys.com>
|
||||
Adapted to 2.6.20 by Carsten Emde <ce@osadl.org>
|
||||
Modified for mainline integration by Hans J. Koch <hjk@linutronix.de>
|
||||
|
||||
Module Parameters
|
||||
-----------------
|
||||
|
||||
(specific to LM93)
|
||||
* init: integer
|
||||
Set to non-zero to force some initializations (default is 0).
|
||||
* disable_block: integer
|
||||
A "0" allows SMBus block data transactions if the host supports them. A "1"
|
||||
disables SMBus block data transactions. The default is 0.
|
||||
* vccp_limit_type: integer array (2)
|
||||
Configures in7 and in8 limit type, where 0 means absolute and non-zero
|
||||
means relative. "Relative" here refers to "Dynamic Vccp Monitoring using
|
||||
VID" from the datasheet. It greatly simplifies the interface to allow
|
||||
only one set of limits (absolute or relative) to be in operation at a
|
||||
time (even though the hardware is capable of enabling both). There's
|
||||
not a compelling use case for enabling both at once, anyway. The default
|
||||
is "0,0".
|
||||
* vid_agtl: integer
|
||||
A "0" configures the VID pins for V(ih) = 2.1V min, V(il) = 0.8V max.
|
||||
A "1" configures the VID pins for V(ih) = 0.8V min, V(il) = 0.4V max.
|
||||
(The latter setting is referred to as AGTL+ Compatible in the datasheet.)
|
||||
I.e. this parameter controls the VID pin input thresholds; if your VID
|
||||
inputs are not working, try changing this. The default value is "0".
|
||||
|
||||
(common among sensor drivers)
|
||||
* force: short array (min = 1, max = 48)
|
||||
List of adapter,address pairs to assume to be present. Autodetection
|
||||
of the target device will still be attempted. Use one of the more
|
||||
specific force directives below if this doesn't detect the device.
|
||||
* force_lm93: short array (min = 1, max = 48)
|
||||
List of adapter,address pairs which are unquestionably assumed to contain
|
||||
a 'lm93' chip
|
||||
* ignore: short array (min = 1, max = 48)
|
||||
List of adapter,address pairs not to scan
|
||||
* ignore_range: short array (min = 1, max = 48)
|
||||
List of adapter,start-addr,end-addr triples not to scan
|
||||
* probe: short array (min = 1, max = 48)
|
||||
List of adapter,address pairs to scan additionally
|
||||
* probe_range: short array (min = 1, max = 48)
|
||||
List of adapter,start-addr,end-addr triples to scan additionally
|
||||
|
||||
|
||||
Hardware Description
|
||||
--------------------
|
||||
|
||||
(from the datasheet)
|
||||
|
||||
The LM93, hardware monitor, has a two wire digital interface compatible with
|
||||
SMBus 2.0. Using an 8-bit ADC, the LM93 measures the temperature of two remote
|
||||
diode connected transistors as well as its own die and 16 power supply
|
||||
voltages. To set fan speed, the LM93 has two PWM outputs that are each
|
||||
controlled by up to four temperature zones. The fancontrol algorithm is lookup
|
||||
table based. The LM93 includes a digital filter that can be invoked to smooth
|
||||
temperature readings for better control of fan speed. The LM93 has four
|
||||
tachometer inputs to measure fan speed. Limit and status registers for all
|
||||
measured values are included. The LM93 builds upon the functionality of
|
||||
previous motherboard management ASICs and uses some of the LM85 s features
|
||||
(i.e. smart tachometer mode). It also adds measurement and control support
|
||||
for dynamic Vccp monitoring and PROCHOT. It is designed to monitor a dual
|
||||
processor Xeon class motherboard with a minimum of external components.
|
||||
|
||||
|
||||
Driver Description
|
||||
------------------
|
||||
|
||||
This driver implements support for the National Semiconductor LM93.
|
||||
|
||||
|
||||
User Interface
|
||||
--------------
|
||||
|
||||
#PROCHOT:
|
||||
|
||||
The LM93 can monitor two #PROCHOT signals. The results are found in the
|
||||
sysfs files prochot1, prochot2, prochot1_avg, prochot2_avg, prochot1_max,
|
||||
and prochot2_max. prochot1_max and prochot2_max contain the user limits
|
||||
for #PROCHOT1 and #PROCHOT2, respectively. prochot1 and prochot2 contain
|
||||
the current readings for the most recent complete time interval. The
|
||||
value of prochot1_avg and prochot2_avg is something like a 2 period
|
||||
exponential moving average (but not quite - check the datasheet). Note
|
||||
that this third value is calculated by the chip itself. All values range
|
||||
from 0-255 where 0 indicates no throttling, and 255 indicates > 99.6%.
|
||||
|
||||
The monitoring intervals for the two #PROCHOT signals is also configurable.
|
||||
These intervals can be found in the sysfs files prochot1_interval and
|
||||
prochot2_interval. The values in these files specify the intervals for
|
||||
#P1_PROCHOT and #P2_PROCHOT, respectively. Selecting a value not in this
|
||||
list will cause the driver to use the next largest interval. The available
|
||||
intervals are:
|
||||
|
||||
#PROCHOT intervals: 0.73, 1.46, 2.9, 5.8, 11.7, 23.3, 46.6, 93.2, 186, 372
|
||||
|
||||
It is possible to configure the LM93 to logically short the two #PROCHOT
|
||||
signals. I.e. when #P1_PROCHOT is asserted, the LM93 will automatically
|
||||
assert #P2_PROCHOT, and vice-versa. This mode is enabled by writing a
|
||||
non-zero integer to the sysfs file prochot_short.
|
||||
|
||||
The LM93 can also override the #PROCHOT pins by driving a PWM signal onto
|
||||
one or both of them. When overridden, the signal has a period of 3.56 mS,
|
||||
a minimum pulse width of 5 clocks (at 22.5kHz => 6.25% duty cycle), and
|
||||
a maximum pulse width of 80 clocks (at 22.5kHz => 99.88% duty cycle).
|
||||
|
||||
The sysfs files prochot1_override and prochot2_override contain boolean
|
||||
intgers which enable or disable the override function for #P1_PROCHOT and
|
||||
#P2_PROCHOT, respectively. The sysfs file prochot_override_duty_cycle
|
||||
contains a value controlling the duty cycle for the PWM signal used when
|
||||
the override function is enabled. This value ranges from 0 to 15, with 0
|
||||
indicating minimum duty cycle and 15 indicating maximum.
|
||||
|
||||
#VRD_HOT:
|
||||
|
||||
The LM93 can monitor two #VRD_HOT signals. The results are found in the
|
||||
sysfs files vrdhot1 and vrdhot2. There is one value per file: a boolean for
|
||||
which 1 indicates #VRD_HOT is asserted and 0 indicates it is negated. These
|
||||
files are read-only.
|
||||
|
||||
Smart Tach Mode:
|
||||
|
||||
(from the datasheet)
|
||||
|
||||
If a fan is driven using a low-side drive PWM, the tachometer
|
||||
output of the fan is corrupted. The LM93 includes smart tachometer
|
||||
circuitry that allows an accurate tachometer reading to be
|
||||
achieved despite the signal corruption. In smart tach mode all
|
||||
four signals are measured within 4 seconds.
|
||||
|
||||
Smart tach mode is enabled by the driver by writing 1 or 2 (associating the
|
||||
the fan tachometer with a pwm) to the sysfs file fan<n>_smart_tach. A zero
|
||||
will disable the function for that fan. Note that Smart tach mode cannot be
|
||||
enabled if the PWM output frequency is 22500 Hz (see below).
|
||||
|
||||
Manual PWM:
|
||||
|
||||
The LM93 has a fixed or override mode for the two PWM outputs (although, there
|
||||
are still some conditions that will override even this mode - see section
|
||||
15.10.6 of the datasheet for details.) The sysfs files pwm1_override
|
||||
and pwm2_override are used to enable this mode; each is a boolean integer
|
||||
where 0 disables and 1 enables the manual control mode. The sysfs files pwm1
|
||||
and pwm2 are used to set the manual duty cycle; each is an integer (0-255)
|
||||
where 0 is 0% duty cycle, and 255 is 100%. Note that the duty cycle values
|
||||
are constrained by the hardware. Selecting a value which is not available
|
||||
will cause the driver to use the next largest value. Also note: when manual
|
||||
PWM mode is disabled, the value of pwm1 and pwm2 indicates the current duty
|
||||
cycle chosen by the h/w.
|
||||
|
||||
PWM Output Frequency:
|
||||
|
||||
The LM93 supports several different frequencies for the PWM output channels.
|
||||
The sysfs files pwm1_freq and pwm2_freq are used to select the frequency. The
|
||||
frequency values are constrained by the hardware. Selecting a value which is
|
||||
not available will cause the driver to use the next largest value. Also note
|
||||
that this parameter has implications for the Smart Tach Mode (see above).
|
||||
|
||||
PWM Output Frequencies: 12, 36, 48, 60, 72, 84, 96, 22500 (h/w default)
|
||||
|
||||
Automatic PWM:
|
||||
|
||||
The LM93 is capable of complex automatic fan control, with many different
|
||||
points of configuration. To start, each PWM output can be bound to any
|
||||
combination of eight control sources. The final PWM is the largest of all
|
||||
individual control sources to which the PWM output is bound.
|
||||
|
||||
The eight control sources are: temp1-temp4 (aka "zones" in the datasheet),
|
||||
#PROCHOT 1 & 2, and #VRDHOT 1 & 2. The bindings are expressed as a bitmask
|
||||
in the sysfs files pwm<n>_auto_channels, where a "1" enables the binding, and
|
||||
a "0" disables it. The h/w default is 0x0f (all temperatures bound).
|
||||
|
||||
0x01 - Temp 1
|
||||
0x02 - Temp 2
|
||||
0x04 - Temp 3
|
||||
0x08 - Temp 4
|
||||
0x10 - #PROCHOT 1
|
||||
0x20 - #PROCHOT 2
|
||||
0x40 - #VRDHOT 1
|
||||
0x80 - #VRDHOT 2
|
||||
|
||||
The function y = f(x) takes a source temperature x to a PWM output y. This
|
||||
function of the LM93 is derived from a base temperature and a table of 12
|
||||
temperature offsets. The base temperature is expressed in degrees C in the
|
||||
sysfs files temp<n>_auto_base. The offsets are expressed in cumulative
|
||||
degrees C, with the value of offset <i> for temperature value <n> being
|
||||
contained in the file temp<n>_auto_offset<i>. E.g. if the base temperature
|
||||
is 40C:
|
||||
|
||||
offset # temp<n>_auto_offset<i> range pwm
|
||||
1 0 - 25.00%
|
||||
2 0 - 28.57%
|
||||
3 1 40C - 41C 32.14%
|
||||
4 1 41C - 42C 35.71%
|
||||
5 2 42C - 44C 39.29%
|
||||
6 2 44C - 46C 42.86%
|
||||
7 2 48C - 50C 46.43%
|
||||
8 2 50C - 52C 50.00%
|
||||
9 2 52C - 54C 53.57%
|
||||
10 2 54C - 56C 57.14%
|
||||
11 2 56C - 58C 71.43%
|
||||
12 2 58C - 60C 85.71%
|
||||
> 60C 100.00%
|
||||
|
||||
Valid offsets are in the range 0C <= x <= 7.5C in 0.5C increments.
|
||||
|
||||
There is an independent base temperature for each temperature channel. Note,
|
||||
however, there are only two tables of offsets: one each for temp[12] and
|
||||
temp[34]. Therefore, any change to e.g. temp1_auto_offset<i> will also
|
||||
affect temp2_auto_offset<i>.
|
||||
|
||||
The LM93 can also apply hysteresis to the offset table, to prevent unwanted
|
||||
oscillation between two steps in the offsets table. These values are found in
|
||||
the sysfs files temp<n>_auto_offset_hyst. The value in this file has the
|
||||
same representation as in temp<n>_auto_offset<i>.
|
||||
|
||||
If a temperature reading falls below the base value for that channel, the LM93
|
||||
will use the minimum PWM value. These values are found in the sysfs files
|
||||
temp<n>_auto_pwm_min. Note, there are only two minimums: one each for temp[12]
|
||||
and temp[34]. Therefore, any change to e.g. temp1_auto_pwm_min will also
|
||||
affect temp2_auto_pwm_min.
|
||||
|
||||
PWM Spin-Up Cycle:
|
||||
|
||||
A spin-up cycle occurs when a PWM output is commanded from 0% duty cycle to
|
||||
some value > 0%. The LM93 supports a minimum duty cycle during spin-up. These
|
||||
values are found in the sysfs files pwm<n>_auto_spinup_min. The value in this
|
||||
file has the same representation as other PWM duty cycle values. The
|
||||
duration of the spin-up cycle is also configurable. These values are found in
|
||||
the sysfs files pwm<n>_auto_spinup_time. The value in this file is
|
||||
the spin-up time in seconds. The available spin-up times are constrained by
|
||||
the hardware. Selecting a value which is not available will cause the driver
|
||||
to use the next largest value.
|
||||
|
||||
Spin-up Durations: 0 (disabled, h/w default), 0.1, 0.25, 0.4, 0.7, 1.0,
|
||||
2.0, 4.0
|
||||
|
||||
#PROCHOT and #VRDHOT PWM Ramping:
|
||||
|
||||
If the #PROCHOT or #VRDHOT signals are asserted while bound to a PWM output
|
||||
channel, the LM93 will ramp the PWM output up to 100% duty cycle in discrete
|
||||
steps. The duration of each step is configurable. There are two files, with
|
||||
one value each in seconds: pwm_auto_prochot_ramp and pwm_auto_vrdhot_ramp.
|
||||
The available ramp times are constrained by the hardware. Selecting a value
|
||||
which is not available will cause the driver to use the next largest value.
|
||||
|
||||
Ramp Times: 0 (disabled, h/w default) to 0.75 in 0.05 second intervals
|
||||
|
||||
Fan Boost:
|
||||
|
||||
For each temperature channel, there is a boost temperature: if the channel
|
||||
exceeds this limit, the LM93 will immediately drive both PWM outputs to 100%.
|
||||
This limit is expressed in degrees C in the sysfs files temp<n>_auto_boost.
|
||||
There is also a hysteresis temperature for this function: after the boost
|
||||
limit is reached, the temperature channel must drop below this value before
|
||||
the boost function is disabled. This temperature is also expressed in degrees
|
||||
C in the sysfs files temp<n>_auto_boost_hyst.
|
||||
|
||||
GPIO Pins:
|
||||
|
||||
The LM93 can monitor the logic level of four dedicated GPIO pins as well as the
|
||||
four tach input pins. GPIO0-GPIO3 correspond to (fan) tach 1-4, respectively.
|
||||
All eight GPIOs are read by reading the bitmask in the sysfs file gpio. The
|
||||
LSB is GPIO0, and the MSB is GPIO7.
|
||||
|
||||
|
||||
LM93 Unique sysfs Files
|
||||
-----------------------
|
||||
|
||||
file description
|
||||
-------------------------------------------------------------
|
||||
|
||||
prochot<n> current #PROCHOT %
|
||||
|
||||
prochot<n>_avg moving average #PROCHOT %
|
||||
|
||||
prochot<n>_max limit #PROCHOT %
|
||||
|
||||
prochot_short enable or disable logical #PROCHOT pin short
|
||||
|
||||
prochot<n>_override force #PROCHOT assertion as PWM
|
||||
|
||||
prochot_override_duty_cycle
|
||||
duty cycle for the PWM signal used when
|
||||
#PROCHOT is overridden
|
||||
|
||||
prochot<n>_interval #PROCHOT PWM sampling interval
|
||||
|
||||
vrdhot<n> 0 means negated, 1 means asserted
|
||||
|
||||
fan<n>_smart_tach enable or disable smart tach mode
|
||||
|
||||
pwm<n>_auto_channels select control sources for PWM outputs
|
||||
|
||||
pwm<n>_auto_spinup_min minimum duty cycle during spin-up
|
||||
|
||||
pwm<n>_auto_spinup_time duration of spin-up
|
||||
|
||||
pwm_auto_prochot_ramp ramp time per step when #PROCHOT asserted
|
||||
|
||||
pwm_auto_vrdhot_ramp ramp time per step when #VRDHOT asserted
|
||||
|
||||
temp<n>_auto_base temperature channel base
|
||||
|
||||
temp<n>_auto_offset[1-12]
|
||||
temperature channel offsets
|
||||
|
||||
temp<n>_auto_offset_hyst
|
||||
temperature channel offset hysteresis
|
||||
|
||||
temp<n>_auto_boost temperature channel boost (PWMs to 100%) limit
|
||||
|
||||
temp<n>_auto_boost_hyst temperature channel boost hysteresis
|
||||
|
||||
gpio input state of 8 GPIO pins; read-only
|
||||
|
||||
|
||||
Sample Configuration File
|
||||
-------------------------
|
||||
|
||||
Here is a sample LM93 chip config for sensors.conf:
|
||||
|
||||
---------- cut here ----------
|
||||
chip "lm93-*"
|
||||
|
||||
# VOLTAGE INPUTS
|
||||
|
||||
# labels and scaling based on datasheet recommendations
|
||||
label in1 "+12V1"
|
||||
compute in1 @ * 12.945, @ / 12.945
|
||||
set in1_min 12 * 0.90
|
||||
set in1_max 12 * 1.10
|
||||
|
||||
label in2 "+12V2"
|
||||
compute in2 @ * 12.945, @ / 12.945
|
||||
set in2_min 12 * 0.90
|
||||
set in2_max 12 * 1.10
|
||||
|
||||
label in3 "+12V3"
|
||||
compute in3 @ * 12.945, @ / 12.945
|
||||
set in3_min 12 * 0.90
|
||||
set in3_max 12 * 1.10
|
||||
|
||||
label in4 "FSB_Vtt"
|
||||
|
||||
label in5 "3GIO"
|
||||
|
||||
label in6 "ICH_Core"
|
||||
|
||||
label in7 "Vccp1"
|
||||
|
||||
label in8 "Vccp2"
|
||||
|
||||
label in9 "+3.3V"
|
||||
set in9_min 3.3 * 0.90
|
||||
set in9_max 3.3 * 1.10
|
||||
|
||||
label in10 "+5V"
|
||||
set in10_min 5.0 * 0.90
|
||||
set in10_max 5.0 * 1.10
|
||||
|
||||
label in11 "SCSI_Core"
|
||||
|
||||
label in12 "Mem_Core"
|
||||
|
||||
label in13 "Mem_Vtt"
|
||||
|
||||
label in14 "Gbit_Core"
|
||||
|
||||
# Assuming R1/R2 = 4.1143, and 3.3V reference
|
||||
# -12V = (4.1143 + 1) * (@ - 3.3) + 3.3
|
||||
label in15 "-12V"
|
||||
compute in15 @ * 5.1143 - 13.57719, (@ + 13.57719) / 5.1143
|
||||
set in15_min -12 * 0.90
|
||||
set in15_max -12 * 1.10
|
||||
|
||||
label in16 "+3.3VSB"
|
||||
set in16_min 3.3 * 0.90
|
||||
set in16_max 3.3 * 1.10
|
||||
|
||||
# TEMPERATURE INPUTS
|
||||
|
||||
label temp1 "CPU1"
|
||||
label temp2 "CPU2"
|
||||
label temp3 "LM93"
|
||||
|
||||
# TACHOMETER INPUTS
|
||||
|
||||
label fan1 "Fan1"
|
||||
set fan1_min 3000
|
||||
label fan2 "Fan2"
|
||||
set fan2_min 3000
|
||||
label fan3 "Fan3"
|
||||
set fan3_min 3000
|
||||
label fan4 "Fan4"
|
||||
set fan4_min 3000
|
||||
|
||||
# PWM OUTPUTS
|
||||
|
||||
label pwm1 "CPU1"
|
||||
label pwm2 "CPU2"
|
||||
|
@ -4,6 +4,7 @@ Kernel driver smsc47b397
|
||||
Supported chips:
|
||||
* SMSC LPC47B397-NC
|
||||
* SMSC SCH5307-NS
|
||||
* SMSC SCH5317
|
||||
Prefix: 'smsc47b397'
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
Datasheet: In this file
|
||||
@ -18,8 +19,8 @@ The following specification describes the SMSC LPC47B397-NC[1] sensor chip
|
||||
provided by Craig Kelly (In-Store Broadcast Network) and edited/corrected
|
||||
by Mark M. Hoffman <mhoffman@lightlink.com>.
|
||||
|
||||
[1] And SMSC SCH5307-NS, which has a different device ID but is otherwise
|
||||
compatible.
|
||||
[1] And SMSC SCH5307-NS and SCH5317, which have different device IDs but are
|
||||
otherwise compatible.
|
||||
|
||||
* * * * *
|
||||
|
||||
@ -131,7 +132,7 @@ OUT DX,AL
|
||||
The registers of interest for identifying the SIO on the dc7100 are Device ID
|
||||
(0x20) and Device Rev (0x21).
|
||||
|
||||
The Device ID will read 0x6F (for SCH5307-NS, 0x81)
|
||||
The Device ID will read 0x6F (0x81 for SCH5307-NS, and 0x85 for SCH5317)
|
||||
The Device Rev currently reads 0x01
|
||||
|
||||
Obtaining the HWM Base Address.
|
||||
|
@ -172,11 +172,10 @@ pwm[1-*] Pulse width modulation fan control.
|
||||
255 is max or 100%.
|
||||
|
||||
pwm[1-*]_enable
|
||||
Switch PWM on and off.
|
||||
Not always present even if pwmN is.
|
||||
0: turn off
|
||||
1: turn on in manual mode
|
||||
2+: turn on in automatic mode
|
||||
Fan speed control method:
|
||||
0: no fan speed control (i.e. fan at full speed)
|
||||
1: manual fan speed control enabled (using pwm[1-*])
|
||||
2+: automatic fan speed control enabled
|
||||
Check individual chip documentation files for automatic mode
|
||||
details.
|
||||
RW
|
||||
@ -343,9 +342,9 @@ to notify open diodes, unconnected fans etc. where the hardware
|
||||
supports it. When this boolean has value 1, the measurement for that
|
||||
channel should not be trusted.
|
||||
|
||||
in[0-*]_input_fault
|
||||
fan[1-*]_input_fault
|
||||
temp[1-*]_input_fault
|
||||
in[0-*]_fault
|
||||
fan[1-*]_fault
|
||||
temp[1-*]_fault
|
||||
Input fault condition
|
||||
0: no fault occured
|
||||
1: fault condition
|
||||
|
@ -22,9 +22,9 @@ This driver implements support for the Winbond W83627EHF, W83627EHG, and
|
||||
W83627DHG super I/O chips. We will refer to them collectively as Winbond chips.
|
||||
|
||||
The chips implement three temperature sensors, five fan rotation
|
||||
speed sensors, ten analog voltage sensors (only nine for the 627DHG), alarms
|
||||
with beep warnings (control unimplemented), and some automatic fan regulation
|
||||
strategies (plus manual fan control mode).
|
||||
speed sensors, ten analog voltage sensors (only nine for the 627DHG), one
|
||||
VID (6 pins), alarms with beep warnings (control unimplemented), and
|
||||
some automatic fan regulation strategies (plus manual fan control mode).
|
||||
|
||||
Temperatures are measured in degrees Celsius and measurement resolution is 1
|
||||
degC for temp1 and 0.5 degC for temp2 and temp3. An alarm is triggered when
|
||||
|
@ -5,8 +5,8 @@ Supported adapters:
|
||||
'810' and '810E' chipsets)
|
||||
* Intel 82801BA (ICH2 - part of the '815E' chipset)
|
||||
* Intel 82801CA/CAM (ICH3)
|
||||
* Intel 82801DB (ICH4) (HW PEC supported, 32 byte buffer not supported)
|
||||
* Intel 82801EB/ER (ICH5) (HW PEC supported, 32 byte buffer not supported)
|
||||
* Intel 82801DB (ICH4) (HW PEC supported)
|
||||
* Intel 82801EB/ER (ICH5) (HW PEC supported)
|
||||
* Intel 6300ESB
|
||||
* Intel 82801FB/FR/FW/FRW (ICH6)
|
||||
* Intel 82801G (ICH7)
|
||||
|
@ -6,7 +6,7 @@ Supported adapters:
|
||||
Datasheet: Publicly available at the Intel website
|
||||
* ServerWorks OSB4, CSB5, CSB6 and HT-1000 southbridges
|
||||
Datasheet: Only available via NDA from ServerWorks
|
||||
* ATI IXP200, IXP300, IXP400 and SB600 southbridges
|
||||
* ATI IXP200, IXP300, IXP400, SB600 and SB700 southbridges
|
||||
Datasheet: Not publicly available
|
||||
* Standard Microsystems (SMSC) SLC90E66 (Victory66) southbridge
|
||||
Datasheet: Publicly available at the SMSC website http://www.smsc.com
|
||||
|
46
Documentation/i2c/busses/i2c-taos-evm
Normal file
46
Documentation/i2c/busses/i2c-taos-evm
Normal file
@ -0,0 +1,46 @@
|
||||
Kernel driver i2c-taos-evm
|
||||
|
||||
Author: Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
This is a driver for the evaluation modules for TAOS I2C/SMBus chips.
|
||||
The modules include an SMBus master with limited capabilities, which can
|
||||
be controlled over the serial port. Virtually all evaluation modules
|
||||
are supported, but a few lines of code need to be added for each new
|
||||
module to instantiate the right I2C chip on the bus. Obviously, a driver
|
||||
for the chip in question is also needed.
|
||||
|
||||
Currently supported devices are:
|
||||
|
||||
* TAOS TSL2550 EVM
|
||||
|
||||
For addtional information on TAOS products, please see
|
||||
http://www.taosinc.com/
|
||||
|
||||
|
||||
Using this driver
|
||||
-----------------
|
||||
|
||||
In order to use this driver, you'll need the serport driver, and the
|
||||
inputattach tool, which is part of the input-utils package. The following
|
||||
commands will tell the kernel that you have a TAOS EVM on the first
|
||||
serial port:
|
||||
|
||||
# modprobe serport
|
||||
# inputattach --taos-evm /dev/ttyS0
|
||||
|
||||
|
||||
Technical details
|
||||
-----------------
|
||||
|
||||
Only 4 SMBus transaction types are supported by the TAOS evaluation
|
||||
modules:
|
||||
* Receive Byte
|
||||
* Send Byte
|
||||
* Read Byte
|
||||
* Write Byte
|
||||
|
||||
The communication protocol is text-based and pretty simple. It is
|
||||
described in a PDF document on the CD which comes with the evaluation
|
||||
module. The communication is rather slow, because the serial port has
|
||||
to operate at 1200 bps. However, I don't think this is a big concern in
|
||||
practice, as these modules are meant for evaluation and testing only.
|
@ -99,7 +99,7 @@ And then read the data
|
||||
|
||||
or
|
||||
|
||||
count = i2c_smbus_read_i2c_block_data(fd, 0x84, buffer);
|
||||
count = i2c_smbus_read_i2c_block_data(fd, 0x84, 16, buffer);
|
||||
|
||||
The block read should read 16 bytes.
|
||||
0x84 is the block read command.
|
||||
|
@ -1,38 +0,0 @@
|
||||
Kernel driver x1205
|
||||
===================
|
||||
|
||||
Supported chips:
|
||||
* Xicor X1205 RTC
|
||||
Prefix: 'x1205'
|
||||
Addresses scanned: none
|
||||
Datasheet: http://www.intersil.com/cda/deviceinfo/0,1477,X1205,00.html
|
||||
|
||||
Authors:
|
||||
Karen Spearel <kas11@tampabay.rr.com>,
|
||||
Alessandro Zummo <a.zummo@towertech.it>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This module aims to provide complete access to the Xicor X1205 RTC.
|
||||
Recently Xicor has merged with Intersil, but the chip is
|
||||
still sold under the Xicor brand.
|
||||
|
||||
This chip is located at address 0x6f and uses a 2-byte register addressing.
|
||||
Two bytes need to be written to read a single register, while most
|
||||
other chips just require one and take the second one as the data
|
||||
to be written. To prevent corrupting unknown chips, the user must
|
||||
explicitely set the probe parameter.
|
||||
|
||||
example:
|
||||
|
||||
modprobe x1205 probe=0,0x6f
|
||||
|
||||
The module supports one more option, hctosys, which is used to set the
|
||||
software clock from the x1205. On systems where the x1205 is the
|
||||
only hardware rtc, this parameter could be used to achieve a correct
|
||||
date/time earlier in the system boot sequence.
|
||||
|
||||
example:
|
||||
|
||||
modprobe x1205 probe=0,0x6f hctosys=1
|
@ -67,7 +67,6 @@ i2c-proc: The /proc/sys/dev/sensors interface for device (client) drivers
|
||||
Algorithm drivers
|
||||
-----------------
|
||||
|
||||
i2c-algo-8xx: An algorithm for CPM's I2C device in Motorola 8xx processors (NOT BUILT BY DEFAULT)
|
||||
i2c-algo-bit: A bit-banging algorithm
|
||||
i2c-algo-pcf: A PCF 8584 style algorithm
|
||||
i2c-algo-ibm_ocp: An algorithm for the I2C device in IBM 4xx processors (NOT BUILT BY DEFAULT)
|
||||
@ -81,6 +80,5 @@ i2c-pcf-epp: PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (NOT mkpatch
|
||||
i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit)
|
||||
i2c-adap-ibm_ocp: IBM 4xx processor I2C device (uses i2c-algo-ibm_ocp) (NOT BUILT BY DEFAULT)
|
||||
i2c-pport: Primitive parallel port adapter (uses i2c-algo-bit)
|
||||
i2c-rpx: RPX board Motorola 8xx I2C device (uses i2c-algo-8xx) (NOT BUILT BY DEFAULT)
|
||||
i2c-velleman: Velleman K8000 parallel port adapter (uses i2c-algo-bit)
|
||||
|
||||
|
@ -571,7 +571,7 @@ SMBus communication
|
||||
u8 command, u8 length,
|
||||
u8 *values);
|
||||
extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client,
|
||||
u8 command, u8 *values);
|
||||
u8 command, u8 length, u8 *values);
|
||||
|
||||
These ones were removed in Linux 2.6.10 because they had no users, but could
|
||||
be added back later if needed:
|
||||
|
@ -37,6 +37,7 @@ Offset Type Description
|
||||
0x1d0 unsigned long EFI memory descriptor map pointer
|
||||
0x1d4 unsigned long EFI memory descriptor map size
|
||||
0x1e0 unsigned long ALT_MEM_K, alternative mem check, in Kb
|
||||
0x1e4 unsigned long Scratch field for the kernel setup code
|
||||
0x1e8 char number of entries in E820MAP (below)
|
||||
0x1e9 unsigned char number of entries in EDDBUF (below)
|
||||
0x1ea unsigned char number of entries in EDD_MBR_SIG_BUFFER (below)
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
int sum;
|
||||
|
||||
@ -34,13 +35,19 @@ int map_mem(char *path, off_t offset, size_t length, int touch)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fnmatch("/proc/bus/pci/*", path, 0) == 0) {
|
||||
rc = ioctl(fd, PCIIOC_MMAP_IS_MEM);
|
||||
if (rc == -1)
|
||||
perror("PCIIOC_MMAP_IS_MEM ioctl");
|
||||
}
|
||||
|
||||
addr = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset);
|
||||
if (addr == MAP_FAILED)
|
||||
return 1;
|
||||
|
||||
if (touch) {
|
||||
c = (int *) addr;
|
||||
while (c < (int *) (offset + length))
|
||||
while (c < (int *) (addr + length))
|
||||
sum += *c++;
|
||||
}
|
||||
|
||||
@ -54,7 +61,7 @@ int map_mem(char *path, off_t offset, size_t length, int touch)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int scan_sysfs(char *path, char *file, off_t offset, size_t length, int touch)
|
||||
int scan_tree(char *path, char *file, off_t offset, size_t length, int touch)
|
||||
{
|
||||
struct dirent **namelist;
|
||||
char *name, *path2;
|
||||
@ -93,7 +100,7 @@ int scan_sysfs(char *path, char *file, off_t offset, size_t length, int touch)
|
||||
} else {
|
||||
r = lstat(path2, &buf);
|
||||
if (r == 0 && S_ISDIR(buf.st_mode)) {
|
||||
rc = scan_sysfs(path2, file, offset, length, touch);
|
||||
rc = scan_tree(path2, file, offset, length, touch);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
@ -238,10 +245,15 @@ int main()
|
||||
else
|
||||
fprintf(stderr, "FAIL: /dev/mem 0x0-0x100000 not accessible\n");
|
||||
|
||||
scan_sysfs("/sys/class/pci_bus", "legacy_mem", 0, 0xA0000, 1);
|
||||
scan_sysfs("/sys/class/pci_bus", "legacy_mem", 0xA0000, 0x20000, 0);
|
||||
scan_sysfs("/sys/class/pci_bus", "legacy_mem", 0xC0000, 0x40000, 1);
|
||||
scan_sysfs("/sys/class/pci_bus", "legacy_mem", 0, 1024*1024, 0);
|
||||
scan_tree("/sys/class/pci_bus", "legacy_mem", 0, 0xA0000, 1);
|
||||
scan_tree("/sys/class/pci_bus", "legacy_mem", 0xA0000, 0x20000, 0);
|
||||
scan_tree("/sys/class/pci_bus", "legacy_mem", 0xC0000, 0x40000, 1);
|
||||
scan_tree("/sys/class/pci_bus", "legacy_mem", 0, 1024*1024, 0);
|
||||
|
||||
scan_rom("/sys/devices", "rom");
|
||||
|
||||
scan_tree("/proc/bus/pci", "??.?", 0, 0xA0000, 1);
|
||||
scan_tree("/proc/bus/pci", "??.?", 0xA0000, 0x20000, 0);
|
||||
scan_tree("/proc/bus/pci", "??.?", 0xC0000, 0x40000, 1);
|
||||
scan_tree("/proc/bus/pci", "??.?", 0, 1024*1024, 0);
|
||||
}
|
||||
|
@ -112,6 +112,18 @@ POTENTIAL ATTRIBUTE ALIASING CASES
|
||||
|
||||
The /dev/mem mmap constraints apply.
|
||||
|
||||
mmap of /proc/bus/pci/.../??.?
|
||||
|
||||
This is an MMIO mmap of PCI functions, which additionally may or
|
||||
may not be requested as using the WC attribute.
|
||||
|
||||
If WC is requested, and the region in kern_memmap is either WC
|
||||
or UC, and the EFI memory map designates the region as WC, then
|
||||
the WC mapping is allowed.
|
||||
|
||||
Otherwise, the user mapping must use the same attribute as the
|
||||
kernel mapping.
|
||||
|
||||
read/write of /dev/mem
|
||||
|
||||
This uses copy_from_user(), which implicitly uses a kernel
|
||||
|
@ -67,7 +67,7 @@ Code Seq# Include File Comments
|
||||
0x00 00-1F linux/wavefront.h conflict!
|
||||
0x02 all linux/fd.h
|
||||
0x03 all linux/hdreg.h
|
||||
0x04 all linux/umsdos_fs.h
|
||||
0x04 D2-DC linux/umsdos_fs.h Dead since 2.6.11, but don't reuse these.
|
||||
0x06 all linux/lp.h
|
||||
0x09 all linux/md.h
|
||||
0x12 all linux/fs.h
|
||||
|
650
Documentation/ja_JP/HOWTO
Normal file
650
Documentation/ja_JP/HOWTO
Normal file
@ -0,0 +1,650 @@
|
||||
NOTE:
|
||||
This is Japanese translated version of "Documentation/HOWTO".
|
||||
This one is maintained by Tsugikazu Shibata <tshibata@ab.jp.nec.com>
|
||||
and JF Project team <www.linux.or.jp/JF>.
|
||||
If you find difference with original file or problem in translation,
|
||||
please contact maintainer of this file or JF project.
|
||||
|
||||
Please also note that purpose of this file is easier to read for non
|
||||
English natives and not to be intended to fork. So, if you have any
|
||||
comments or updates of this file, please try to update Original(English)
|
||||
file at first.
|
||||
|
||||
Last Updated: 2007/06/04
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.21/Documentation/HOWTO
|
||||
の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2007/06/04
|
||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||
武井伸光さん、<takei at webmasters dot gr dot jp>
|
||||
かねこさん (Seiji Kaneko) <skaneko at a2 dot mbn dot or dot jp>
|
||||
野口さん (Kenji Noguchi) <tokyo246 at gmail dot com>
|
||||
河内さん (Takayoshi Kochi) <t-kochi at bq dot jp dot nec dot com>
|
||||
岩本さん (iwamoto) <iwamoto.kn at ncos dot nec dot co dot jp>
|
||||
==================================
|
||||
|
||||
Linux カーネル開発のやり方
|
||||
-------------------------------
|
||||
|
||||
これは上のトピック( Linux カーネル開発のやり方)の重要な事柄を網羅した
|
||||
ドキュメントです。ここには Linux カーネル開発者になるための方法と
|
||||
Linux カーネル開発コミュニティと共に活動するやり方を学ぶ方法が含まれて
|
||||
います。カーネルプログラミングに関する技術的な項目に関することは何も含
|
||||
めないようにしていますが、カーネル開発者となるための正しい方向に向かう
|
||||
手助けになります。
|
||||
|
||||
もし、このドキュメントのどこかが古くなっていた場合には、このドキュメン
|
||||
トの最後にリストしたメンテナーにパッチを送ってください。
|
||||
|
||||
はじめに
|
||||
---------
|
||||
|
||||
あなたは Linux カーネルの開発者になる方法を学びたいのでしょうか? そ
|
||||
れともあなたは上司から「このデバイスの Linux ドライバを書くように」と
|
||||
言われているのでしょうか?
|
||||
この文書の目的は、あなたが踏むべき手順と、コミュニティと一緒にうまく働
|
||||
くヒントを書き下すことで、あなたが知るべき全てのことを教えることです。
|
||||
また、このコミュニティがなぜ今うまくまわっているのかという理由の一部も
|
||||
説明しようと試みています。
|
||||
|
||||
カーネルは 少量のアーキテクチャ依存部分がアセンブリ言語で書かれている
|
||||
以外は大部分は C 言語で書かれています。C言語をよく理解していることはカー
|
||||
ネル開発者には必要です。アーキテクチャ向けの低レベル部分の開発をするの
|
||||
でなければ、(どんなアーキテクチャでも)アセンブリ(訳注: 言語)は必要あり
|
||||
ません。以下の本は、C 言語の十分な知識や何年もの経験に取って代わるもの
|
||||
ではありませんが、少なくともリファレンスとしてはいい本です。
|
||||
- "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
|
||||
-『プログラミング言語C第2版』(B.W. カーニハン/D.M. リッチー著 石田晴久訳) [共立出版]
|
||||
- "Practical C Programming" by Steve Oualline [O'Reilly]
|
||||
- 『C実践プログラミング第3版』(Steve Oualline著 望月康司監訳 谷口功訳) [オライリージャパン]
|
||||
- "C: A Reference Manual" by Harbison and Steele [Prentice Hall]
|
||||
- 『新・詳説 C 言語 H&S リファレンス』
|
||||
(サミュエル P ハービソン/ガイ L スティール共著 斉藤 信男監訳)[ソフトバンク]
|
||||
|
||||
カーネルは GNU C と GNU ツールチェインを使って書かれています。カーネル
|
||||
は ISO C89 仕様に準拠して書く一方で、標準には無い言語拡張を多く使って
|
||||
います。カーネルは標準 C ライブラリとは関係がないといった、C 言語フリー
|
||||
スタンディング環境です。そのため、C の標準で使えないものもあります。任
|
||||
意の long long の除算や浮動小数点は使えません。
|
||||
ときどき、カーネルがツールチェインや C 言語拡張に置いている前提がどう
|
||||
なっているのかわかりにくいことがあり、また、残念なことに決定的なリファ
|
||||
レンスは存在しません。情報を得るには、gcc の info ページ( info gcc )を
|
||||
みてください。
|
||||
|
||||
あなたは既存の開発コミュニティと一緒に作業する方法を学ぼうとしているこ
|
||||
とに留意してください。そのコミュニティは、コーディング、スタイル、
|
||||
開発手順について高度な標準を持つ、多様な人の集まりです。
|
||||
地理的に分散した大規模なチームに対してもっともうまくいくとわかったこと
|
||||
をベースにしながら、これらの標準は長い時間をかけて築かれてきました。
|
||||
これらはきちんと文書化されていますから、事前にこれらの標準についてでき
|
||||
るだけたくさん学んでください。また皆があなたやあなたの会社のやり方に合わ
|
||||
せてくれると思わないでください。
|
||||
|
||||
法的問題
|
||||
------------
|
||||
|
||||
Linux カーネルのソースコードは GPL ライセンスの下でリリースされていま
|
||||
す。ライセンスの詳細については、ソースツリーのメインディレクトリに存在
|
||||
する、COPYING のファイルをみてください。もしライセンスについてさらに質
|
||||
問があれば、Linux Kernel メーリングリストに質問するのではなく、どうぞ
|
||||
法律家に相談してください。メーリングリストの人達は法律家ではなく、法的
|
||||
問題については彼らの声明はあてにするべきではありません。
|
||||
|
||||
GPL に関する共通の質問や回答については、以下を参照してください。
|
||||
http://www.gnu.org/licenses/gpl-faq.html
|
||||
|
||||
ドキュメント
|
||||
------------
|
||||
|
||||
Linux カーネルソースツリーは幅広い範囲のドキュメントを含んでおり、それ
|
||||
らはカーネルコミュニティと会話する方法を学ぶのに非常に貴重なものです。
|
||||
新しい機能がカーネルに追加される場合、その機能の使い方について説明した
|
||||
新しいドキュメントファイルも追加することを勧めます。
|
||||
カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの
|
||||
変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報
|
||||
をマニュアルページのメンテナ mtk-manpages@gmx.net に送ることを勧めます。
|
||||
|
||||
以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
|
||||
す-
|
||||
|
||||
README
|
||||
このファイルは Linuxカーネルの簡単な背景とカーネルを設定(訳注
|
||||
configure )し、生成(訳注 build )するために必要なことは何かが書かれ
|
||||
ています。カーネルに関して初めての人はここからスタートするとよいで
|
||||
しょう。
|
||||
|
||||
Documentation/Changes
|
||||
このファイルはカーネルをうまく生成(訳注 build )し、走らせるのに最
|
||||
小限のレベルで必要な数々のソフトウェアパッケージの一覧を示してい
|
||||
ます。
|
||||
|
||||
Documentation/CodingStyle
|
||||
これは Linux カーネルのコーディングスタイルと背景にある理由を記述
|
||||
しています。全ての新しいコードはこのドキュメントにあるガイドライン
|
||||
に従っていることを期待されています。大部分のメンテナーはこれらのルー
|
||||
ルに従っているものだけを受け付け、多くの人は正しいスタイルのコード
|
||||
だけをレビューします。
|
||||
|
||||
Documentation/SubmittingPatches
|
||||
Documentation/SubmittingDrivers
|
||||
これらのファイルには、どうやってうまくパッチを作って投稿するかに
|
||||
ついて非常に詳しく書かれており、以下を含みます(これだけに限らない
|
||||
けれども)
|
||||
- Email に含むこと
|
||||
- Email の形式
|
||||
- だれに送るか
|
||||
これらのルールに従えばうまくいくことを保証することではありません
|
||||
が (すべてのパッチは内容とスタイルについて精査を受けるので)、
|
||||
ルールに従わなければ間違いなくうまくいかないでしょう。
|
||||
この他にパッチを作る方法についてのよくできた記述は-
|
||||
|
||||
"The Perfect Patch"
|
||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
||||
"Linux kernel patch submission format"
|
||||
http://linux.yyz.us/patch-format.html
|
||||
|
||||
Documentation/stable_api_nonsense.txt
|
||||
このファイルはカーネルの中に不変のAPIを持たないことにした意識的な
|
||||
決断の背景にある理由について書かれています。以下のようなことを含
|
||||
んでいます-
|
||||
- サブシステムとの間に層を作ること(コンパチビリティのため?)
|
||||
- オペレーティングシステム間のドライバの移植性
|
||||
- カーネルソースツリーの素早い変更を遅らせる(もしくは素早い変更
|
||||
を妨げる)
|
||||
このドキュメントは Linux 開発の思想を理解するのに非常に重要です。
|
||||
そして、他のOSでの開発者が Linux に移る時にとても重要です。
|
||||
|
||||
Documentation/SecurityBugs
|
||||
もし Linux カーネルでセキュリティ問題を発見したように思ったら、こ
|
||||
のドキュメントのステップに従ってカーネル開発者に連絡し、問題解決を
|
||||
支援してください。
|
||||
|
||||
Documentation/ManagementStyle
|
||||
このドキュメントは Linux カーネルのメンテナー達がどう行動するか、
|
||||
彼らの手法の背景にある共有されている精神について記述しています。こ
|
||||
れはカーネル開発の初心者なら(もしくは、単に興味があるだけの人でも)
|
||||
重要です。なぜならこのドキュメントは、カーネルメンテナー達の独特な
|
||||
行動についての多くの誤解や混乱を解消するからです。
|
||||
|
||||
Documentation/stable_kernel_rules.txt
|
||||
このファイルはどのように stable カーネルのリリースが行われるかのルー
|
||||
ルが記述されています。そしてこれらのリリースの中のどこかで変更を取
|
||||
り入れてもらいたい場合に何をすればいいかが示されています。
|
||||
|
||||
Documentation/kernel-docs.txt
|
||||
カーネル開発に付随する外部ドキュメントのリストです。もしあなたが
|
||||
探しているものがカーネル内のドキュメントでみつからなかった場合、
|
||||
このリストをあたってみてください。
|
||||
|
||||
Documentation/applying-patches.txt
|
||||
パッチとはなにか、パッチをどうやって様々なカーネルの開発ブランチに
|
||||
適用するのかについて正確に記述した良い入門書です。
|
||||
|
||||
カーネルはソースコードから自動的に生成可能な多数のドキュメントを自分自
|
||||
身でもっています。これにはカーネル内 API のすべての記述や、どう正しく
|
||||
ロックをかけるかの規則が含まれます。このドキュメントは
|
||||
Documentation/DocBook/ ディレクトリに作られ、以下のように
|
||||
make pdfdocs
|
||||
make psdocs
|
||||
make htmldocs
|
||||
make mandocs
|
||||
コマンドを実行するとメインカーネルのソースディレクトリから
|
||||
それぞれ、PDF, Postscript, HTML, man page の形式で生成されます。
|
||||
|
||||
カーネル開発者になるには
|
||||
---------------------------
|
||||
|
||||
もしあなたが、Linux カーネル開発について何も知らないならば、
|
||||
KernelNewbies プロジェクトを見るべきです
|
||||
http://kernelnewbies.org
|
||||
|
||||
このサイトには役に立つメーリングリストがあり、基本的なカーネル開発に関
|
||||
するほとんどどんな種類の質問もできます (既に回答されているようなことを
|
||||
聞く前にまずはアーカイブを調べてください)。
|
||||
またここには、リアルタイムで質問を聞くことができる IRC チャネルや、Linux
|
||||
カーネルの開発に関して学ぶのに便利なたくさんの役に立つドキュメントがあ
|
||||
ります。
|
||||
|
||||
web サイトには、コードの構成、サブシステム、現在存在するプロジェクト(ツ
|
||||
リーにあるもの無いものの両方)の基本的な管理情報があります。
|
||||
ここには、また、カーネルのコンパイルのやり方やパッチの当て方などの間接
|
||||
的な基本情報も記述されています。
|
||||
|
||||
あなたがどこからスタートしてよいかわからないが、Linux カーネル開発コミュ
|
||||
ニティに参加して何かすることをさがしている場合には、Linux kernel
|
||||
Janitor's プロジェクトにいけばよいでしょう -
|
||||
http://janitor.kernelnewbies.org/
|
||||
ここはそのようなスタートをするのにうってつけの場所です。ここには、
|
||||
Linux カーネルソースツリーの中に含まれる、きれいにし、修正しなければな
|
||||
らない、単純な問題のリストが記述されています。このプロジェクトに関わる
|
||||
開発者と一緒に作業することで、あなたのパッチを Linuxカーネルツリーに入
|
||||
れるための基礎を学ぶことができ、そしてもしあなたがまだアイディアを持っ
|
||||
ていない場合には、次にやる仕事の方向性が見えてくるかもしれません。
|
||||
|
||||
もしあなたが、すでにひとまとまりコードを書いていて、カーネルツリーに入
|
||||
れたいと思っていたり、それに関する適切な支援を求めたい場合、カーネル
|
||||
メンターズプロジェクトはそのような皆さんを助けるためにできました。
|
||||
ここにはメーリングリストがあり、以下から参照できます
|
||||
http://selenic.com/mailman/listinfo/kernel-mentors
|
||||
|
||||
実際に Linux カーネルのコードについて修正を加える前に、どうやってその
|
||||
コードが動作するのかを理解することが必要です。そのためには、特別なツー
|
||||
ルの助けを借りてでも、それを直接よく読むことが最良の方法です(ほとんど
|
||||
のトリッキーな部分は十分にコメントしてありますから)。そういうツールで
|
||||
特におすすめなのは、Linux クロスリファレンスプロジェクトです。これは、
|
||||
自己参照方式で、索引がついた web 形式で、ソースコードを参照することが
|
||||
できます。この最新の素晴しいカーネルコードのリポジトリは以下で見つかり
|
||||
ます-
|
||||
http://sosdg.org/~coywolf/lxr/
|
||||
|
||||
開発プロセス
|
||||
-----------------------
|
||||
|
||||
Linux カーネルの開発プロセスは現在幾つかの異なるメインカーネル「ブラン
|
||||
チ」と多数のサブシステム毎のカーネルブランチから構成されます。
|
||||
これらのブランチとは-
|
||||
- メインの 2.6.x カーネルツリー
|
||||
- 2.6.x.y -stable カーネルツリー
|
||||
- 2.6.x -git カーネルパッチ
|
||||
- 2.6.x -mm カーネルパッチ
|
||||
- サブシステム毎のカーネルツリーとパッチ
|
||||
|
||||
2.6.x カーネルツリー
|
||||
-----------------
|
||||
|
||||
2.6.x カーネルは Linus Torvalds によってメンテナンスされ、kernel.org
|
||||
の pub/linux/kernel/v2.6/ ディレクトリに存在します。この開発プロセスは
|
||||
以下のとおり-
|
||||
|
||||
- 新しいカーネルがリリースされた直後に、2週間の特別期間が設けられ、
|
||||
この期間中に、メンテナー達は Linus に大きな差分を送ることができま
|
||||
す。このような差分は通常 -mm カーネルに数週間含まれてきたパッチで
|
||||
す。 大きな変更は git(カーネルのソース管理ツール、詳細は
|
||||
http://git.or.cz/ 参照) を使って送るのが好ましいやり方ですが、パッ
|
||||
チファイルの形式のまま送るのでも十分です。
|
||||
|
||||
- 2週間後、-rc1 カーネルがリリースされ、この後にはカーネル全体の安定
|
||||
性に影響をあたえるような新機能は含まない類のパッチしか取り込むこと
|
||||
はできません。新しいドライバ(もしくはファイルシステム)のパッチは
|
||||
-rc1 の後で受け付けられることもあることを覚えておいてください。な
|
||||
ぜなら、変更が独立していて、追加されたコードの外の領域に影響を与え
|
||||
ない限り、退行のリスクは無いからです。-rc1 がリリースされた後、
|
||||
Linus へパッチを送付するのに git を使うこともできますが、パッチは
|
||||
レビューのために、パブリックなメーリングリストへも同時に送る必要が
|
||||
あります。
|
||||
|
||||
- 新しい -rc は Linus が、最新の git ツリーがテスト目的であれば十分
|
||||
に安定した状態にあると判断したときにリリースされます。目標は毎週新
|
||||
しい -rc カーネルをリリースすることです。
|
||||
|
||||
- このプロセスはカーネルが 「準備ができた」と考えられるまで継続しま
|
||||
す。このプロセスはだいたい 6週間継続します。
|
||||
|
||||
Andrew Morton が Linux-kernel メーリングリストにカーネルリリースについ
|
||||
て書いたことをここで言っておくことは価値があります-
|
||||
「カーネルがいつリリースされるかは誰も知りません。なぜなら、これは現
|
||||
実に認識されたバグの状況によりリリースされるのであり、前もって決めら
|
||||
れた計画によってリリースされるものではないからです。」
|
||||
|
||||
2.6.x.y -stable カーネルツリー
|
||||
---------------------------
|
||||
|
||||
バージョンに4つ目の数字がついたカーネルは -stable カーネルです。これに
|
||||
は、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対する比
|
||||
較的小さい重要な修正が含まれます。
|
||||
|
||||
これは、開発/実験的バージョンのテストに協力することに興味が無く、
|
||||
最新の安定したカーネルを使いたいユーザに推奨するブランチです。
|
||||
|
||||
もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x
|
||||
が最新の安定版カーネルです。
|
||||
|
||||
2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、だ
|
||||
いたい隔週でリリースされています。
|
||||
|
||||
カーネルツリーに入っている、Documentation/stable_kernel_rules.txt ファ
|
||||
イルにはどのような種類の変更が -stable ツリーに受け入れ可能か、またリ
|
||||
リースプロセスがどう動くかが記述されています。
|
||||
|
||||
2.6.x -git パッチ
|
||||
------------------
|
||||
|
||||
git リポジトリで管理されているLinus のカーネルツリーの毎日のスナップ
|
||||
ショットがあります。(だから -git という名前がついています)。これらのパッ
|
||||
チはおおむね毎日リリースされており、Linus のツリーの現状を表します。こ
|
||||
れは -rc カーネルと比べて、パッチが大丈夫かどうかも確認しないで自動的
|
||||
に生成されるので、より実験的です。
|
||||
|
||||
2.6.x -mm カーネルパッチ
|
||||
------------------------
|
||||
|
||||
Andrew Morton によってリリースされる実験的なカーネルパッチ群です。
|
||||
Andrew は個別のサブシステムカーネルツリーとパッチを全て集めてきて
|
||||
linux-kernel メーリングリストで収集された多数のパッチと同時に一つにま
|
||||
とめます。
|
||||
このツリーは新機能とパッチが検証される場となります。ある期間の間パッチ
|
||||
が -mm に入って価値を証明されたら、Andrew やサブシステムメンテナが、メ
|
||||
インラインへ入れるように Linus にプッシュします。
|
||||
|
||||
メインカーネルツリーに含めるために Linus に送る前に、すべての新しいパッ
|
||||
チが -mm ツリーでテストされることが強く推奨されます。
|
||||
|
||||
これらのカーネルは安定して動作すべきシステムとして使うのには適切ではあ
|
||||
りませんし、カーネルブランチの中でももっとも動作にリスクが高いものです。
|
||||
|
||||
もしあなたが、カーネル開発プロセスの支援をしたいと思っているのであれば、
|
||||
どうぞこれらのカーネルリリースをテストに使ってみて、そしてもし問題があ
|
||||
れば、またもし全てが正しく動作したとしても、linux-kernel メーリングリ
|
||||
ストにフィードバックを提供してください。
|
||||
|
||||
すべての他の実験的パッチに加えて、これらのカーネルは通常リリース時点で
|
||||
メインラインの -git カーネルに含まれる全ての変更も含んでいます。
|
||||
|
||||
-mm カーネルは決まったスケジュールではリリースされません、しかし通常幾
|
||||
つかの -mm カーネル (1 から 3 が普通)が各-rc カーネルの間にリリースさ
|
||||
れます。
|
||||
|
||||
サブシステム毎のカーネルツリーとパッチ
|
||||
-------------------------------------------
|
||||
|
||||
カーネルの様々な領域で何が起きているかを見られるようにするため、多くの
|
||||
カーネルサブシステム開発者は彼らの開発ツリーを公開しています。これらの
|
||||
ツリーは説明したように -mm カーネルリリースに入れ込まれます。
|
||||
|
||||
以下はさまざまなカーネルツリーの中のいくつかのリスト-
|
||||
|
||||
git ツリー-
|
||||
- Kbuild の開発ツリー、Sam Ravnborg <sam@ravnborg.org>
|
||||
kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
|
||||
|
||||
- ACPI の開発ツリー、 Len Brown <len.brown@intel.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
|
||||
- Block の開発ツリー、Jens Axboe <axboe@suse.de>
|
||||
kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
|
||||
- DRM の開発ツリー、Dave Airlie <airlied@linux.ie>
|
||||
kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
|
||||
|
||||
- ia64 の開発ツリー、Tony Luck <tony.luck@intel.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||
|
||||
- ieee1394 の開発ツリー、Jody McIntyre <scjody@modernduck.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
|
||||
|
||||
- infiniband, Roland Dreier <rolandd@cisco.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
||||
|
||||
- libata, Jeff Garzik <jgarzik@pobox.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
||||
|
||||
- ネットワークドライバ, Jeff Garzik <jgarzik@pobox.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
|
||||
|
||||
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
||||
kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
|
||||
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||
|
||||
その他の git カーネルツリーは http://kernel.org/git に一覧表がありま
|
||||
す。
|
||||
|
||||
quilt ツリー-
|
||||
- USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
||||
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
|
||||
バグレポート
|
||||
-------------
|
||||
|
||||
bugzilla.kernel.org は Linux カーネル開発者がカーネルのバグを追跡する
|
||||
場所です。ユーザは見つけたバグの全てをこのツールで報告すべきです。
|
||||
どう kernel bugzilla を使うかの詳細は、以下を参照してください-
|
||||
http://test.kernel.org/bugzilla/faq.html
|
||||
|
||||
メインカーネルソースディレクトリにあるファイル REPORTING-BUGS はカーネ
|
||||
ルバグらしいものについてどうレポートするかの良いテンプレートであり、問
|
||||
題の追跡を助けるためにカーネル開発者にとってどんな情報が必要なのかの詳
|
||||
細が書かれています。
|
||||
|
||||
メーリングリスト
|
||||
-------------
|
||||
|
||||
上のいくつかのドキュメントで述べていますが、コアカーネル開発者の大部分
|
||||
は Linux kernel メーリングリストに参加しています。このリストの登録/脱
|
||||
退の方法については以下を参照してください-
|
||||
http://vger.kernel.org/vger-lists.html#linux-kernel
|
||||
|
||||
このメーリングリストのアーカイブは web 上の多数の場所に存在します。こ
|
||||
れらのアーカイブを探すにはサーチエンジンを使いましょう。例えば-
|
||||
http://dir.gmane.org/gmane.linux.kernel
|
||||
|
||||
リストに投稿する前にすでにその話題がアーカイブに存在するかどうかを検索
|
||||
することを是非やってください。多数の事がすでに詳細に渡って議論されて
|
||||
おり、アーカイブにのみ記録されています。
|
||||
|
||||
大部分のカーネルサブシステムも自分の個別の開発を実施するメーリングリス
|
||||
トを持っています。個々のグループがどんなリストを持っているかは、
|
||||
MAINTAINERS ファイルにリストがありますので参照してください。
|
||||
|
||||
多くのリストは kernel.org でホストされています。これらの情報は以下にあ
|
||||
ります-
|
||||
http://vger.kernel.org/vger-lists.html
|
||||
|
||||
メーリングリストを使う場合、良い行動習慣に従うようにしましょう。
|
||||
少し安っぽいが、以下の URL は上のリスト(や他のリスト)で会話する場合の
|
||||
シンプルなガイドラインを示しています-
|
||||
http://www.albion.com/netiquette/
|
||||
|
||||
もし複数の人があなたのメールに返事をした場合、CC: で受ける人のリストは
|
||||
だいぶ多くなるでしょう。良い理由がない場合、CC: リストから誰かを削除を
|
||||
しないように、また、メーリングリストのアドレスだけにリプライすることの
|
||||
ないようにしましょう。1つは送信者から、もう1つはリストからのように、メー
|
||||
ルを2回受けることになってもそれに慣れ、しゃれたメールヘッダーを追加し
|
||||
てこの状態を変えようとしないように。人々はそのようなことは好みません。
|
||||
|
||||
今までのメールでのやりとりとその間のあなたの発言はそのまま残し、
|
||||
"John Kernlehacker wrote ...:" の行をあなたのリプライの先頭行にして、
|
||||
メールの先頭でなく、各引用行の間にあなたの言いたいことを追加するべきで
|
||||
す。
|
||||
|
||||
もしパッチをメールに付ける場合は、Documentaion/SubmittingPatches に提
|
||||
示されているように、それは プレーンな可読テキストにすることを忘れない
|
||||
ようにしましょう。カーネル開発者は 添付や圧縮したパッチを扱いたがりま
|
||||
せん-
|
||||
彼らはあなたのパッチの行毎にコメントを入れたいので、そのためにはそうす
|
||||
るしかありません。あなたのメールプログラムが空白やタブを圧縮しないよう
|
||||
に確認した方がいいです。最初の良いテストとしては、自分にメールを送って
|
||||
みて、そのパッチを自分で当ててみることです。もしそれがうまく行かないな
|
||||
ら、あなたのメールプログラムを直してもらうか、正しく動くように変えるべ
|
||||
きです。
|
||||
|
||||
とりわけ、他の登録者に対する尊敬を表すようにすることを覚えておいてくだ
|
||||
さい。
|
||||
|
||||
コミュニティと共に働くこと
|
||||
--------------------------
|
||||
|
||||
カーネルコミュニティのゴールは可能なかぎり最高のカーネルを提供すること
|
||||
です。あなたがパッチを受け入れてもらうために投稿した場合、それは、技術
|
||||
的メリットだけがレビューされます。その際、あなたは何を予想すべきでしょ
|
||||
うか?
|
||||
- 批判
|
||||
- コメント
|
||||
- 変更の要求
|
||||
- パッチの正当性の証明要求
|
||||
- 沈黙
|
||||
|
||||
思い出してください、ここはあなたのパッチをカーネルに入れる話です。あ
|
||||
なたは、あなたのパッチに対する批判とコメントを受け入れるべきで、それら
|
||||
を技術的レベルで評価して、パッチを再作成するか、なぜそれらの変更をすべ
|
||||
きでないかを明確で簡潔な理由の説明を提供してください。
|
||||
もし、あなたのパッチに何も反応がない場合、たまにはメールの山に埋もれて
|
||||
見逃され、あなたの投稿が忘れられてしまうこともあるので、数日待って再度
|
||||
投稿してください。
|
||||
|
||||
あなたがやるべきでないものは?
|
||||
- 質問なしにあなたのパッチが受け入れられると想像すること
|
||||
- 守りに入ること
|
||||
- コメントを無視すること
|
||||
- 要求された変更を何もしないでパッチを出し直すこと
|
||||
|
||||
可能な限り最高の技術的解決を求めているコミュニティでは、パッチがどのく
|
||||
らい有益なのかについては常に異なる意見があります。あなたは協調的である
|
||||
べきですし、また、あなたのアイディアをカーネルに対してうまく合わせるよ
|
||||
うにすることが望まれています。もしくは、最低限あなたのアイディアがそれ
|
||||
だけの価値があるとすすんで証明するようにしなければなりません。
|
||||
正しい解決に向かって進もうという意志がある限り、間違うことがあっても許
|
||||
容されることを忘れないでください。
|
||||
|
||||
あなたの最初のパッチに単に 1ダースもの修正を求めるリストの返答になるこ
|
||||
とも普通のことです。これはあなたのパッチが受け入れられないということで
|
||||
は *ありません*、そしてあなた自身に反対することを意味するのでも *ありま
|
||||
せん*。単に自分のパッチに対して指摘された問題を全て修正して再送すれば
|
||||
いいのです。
|
||||
|
||||
カーネルコミュニティと企業組織のちがい
|
||||
-----------------------------------------------------------------
|
||||
|
||||
カーネルコミュニティは大部分の伝統的な会社の開発環境とは異ったやり方で
|
||||
動いています。以下は問題を避けるためにできるとよいことののリストです-
|
||||
|
||||
あなたの提案する変更について言うときのうまい言い方:
|
||||
|
||||
- "これは複数の問題を解決します"
|
||||
- "これは2000行のコードを削除します"
|
||||
- "以下のパッチは、私が言おうとしていることを説明するものです"
|
||||
- "私はこれを5つの異なるアーキテクチャでテストしたのですが..."
|
||||
- "以下は一連の小さなパッチ群ですが..."
|
||||
- "これは典型的なマシンでの性能を向上させます.."
|
||||
|
||||
やめた方がいい悪い言い方:
|
||||
|
||||
- このやり方で AIX/ptx/Solaris ではできたので、できるはずだ
|
||||
- 私はこれを20年もの間やってきた、だから
|
||||
- これは、私の会社が金儲けをするために必要だ
|
||||
- これは我々のエンタープライズ向け商品ラインのためである
|
||||
- これは 私が自分のアイディアを記述した、1000ページの設計資料である
|
||||
- 私はこれについて、6ケ月作業している。
|
||||
- 以下は ... に関する5000行のパッチです
|
||||
- 私は現在のぐちゃぐちゃを全部書き直した、それが以下です...
|
||||
- 私は〆切がある、そのためこのパッチは今すぐ適用される必要がある
|
||||
|
||||
カーネルコミュニティが大部分の伝統的なソフトウェアエンジニアリングの労
|
||||
働環境と異なるもう一つの点は、やりとりに顔を合わせないということです。
|
||||
email と irc を第一のコミュニケーションの形とする一つの利点は、性別や
|
||||
民族の差別がないことです。Linux カーネルの職場環境は女性や少数民族を受
|
||||
容します。なぜなら、email アドレスによってのみあなたが認識されるからで
|
||||
す。
|
||||
国際的な側面からも活動領域を均等にするようにします。なぜならば、あなた
|
||||
は人の名前で性別を想像できないからです。ある男性が アンドレアという名
|
||||
前で、女性の名前は パット かもしれません (訳注 Andrea は米国では女性、
|
||||
それ以外(欧州など)では男性名として使われることが多い。同様に、Pat は
|
||||
Patricia (主に女性名)や Patrick (主に男性名)の略称)。
|
||||
Linux カーネルの活動をして、意見を表明したことがある大部分の女性は、前
|
||||
向きな経験をもっています。
|
||||
|
||||
言葉の壁は英語が得意でない一部の人には問題になります。
|
||||
メーリングリストの中できちんとアイディアを交換するには、相当うまく英語
|
||||
を操れる必要があることもあります。そのため、あなたは自分のメール
|
||||
を送る前に英語で意味が通じているかをチェックすることをお薦めします。
|
||||
|
||||
変更を分割する
|
||||
---------------------
|
||||
|
||||
Linux カーネルコミュニティは、一度に大量のコードの塊を喜んで受容するこ
|
||||
とはありません。変更は正確に説明される必要があり、議論され、小さい、個
|
||||
別の部分に分割する必要があります。これはこれまで多くの会社がやり慣れて
|
||||
きたことと全く正反対のことです。あなたのプロポーザルは、開発プロセスのと
|
||||
ても早い段階から紹介されるべきです。そうすれば あなたは自分のやってい
|
||||
ることにフィードバックを得られます。これは、コミュニティからみれば、あ
|
||||
なたが彼らと一緒にやっているように感じられ、単にあなたの提案する機能の
|
||||
ゴミ捨て場として使っているのではない、と感じられるでしょう。
|
||||
しかし、一度に 50 もの email をメーリングリストに送りつけるようなことは
|
||||
やってはいけません、あなたのパッチ群はいつもどんな時でもそれよりは小さ
|
||||
くなければなりません。
|
||||
|
||||
パッチを分割する理由は以下です-
|
||||
|
||||
1) 小さいパッチはあなたのパッチが適用される見込みを大きくします、カー
|
||||
ネルの人達はパッチが正しいかどうかを確認する時間や労力をかけないか
|
||||
らです。5行のパッチはメンテナがたった1秒見るだけで適用できます。し
|
||||
かし、500行のパッチは、正しいことをレビューするのに数時間かかるかも
|
||||
しれません(時間はパッチのサイズなどにより指数関数に比例してかかりま
|
||||
す)
|
||||
小さいパッチは何かあったときにデバッグもとても簡単になります。パッ
|
||||
チを1個1個取り除くのは、とても大きなパッチを当てた後に(かつ、何かお
|
||||
かしくなった後で)解剖するのに比べればとても簡単です。
|
||||
|
||||
2) 小さいパッチを送るだけでなく、送るまえに、書き直して、シンプルにす
|
||||
る(もしくは、単に順番を変えるだけでも)ことも、とても重要です。
|
||||
|
||||
以下はカーネル開発者の Al Viro のたとえ話しです:
|
||||
|
||||
"生徒の数学の宿題を採点する先生のことを考えてみてください、先
|
||||
生は生徒が解に到達するまでの試行錯誤をみたいとは思わないでしょ
|
||||
う。先生は簡潔な最高の解をみたいのです。良い生徒はこれを知って
|
||||
おり、そして最終解の前の中間作業を提出することは決してないので
|
||||
す"
|
||||
カーネル開発でもこれは同じです。メンテナー達とレビューア達は、
|
||||
問題を解決する解の背後になる思考プロセスをみたいとは思いません。
|
||||
彼らは単純であざやかな解決方法をみたいのです。
|
||||
|
||||
あざやかな解を説明するのと、コミュニティと共に仕事をし、未解決の仕事を
|
||||
議論することのバランスをキープするのは難しいかもしれません。
|
||||
ですから、開発プロセスの早期段階で改善のためのフィードバックをもらうよ
|
||||
うにするのもいいですが、変更点を小さい部分に分割して全体ではまだ完成し
|
||||
ていない仕事を(部分的に)取り込んでもらえるようにすることもいいことです。
|
||||
|
||||
また、でき上がっていないものや、"将来直す" ようなパッチを、本流に含め
|
||||
てもらうように送っても、それは受け付けられないことを理解してください。
|
||||
|
||||
あなたの変更を正当化する
|
||||
-------------------
|
||||
|
||||
あなたのパッチを分割するのと同時に、なぜその変更を追加しなければならな
|
||||
いかを Linux コミュニティに知らせることはとても重要です。新機能は必要
|
||||
性と有用性で正当化されなければなりません。
|
||||
|
||||
あなたの変更の説明
|
||||
--------------------
|
||||
|
||||
あなたのパッチを送付する場合には、メールの中のテキストで何を言うかにつ
|
||||
いて、特別に注意を払ってください。この情報はパッチの ChangeLog に使わ
|
||||
れ、いつも皆がみられるように保管されます。これは次のような項目を含め、
|
||||
パッチを完全に記述するべきです-
|
||||
|
||||
- なぜ変更が必要か
|
||||
- パッチ全体の設計アプローチ
|
||||
- 実装の詳細
|
||||
- テスト結果
|
||||
|
||||
これについて全てがどのようにあるべきかについての詳細は、以下のドキュメ
|
||||
ントの ChangeLog セクションをみてください-
|
||||
"The Perfect Patch"
|
||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
||||
|
||||
これらのどれもが、時にはとても困難です。これらの慣例を完璧に実施するに
|
||||
は数年かかるかもしれません。これは継続的な改善のプロセスであり、そのた
|
||||
めには多数の忍耐と決意を必要とするものです。でも、諦めないで、これは可
|
||||
能なことです。多数の人がすでにできていますし、彼らも皆最初はあなたと同
|
||||
じところからスタートしたのですから。
|
||||
|
||||
Paolo Ciarrocchi に感謝、彼は彼の書いた "Development Process"
|
||||
(http://linux.tar.bz/articles/2.6-development_process)セクショ
|
||||
ンをこのテキストの原型にすることを許可してくれました。
|
||||
Rundy Dunlap と Gerrit Huizenga はメーリングリストでやるべきこととやっ
|
||||
てはいけないことのリストを提供してくれました。
|
||||
以下の人々のレビュー、コメント、貢献に感謝。
|
||||
Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers,
|
||||
Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi
|
||||
Kleen, Vadim Lobanov, Jesper Juhl, Adrian Bunk, Keri Harris, Frans Pop,
|
||||
David A. Wheeler, Junio Hamano, Michael Kerrisk, と Alex Shepard
|
||||
彼らの支援なしでは、このドキュメントはできなかったでしょう。
|
||||
|
||||
Maintainer: Greg Kroah-Hartman <greg@kroah.com>
|
263
Documentation/ja_JP/stable_api_nonsense.txt
Normal file
263
Documentation/ja_JP/stable_api_nonsense.txt
Normal file
@ -0,0 +1,263 @@
|
||||
NOTE:
|
||||
This is a Japanese translated version of
|
||||
"Documentation/stable_api_nonsense.txt".
|
||||
This one is maintained by
|
||||
IKEDA, Munehiro <m-ikeda@ds.jp.nec.com>
|
||||
and JF Project team <http://www.linux.or.jp/JF/>.
|
||||
If you find difference with original file or problem in translation,
|
||||
please contact the maintainer of this file or JF project.
|
||||
|
||||
Please also note that purpose of this file is easier to read for non
|
||||
English natives and not to be intended to fork. So, if you have any
|
||||
comments or updates of this file, please try to update
|
||||
Original(English) file at first.
|
||||
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.22-rc4/Documentation/stable_api_nonsense.txt の和訳
|
||||
です。
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日 : 2007/06/11
|
||||
原著作者: Greg Kroah-Hartman < greg at kroah dot com >
|
||||
翻訳者 : 池田 宗広 < m-ikeda at ds dot jp dot nec dot com >
|
||||
校正者 : Masanori Kobayashi さん < zap03216 at nifty dot ne dot jp >
|
||||
Seiji Kaneko さん < skaneko at a2 dot mbn dot or dot jp >
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
Linux カーネルのドライバインターフェース
|
||||
(あなたの質問すべてに対する回答とその他諸々)
|
||||
|
||||
Greg Kroah-Hartman <greg at kroah dot com>
|
||||
|
||||
|
||||
この文書は、なぜ Linux ではバイナリカーネルインターフェースが定義
|
||||
されていないのか、またはなぜ不変のカーネルインターフェースを持たな
|
||||
いのか、ということを説明するために書かれた。ここでの話題は「カーネ
|
||||
ル内部の」インターフェースについてであり、ユーザー空間とのインター
|
||||
フェースではないことを理解してほしい。カーネルとユーザー空間とのイ
|
||||
ンターフェースとはアプリケーションプログラムが使用するものであり、
|
||||
つまりシステムコールのインターフェースがこれに当たる。これは今まで
|
||||
長きに渡り、かつ今後も「まさしく」不変である。私は確か 0.9 か何か
|
||||
より前のカーネルを使ってビルドした古いプログラムを持っているが、そ
|
||||
れは最新の 2.6 カーネルでもきちんと動作する。ユーザー空間とのイン
|
||||
ターフェースは、ユーザーとアプリケーションプログラマが不変性を信頼
|
||||
してよいものの一つである。
|
||||
|
||||
|
||||
要旨
|
||||
----
|
||||
|
||||
あなたは不変のカーネルインターフェースが必要だと考えているかもしれ
|
||||
ないが、実際のところはそうではない。あなたは必要としているものが分
|
||||
かっていない。あなたが必要としているものは安定して動作するドライバ
|
||||
であり、それはドライバがメインのカーネルツリーに含まれる場合のみ得
|
||||
ることができる。ドライバがメインのカーネルツリーに含まれていると、
|
||||
他にも多くの良いことがある。それは、Linux をより強固で、安定な、成
|
||||
熟したオペレーティングシステムにすることができるということだ。これ
|
||||
こそ、そもそもあなたが Linux を使う理由のはずだ。
|
||||
|
||||
|
||||
はじめに
|
||||
--------
|
||||
|
||||
カーネル内部のインターフェース変更を心配しなければならないドライバ
|
||||
を書きたいなどというのは、変わり者だけだ。この世界のほとんどの人は、
|
||||
そのようなドライバがどんなインターフェースを使っているかなど知らな
|
||||
いし、そんなドライバのことなど全く気にもかけていない。
|
||||
|
||||
|
||||
まず初めに、クローズソースとか、ソースコードの隠蔽とか、バイナリの
|
||||
みが配布される使い物にならない代物[訳注(1)]とか、実体はバイナリ
|
||||
コードでそれを読み込むためのラッパー部分のみソースコードが公開され
|
||||
ているとか、その他用語は何であれ GPL の下にソースコードがリリース
|
||||
されていないカーネルドライバに関する法的な問題について、私は「いか
|
||||
なる議論も」行うつもりがない。法的な疑問があるのならば、プログラマ
|
||||
である私ではなく、弁護士に相談して欲しい。ここでは単に、技術的な問
|
||||
題について述べることにする。(法的な問題を軽視しているわけではない。
|
||||
それらは実際に存在するし、あなたはそれをいつも気にかけておく必要が
|
||||
ある)
|
||||
|
||||
訳注(1)
|
||||
「使い物にならない代物」の原文は "blob"
|
||||
|
||||
|
||||
さてここでは、バイナリカーネルインターフェースについてと、ソースレ
|
||||
ベルでのインターフェースの不変性について、という二つの話題を取り上
|
||||
げる。この二つは互いに依存する関係にあるが、まずはバイナリインター
|
||||
フェースについて議論を行いやっつけてしまおう。
|
||||
|
||||
|
||||
バイナリカーネルインターフェース
|
||||
--------------------------------
|
||||
|
||||
もしソースレベルでのインターフェースが不変ならば、バイナリインター
|
||||
フェースも当然のように不変である、というのは正しいだろうか?正しく
|
||||
ない。Linux カーネルに関する以下の事実を考えてみてほしい。
|
||||
- あなたが使用するCコンパイラのバージョンによって、カーネル内部
|
||||
の構造体の配置構造は異なったものになる。また、関数は異なった方
|
||||
法でカーネルに含まれることになるかもしれない(例えばインライン
|
||||
関数として扱われたり、扱われなかったりする)。個々の関数がどの
|
||||
ようにコンパイルされるかはそれほど重要ではないが、構造体のパデ
|
||||
ィングが異なるというのは非常に重要である。
|
||||
- あなたがカーネルのビルドオプションをどのように設定するかによっ
|
||||
て、カーネルには広い範囲で異なった事態が起こり得る。
|
||||
- データ構造は異なるデータフィールドを持つかもしれない
|
||||
- いくつかの関数は全く実装されていない状態になり得る
|
||||
(例:SMP向けではないビルドでは、いくつかのロックは中身が
|
||||
カラにコンパイルされる)
|
||||
- カーネル内のメモリは、異なった方法で配置され得る。これはビ
|
||||
ルドオプションに依存している。
|
||||
- Linux は様々な異なるプロセッサアーキテクチャ上で動作する。
|
||||
あるアーキテクチャ用のバイナリドライバを、他のアーキテクチャで
|
||||
正常に動作させる方法はない。
|
||||
|
||||
|
||||
ある特定のカーネル設定を使用し、カーネルをビルドしたのと正確に同じ
|
||||
Cコンパイラを使用して単にカーネルモジュールをコンパイルするだけで
|
||||
も、あなたはこれらいくつもの問題に直面することになる。ある特定の
|
||||
Linux ディストリビューションの、ある特定のリリースバージョン用にモ
|
||||
ジュールを提供しようと思っただけでも、これらの問題を引き起こすには
|
||||
十分である。にも関わらず Linux ディストリビューションの数と、サ
|
||||
ポートするディストリビューションのリリース数を掛け算し、それら一つ
|
||||
一つについてビルドを行ったとしたら、今度はリリースごとのビルドオプ
|
||||
ションの違いという悪夢にすぐさま悩まされることになる。また、ディス
|
||||
トリビューションの各リリースバージョンには、異なるハードウェア(プ
|
||||
ロセッサタイプや種々のオプション)に対応するため、何種類かのカーネ
|
||||
ルが含まれているということも理解して欲しい。従って、ある一つのリ
|
||||
リースバージョンだけのためにモジュールを作成する場合でも、あなたは
|
||||
何バージョンものモジュールを用意しなければならない。
|
||||
|
||||
|
||||
信じて欲しい。このような方法でサポートを続けようとするなら、あなた
|
||||
はいずれ正気を失うだろう。遠い昔、私はそれがいかに困難なことか、身
|
||||
をもって学んだのだ・・・
|
||||
|
||||
|
||||
不変のカーネルソースレベルインターフェース
|
||||
------------------------------------------
|
||||
|
||||
メインカーネルツリーに含まれていない Linux カーネルドライバを継続
|
||||
してサポートしていこうとしている人たちとの議論においては、これは極
|
||||
めて「引火性の高い」話題である。[訳注(2)]
|
||||
|
||||
訳注(2)
|
||||
「引火性の高い」の原文は "volatile"。
|
||||
volatile には「揮発性の」「爆発しやすい」という意味の他、「変わり
|
||||
やすい」「移り気な」という意味がある。
|
||||
「(この話題は)爆発的に激しい論争を巻き起こしかねない」ということ
|
||||
を、「(カーネルのソースレベルインターフェースは)移ろい行くもので
|
||||
ある」ということを連想させる "volatile" という単語で表現している。
|
||||
|
||||
|
||||
Linux カーネルの開発は継続的に速いペースで行われ、決して歩みを緩め
|
||||
ることがない。その中でカーネル開発者達は、現状のインターフェースに
|
||||
あるバグを見つけ、より良い方法を考え出す。彼らはやがて、現状のイン
|
||||
ターフェースがより正しく動作するように修正を行う。その過程で関数の
|
||||
名前は変更されるかもしれず、構造体は大きく、または小さくなるかもし
|
||||
れず、関数の引数は検討しなおされるかもしれない。そのような場合、引
|
||||
き続き全てが正常に動作するよう、カーネル内でこれらのインターフェー
|
||||
スを使用している個所も全て同時に修正される。
|
||||
|
||||
|
||||
具体的な例として、カーネル内の USB インターフェースを挙げる。USB
|
||||
サブシステムはこれまでに少なくとも3回の書き直しが行われ、その結果
|
||||
インターフェースが変更された。これらの書き直しはいくつかの異なった
|
||||
問題を修正するために行われた。
|
||||
- 同期的データストリームが非同期に変更された。これにより多数のド
|
||||
ライバを単純化でき、全てのドライバのスループットが向上した。今
|
||||
やほとんど全ての USB デバイスは、考えられる最高の速度で動作し
|
||||
ている。
|
||||
- USB ドライバが USB サブシステムのコアから行う、データパケット
|
||||
用のメモリ確保方法が変更された。これに伴い、いくつもの文書化さ
|
||||
れたデッドロック条件を回避するため、全ての USB ドライバはより
|
||||
多くの情報を USB コアに提供しなければならないようになっている。
|
||||
|
||||
|
||||
このできごとは、数多く存在するクローズソースのオペレーティングシス
|
||||
テムとは全く対照的だ。それらは長期に渡り古い USB インターフェース
|
||||
をメンテナンスしなければならない。古いインターフェースが残ることで、
|
||||
新たな開発者が偶然古いインターフェースを使い、正しくない方法で開発
|
||||
を行ってしまう可能性が生じる。これによりシステムの安定性は危険にさ
|
||||
らされることになる。
|
||||
|
||||
|
||||
上に挙げたどちらの例においても、開発者達はその変更が重要かつ必要で
|
||||
あることに合意し、比較的楽にそれを実行した。もし Linux がソースレ
|
||||
ベルでインターフェースの不変性を保証しなければならないとしたら、新
|
||||
しいインターフェースを作ると同時に、古い、問題のある方を今後ともメ
|
||||
ンテナンスするという余計な仕事を USB の開発者にさせなければならな
|
||||
い。Linux の USB 開発者は、自分の時間を使って仕事をしている。よっ
|
||||
て、価値のない余計な仕事を報酬もなしに実行しろと言うことはできない。
|
||||
|
||||
|
||||
セキュリティ問題も、Linux にとっては非常に重要である。ひとたびセキ
|
||||
ュリティに関する問題が発見されれば、それは極めて短期間のうちに修正
|
||||
される。セキュリティ問題の発生を防ぐための修正は、カーネルの内部イ
|
||||
ンターフェースの変更を何度も引き起こしてきた。その際同時に、変更さ
|
||||
れたインターフェースを使用する全てのドライバもまた変更された。これ
|
||||
により問題が解消し、将来偶然に問題が再発してしまわないことが保証さ
|
||||
れる。もし内部インターフェースの変更が許されないとしたら、このよう
|
||||
にセキュリティ問題を修正し、将来再発しないことを保証することなど不
|
||||
可能なのだ。
|
||||
|
||||
|
||||
カーネルのインターフェースは時が経つにつれクリーンナップを受ける。
|
||||
誰も使っていないインターフェースは削除される。これにより、可能な限
|
||||
りカーネルが小さく保たれ、現役の全てのインターフェースが可能な限り
|
||||
テストされることを保証しているのだ。(使われていないインターフェー
|
||||
スの妥当性をテストすることは不可能と言っていいだろう)
|
||||
|
||||
|
||||
|
||||
これから何をすべきか
|
||||
-----------------------
|
||||
|
||||
では、もしメインのカーネルツリーに含まれない Linux カーネルドライ
|
||||
バがあったとして、あなたは、つまり開発者は何をするべきだろうか?全
|
||||
てのディストリビューションの全てのカーネルバージョン向けにバイナリ
|
||||
のドライバを供給することは悪夢であり、カーネルインターフェースの変
|
||||
更を追いかけ続けることもまた過酷な仕事だ。
|
||||
|
||||
|
||||
答えは簡単。そのドライバをメインのカーネルツリーに入れてしまえばよ
|
||||
い。(ここで言及しているのは、GPL に従って公開されるドライバのこと
|
||||
だということに注意してほしい。あなたのコードがそれに該当しないなら
|
||||
ば、さよなら。幸運を祈ります。ご自分で何とかしてください。Andrew
|
||||
と Linus からのコメント<Andrew と Linus のコメントへのリンクをこ
|
||||
こに置く>をどうぞ)ドライバがメインツリーに入れば、カーネルのイン
|
||||
ターフェースが変更された場合、変更を行った開発者によってドライバも
|
||||
修正されることになるだろう。あなたはほとんど労力を払うことなしに、
|
||||
常にビルド可能できちんと動作するドライバを手に入れることができる。
|
||||
|
||||
|
||||
ドライバをメインのカーネルツリーに入れると、非常に好ましい以下の効
|
||||
果がある。
|
||||
- ドライバの品質が向上する一方で、(元の開発者にとっての)メンテ
|
||||
ナンスコストは下がる。
|
||||
- あなたのドライバに他の開発者が機能を追加してくれる。
|
||||
- 誰かがあなたのドライバにあるバグを見つけ、修正してくれる。
|
||||
- 誰かがあなたのドライバにある改善点を見つけてくれる。
|
||||
- 外部インターフェースが変更されドライバの更新が必要になった場合、
|
||||
誰かがあなたの代わりに更新してくれる。
|
||||
- ドライバを入れてくれとディストロに頼まなくても、そのドライバは
|
||||
全ての Linux ディストリビューションに自動的に含まれてリリース
|
||||
される。
|
||||
|
||||
|
||||
Linux では、他のどのオペレーティングシステムよりも数多くのデバイス
|
||||
が「そのまま」使用できるようになった。また Linux は、どのオペレー
|
||||
ティングシステムよりも数多くのプロセッサアーキテクチャ上でそれらの
|
||||
デバイスを使用することができるようにもなった。このように、Linux の
|
||||
開発モデルは実証されており、今後も間違いなく正しい方向へと進んでい
|
||||
くだろう。:)
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
この文書の初期の草稿に対し、Randy Dunlap, Andrew Morton, David
|
||||
Brownell, Hanna Linder, Robert Love, Nishanth Aravamudan から査読
|
||||
と助言を頂きました。感謝申し上げます。
|
||||
|
@ -501,6 +501,20 @@ more details, with real examples.
|
||||
The third parameter may be a text as in this example, but it may also
|
||||
be an expanded variable or a macro.
|
||||
|
||||
cc-fullversion
|
||||
cc-fullversion is useful when the exact version of gcc is needed.
|
||||
One typical use-case is when a specific GCC version is broken.
|
||||
cc-fullversion points out a more specific version than cc-version does.
|
||||
|
||||
Example:
|
||||
#arch/powerpc/Makefile
|
||||
$(Q)if test "$(call cc-fullversion)" = "040200" ; then \
|
||||
echo -n '*** GCC-4.2.0 cannot compile the 64-bit powerpc ' ; \
|
||||
false ; \
|
||||
fi
|
||||
|
||||
In this example for a specific GCC version the build will error out explaining
|
||||
to the user why it stops.
|
||||
|
||||
=== 4 Host Program support
|
||||
|
||||
|
@ -34,7 +34,6 @@ parameter is applicable:
|
||||
APIC APIC support is enabled.
|
||||
APM Advanced Power Management support is enabled.
|
||||
AX25 Appropriate AX.25 support is enabled.
|
||||
CD Appropriate CD support is enabled.
|
||||
DRM Direct Rendering Management support is enabled.
|
||||
EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
|
||||
EFI EFI Partitioning (GPT) is enabled
|
||||
@ -238,16 +237,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Disable PIN 1 of APIC timer
|
||||
Can be useful to work around chipset bugs.
|
||||
|
||||
ad1816= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>
|
||||
See also Documentation/sound/oss/AD1816.
|
||||
|
||||
ad1848= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>,<type>
|
||||
|
||||
adlib= [HW,OSS]
|
||||
Format: <io>
|
||||
|
||||
advansys= [HW,SCSI]
|
||||
See header of drivers/scsi/advansys.c.
|
||||
|
||||
@ -326,9 +318,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
autotest [IA64]
|
||||
|
||||
aztcd= [HW,CD] Aztech CD268 CDROM driver
|
||||
Format: <io>,0x79 (?)
|
||||
|
||||
baycom_epp= [HW,AX25]
|
||||
Format: <io>,<mode>
|
||||
|
||||
@ -371,10 +360,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
possible to determine what the correct size should be.
|
||||
This option provides an override for these situations.
|
||||
|
||||
cdu31a= [HW,CD]
|
||||
Format: <io>,<irq>[,PAS]
|
||||
See header of drivers/cdrom/cdu31a.c.
|
||||
|
||||
chandev= [HW,NET] Generic channel device initialisation
|
||||
|
||||
checkreqprot [SELINUX] Set initial checkreqprot flag value.
|
||||
@ -428,9 +413,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
hpet= [IA-32,HPET] option to disable HPET and use PIT.
|
||||
Format: disable
|
||||
|
||||
cm206= [HW,CD]
|
||||
Format: { auto | [<io>,][<irq>] }
|
||||
|
||||
com20020= [HW,NET] ARCnet - COM20020 chipset
|
||||
Format:
|
||||
<io>[,<irq>[,<nodeID>[,<backplane>[,<ckp>[,<timeout>]]]]]
|
||||
@ -462,13 +444,20 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Documentation/networking/netconsole.txt for an
|
||||
alternative.
|
||||
|
||||
uart,io,<addr>[,options]
|
||||
uart,mmio,<addr>[,options]
|
||||
uart[8250],io,<addr>[,options]
|
||||
uart[8250],mmio,<addr>[,options]
|
||||
Start an early, polled-mode console on the 8250/16550
|
||||
UART at the specified I/O port or MMIO address,
|
||||
switching to the matching ttyS device later. The
|
||||
options are the same as for ttyS, above.
|
||||
|
||||
earlycon= [KNL] Output early console device and options.
|
||||
uart[8250],io,<addr>[,options]
|
||||
uart[8250],mmio,<addr>[,options]
|
||||
Start an early, polled-mode console on the 8250/16550
|
||||
UART at the specified I/O port or MMIO address.
|
||||
The options are the same as for ttyS, above.
|
||||
|
||||
cpcihp_generic= [HW,PCI] Generic port I/O CompactPCI driver
|
||||
Format:
|
||||
<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
|
||||
@ -660,9 +649,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
gpt [EFI] Forces disk with valid GPT signature but
|
||||
invalid Protective MBR to be treated as GPT.
|
||||
|
||||
gscd= [HW,CD]
|
||||
Format: <io>
|
||||
|
||||
gvp11= [HW,SCSI]
|
||||
|
||||
hashdist= [KNL,NUMA] Large hashes allocated during boot
|
||||
@ -826,14 +812,37 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
tasks in the system -- can cause problems and
|
||||
suboptimal load balancer performance.
|
||||
|
||||
isp16= [HW,CD]
|
||||
Format: <io>,<irq>,<dma>,<setup>
|
||||
|
||||
iucv= [HW,NET]
|
||||
|
||||
js= [HW,JOY] Analog joystick
|
||||
See Documentation/input/joystick.txt.
|
||||
|
||||
kernelcore=nn[KMG] [KNL,IA-32,IA-64,PPC,X86-64] This parameter
|
||||
specifies the amount of memory usable by the kernel
|
||||
for non-movable allocations. The requested amount is
|
||||
spread evenly throughout all nodes in the system. The
|
||||
remaining memory in each node is used for Movable
|
||||
pages. In the event, a node is too small to have both
|
||||
kernelcore and Movable pages, kernelcore pages will
|
||||
take priority and other nodes will have a larger number
|
||||
of kernelcore pages. The Movable zone is used for the
|
||||
allocation of pages that may be reclaimed or moved
|
||||
by the page migration subsystem. This means that
|
||||
HugeTLB pages may not be allocated from this zone.
|
||||
Note that allocations like PTEs-from-HighMem still
|
||||
use the HighMem zone if it exists, and the Normal
|
||||
zone if it does not.
|
||||
|
||||
movablecore=nn[KMG] [KNL,IA-32,IA-64,PPC,X86-64] This parameter
|
||||
is similar to kernelcore except it specifies the
|
||||
amount of memory used for migratable allocations.
|
||||
If both kernelcore and movablecore is specified,
|
||||
then kernelcore will be at *least* the specified
|
||||
value but may be more. If movablecore on its own
|
||||
is specified, the administrator must be careful
|
||||
that the amount of memory usable for all allocations
|
||||
is not too small.
|
||||
|
||||
keepinitrd [HW,ARM]
|
||||
|
||||
kstack=N [IA-32,X86-64] Print N words from the kernel stack
|
||||
@ -967,11 +976,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
mcatest= [IA-64]
|
||||
|
||||
mcd= [HW,CD]
|
||||
Format: <port>,<irq>,<mitsumi_bug_93_wait>
|
||||
|
||||
mcdx= [HW,CD]
|
||||
|
||||
mce [IA-32] Machine Check Exception
|
||||
|
||||
md= [HW] RAID subsystems devices and level
|
||||
@ -1150,6 +1154,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
nointroute [IA-64]
|
||||
|
||||
nojitter [IA64] Disables jitter checking for ITC timers.
|
||||
|
||||
nolapic [IA-32,APIC] Do not enable or use the local APIC.
|
||||
|
||||
nolapic_timer [IA-32,APIC] Do not use the local APIC timer.
|
||||
@ -1181,6 +1187,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
nosmp [SMP] Tells an SMP kernel to act as a UP kernel.
|
||||
|
||||
nosoftlockup [KNL] Disable the soft-lockup detector.
|
||||
|
||||
nosync [HW,M68K] Disables sync negotiation for all devices.
|
||||
|
||||
notsc [BUGS=IA-32] Disable Time Stamp Counter
|
||||
@ -1189,20 +1197,19 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
nowb [ARM]
|
||||
|
||||
numa_zonelist_order= [KNL, BOOT] Select zonelist order for NUMA.
|
||||
one of ['zone', 'node', 'default'] can be specified
|
||||
This can be set from sysctl after boot.
|
||||
See Documentation/sysctl/vm.txt for details.
|
||||
|
||||
nr_uarts= [SERIAL] maximum number of UARTs to be registered.
|
||||
|
||||
opl3= [HW,OSS]
|
||||
Format: <io>
|
||||
|
||||
opl3sa2= [HW,OSS] Format:
|
||||
<io>,<irq>,<dma>,<dma2>,<mss_io>,<mpu_io>,<ymode>,<loopback>[,<isapnp>,<multiple]
|
||||
|
||||
oprofile.timer= [HW]
|
||||
Use timer interrupt instead of performance counters
|
||||
|
||||
optcd= [HW,CD]
|
||||
Format: <io>
|
||||
|
||||
osst= [HW,SCSI] SCSI Tape Driver
|
||||
Format: <buffer_size>,<write_threshold>
|
||||
See also Documentation/scsi/st.txt.
|
||||
@ -1381,6 +1388,15 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
autoconfiguration.
|
||||
Ranges are in pairs (memory base and size).
|
||||
|
||||
print-fatal-signals=
|
||||
[KNL] debug: print fatal signals
|
||||
print-fatal-signals=1: print segfault info to
|
||||
the kernel console.
|
||||
default: off.
|
||||
|
||||
printk.time= Show timing data prefixed to each printk message line
|
||||
Format: <bool> (1/Y/y=enable, 0/N/n=disable)
|
||||
|
||||
profile= [KNL] Enable kernel profiling via /proc/profile
|
||||
Format: [schedule,]<number>
|
||||
Param: "schedule" - profile schedule points.
|
||||
@ -1493,6 +1509,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
rootfstype= [KNL] Set root filesystem type
|
||||
|
||||
rootwait [KNL] Wait (indefinitely) for root device to show up.
|
||||
Useful for devices that are detected asynchronously
|
||||
(e.g. USB and MMC devices).
|
||||
|
||||
rw [KNL] Mount root device read-write on boot
|
||||
|
||||
S [KNL] Run init in single mode
|
||||
@ -1505,11 +1525,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
sbni= [NET] Granch SBNI12 leased line adapter
|
||||
|
||||
sbpcd= [HW,CD] Soundblaster CD adapter
|
||||
Format: <io>,<type>
|
||||
See a comment before function sbpcd_setup() in
|
||||
drivers/cdrom/sbpcd.c.
|
||||
|
||||
sc1200wdt= [HW,WDT] SC1200 WDT (watchdog) driver
|
||||
Format: <io>[,<timeout>[,<isapnp>]]
|
||||
|
||||
@ -1562,41 +1577,41 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
simeth= [IA-64]
|
||||
simscsi=
|
||||
|
||||
sjcd= [HW,CD]
|
||||
Format: <io>,<irq>,<dma>
|
||||
See header of drivers/cdrom/sjcd.c.
|
||||
|
||||
slram= [HW,MTD]
|
||||
|
||||
slub_debug [MM, SLUB]
|
||||
Enabling slub_debug allows one to determine the culprit
|
||||
if slab objects become corrupted. Enabling slub_debug
|
||||
creates guard zones around objects and poisons objects
|
||||
when not in use. Also tracks the last alloc / free.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
slub_debug[=options[,slabs]] [MM, SLUB]
|
||||
Enabling slub_debug allows one to determine the
|
||||
culprit if slab objects become corrupted. Enabling
|
||||
slub_debug can create guard zones around objects and
|
||||
may poison objects when not in use. Also tracks the
|
||||
last alloc / free. For more information see
|
||||
Documentation/vm/slub.txt.
|
||||
|
||||
slub_max_order= [MM, SLUB]
|
||||
Determines the maximum allowed order for slabs. Setting
|
||||
this too high may cause fragmentation.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
Determines the maximum allowed order for slabs.
|
||||
A high setting may cause OOMs due to memory
|
||||
fragmentation. For more information see
|
||||
Documentation/vm/slub.txt.
|
||||
|
||||
slub_min_objects= [MM, SLUB]
|
||||
The minimum objects per slab. SLUB will increase the
|
||||
slab order up to slub_max_order to generate a
|
||||
sufficiently big slab to satisfy the number of objects.
|
||||
The higher the number of objects the smaller the overhead
|
||||
of tracking slabs.
|
||||
The minimum number of objects per slab. SLUB will
|
||||
increase the slab order up to slub_max_order to
|
||||
generate a sufficiently large slab able to contain
|
||||
the number of objects indicated. The higher the number
|
||||
of objects the smaller the overhead of tracking slabs
|
||||
and the less frequently locks need to be acquired.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
|
||||
slub_min_order= [MM, SLUB]
|
||||
Determines the mininum page order for slabs. Must be
|
||||
lower than slub_max_order
|
||||
lower than slub_max_order.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
|
||||
slub_nomerge [MM, SLUB]
|
||||
Disable merging of slabs of similar size. May be
|
||||
Disable merging of slabs with similar size. May be
|
||||
necessary if there is some reason to distinguish
|
||||
allocs to different slabs.
|
||||
allocs to different slabs. Debug options disable
|
||||
merging on their own.
|
||||
For more information see Documentation/vm/slub.txt.
|
||||
|
||||
smart2= [HW]
|
||||
@ -1738,9 +1753,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
snd-ymfpci= [HW,ALSA]
|
||||
|
||||
sonycd535= [HW,CD]
|
||||
Format: <io>[,<irq>]
|
||||
|
||||
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
||||
See Documentation/sonypi.txt
|
||||
|
||||
@ -1812,6 +1824,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
Set number of hash buckets for TCP connection
|
||||
|
||||
time Show timing data prefixed to each printk message line
|
||||
[deprecated, see 'printk.time']
|
||||
|
||||
tipar.timeout= [HW,PPT]
|
||||
Set communications timeout in tenths of a second
|
||||
@ -1869,11 +1882,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
usbhid.mousepoll=
|
||||
[USBHID] The interval which mice are to be polled at.
|
||||
|
||||
vdso= [IA-32,SH]
|
||||
vdso= [IA-32,SH,x86-64]
|
||||
vdso=2: enable compat VDSO (default with COMPAT_VDSO)
|
||||
vdso=1: enable VDSO (default)
|
||||
vdso=0: disable VDSO mapping
|
||||
|
||||
vector= [IA-64,SMP]
|
||||
vector=percpu: enable percpu vector domain
|
||||
|
||||
video= [FB] Frame buffer configuration
|
||||
See Documentation/fb/modedb.txt.
|
||||
|
||||
|
@ -247,12 +247,6 @@ control to Kprobes.) If the probed function is declared asmlinkage,
|
||||
fastcall, or anything else that affects how args are passed, the
|
||||
handler's declaration must match.
|
||||
|
||||
NOTE: A macro JPROBE_ENTRY is provided to handle architecture-specific
|
||||
aliasing of jp->entry. In the interest of portability, it is advised
|
||||
to use:
|
||||
|
||||
jp->entry = JPROBE_ENTRY(handler);
|
||||
|
||||
register_jprobe() returns 0 on success, or a negative errno otherwise.
|
||||
|
||||
4.3 register_kretprobe
|
||||
@ -518,7 +512,7 @@ long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
|
||||
}
|
||||
|
||||
static struct jprobe my_jprobe = {
|
||||
.entry = JPROBE_ENTRY(jdo_fork)
|
||||
.entry = jdo_fork
|
||||
};
|
||||
|
||||
static int __init jprobe_init(void)
|
||||
|
27
Documentation/lguest/Makefile
Normal file
27
Documentation/lguest/Makefile
Normal file
@ -0,0 +1,27 @@
|
||||
# This creates the demonstration utility "lguest" which runs a Linux guest.
|
||||
|
||||
# For those people that have a separate object dir, look there for .config
|
||||
KBUILD_OUTPUT := ../..
|
||||
ifdef O
|
||||
ifeq ("$(origin O)", "command line")
|
||||
KBUILD_OUTPUT := $(O)
|
||||
endif
|
||||
endif
|
||||
# We rely on CONFIG_PAGE_OFFSET to know where to put lguest binary.
|
||||
include $(KBUILD_OUTPUT)/.config
|
||||
LGUEST_GUEST_TOP := ($(CONFIG_PAGE_OFFSET) - 0x08000000)
|
||||
|
||||
CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 \
|
||||
-static -DLGUEST_GUEST_TOP="$(LGUEST_GUEST_TOP)" -Wl,-T,lguest.lds
|
||||
LDLIBS:=-lz
|
||||
|
||||
all: lguest.lds lguest
|
||||
|
||||
# The linker script on x86 is so complex the only way of creating one
|
||||
# which will link our binary in the right place is to mangle the
|
||||
# default one.
|
||||
lguest.lds:
|
||||
$(LD) --verbose | awk '/^==========/ { PRINT=1; next; } /SIZEOF_HEADERS/ { gsub(/0x[0-9A-F]*/, "$(LGUEST_GUEST_TOP)") } { if (PRINT) print $$0; }' > $@
|
||||
|
||||
clean:
|
||||
rm -f lguest.lds lguest
|
1012
Documentation/lguest/lguest.c
Normal file
1012
Documentation/lguest/lguest.c
Normal file
File diff suppressed because it is too large
Load Diff
129
Documentation/lguest/lguest.txt
Normal file
129
Documentation/lguest/lguest.txt
Normal file
@ -0,0 +1,129 @@
|
||||
Rusty's Remarkably Unreliable Guide to Lguest
|
||||
- or, A Young Coder's Illustrated Hypervisor
|
||||
http://lguest.ozlabs.org
|
||||
|
||||
Lguest is designed to be a minimal hypervisor for the Linux kernel, for
|
||||
Linux developers and users to experiment with virtualization with the
|
||||
minimum of complexity. Nonetheless, it should have sufficient
|
||||
features to make it useful for specific tasks, and, of course, you are
|
||||
encouraged to fork and enhance it.
|
||||
|
||||
Features:
|
||||
|
||||
- Kernel module which runs in a normal kernel.
|
||||
- Simple I/O model for communication.
|
||||
- Simple program to create new guests.
|
||||
- Logo contains cute puppies: http://lguest.ozlabs.org
|
||||
|
||||
Developer features:
|
||||
|
||||
- Fun to hack on.
|
||||
- No ABI: being tied to a specific kernel anyway, you can change anything.
|
||||
- Many opportunities for improvement or feature implementation.
|
||||
|
||||
Running Lguest:
|
||||
|
||||
- Lguest runs the same kernel as guest and host. You can configure
|
||||
them differently, but usually it's easiest not to.
|
||||
|
||||
You will need to configure your kernel with the following options:
|
||||
|
||||
CONFIG_HIGHMEM64G=n ("High Memory Support" "64GB")[1]
|
||||
CONFIG_TUN=y/m ("Universal TUN/TAP device driver support")
|
||||
CONFIG_EXPERIMENTAL=y ("Prompt for development and/or incomplete code/drivers")
|
||||
CONFIG_PARAVIRT=y ("Paravirtualization support (EXPERIMENTAL)")
|
||||
CONFIG_LGUEST=y/m ("Linux hypervisor example code")
|
||||
|
||||
and I recommend:
|
||||
CONFIG_HZ=100 ("Timer frequency")[2]
|
||||
|
||||
- A tool called "lguest" is available in this directory: type "make"
|
||||
to build it. If you didn't build your kernel in-tree, use "make
|
||||
O=<builddir>".
|
||||
|
||||
- Create or find a root disk image. There are several useful ones
|
||||
around, such as the xm-test tiny root image at
|
||||
http://xm-test.xensource.com/ramdisks/initrd-1.1-i386.img
|
||||
|
||||
For more serious work, I usually use a distribution ISO image and
|
||||
install it under qemu, then make multiple copies:
|
||||
|
||||
dd if=/dev/zero of=rootfile bs=1M count=2048
|
||||
qemu -cdrom image.iso -hda rootfile -net user -net nic -boot d
|
||||
|
||||
- "modprobe lg" if you built it as a module.
|
||||
|
||||
- Run an lguest as root:
|
||||
|
||||
Documentation/lguest/lguest 64m vmlinux --tunnet=192.168.19.1 --block=rootfile root=/dev/lgba
|
||||
|
||||
Explanation:
|
||||
64m: the amount of memory to use.
|
||||
|
||||
vmlinux: the kernel image found in the top of your build directory. You
|
||||
can also use a standard bzImage.
|
||||
|
||||
--tunnet=192.168.19.1: configures a "tap" device for networking with this
|
||||
IP address.
|
||||
|
||||
--block=rootfile: a file or block device which becomes /dev/lgba
|
||||
inside the guest.
|
||||
|
||||
root=/dev/lgba: this (and anything else on the command line) are
|
||||
kernel boot parameters.
|
||||
|
||||
- Configuring networking. I usually have the host masquerade, using
|
||||
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" and "echo 1 >
|
||||
/proc/sys/net/ipv4/ip_forward". In this example, I would configure
|
||||
eth0 inside the guest at 192.168.19.2.
|
||||
|
||||
Another method is to bridge the tap device to an external interface
|
||||
using --tunnet=bridge:<bridgename>, and perhaps run dhcp on the guest
|
||||
to obtain an IP address. The bridge needs to be configured first:
|
||||
this option simply adds the tap interface to it.
|
||||
|
||||
A simple example on my system:
|
||||
|
||||
ifconfig eth0 0.0.0.0
|
||||
brctl addbr lg0
|
||||
ifconfig lg0 up
|
||||
brctl addif lg0 eth0
|
||||
dhclient lg0
|
||||
|
||||
Then use --tunnet=bridge:lg0 when launching the guest.
|
||||
|
||||
See http://linux-net.osdl.org/index.php/Bridge for general information
|
||||
on how to get bridging working.
|
||||
|
||||
- You can also create an inter-guest network using
|
||||
"--sharenet=<filename>": any two guests using the same file are on
|
||||
the same network. This file is created if it does not exist.
|
||||
|
||||
Lguest I/O model:
|
||||
|
||||
Lguest uses a simplified DMA model plus shared memory for I/O. Guests
|
||||
can communicate with each other if they share underlying memory
|
||||
(usually by the lguest program mmaping the same file), but they can
|
||||
use any non-shared memory to communicate with the lguest process.
|
||||
|
||||
Guests can register DMA buffers at any key (must be a valid physical
|
||||
address) using the LHCALL_BIND_DMA(key, dmabufs, num<<8|irq)
|
||||
hypercall. "dmabufs" is the physical address of an array of "num"
|
||||
"struct lguest_dma": each contains a used_len, and an array of
|
||||
physical addresses and lengths. When a transfer occurs, the
|
||||
"used_len" field of one of the buffers which has used_len 0 will be
|
||||
set to the length transferred and the irq will fire.
|
||||
|
||||
Using an irq value of 0 unbinds the dma buffers.
|
||||
|
||||
To send DMA, the LHCALL_SEND_DMA(key, dma_physaddr) hypercall is used,
|
||||
and the bytes used is written to the used_len field. This can be 0 if
|
||||
noone else has bound a DMA buffer to that key or some other error.
|
||||
DMA buffers bound by the same guest are ignored.
|
||||
|
||||
Cheers!
|
||||
Rusty Russell rusty@rustcorp.com.au.
|
||||
|
||||
[1] These are on various places on the TODO list, waiting for you to
|
||||
get annoyed enough at the limitation to fix it.
|
||||
[2] Lguest is not yet tickless when idle. See [1].
|
@ -82,13 +82,6 @@ Valid names are:
|
||||
/dev/fd : -> 0x0200 (floppy disk)
|
||||
/dev/xda: -> 0x0c00 (first XT disk, unused in Linux/m68k)
|
||||
/dev/xdb: -> 0x0c40 (second XT disk, unused in Linux/m68k)
|
||||
/dev/ada: -> 0x1c00 (first ACSI device)
|
||||
/dev/adb: -> 0x1c10 (second ACSI device)
|
||||
/dev/adc: -> 0x1c20 (third ACSI device)
|
||||
/dev/add: -> 0x1c30 (forth ACSI device)
|
||||
|
||||
The last four names are available only if the kernel has been compiled
|
||||
with Atari and ACSI support.
|
||||
|
||||
The name must be followed by a decimal number, that stands for the
|
||||
partition number. Internally, the value of the number is just
|
||||
|
@ -433,6 +433,12 @@ tcp_workaround_signed_windows - BOOLEAN
|
||||
not receive a window scaling option from them.
|
||||
Default: 0
|
||||
|
||||
tcp_dma_copybreak - INTEGER
|
||||
Lower limit, in bytes, of the size of socket reads that will be
|
||||
offloaded to a DMA copy engine, if one is present in the system
|
||||
and CONFIG_NET_DMA is enabled.
|
||||
Default: 4096
|
||||
|
||||
CIPSOv4 Variables:
|
||||
|
||||
cipso_cache_enable - BOOLEAN
|
||||
@ -874,8 +880,7 @@ accept_redirects - BOOLEAN
|
||||
accept_source_route - INTEGER
|
||||
Accept source routing (routing extension header).
|
||||
|
||||
> 0: Accept routing header.
|
||||
= 0: Accept only routing header type 2.
|
||||
>= 0: Accept only routing header type 2.
|
||||
< 0: Do not accept routing header.
|
||||
|
||||
Default: 0
|
||||
|
169
Documentation/networking/l2tp.txt
Normal file
169
Documentation/networking/l2tp.txt
Normal file
@ -0,0 +1,169 @@
|
||||
This brief document describes how to use the kernel's PPPoL2TP driver
|
||||
to provide L2TP functionality. L2TP is a protocol that tunnels one or
|
||||
more PPP sessions over a UDP tunnel. It is commonly used for VPNs
|
||||
(L2TP/IPSec) and by ISPs to tunnel subscriber PPP sessions over an IP
|
||||
network infrastructure.
|
||||
|
||||
Design
|
||||
======
|
||||
|
||||
The PPPoL2TP driver, drivers/net/pppol2tp.c, provides a mechanism by
|
||||
which PPP frames carried through an L2TP session are passed through
|
||||
the kernel's PPP subsystem. The standard PPP daemon, pppd, handles all
|
||||
PPP interaction with the peer. PPP network interfaces are created for
|
||||
each local PPP endpoint.
|
||||
|
||||
The L2TP protocol http://www.faqs.org/rfcs/rfc2661.html defines L2TP
|
||||
control and data frames. L2TP control frames carry messages between
|
||||
L2TP clients/servers and are used to setup / teardown tunnels and
|
||||
sessions. An L2TP client or server is implemented in userspace and
|
||||
will use a regular UDP socket per tunnel. L2TP data frames carry PPP
|
||||
frames, which may be PPP control or PPP data. The kernel's PPP
|
||||
subsystem arranges for PPP control frames to be delivered to pppd,
|
||||
while data frames are forwarded as usual.
|
||||
|
||||
Each tunnel and session within a tunnel is assigned a unique tunnel_id
|
||||
and session_id. These ids are carried in the L2TP header of every
|
||||
control and data packet. The pppol2tp driver uses them to lookup
|
||||
internal tunnel and/or session contexts. Zero tunnel / session ids are
|
||||
treated specially - zero ids are never assigned to tunnels or sessions
|
||||
in the network. In the driver, the tunnel context keeps a pointer to
|
||||
the tunnel UDP socket. The session context keeps a pointer to the
|
||||
PPPoL2TP socket, as well as other data that lets the driver interface
|
||||
to the kernel PPP subsystem.
|
||||
|
||||
Note that the pppol2tp kernel driver handles only L2TP data frames;
|
||||
L2TP control frames are simply passed up to userspace in the UDP
|
||||
tunnel socket. The kernel handles all datapath aspects of the
|
||||
protocol, including data packet resequencing (if enabled).
|
||||
|
||||
There are a number of requirements on the userspace L2TP daemon in
|
||||
order to use the pppol2tp driver.
|
||||
|
||||
1. Use a UDP socket per tunnel.
|
||||
|
||||
2. Create a single PPPoL2TP socket per tunnel bound to a special null
|
||||
session id. This is used only for communicating with the driver but
|
||||
must remain open while the tunnel is active. Opening this tunnel
|
||||
management socket causes the driver to mark the tunnel socket as an
|
||||
L2TP UDP encapsulation socket and flags it for use by the
|
||||
referenced tunnel id. This hooks up the UDP receive path via
|
||||
udp_encap_rcv() in net/ipv4/udp.c. PPP data frames are never passed
|
||||
in this special PPPoX socket.
|
||||
|
||||
3. Create a PPPoL2TP socket per L2TP session. This is typically done
|
||||
by starting pppd with the pppol2tp plugin and appropriate
|
||||
arguments. A PPPoL2TP tunnel management socket (Step 2) must be
|
||||
created before the first PPPoL2TP session socket is created.
|
||||
|
||||
When creating PPPoL2TP sockets, the application provides information
|
||||
to the driver about the socket in a socket connect() call. Source and
|
||||
destination tunnel and session ids are provided, as well as the file
|
||||
descriptor of a UDP socket. See struct pppol2tp_addr in
|
||||
include/linux/if_ppp.h. Note that zero tunnel / session ids are
|
||||
treated specially. When creating the per-tunnel PPPoL2TP management
|
||||
socket in Step 2 above, zero source and destination session ids are
|
||||
specified, which tells the driver to prepare the supplied UDP file
|
||||
descriptor for use as an L2TP tunnel socket.
|
||||
|
||||
Userspace may control behavior of the tunnel or session using
|
||||
setsockopt and ioctl on the PPPoX socket. The following socket
|
||||
options are supported:-
|
||||
|
||||
DEBUG - bitmask of debug message categories. See below.
|
||||
SENDSEQ - 0 => don't send packets with sequence numbers
|
||||
1 => send packets with sequence numbers
|
||||
RECVSEQ - 0 => receive packet sequence numbers are optional
|
||||
1 => drop receive packets without sequence numbers
|
||||
LNSMODE - 0 => act as LAC.
|
||||
1 => act as LNS.
|
||||
REORDERTO - reorder timeout (in millisecs). If 0, don't try to reorder.
|
||||
|
||||
Only the DEBUG option is supported by the special tunnel management
|
||||
PPPoX socket.
|
||||
|
||||
In addition to the standard PPP ioctls, a PPPIOCGL2TPSTATS is provided
|
||||
to retrieve tunnel and session statistics from the kernel using the
|
||||
PPPoX socket of the appropriate tunnel or session.
|
||||
|
||||
Debugging
|
||||
=========
|
||||
|
||||
The driver supports a flexible debug scheme where kernel trace
|
||||
messages may be optionally enabled per tunnel and per session. Care is
|
||||
needed when debugging a live system since the messages are not
|
||||
rate-limited and a busy system could be swamped. Userspace uses
|
||||
setsockopt on the PPPoX socket to set a debug mask.
|
||||
|
||||
The following debug mask bits are available:
|
||||
|
||||
PPPOL2TP_MSG_DEBUG verbose debug (if compiled in)
|
||||
PPPOL2TP_MSG_CONTROL userspace - kernel interface
|
||||
PPPOL2TP_MSG_SEQ sequence numbers handling
|
||||
PPPOL2TP_MSG_DATA data packets
|
||||
|
||||
Sample Userspace Code
|
||||
=====================
|
||||
|
||||
1. Create tunnel management PPPoX socket
|
||||
|
||||
kernel_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
|
||||
if (kernel_fd >= 0) {
|
||||
struct sockaddr_pppol2tp sax;
|
||||
struct sockaddr_in const *peer_addr;
|
||||
|
||||
peer_addr = l2tp_tunnel_get_peer_addr(tunnel);
|
||||
memset(&sax, 0, sizeof(sax));
|
||||
sax.sa_family = AF_PPPOX;
|
||||
sax.sa_protocol = PX_PROTO_OL2TP;
|
||||
sax.pppol2tp.fd = udp_fd; /* fd of tunnel UDP socket */
|
||||
sax.pppol2tp.addr.sin_addr.s_addr = peer_addr->sin_addr.s_addr;
|
||||
sax.pppol2tp.addr.sin_port = peer_addr->sin_port;
|
||||
sax.pppol2tp.addr.sin_family = AF_INET;
|
||||
sax.pppol2tp.s_tunnel = tunnel_id;
|
||||
sax.pppol2tp.s_session = 0; /* special case: mgmt socket */
|
||||
sax.pppol2tp.d_tunnel = 0;
|
||||
sax.pppol2tp.d_session = 0; /* special case: mgmt socket */
|
||||
|
||||
if(connect(kernel_fd, (struct sockaddr *)&sax, sizeof(sax) ) < 0 ) {
|
||||
perror("connect failed");
|
||||
result = -errno;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
2. Create session PPPoX data socket
|
||||
|
||||
struct sockaddr_pppol2tp sax;
|
||||
int fd;
|
||||
|
||||
/* Note, the target socket must be bound already, else it will not be ready */
|
||||
sax.sa_family = AF_PPPOX;
|
||||
sax.sa_protocol = PX_PROTO_OL2TP;
|
||||
sax.pppol2tp.fd = tunnel_fd;
|
||||
sax.pppol2tp.addr.sin_addr.s_addr = addr->sin_addr.s_addr;
|
||||
sax.pppol2tp.addr.sin_port = addr->sin_port;
|
||||
sax.pppol2tp.addr.sin_family = AF_INET;
|
||||
sax.pppol2tp.s_tunnel = tunnel_id;
|
||||
sax.pppol2tp.s_session = session_id;
|
||||
sax.pppol2tp.d_tunnel = peer_tunnel_id;
|
||||
sax.pppol2tp.d_session = peer_session_id;
|
||||
|
||||
/* session_fd is the fd of the session's PPPoL2TP socket.
|
||||
* tunnel_fd is the fd of the tunnel UDP socket.
|
||||
*/
|
||||
fd = connect(session_fd, (struct sockaddr *)&sax, sizeof(sax));
|
||||
if (fd < 0 ) {
|
||||
return -errno;
|
||||
}
|
||||
return 0;
|
||||
|
||||
Miscellanous
|
||||
============
|
||||
|
||||
The PPPoL2TP driver was developed as part of the OpenL2TP project by
|
||||
Katalix Systems Ltd. OpenL2TP is a full-featured L2TP client / server,
|
||||
designed from the ground up to have the L2TP datapath in the
|
||||
kernel. The project also implemented the pppol2tp plugin for pppd
|
||||
which allows pppd to use the kernel driver. Details can be found at
|
||||
http://openl2tp.sourceforge.net.
|
59
Documentation/networking/mac80211-injection.txt
Normal file
59
Documentation/networking/mac80211-injection.txt
Normal file
@ -0,0 +1,59 @@
|
||||
How to use packet injection with mac80211
|
||||
=========================================
|
||||
|
||||
mac80211 now allows arbitrary packets to be injected down any Monitor Mode
|
||||
interface from userland. The packet you inject needs to be composed in the
|
||||
following format:
|
||||
|
||||
[ radiotap header ]
|
||||
[ ieee80211 header ]
|
||||
[ payload ]
|
||||
|
||||
The radiotap format is discussed in
|
||||
./Documentation/networking/radiotap-headers.txt.
|
||||
|
||||
Despite 13 radiotap argument types are currently defined, most only make sense
|
||||
to appear on received packets. Currently three kinds of argument are used by
|
||||
the injection code, although it knows to skip any other arguments that are
|
||||
present (facilitating replay of captured radiotap headers directly):
|
||||
|
||||
- IEEE80211_RADIOTAP_RATE - u8 arg in 500kbps units (0x02 --> 1Mbps)
|
||||
|
||||
- IEEE80211_RADIOTAP_ANTENNA - u8 arg, 0x00 = ant1, 0x01 = ant2
|
||||
|
||||
- IEEE80211_RADIOTAP_DBM_TX_POWER - u8 arg, dBm
|
||||
|
||||
Here is an example valid radiotap header defining these three parameters
|
||||
|
||||
0x00, 0x00, // <-- radiotap version
|
||||
0x0b, 0x00, // <- radiotap header length
|
||||
0x04, 0x0c, 0x00, 0x00, // <-- bitmap
|
||||
0x6c, // <-- rate
|
||||
0x0c, //<-- tx power
|
||||
0x01 //<-- antenna
|
||||
|
||||
The ieee80211 header follows immediately afterwards, looking for example like
|
||||
this:
|
||||
|
||||
0x08, 0x01, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
|
||||
0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
|
||||
0x10, 0x86
|
||||
|
||||
Then lastly there is the payload.
|
||||
|
||||
After composing the packet contents, it is sent by send()-ing it to a logical
|
||||
mac80211 interface that is in Monitor mode. Libpcap can also be used,
|
||||
(which is easier than doing the work to bind the socket to the right
|
||||
interface), along the following lines:
|
||||
|
||||
ppcap = pcap_open_live(szInterfaceName, 800, 1, 20, szErrbuf);
|
||||
...
|
||||
r = pcap_inject(ppcap, u8aSendBuffer, nLength);
|
||||
|
||||
You can also find sources for a complete inject test applet here:
|
||||
|
||||
http://penumbra.warmcat.com/_twk/tiki-index.php?page=packetspammer
|
||||
|
||||
Andy Green <andy@warmcat.com>
|
111
Documentation/networking/multiqueue.txt
Normal file
111
Documentation/networking/multiqueue.txt
Normal file
@ -0,0 +1,111 @@
|
||||
|
||||
HOWTO for multiqueue network device support
|
||||
===========================================
|
||||
|
||||
Section 1: Base driver requirements for implementing multiqueue support
|
||||
Section 2: Qdisc support for multiqueue devices
|
||||
Section 3: Brief howto using PRIO or RR for multiqueue devices
|
||||
|
||||
|
||||
Intro: Kernel support for multiqueue devices
|
||||
---------------------------------------------------------
|
||||
|
||||
Kernel support for multiqueue devices is only an API that is presented to the
|
||||
netdevice layer for base drivers to implement. This feature is part of the
|
||||
core networking stack, and all network devices will be running on the
|
||||
multiqueue-aware stack. If a base driver only has one queue, then these
|
||||
changes are transparent to that driver.
|
||||
|
||||
|
||||
Section 1: Base driver requirements for implementing multiqueue support
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Base drivers are required to use the new alloc_etherdev_mq() or
|
||||
alloc_netdev_mq() functions to allocate the subqueues for the device. The
|
||||
underlying kernel API will take care of the allocation and deallocation of
|
||||
the subqueue memory, as well as netdev configuration of where the queues
|
||||
exist in memory.
|
||||
|
||||
The base driver will also need to manage the queues as it does the global
|
||||
netdev->queue_lock today. Therefore base drivers should use the
|
||||
netif_{start|stop|wake}_subqueue() functions to manage each queue while the
|
||||
device is still operational. netdev->queue_lock is still used when the device
|
||||
comes online or when it's completely shut down (unregister_netdev(), etc.).
|
||||
|
||||
Finally, the base driver should indicate that it is a multiqueue device. The
|
||||
feature flag NETIF_F_MULTI_QUEUE should be added to the netdev->features
|
||||
bitmap on device initialization. Below is an example from e1000:
|
||||
|
||||
#ifdef CONFIG_E1000_MQ
|
||||
if ( (adapter->hw.mac.type == e1000_82571) ||
|
||||
(adapter->hw.mac.type == e1000_82572) ||
|
||||
(adapter->hw.mac.type == e1000_80003es2lan))
|
||||
netdev->features |= NETIF_F_MULTI_QUEUE;
|
||||
#endif
|
||||
|
||||
|
||||
Section 2: Qdisc support for multiqueue devices
|
||||
-----------------------------------------------
|
||||
|
||||
Currently two qdiscs support multiqueue devices. A new round-robin qdisc,
|
||||
sch_rr, and sch_prio. The qdisc is responsible for classifying the skb's to
|
||||
bands and queues, and will store the queue mapping into skb->queue_mapping.
|
||||
Use this field in the base driver to determine which queue to send the skb
|
||||
to.
|
||||
|
||||
sch_rr has been added for hardware that doesn't want scheduling policies from
|
||||
software, so it's a straight round-robin qdisc. It uses the same syntax and
|
||||
classification priomap that sch_prio uses, so it should be intuitive to
|
||||
configure for people who've used sch_prio.
|
||||
|
||||
The PRIO qdisc naturally plugs into a multiqueue device. If PRIO has been
|
||||
built with NET_SCH_PRIO_MQ, then upon load, it will make sure the number of
|
||||
bands requested is equal to the number of queues on the hardware. If they
|
||||
are equal, it sets a one-to-one mapping up between the queues and bands. If
|
||||
they're not equal, it will not load the qdisc. This is the same behavior
|
||||
for RR. Once the association is made, any skb that is classified will have
|
||||
skb->queue_mapping set, which will allow the driver to properly queue skb's
|
||||
to multiple queues.
|
||||
|
||||
|
||||
Section 3: Brief howto using PRIO and RR for multiqueue devices
|
||||
---------------------------------------------------------------
|
||||
|
||||
The userspace command 'tc,' part of the iproute2 package, is used to configure
|
||||
qdiscs. To add the PRIO qdisc to your network device, assuming the device is
|
||||
called eth0, run the following command:
|
||||
|
||||
# tc qdisc add dev eth0 root handle 1: prio bands 4 multiqueue
|
||||
|
||||
This will create 4 bands, 0 being highest priority, and associate those bands
|
||||
to the queues on your NIC. Assuming eth0 has 4 Tx queues, the band mapping
|
||||
would look like:
|
||||
|
||||
band 0 => queue 0
|
||||
band 1 => queue 1
|
||||
band 2 => queue 2
|
||||
band 3 => queue 3
|
||||
|
||||
Traffic will begin flowing through each queue if your TOS values are assigning
|
||||
traffic across the various bands. For example, ssh traffic will always try to
|
||||
go out band 0 based on TOS -> Linux priority conversion (realtime traffic),
|
||||
so it will be sent out queue 0. ICMP traffic (pings) fall into the "normal"
|
||||
traffic classification, which is band 1. Therefore pings will be send out
|
||||
queue 1 on the NIC.
|
||||
|
||||
Note the use of the multiqueue keyword. This is only in versions of iproute2
|
||||
that support multiqueue networking devices; if this is omitted when loading
|
||||
a qdisc onto a multiqueue device, the qdisc will load and operate the same
|
||||
if it were loaded onto a single-queue device (i.e. - sends all traffic to
|
||||
queue 0).
|
||||
|
||||
Another alternative to multiqueue band allocation can be done by using the
|
||||
multiqueue option and specify 0 bands. If this is the case, the qdisc will
|
||||
allocate the number of bands to equal the number of queues that the device
|
||||
reports, and bring the qdisc online.
|
||||
|
||||
The behavior of tc filters remains the same, where it will override TOS priority
|
||||
classification.
|
||||
|
||||
|
||||
Author: Peter P. Waskiewicz Jr. <peter.p.waskiewicz.jr@intel.com>
|
@ -146,12 +146,6 @@ at1700.c:
|
||||
irq = 0
|
||||
(Probes ports: 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300)
|
||||
|
||||
atari_bionet.c:
|
||||
Supports full autoprobing. (m68k/Atari)
|
||||
|
||||
atari_pamsnet.c:
|
||||
Supports full autoprobing. (m68k/Atari)
|
||||
|
||||
atarilance.c:
|
||||
Supports full autoprobing. (m68k/Atari)
|
||||
|
||||
|
@ -20,6 +20,30 @@ private data which gets freed when the network device is freed. If
|
||||
separately allocated data is attached to the network device
|
||||
(dev->priv) then it is up to the module exit handler to free that.
|
||||
|
||||
MTU
|
||||
===
|
||||
Each network device has a Maximum Transfer Unit. The MTU does not
|
||||
include any link layer protocol overhead. Upper layer protocols must
|
||||
not pass a socket buffer (skb) to a device to transmit with more data
|
||||
than the mtu. The MTU does not include link layer header overhead, so
|
||||
for example on Ethernet if the standard MTU is 1500 bytes used, the
|
||||
actual skb will contain up to 1514 bytes because of the Ethernet
|
||||
header. Devices should allow for the 4 byte VLAN header as well.
|
||||
|
||||
Segmentation Offload (GSO, TSO) is an exception to this rule. The
|
||||
upper layer protocol may pass a large socket buffer to the device
|
||||
transmit routine, and the device will break that up into separate
|
||||
packets based on the current MTU.
|
||||
|
||||
MTU is symmetrical and applies both to receive and transmit. A device
|
||||
must be able to receive at least the maximum size packet allowed by
|
||||
the MTU. A network device may use the MTU as mechanism to size receive
|
||||
buffers, but the device should allow packets with VLAN header. With
|
||||
standard Ethernet mtu of 1500 bytes, the device should allow up to
|
||||
1518 byte packets (1500 + 14 header + 4 tag). The device may either:
|
||||
drop, truncate, or pass up oversize packets, but dropping oversize
|
||||
packets is preferred.
|
||||
|
||||
|
||||
struct net_device synchronization rules
|
||||
=======================================
|
||||
@ -43,16 +67,17 @@ dev->get_stats:
|
||||
|
||||
dev->hard_start_xmit:
|
||||
Synchronization: netif_tx_lock spinlock.
|
||||
|
||||
When the driver sets NETIF_F_LLTX in dev->features this will be
|
||||
called without holding netif_tx_lock. In this case the driver
|
||||
has to lock by itself when needed. It is recommended to use a try lock
|
||||
for this and return -1 when the spin lock fails.
|
||||
for this and return NETDEV_TX_LOCKED when the spin lock fails.
|
||||
The locking there should also properly protect against
|
||||
set_multicast_list
|
||||
Context: Process with BHs disabled or BH (timer).
|
||||
Notes: netif_queue_stopped() is guaranteed false
|
||||
Interrupts must be enabled when calling hard_start_xmit.
|
||||
(Interrupts must also be enabled when enabling the BH handler.)
|
||||
set_multicast_list.
|
||||
|
||||
Context: Process with BHs disabled or BH (timer),
|
||||
will be called with interrupts disabled by netconsole.
|
||||
|
||||
Return codes:
|
||||
o NETDEV_TX_OK everything ok.
|
||||
o NETDEV_TX_BUSY Cannot transmit packet, try later
|
||||
@ -74,4 +99,5 @@ dev->poll:
|
||||
Synchronization: __LINK_STATE_RX_SCHED bit in dev->state. See
|
||||
dev_close code and comments in net/core/dev.c for more info.
|
||||
Context: softirq
|
||||
will be called with interrupts disabled by netconsole.
|
||||
|
||||
|
152
Documentation/networking/radiotap-headers.txt
Normal file
152
Documentation/networking/radiotap-headers.txt
Normal file
@ -0,0 +1,152 @@
|
||||
How to use radiotap headers
|
||||
===========================
|
||||
|
||||
Pointer to the radiotap include file
|
||||
------------------------------------
|
||||
|
||||
Radiotap headers are variable-length and extensible, you can get most of the
|
||||
information you need to know on them from:
|
||||
|
||||
./include/net/ieee80211_radiotap.h
|
||||
|
||||
This document gives an overview and warns on some corner cases.
|
||||
|
||||
|
||||
Structure of the header
|
||||
-----------------------
|
||||
|
||||
There is a fixed portion at the start which contains a u32 bitmap that defines
|
||||
if the possible argument associated with that bit is present or not. So if b0
|
||||
of the it_present member of ieee80211_radiotap_header is set, it means that
|
||||
the header for argument index 0 (IEEE80211_RADIOTAP_TSFT) is present in the
|
||||
argument area.
|
||||
|
||||
< 8-byte ieee80211_radiotap_header >
|
||||
[ <possible argument bitmap extensions ... > ]
|
||||
[ <argument> ... ]
|
||||
|
||||
At the moment there are only 13 possible argument indexes defined, but in case
|
||||
we run out of space in the u32 it_present member, it is defined that b31 set
|
||||
indicates that there is another u32 bitmap following (shown as "possible
|
||||
argument bitmap extensions..." above), and the start of the arguments is moved
|
||||
forward 4 bytes each time.
|
||||
|
||||
Note also that the it_len member __le16 is set to the total number of bytes
|
||||
covered by the ieee80211_radiotap_header and any arguments following.
|
||||
|
||||
|
||||
Requirements for arguments
|
||||
--------------------------
|
||||
|
||||
After the fixed part of the header, the arguments follow for each argument
|
||||
index whose matching bit is set in the it_present member of
|
||||
ieee80211_radiotap_header.
|
||||
|
||||
- the arguments are all stored little-endian!
|
||||
|
||||
- the argument payload for a given argument index has a fixed size. So
|
||||
IEEE80211_RADIOTAP_TSFT being present always indicates an 8-byte argument is
|
||||
present. See the comments in ./include/net/ieee80211_radiotap.h for a nice
|
||||
breakdown of all the argument sizes
|
||||
|
||||
- the arguments must be aligned to a boundary of the argument size using
|
||||
padding. So a u16 argument must start on the next u16 boundary if it isn't
|
||||
already on one, a u32 must start on the next u32 boundary and so on.
|
||||
|
||||
- "alignment" is relative to the start of the ieee80211_radiotap_header, ie,
|
||||
the first byte of the radiotap header. The absolute alignment of that first
|
||||
byte isn't defined. So even if the whole radiotap header is starting at, eg,
|
||||
address 0x00000003, still the first byte of the radiotap header is treated as
|
||||
0 for alignment purposes.
|
||||
|
||||
- the above point that there may be no absolute alignment for multibyte
|
||||
entities in the fixed radiotap header or the argument region means that you
|
||||
have to take special evasive action when trying to access these multibyte
|
||||
entities. Some arches like Blackfin cannot deal with an attempt to
|
||||
dereference, eg, a u16 pointer that is pointing to an odd address. Instead
|
||||
you have to use a kernel API get_unaligned() to dereference the pointer,
|
||||
which will do it bytewise on the arches that require that.
|
||||
|
||||
- The arguments for a given argument index can be a compound of multiple types
|
||||
together. For example IEEE80211_RADIOTAP_CHANNEL has an argument payload
|
||||
consisting of two u16s of total length 4. When this happens, the padding
|
||||
rule is applied dealing with a u16, NOT dealing with a 4-byte single entity.
|
||||
|
||||
|
||||
Example valid radiotap header
|
||||
-----------------------------
|
||||
|
||||
0x00, 0x00, // <-- radiotap version + pad byte
|
||||
0x0b, 0x00, // <- radiotap header length
|
||||
0x04, 0x0c, 0x00, 0x00, // <-- bitmap
|
||||
0x6c, // <-- rate (in 500kHz units)
|
||||
0x0c, //<-- tx power
|
||||
0x01 //<-- antenna
|
||||
|
||||
|
||||
Using the Radiotap Parser
|
||||
-------------------------
|
||||
|
||||
If you are having to parse a radiotap struct, you can radically simplify the
|
||||
job by using the radiotap parser that lives in net/wireless/radiotap.c and has
|
||||
its prototypes available in include/net/cfg80211.h. You use it like this:
|
||||
|
||||
#include <net/cfg80211.h>
|
||||
|
||||
/* buf points to the start of the radiotap header part */
|
||||
|
||||
int MyFunction(u8 * buf, int buflen)
|
||||
{
|
||||
int pkt_rate_100kHz = 0, antenna = 0, pwr = 0;
|
||||
struct ieee80211_radiotap_iterator iterator;
|
||||
int ret = ieee80211_radiotap_iterator_init(&iterator, buf, buflen);
|
||||
|
||||
while (!ret) {
|
||||
|
||||
ret = ieee80211_radiotap_iterator_next(&iterator);
|
||||
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
/* see if this argument is something we can use */
|
||||
|
||||
switch (iterator.this_arg_index) {
|
||||
/*
|
||||
* You must take care when dereferencing iterator.this_arg
|
||||
* for multibyte types... the pointer is not aligned. Use
|
||||
* get_unaligned((type *)iterator.this_arg) to dereference
|
||||
* iterator.this_arg for type "type" safely on all arches.
|
||||
*/
|
||||
case IEEE80211_RADIOTAP_RATE:
|
||||
/* radiotap "rate" u8 is in
|
||||
* 500kbps units, eg, 0x02=1Mbps
|
||||
*/
|
||||
pkt_rate_100kHz = (*iterator.this_arg) * 5;
|
||||
break;
|
||||
|
||||
case IEEE80211_RADIOTAP_ANTENNA:
|
||||
/* radiotap uses 0 for 1st ant */
|
||||
antenna = *iterator.this_arg);
|
||||
break;
|
||||
|
||||
case IEEE80211_RADIOTAP_DBM_TX_POWER:
|
||||
pwr = *iterator.this_arg;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} /* while more rt headers */
|
||||
|
||||
if (ret != -ENOENT)
|
||||
return TXRX_DROP;
|
||||
|
||||
/* discard the radiotap header part */
|
||||
buf += iterator.max_length;
|
||||
buflen -= iterator.max_length;
|
||||
|
||||
...
|
||||
|
||||
}
|
||||
|
||||
Andy Green <andy@warmcat.com>
|
@ -86,6 +86,20 @@ stuff are the values reported by the Oops - you can just cut-and-paste
|
||||
and do a replace of spaces to "\x" - that's what I do, as I'm too lazy
|
||||
to write a program to automate this all).
|
||||
|
||||
Alternatively, you can use the shell script in scripts/decodecode.
|
||||
Its usage is: decodecode < oops.txt
|
||||
|
||||
The hex bytes that follow "Code:" may (in some architectures) have a series
|
||||
of bytes that precede the current instruction pointer as well as bytes at and
|
||||
following the current instruction pointer. In some cases, one instruction
|
||||
byte or word is surrounded by <> or (), as in "<86>" or "(f00d)". These
|
||||
<> or () markings indicate the current instruction pointer. Example from
|
||||
i386, split into multiple lines for readability:
|
||||
|
||||
Code: f9 0f 8d f9 00 00 00 8d 42 0c e8 dd 26 11 c7 a1 60 ea 2b f9 8b 50 08 a1
|
||||
64 ea 2b f9 8d 34 82 8b 1e 85 db 74 6d 8b 15 60 ea 2b f9 <8b> 43 04 39 42 54
|
||||
7e 04 40 89 42 54 8b 43 04 3b 05 00 f6 52 c0
|
||||
|
||||
Finally, if you want to see where the code comes from, you can do
|
||||
|
||||
cd /usr/src/linux
|
||||
@ -237,6 +251,8 @@ characters, each representing a particular tainted value.
|
||||
7: 'U' if a user or user application specifically requested that the
|
||||
Tainted flag be set, ' ' otherwise.
|
||||
|
||||
8: 'D' if the kernel has died recently, i.e. there was an OOPS or BUG.
|
||||
|
||||
The primary reason for the 'Tainted: ' string is to tell kernel
|
||||
debuggers if this is a clean kernel or if anything unusual has
|
||||
occurred. Tainting is permanent: even if an offending module is
|
||||
|
@ -113,9 +113,6 @@ initialization with a pointer to a structure describing the driver
|
||||
(Please see Documentation/power/pci.txt for descriptions
|
||||
of PCI Power Management and the related functions.)
|
||||
|
||||
enable_wake Enable device to generate wake events from a low power
|
||||
state.
|
||||
|
||||
shutdown Hook into reboot_notifier_list (kernel/sys.c).
|
||||
Intended to stop any idling DMA operations.
|
||||
Useful for enabling wake-on-lan (NIC) or changing
|
||||
@ -299,7 +296,10 @@ If the PCI device can use the PCI Memory-Write-Invalidate transaction,
|
||||
call pci_set_mwi(). This enables the PCI_COMMAND bit for Mem-Wr-Inval
|
||||
and also ensures that the cache line size register is set correctly.
|
||||
Check the return value of pci_set_mwi() as not all architectures
|
||||
or chip-sets may support Memory-Write-Invalidate.
|
||||
or chip-sets may support Memory-Write-Invalidate. Alternatively,
|
||||
if Mem-Wr-Inval would be nice to have but is not required, call
|
||||
pci_try_set_mwi() to have the system do its best effort at enabling
|
||||
Mem-Wr-Inval.
|
||||
|
||||
|
||||
3.2 Request MMIO/IOP resources
|
||||
|
162
Documentation/power/freezing-of-tasks.txt
Normal file
162
Documentation/power/freezing-of-tasks.txt
Normal file
@ -0,0 +1,162 @@
|
||||
Freezing of tasks
|
||||
(C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL
|
||||
|
||||
I. What is the freezing of tasks?
|
||||
|
||||
The freezing of tasks is a mechanism by which user space processes and some
|
||||
kernel threads are controlled during hibernation or system-wide suspend (on some
|
||||
architectures).
|
||||
|
||||
II. How does it work?
|
||||
|
||||
There are four per-task flags used for that, PF_NOFREEZE, PF_FROZEN, TIF_FREEZE
|
||||
and PF_FREEZER_SKIP (the last one is auxiliary). The tasks that have
|
||||
PF_NOFREEZE unset (all user space processes and some kernel threads) are
|
||||
regarded as 'freezable' and treated in a special way before the system enters a
|
||||
suspend state as well as before a hibernation image is created (in what follows
|
||||
we only consider hibernation, but the description also applies to suspend).
|
||||
|
||||
Namely, as the first step of the hibernation procedure the function
|
||||
freeze_processes() (defined in kernel/power/process.c) is called. It executes
|
||||
try_to_freeze_tasks() that sets TIF_FREEZE for all of the freezable tasks and
|
||||
sends a fake signal to each of them. A task that receives such a signal and has
|
||||
TIF_FREEZE set, should react to it by calling the refrigerator() function
|
||||
(defined in kernel/power/process.c), which sets the task's PF_FROZEN flag,
|
||||
changes its state to TASK_UNINTERRUPTIBLE and makes it loop until PF_FROZEN is
|
||||
cleared for it. Then, we say that the task is 'frozen' and therefore the set of
|
||||
functions handling this mechanism is called 'the freezer' (these functions are
|
||||
defined in kernel/power/process.c and include/linux/freezer.h). User space
|
||||
processes are generally frozen before kernel threads.
|
||||
|
||||
It is not recommended to call refrigerator() directly. Instead, it is
|
||||
recommended to use the try_to_freeze() function (defined in
|
||||
include/linux/freezer.h), that checks the task's TIF_FREEZE flag and makes the
|
||||
task enter refrigerator() if the flag is set.
|
||||
|
||||
For user space processes try_to_freeze() is called automatically from the
|
||||
signal-handling code, but the freezable kernel threads need to call it
|
||||
explicitly in suitable places. The code to do this may look like the following:
|
||||
|
||||
do {
|
||||
hub_events();
|
||||
wait_event_interruptible(khubd_wait,
|
||||
!list_empty(&hub_event_list));
|
||||
try_to_freeze();
|
||||
} while (!signal_pending(current));
|
||||
|
||||
(from drivers/usb/core/hub.c::hub_thread()).
|
||||
|
||||
If a freezable kernel thread fails to call try_to_freeze() after the freezer has
|
||||
set TIF_FREEZE for it, the freezing of tasks will fail and the entire
|
||||
hibernation operation will be cancelled. For this reason, freezable kernel
|
||||
threads must call try_to_freeze() somewhere.
|
||||
|
||||
After the system memory state has been restored from a hibernation image and
|
||||
devices have been reinitialized, the function thaw_processes() is called in
|
||||
order to clear the PF_FROZEN flag for each frozen task. Then, the tasks that
|
||||
have been frozen leave refrigerator() and continue running.
|
||||
|
||||
III. Which kernel threads are freezable?
|
||||
|
||||
Kernel threads are not freezable by default. However, a kernel thread may clear
|
||||
PF_NOFREEZE for itself by calling set_freezable() (the resetting of PF_NOFREEZE
|
||||
directly is strongly discouraged). From this point it is regarded as freezable
|
||||
and must call try_to_freeze() in a suitable place.
|
||||
|
||||
IV. Why do we do that?
|
||||
|
||||
Generally speaking, there is a couple of reasons to use the freezing of tasks:
|
||||
|
||||
1. The principal reason is to prevent filesystems from being damaged after
|
||||
hibernation. At the moment we have no simple means of checkpointing
|
||||
filesystems, so if there are any modifications made to filesystem data and/or
|
||||
metadata on disks, we cannot bring them back to the state from before the
|
||||
modifications. At the same time each hibernation image contains some
|
||||
filesystem-related information that must be consistent with the state of the
|
||||
on-disk data and metadata after the system memory state has been restored from
|
||||
the image (otherwise the filesystems will be damaged in a nasty way, usually
|
||||
making them almost impossible to repair). We therefore freeze tasks that might
|
||||
cause the on-disk filesystems' data and metadata to be modified after the
|
||||
hibernation image has been created and before the system is finally powered off.
|
||||
The majority of these are user space processes, but if any of the kernel threads
|
||||
may cause something like this to happen, they have to be freezable.
|
||||
|
||||
2. The second reason is to prevent user space processes and some kernel threads
|
||||
from interfering with the suspending and resuming of devices. A user space
|
||||
process running on a second CPU while we are suspending devices may, for
|
||||
example, be troublesome and without the freezing of tasks we would need some
|
||||
safeguards against race conditions that might occur in such a case.
|
||||
|
||||
Although Linus Torvalds doesn't like the freezing of tasks, he said this in one
|
||||
of the discussions on LKML (http://lkml.org/lkml/2007/4/27/608):
|
||||
|
||||
"RJW:> Why we freeze tasks at all or why we freeze kernel threads?
|
||||
|
||||
Linus: In many ways, 'at all'.
|
||||
|
||||
I _do_ realize the IO request queue issues, and that we cannot actually do
|
||||
s2ram with some devices in the middle of a DMA. So we want to be able to
|
||||
avoid *that*, there's no question about that. And I suspect that stopping
|
||||
user threads and then waiting for a sync is practically one of the easier
|
||||
ways to do so.
|
||||
|
||||
So in practice, the 'at all' may become a 'why freeze kernel threads?' and
|
||||
freezing user threads I don't find really objectionable."
|
||||
|
||||
Still, there are kernel threads that may want to be freezable. For example, if
|
||||
a kernel that belongs to a device driver accesses the device directly, it in
|
||||
principle needs to know when the device is suspended, so that it doesn't try to
|
||||
access it at that time. However, if the kernel thread is freezable, it will be
|
||||
frozen before the driver's .suspend() callback is executed and it will be
|
||||
thawed after the driver's .resume() callback has run, so it won't be accessing
|
||||
the device while it's suspended.
|
||||
|
||||
3. Another reason for freezing tasks is to prevent user space processes from
|
||||
realizing that hibernation (or suspend) operation takes place. Ideally, user
|
||||
space processes should not notice that such a system-wide operation has occurred
|
||||
and should continue running without any problems after the restore (or resume
|
||||
from suspend). Unfortunately, in the most general case this is quite difficult
|
||||
to achieve without the freezing of tasks. Consider, for example, a process
|
||||
that depends on all CPUs being online while it's running. Since we need to
|
||||
disable nonboot CPUs during the hibernation, if this process is not frozen, it
|
||||
may notice that the number of CPUs has changed and may start to work incorrectly
|
||||
because of that.
|
||||
|
||||
V. Are there any problems related to the freezing of tasks?
|
||||
|
||||
Yes, there are.
|
||||
|
||||
First of all, the freezing of kernel threads may be tricky if they depend one
|
||||
on another. For example, if kernel thread A waits for a completion (in the
|
||||
TASK_UNINTERRUPTIBLE state) that needs to be done by freezable kernel thread B
|
||||
and B is frozen in the meantime, then A will be blocked until B is thawed, which
|
||||
may be undesirable. That's why kernel threads are not freezable by default.
|
||||
|
||||
Second, there are the following two problems related to the freezing of user
|
||||
space processes:
|
||||
1. Putting processes into an uninterruptible sleep distorts the load average.
|
||||
2. Now that we have FUSE, plus the framework for doing device drivers in
|
||||
userspace, it gets even more complicated because some userspace processes are
|
||||
now doing the sorts of things that kernel threads do
|
||||
(https://lists.linux-foundation.org/pipermail/linux-pm/2007-May/012309.html).
|
||||
|
||||
The problem 1. seems to be fixable, although it hasn't been fixed so far. The
|
||||
other one is more serious, but it seems that we can work around it by using
|
||||
hibernation (and suspend) notifiers (in that case, though, we won't be able to
|
||||
avoid the realization by the user space processes that the hibernation is taking
|
||||
place).
|
||||
|
||||
There are also problems that the freezing of tasks tends to expose, although
|
||||
they are not directly related to it. For example, if request_firmware() is
|
||||
called from a device driver's .resume() routine, it will timeout and eventually
|
||||
fail, because the user land process that should respond to the request is frozen
|
||||
at this point. So, seemingly, the failure is due to the freezing of tasks.
|
||||
Suppose, however, that the firmware file is located on a filesystem accessible
|
||||
only through another device that hasn't been resumed yet. In that case,
|
||||
request_firmware() will fail regardless of whether or not the freezing of tasks
|
||||
is used. Consequently, the problem is not really related to the freezing of
|
||||
tasks, since it generally exists anyway.
|
||||
|
||||
A driver must have all firmwares it may need in RAM before suspend() is called.
|
||||
If keeping them is not practical, for example due to their size, they must be
|
||||
requested early enough using the suspend notifier API described in notifiers.txt.
|
@ -1,40 +0,0 @@
|
||||
KERNEL THREADS
|
||||
|
||||
|
||||
Freezer
|
||||
|
||||
Upon entering a suspended state the system will freeze all
|
||||
tasks. This is done by delivering pseudosignals. This affects
|
||||
kernel threads, too. To successfully freeze a kernel thread
|
||||
the thread has to check for the pseudosignal and enter the
|
||||
refrigerator. Code to do this looks like this:
|
||||
|
||||
do {
|
||||
hub_events();
|
||||
wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
|
||||
try_to_freeze();
|
||||
} while (!signal_pending(current));
|
||||
|
||||
from drivers/usb/core/hub.c::hub_thread()
|
||||
|
||||
|
||||
The Unfreezable
|
||||
|
||||
Some kernel threads however, must not be frozen. The kernel must
|
||||
be able to finish pending IO operations and later on be able to
|
||||
write the memory image to disk. Kernel threads needed to do IO
|
||||
must stay awake. Such threads must mark themselves unfreezable
|
||||
like this:
|
||||
|
||||
/*
|
||||
* This thread doesn't need any user-level access,
|
||||
* so get rid of all our resources.
|
||||
*/
|
||||
daemonize("usb-storage");
|
||||
|
||||
current->flags |= PF_NOFREEZE;
|
||||
|
||||
from drivers/usb/storage/usb.c::usb_stor_control_thread()
|
||||
|
||||
Such drivers are themselves responsible for staying quiet during
|
||||
the actual snapshotting.
|
50
Documentation/power/notifiers.txt
Normal file
50
Documentation/power/notifiers.txt
Normal file
@ -0,0 +1,50 @@
|
||||
Suspend notifiers
|
||||
(C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL
|
||||
|
||||
There are some operations that device drivers may want to carry out in their
|
||||
.suspend() routines, but shouldn't, because they can cause the hibernation or
|
||||
suspend to fail. For example, a driver may want to allocate a substantial amount
|
||||
of memory (like 50 MB) in .suspend(), but that shouldn't be done after the
|
||||
swsusp's memory shrinker has run.
|
||||
|
||||
Also, there may be some operations, that subsystems want to carry out before a
|
||||
hibernation/suspend or after a restore/resume, requiring the system to be fully
|
||||
functional, so the drivers' .suspend() and .resume() routines are not suitable
|
||||
for this purpose. For example, device drivers may want to upload firmware to
|
||||
their devices after a restore from a hibernation image, but they cannot do it by
|
||||
calling request_firmware() from their .resume() routines (user land processes
|
||||
are frozen at this point). The solution may be to load the firmware into
|
||||
memory before processes are frozen and upload it from there in the .resume()
|
||||
routine. Of course, a hibernation notifier may be used for this purpose.
|
||||
|
||||
The subsystems that have such needs can register suspend notifiers that will be
|
||||
called upon the following events by the suspend core:
|
||||
|
||||
PM_HIBERNATION_PREPARE The system is going to hibernate or suspend, tasks will
|
||||
be frozen immediately.
|
||||
|
||||
PM_POST_HIBERNATION The system memory state has been restored from a
|
||||
hibernation image or an error occured during the
|
||||
hibernation. Device drivers' .resume() callbacks have
|
||||
been executed and tasks have been thawed.
|
||||
|
||||
PM_SUSPEND_PREPARE The system is preparing for a suspend.
|
||||
|
||||
PM_POST_SUSPEND The system has just resumed or an error occured during
|
||||
the suspend. Device drivers' .resume() callbacks have
|
||||
been executed and tasks have been thawed.
|
||||
|
||||
It is generally assumed that whatever the notifiers do for
|
||||
PM_HIBERNATION_PREPARE, should be undone for PM_POST_HIBERNATION. Analogously,
|
||||
operations performed for PM_SUSPEND_PREPARE should be reversed for
|
||||
PM_POST_SUSPEND. Additionally, all of the notifiers are called for
|
||||
PM_POST_HIBERNATION if one of them fails for PM_HIBERNATION_PREPARE, and
|
||||
all of the notifiers are called for PM_POST_SUSPEND if one of them fails for
|
||||
PM_SUSPEND_PREPARE.
|
||||
|
||||
The hibernation and suspend notifiers are called with pm_mutex held. They are
|
||||
defined in the usual way, but their last argument is meaningless (it is always
|
||||
NULL). To register and/or unregister a suspend notifier use the functions
|
||||
register_pm_notifier() and unregister_pm_notifier(), respectively, defined in
|
||||
include/linux/suspend.h . If you don't need to unregister the notifier, you can
|
||||
also use the pm_notifier() macro defined in include/linux/suspend.h .
|
@ -164,7 +164,6 @@ struct pci_driver:
|
||||
|
||||
int (*suspend) (struct pci_dev *dev, pm_message_t state);
|
||||
int (*resume) (struct pci_dev *dev);
|
||||
int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable);
|
||||
|
||||
|
||||
suspend
|
||||
@ -251,42 +250,6 @@ The driver should update the current_state field in its pci_dev structure in
|
||||
this function, except for PM-capable devices when pci_set_power_state is used.
|
||||
|
||||
|
||||
enable_wake
|
||||
-----------
|
||||
|
||||
Usage:
|
||||
|
||||
if (dev->driver && dev->driver->enable_wake)
|
||||
dev->driver->enable_wake(dev,state,enable);
|
||||
|
||||
This callback is generally only relevant for devices that support the PCI PM
|
||||
spec and have the ability to generate a PME# (Power Management Event Signal)
|
||||
to wake the system up. (However, it is possible that a device may support
|
||||
some non-standard way of generating a wake event on sleep.)
|
||||
|
||||
Bits 15:11 of the PMC (Power Mgmt Capabilities) Register in a device's
|
||||
PM Capabilities describe what power states the device supports generating a
|
||||
wake event from:
|
||||
|
||||
+------------------+
|
||||
| Bit | State |
|
||||
+------------------+
|
||||
| 11 | D0 |
|
||||
| 12 | D1 |
|
||||
| 13 | D2 |
|
||||
| 14 | D3hot |
|
||||
| 15 | D3cold |
|
||||
+------------------+
|
||||
|
||||
A device can use this to enable wake events:
|
||||
|
||||
pci_enable_wake(dev,state,enable);
|
||||
|
||||
Note that to enable PME# from D3cold, a value of 4 should be passed to
|
||||
pci_enable_wake (since it uses an index into a bitmask). If a driver gets
|
||||
a request to enable wake events from D3, two calls should be made to
|
||||
pci_enable_wake (one for both D3hot and D3cold).
|
||||
|
||||
|
||||
A reference implementation
|
||||
-------------------------
|
||||
|
@ -140,21 +140,11 @@ should be sent to the mailing list available through the suspend2
|
||||
website, and not to the Linux Kernel Mailing List. We are working
|
||||
toward merging suspend2 into the mainline kernel.
|
||||
|
||||
Q: A kernel thread must voluntarily freeze itself (call 'refrigerator').
|
||||
I found some kernel threads that don't do it, and they don't freeze
|
||||
so the system can't sleep. Is this a known behavior?
|
||||
|
||||
A: All such kernel threads need to be fixed, one by one. Select the
|
||||
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
|
||||
add:
|
||||
|
||||
try_to_freeze();
|
||||
|
||||
If the thread is needed for writing the image to storage, you should
|
||||
instead set the PF_NOFREEZE process flag when creating the thread (and
|
||||
be very careful).
|
||||
Q: What is the freezing of tasks and why are we using it?
|
||||
|
||||
A: The freezing of tasks is a mechanism by which user space processes and some
|
||||
kernel threads are controlled during hibernation or system-wide suspend (on some
|
||||
architectures). See freezing-of-tasks.txt for details.
|
||||
|
||||
Q: What is the difference between "platform" and "shutdown"?
|
||||
|
||||
@ -393,6 +383,9 @@ safest thing is to unmount all filesystems on removable media (such USB,
|
||||
Firewire, CompactFlash, MMC, external SATA, or even IDE hotplug bays)
|
||||
before suspending; then remount them after resuming.
|
||||
|
||||
There is a work-around for this problem. For more information, see
|
||||
Documentation/usb/persist.txt.
|
||||
|
||||
Q: I upgraded the kernel from 2.6.15 to 2.6.16. Both kernels were
|
||||
compiled with the similar configuration files. Anyway I found that
|
||||
suspend to disk (and resume) is much slower on 2.6.16 compared to
|
||||
|
@ -42,15 +42,16 @@ Table of Contents
|
||||
1) Defining child nodes of an SOC
|
||||
2) Representing devices without a current OF specification
|
||||
a) MDIO IO device
|
||||
c) PHY nodes
|
||||
b) Gianfar-compatible ethernet nodes
|
||||
c) PHY nodes
|
||||
d) Interrupt controllers
|
||||
e) I2C
|
||||
f) Freescale SOC USB controllers
|
||||
g) Freescale SOC SEC Security Engines
|
||||
h) Board Control and Status (BCSR)
|
||||
i) Freescale QUICC Engine module (QE)
|
||||
g) Flash chip nodes
|
||||
j) Flash chip nodes
|
||||
k) Global Utilities Block
|
||||
|
||||
VII - Specifying interrupt information for devices
|
||||
1) interrupts property
|
||||
@ -626,6 +627,14 @@ So the node content can be summarized as a start token, a full path,
|
||||
a list of properties, a list of child nodes, and an end token. Every
|
||||
child node is a full node structure itself as defined above.
|
||||
|
||||
NOTE: The above definition requires that all property definitions for
|
||||
a particular node MUST precede any subnode definitions for that node.
|
||||
Although the structure would not be ambiguous if properties and
|
||||
subnodes were intermingled, the kernel parser requires that the
|
||||
properties come first (up until at least 2.6.22). Any tools
|
||||
manipulating a flattened tree must take care to preserve this
|
||||
constraint.
|
||||
|
||||
4) Device tree "strings" block
|
||||
|
||||
In order to save space, property names, which are generally redundant,
|
||||
@ -1241,6 +1250,12 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
network device. This is used by the bootwrapper to interpret
|
||||
MAC addresses passed by the firmware when no information other
|
||||
than indices is available to associate an address with a device.
|
||||
- phy-connection-type : a string naming the controller/PHY interface type,
|
||||
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
|
||||
"tbi", or "rtbi". This property is only really needed if the connection
|
||||
is of type "rgmii-id", as all other connection types are detected by
|
||||
hardware.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
@ -1782,6 +1797,33 @@ platforms are moved over to use the flattened-device-tree model.
|
||||
partition-names = "fs\0firmware";
|
||||
};
|
||||
|
||||
k) Global Utilities Block
|
||||
|
||||
The global utilities block controls power management, I/O device
|
||||
enabling, power-on-reset configuration monitoring, general-purpose
|
||||
I/O signal configuration, alternate function selection for multiplexed
|
||||
signals, and clock control.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : Should define the compatible device type for
|
||||
global-utilities.
|
||||
- reg : Offset and length of the register set for the device.
|
||||
|
||||
Recommended properties:
|
||||
|
||||
- fsl,has-rstcr : Indicates that the global utilities register set
|
||||
contains a functioning "reset control register" (i.e. the board
|
||||
is wired to reset upon setting the HRESET_REQ bit in this register).
|
||||
|
||||
Example:
|
||||
|
||||
global-utilities@e0000 { /* global utilities block */
|
||||
compatible = "fsl,mpc8548-guts";
|
||||
reg = <e0000 1000>;
|
||||
fsl,has-rstcr;
|
||||
};
|
||||
|
||||
More devices will be defined as this spec matures.
|
||||
|
||||
VII - Specifying interrupt information for devices
|
||||
|
@ -385,7 +385,7 @@ test_PIE:
|
||||
/* not all RTCs support periodic IRQs */
|
||||
if (errno == ENOTTY) {
|
||||
fprintf(stderr, "\nNo periodic IRQ support\n");
|
||||
return 0;
|
||||
goto done;
|
||||
}
|
||||
perror("RTC_IRQP_READ ioctl");
|
||||
exit(errno);
|
||||
|
@ -50,6 +50,9 @@ Supported Cards/Chipsets
|
||||
9005:0285:9005:02be Adaptec 31605 (Marauder160)
|
||||
9005:0285:9005:02c3 Adaptec 51205 (Voodoo120)
|
||||
9005:0285:9005:02c4 Adaptec 51605 (Voodoo160)
|
||||
9005:0285:9005:02ce Adaptec 51245 (Voodoo124)
|
||||
9005:0285:9005:02cf Adaptec 51645 (Voodoo164)
|
||||
9005:0285:9005:02d0 Adaptec 52445 (Voodoo244)
|
||||
1011:0046:9005:0364 Adaptec 5400S (Mustang)
|
||||
9005:0287:9005:0800 Adaptec Themisto (Jupiter)
|
||||
9005:0200:9005:0200 Adaptec Themisto (Jupiter)
|
||||
|
450
Documentation/scsi/scsi_fc_transport.txt
Normal file
450
Documentation/scsi/scsi_fc_transport.txt
Normal file
@ -0,0 +1,450 @@
|
||||
SCSI FC Tansport
|
||||
=============================================
|
||||
|
||||
Date: 4/12/2007
|
||||
Kernel Revisions for features:
|
||||
rports : <<TBS>>
|
||||
vports : 2.6.22 (? TBD)
|
||||
|
||||
|
||||
Introduction
|
||||
============
|
||||
This file documents the features and components of the SCSI FC Transport.
|
||||
It also provides documents the API between the transport and FC LLDDs.
|
||||
The FC transport can be found at:
|
||||
drivers/scsi/scsi_transport_fc.c
|
||||
include/scsi/scsi_transport_fc.h
|
||||
include/scsi/scsi_netlink_fc.h
|
||||
|
||||
This file is found at Documentation/scsi/scsi_fc_transport.txt
|
||||
|
||||
|
||||
FC Remote Ports (rports)
|
||||
========================================================================
|
||||
<< To Be Supplied >>
|
||||
|
||||
|
||||
FC Virtual Ports (vports)
|
||||
========================================================================
|
||||
|
||||
Overview:
|
||||
-------------------------------
|
||||
|
||||
New FC standards have defined mechanisms which allows for a single physical
|
||||
port to appear on as multiple communication ports. Using the N_Port Id
|
||||
Virtualization (NPIV) mechanism, a point-to-point connection to a Fabric
|
||||
can be assigned more than 1 N_Port_ID. Each N_Port_ID appears as a
|
||||
separate port to other endpoints on the fabric, even though it shares one
|
||||
physical link to the switch for communication. Each N_Port_ID can have a
|
||||
unique view of the fabric based on fabric zoning and array lun-masking
|
||||
(just like a normal non-NPIV adapter). Using the Virtual Fabric (VF)
|
||||
mechanism, adding a fabric header to each frame allows the port to
|
||||
interact with the Fabric Port to join multiple fabrics. The port will
|
||||
obtain an N_Port_ID on each fabric it joins. Each fabric will have its
|
||||
own unique view of endpoints and configuration parameters. NPIV may be
|
||||
used together with VF so that the port can obtain multiple N_Port_IDs
|
||||
on each virtual fabric.
|
||||
|
||||
The FC transport is now recognizing a new object - a vport. A vport is
|
||||
an entity that has a world-wide unique World Wide Port Name (wwpn) and
|
||||
World Wide Node Name (wwnn). The transport also allows for the FC4's to
|
||||
be specified for the vport, with FCP_Initiator being the primary role
|
||||
expected. Once instantiated by one of the above methods, it will have a
|
||||
distinct N_Port_ID and view of fabric endpoints and storage entities.
|
||||
The fc_host associated with the physical adapter will export the ability
|
||||
to create vports. The transport will create the vport object within the
|
||||
Linux device tree, and instruct the fc_host's driver to instantiate the
|
||||
virtual port. Typically, the driver will create a new scsi_host instance
|
||||
on the vport, resulting in a unique <H,C,T,L> namespace for the vport.
|
||||
Thus, whether a FC port is based on a physical port or on a virtual port,
|
||||
each will appear as a unique scsi_host with its own target and lun space.
|
||||
|
||||
Note: At this time, the transport is written to create only NPIV-based
|
||||
vports. However, consideration was given to VF-based vports and it
|
||||
should be a minor change to add support if needed. The remaining
|
||||
discussion will concentrate on NPIV.
|
||||
|
||||
Note: World Wide Name assignment (and uniqueness guarantees) are left
|
||||
up to an administrative entity controling the vport. For example,
|
||||
if vports are to be associated with virtual machines, a XEN mgmt
|
||||
utility would be responsible for creating wwpn/wwnn's for the vport,
|
||||
using it's own naming authority and OUI. (Note: it already does this
|
||||
for virtual MAC addresses).
|
||||
|
||||
|
||||
Device Trees and Vport Objects:
|
||||
-------------------------------
|
||||
|
||||
Today, the device tree typically contains the scsi_host object,
|
||||
with rports and scsi target objects underneath it. Currently the FC
|
||||
transport creates the vport object and places it under the scsi_host
|
||||
object corresponding to the physical adapter. The LLDD will allocate
|
||||
a new scsi_host for the vport and link it's object under the vport.
|
||||
The remainder of the tree under the vports scsi_host is the same
|
||||
as the non-NPIV case. The transport is written currently to easily
|
||||
allow the parent of the vport to be something other than the scsi_host.
|
||||
This could be used in the future to link the object onto a vm-specific
|
||||
device tree. If the vport's parent is not the physical port's scsi_host,
|
||||
a symbolic link to the vport object will be placed in the physical
|
||||
port's scsi_host.
|
||||
|
||||
Here's what to expect in the device tree :
|
||||
The typical Physical Port's Scsi_Host:
|
||||
/sys/devices/.../host17/
|
||||
and it has the typical decendent tree:
|
||||
/sys/devices/.../host17/rport-17:0-0/target17:0:0/17:0:0:0:
|
||||
and then the vport is created on the Physical Port:
|
||||
/sys/devices/.../host17/vport-17:0-0
|
||||
and the vport's Scsi_Host is then created:
|
||||
/sys/devices/.../host17/vport-17:0-0/host18
|
||||
and then the rest of the tree progresses, such as:
|
||||
/sys/devices/.../host17/vport-17:0-0/host18/rport-18:0-0/target18:0:0/18:0:0:0:
|
||||
|
||||
Here's what to expect in the sysfs tree :
|
||||
scsi_hosts:
|
||||
/sys/class/scsi_host/host17 physical port's scsi_host
|
||||
/sys/class/scsi_host/host18 vport's scsi_host
|
||||
fc_hosts:
|
||||
/sys/class/fc_host/host17 physical port's fc_host
|
||||
/sys/class/fc_host/host18 vport's fc_host
|
||||
fc_vports:
|
||||
/sys/class/fc_vports/vport-17:0-0 the vport's fc_vport
|
||||
fc_rports:
|
||||
/sys/class/fc_remote_ports/rport-17:0-0 rport on the physical port
|
||||
/sys/class/fc_remote_ports/rport-18:0-0 rport on the vport
|
||||
|
||||
|
||||
Vport Attributes:
|
||||
-------------------------------
|
||||
|
||||
The new fc_vport class object has the following attributes
|
||||
|
||||
node_name: Read_Only
|
||||
The WWNN of the vport
|
||||
|
||||
port_name: Read_Only
|
||||
The WWPN of the vport
|
||||
|
||||
roles: Read_Only
|
||||
Indicates the FC4 roles enabled on the vport.
|
||||
|
||||
symbolic_name: Read_Write
|
||||
A string, appended to the driver's symbolic port name string, which
|
||||
is registered with the switch to identify the vport. For example,
|
||||
a hypervisor could set this string to "Xen Domain 2 VM 5 Vport 2",
|
||||
and this set of identifiers can be seen on switch management screens
|
||||
to identify the port.
|
||||
|
||||
vport_delete: Write_Only
|
||||
When written with a "1", will tear down the vport.
|
||||
|
||||
vport_disable: Write_Only
|
||||
When written with a "1", will transition the vport to a disabled.
|
||||
state. The vport will still be instantiated with the Linux kernel,
|
||||
but it will not be active on the FC link.
|
||||
When written with a "0", will enable the vport.
|
||||
|
||||
vport_last_state: Read_Only
|
||||
Indicates the previous state of the vport. See the section below on
|
||||
"Vport States".
|
||||
|
||||
vport_state: Read_Only
|
||||
Indicates the state of the vport. See the section below on
|
||||
"Vport States".
|
||||
|
||||
vport_type: Read_Only
|
||||
Reflects the FC mechanism used to create the virtual port.
|
||||
Only NPIV is supported currently.
|
||||
|
||||
|
||||
For the fc_host class object, the following attributes are added for vports:
|
||||
|
||||
max_npiv_vports: Read_Only
|
||||
Indicates the maximum number of NPIV-based vports that the
|
||||
driver/adapter can support on the fc_host.
|
||||
|
||||
npiv_vports_inuse: Read_Only
|
||||
Indicates how many NPIV-based vports have been instantiated on the
|
||||
fc_host.
|
||||
|
||||
vport_create: Write_Only
|
||||
A "simple" create interface to instantiate a vport on an fc_host.
|
||||
A "<WWPN>:<WWNN>" string is written to the attribute. The transport
|
||||
then instantiates the vport object and calls the LLDD to create the
|
||||
vport with the role of FCP_Initiator. Each WWN is specified as 16
|
||||
hex characters and may *not* contain any prefixes (e.g. 0x, x, etc).
|
||||
|
||||
vport_delete: Write_Only
|
||||
A "simple" delete interface to teardown a vport. A "<WWPN>:<WWNN>"
|
||||
string is written to the attribute. The transport will locate the
|
||||
vport on the fc_host with the same WWNs and tear it down. Each WWN
|
||||
is specified as 16 hex characters and may *not* contain any prefixes
|
||||
(e.g. 0x, x, etc).
|
||||
|
||||
|
||||
Vport States:
|
||||
-------------------------------
|
||||
|
||||
Vport instantiation consists of two parts:
|
||||
- Creation with the kernel and LLDD. This means all transport and
|
||||
driver data structures are built up, and device objects created.
|
||||
This is equivalent to a driver "attach" on an adapter, which is
|
||||
independent of the adapter's link state.
|
||||
- Instantiation of the vport on the FC link via ELS traffic, etc.
|
||||
This is equivalent to a "link up" and successfull link initialization.
|
||||
Futher information can be found in the interfaces section below for
|
||||
Vport Creation.
|
||||
|
||||
Once a vport has been instantiated with the kernel/LLDD, a vport state
|
||||
can be reported via the sysfs attribute. The following states exist:
|
||||
|
||||
FC_VPORT_UNKNOWN - Unknown
|
||||
An temporary state, typically set only while the vport is being
|
||||
instantiated with the kernel and LLDD.
|
||||
|
||||
FC_VPORT_ACTIVE - Active
|
||||
The vport has been successfully been created on the FC link.
|
||||
It is fully functional.
|
||||
|
||||
FC_VPORT_DISABLED - Disabled
|
||||
The vport instantiated, but "disabled". The vport is not instantiated
|
||||
on the FC link. This is equivalent to a physical port with the
|
||||
link "down".
|
||||
|
||||
FC_VPORT_LINKDOWN - Linkdown
|
||||
The vport is not operational as the physical link is not operational.
|
||||
|
||||
FC_VPORT_INITIALIZING - Initializing
|
||||
The vport is in the process of instantiating on the FC link.
|
||||
The LLDD will set this state just prior to starting the ELS traffic
|
||||
to create the vport. This state will persist until the vport is
|
||||
successfully created (state becomes FC_VPORT_ACTIVE) or it fails
|
||||
(state is one of the values below). As this state is transitory,
|
||||
it will not be preserved in the "vport_last_state".
|
||||
|
||||
FC_VPORT_NO_FABRIC_SUPP - No Fabric Support
|
||||
The vport is not operational. One of the following conditions were
|
||||
encountered:
|
||||
- The FC topology is not Point-to-Point
|
||||
- The FC port is not connected to an F_Port
|
||||
- The F_Port has indicated that NPIV is not supported.
|
||||
|
||||
FC_VPORT_NO_FABRIC_RSCS - No Fabric Resources
|
||||
The vport is not operational. The Fabric failed FDISC with a status
|
||||
indicating that it does not have sufficient resources to complete
|
||||
the operation.
|
||||
|
||||
FC_VPORT_FABRIC_LOGOUT - Fabric Logout
|
||||
The vport is not operational. The Fabric has LOGO'd the N_Port_ID
|
||||
associated with the vport.
|
||||
|
||||
FC_VPORT_FABRIC_REJ_WWN - Fabric Rejected WWN
|
||||
The vport is not operational. The Fabric failed FDISC with a status
|
||||
indicating that the WWN's are not valid.
|
||||
|
||||
FC_VPORT_FAILED - VPort Failed
|
||||
The vport is not operational. This is a catchall for all other
|
||||
error conditions.
|
||||
|
||||
|
||||
The following state table indicates the different state transitions:
|
||||
|
||||
State Event New State
|
||||
--------------------------------------------------------------------
|
||||
n/a Initialization Unknown
|
||||
Unknown: Link Down Linkdown
|
||||
Link Up & Loop No Fabric Support
|
||||
Link Up & no Fabric No Fabric Support
|
||||
Link Up & FLOGI response No Fabric Support
|
||||
indicates no NPIV support
|
||||
Link Up & FDISC being sent Initializing
|
||||
Disable request Disable
|
||||
Linkdown: Link Up Unknown
|
||||
Initializing: FDISC ACC Active
|
||||
FDISC LS_RJT w/ no resources No Fabric Resources
|
||||
FDISC LS_RJT w/ invalid Fabric Rejected WWN
|
||||
pname or invalid nport_id
|
||||
FDISC LS_RJT failed for Vport Failed
|
||||
other reasons
|
||||
Link Down Linkdown
|
||||
Disable request Disable
|
||||
Disable: Enable request Unknown
|
||||
Active: LOGO received from fabric Fabric Logout
|
||||
Link Down Linkdown
|
||||
Disable request Disable
|
||||
Fabric Logout: Link still up Unknown
|
||||
|
||||
The following 4 error states all have the same transitions:
|
||||
No Fabric Support:
|
||||
No Fabric Resources:
|
||||
Fabric Rejected WWN:
|
||||
Vport Failed:
|
||||
Disable request Disable
|
||||
Link goes down Linkdown
|
||||
|
||||
|
||||
Transport <-> LLDD Interfaces :
|
||||
-------------------------------
|
||||
|
||||
Vport support by LLDD:
|
||||
|
||||
The LLDD indicates support for vports by supplying a vport_create()
|
||||
function in the transport template. The presense of this function will
|
||||
cause the creation of the new attributes on the fc_host. As part of
|
||||
the physical port completing its initialization relative to the
|
||||
transport, it should set the max_npiv_vports attribute to indicate the
|
||||
maximum number of vports the driver and/or adapter supports.
|
||||
|
||||
|
||||
Vport Creation:
|
||||
|
||||
The LLDD vport_create() syntax is:
|
||||
|
||||
int vport_create(struct fc_vport *vport, bool disable)
|
||||
|
||||
where:
|
||||
vport: Is the newly allocated vport object
|
||||
disable: If "true", the vport is to be created in a disabled stated.
|
||||
If "false", the vport is to be enabled upon creation.
|
||||
|
||||
When a request is made to create a new vport (via sgio/netlink, or the
|
||||
vport_create fc_host attribute), the transport will validate that the LLDD
|
||||
can support another vport (e.g. max_npiv_vports > npiv_vports_inuse).
|
||||
If not, the create request will be failed. If space remains, the transport
|
||||
will increment the vport count, create the vport object, and then call the
|
||||
LLDD's vport_create() function with the newly allocated vport object.
|
||||
|
||||
As mentioned above, vport creation is divided into two parts:
|
||||
- Creation with the kernel and LLDD. This means all transport and
|
||||
driver data structures are built up, and device objects created.
|
||||
This is equivalent to a driver "attach" on an adapter, which is
|
||||
independent of the adapter's link state.
|
||||
- Instantiation of the vport on the FC link via ELS traffic, etc.
|
||||
This is equivalent to a "link up" and successfull link initialization.
|
||||
|
||||
The LLDD's vport_create() function will not synchronously wait for both
|
||||
parts to be fully completed before returning. It must validate that the
|
||||
infrastructure exists to support NPIV, and complete the first part of
|
||||
vport creation (data structure build up) before returning. We do not
|
||||
hinge vport_create() on the link-side operation mainly because:
|
||||
- The link may be down. It is not a failure if it is. It simply
|
||||
means the vport is in an inoperable state until the link comes up.
|
||||
This is consistent with the link bouncing post vport creation.
|
||||
- The vport may be created in a disabled state.
|
||||
- This is consistent with a model where: the vport equates to a
|
||||
FC adapter. The vport_create is synonymous with driver attachment
|
||||
to the adapter, which is independent of link state.
|
||||
|
||||
Note: special error codes have been defined to delineate infrastructure
|
||||
failure cases for quicker resolution.
|
||||
|
||||
The expected behavior for the LLDD's vport_create() function is:
|
||||
- Validate Infrastructure:
|
||||
- If the driver or adapter cannot support another vport, whether
|
||||
due to improper firmware, (a lie about) max_npiv, or a lack of
|
||||
some other resource - return VPCERR_UNSUPPORTED.
|
||||
- If the driver validates the WWN's against those already active on
|
||||
the adapter and detects an overlap - return VPCERR_BAD_WWN.
|
||||
- If the driver detects the topology is loop, non-fabric, or the
|
||||
FLOGI did not support NPIV - return VPCERR_NO_FABRIC_SUPP.
|
||||
- Allocate data structures. If errors are encountered, such as out
|
||||
of memory conditions, return the respective negative Exxx error code.
|
||||
- If the role is FCP Initiator, the LLDD is to :
|
||||
- Call scsi_host_alloc() to allocate a scsi_host for the vport.
|
||||
- Call scsi_add_host(new_shost, &vport->dev) to start the scsi_host
|
||||
and bind it as a child of the vport device.
|
||||
- Initializes the fc_host attribute values.
|
||||
- Kick of further vport state transitions based on the disable flag and
|
||||
link state - and return success (zero).
|
||||
|
||||
LLDD Implementers Notes:
|
||||
- It is suggested that there be a different fc_function_templates for
|
||||
the physical port and the virtual port. The physical port's template
|
||||
would have the vport_create, vport_delete, and vport_disable functions,
|
||||
while the vports would not.
|
||||
- It is suggested that there be different scsi_host_templates
|
||||
for the physical port and virtual port. Likely, there are driver
|
||||
attributes, embedded into the scsi_host_template, that are applicable
|
||||
for the physical port only (link speed, topology setting, etc). This
|
||||
ensures that the attributes are applicable to the respective scsi_host.
|
||||
|
||||
|
||||
Vport Disable/Enable:
|
||||
|
||||
The LLDD vport_disable() syntax is:
|
||||
|
||||
int vport_disable(struct fc_vport *vport, bool disable)
|
||||
|
||||
where:
|
||||
vport: Is vport to to be enabled or disabled
|
||||
disable: If "true", the vport is to be disabled.
|
||||
If "false", the vport is to be enabled.
|
||||
|
||||
When a request is made to change the disabled state on a vport, the
|
||||
transport will validate the request against the existing vport state.
|
||||
If the request is to disable and the vport is already disabled, the
|
||||
request will fail. Similarly, if the request is to enable, and the
|
||||
vport is not in a disabled state, the request will fail. If the request
|
||||
is valid for the vport state, the transport will call the LLDD to
|
||||
change the vport's state.
|
||||
|
||||
Within the LLDD, if a vport is disabled, it remains instantiated with
|
||||
the kernel and LLDD, but it is not active or visible on the FC link in
|
||||
any way. (see Vport Creation and the 2 part instantiation discussion).
|
||||
The vport will remain in this state until it is deleted or re-enabled.
|
||||
When enabling a vport, the LLDD reinstantiates the vport on the FC
|
||||
link - essentially restarting the LLDD statemachine (see Vport States
|
||||
above).
|
||||
|
||||
|
||||
Vport Deletion:
|
||||
|
||||
The LLDD vport_delete() syntax is:
|
||||
|
||||
int vport_delete(struct fc_vport *vport)
|
||||
|
||||
where:
|
||||
vport: Is vport to delete
|
||||
|
||||
When a request is made to delete a vport (via sgio/netlink, or via the
|
||||
fc_host or fc_vport vport_delete attributes), the transport will call
|
||||
the LLDD to terminate the vport on the FC link, and teardown all other
|
||||
datastructures and references. If the LLDD completes successfully,
|
||||
the transport will teardown the vport objects and complete the vport
|
||||
removal. If the LLDD delete request fails, the vport object will remain,
|
||||
but will be in an indeterminate state.
|
||||
|
||||
Within the LLDD, the normal code paths for a scsi_host teardown should
|
||||
be followed. E.g. If the vport has a FCP Initiator role, the LLDD
|
||||
will call fc_remove_host() for the vports scsi_host, followed by
|
||||
scsi_remove_host() and scsi_host_put() for the vports scsi_host.
|
||||
|
||||
|
||||
Other:
|
||||
fc_host port_type attribute:
|
||||
There is a new fc_host port_type value - FC_PORTTYPE_NPIV. This value
|
||||
must be set on all vport-based fc_hosts. Normally, on a physical port,
|
||||
the port_type attribute would be set to NPORT, NLPORT, etc based on the
|
||||
topology type and existence of the fabric. As this is not applicable to
|
||||
a vport, it makes more sense to report the FC mechanism used to create
|
||||
the vport.
|
||||
|
||||
Driver unload:
|
||||
FC drivers are required to call fc_remove_host() prior to calling
|
||||
scsi_remove_host(). This allows the fc_host to tear down all remote
|
||||
ports prior the scsi_host being torn down. The fc_remove_host() call
|
||||
was updated to remove all vports for the fc_host as well.
|
||||
|
||||
|
||||
Credits
|
||||
=======
|
||||
The following people have contributed to this document:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
James Smart
|
||||
james.smart@emulex.com
|
||||
|
@ -467,7 +467,12 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
above explicitly.
|
||||
|
||||
The power-management is supported.
|
||||
|
||||
|
||||
Module snd-cs5530
|
||||
_________________
|
||||
|
||||
Module for Cyrix/NatSemi Geode 5530 chip.
|
||||
|
||||
Module snd-cs5535audio
|
||||
----------------------
|
||||
|
||||
@ -759,6 +764,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
|
||||
model - force the model name
|
||||
position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size)
|
||||
probe_mask - Bitmask to probe codecs (default = -1, meaning all slots)
|
||||
single_cmd - Use single immediate commands to communicate with
|
||||
codecs (for debugging only)
|
||||
enable_msi - Enable Message Signaled Interrupt (MSI) (default = off)
|
||||
@ -803,6 +809,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
hp-3013 HP machines (3013-variant)
|
||||
fujitsu Fujitsu S7020
|
||||
acer Acer TravelMate
|
||||
will Will laptops (PB V7900)
|
||||
replacer Replacer 672V
|
||||
basic fixed pin assignment (old default model)
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
@ -811,16 +819,31 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
hp-bpc HP xw4400/6400/8400/9400 laptops
|
||||
hp-bpc-d7000 HP BPC D7000
|
||||
benq Benq ED8
|
||||
benq-t31 Benq T31
|
||||
hippo Hippo (ATI) with jack detection, Sony UX-90s
|
||||
hippo_1 Hippo (Benq) with jack detection
|
||||
sony-assamd Sony ASSAMD
|
||||
basic fixed pin assignment w/o SPDIF
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC268
|
||||
3stack 3-stack model
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC662
|
||||
3stack-dig 3-stack (2-channel) with SPDIF
|
||||
3stack-6ch 3-stack (6-channel)
|
||||
3stack-6ch-dig 3-stack (6-channel) with SPDIF
|
||||
6stack-dig 6-stack with SPDIF
|
||||
lenovo-101e Lenovo laptop
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC882/885
|
||||
3stack-dig 3-jack with SPDIF I/O
|
||||
6stack-dig 6-jack digital with SPDIF I/O
|
||||
arima Arima W820Di1
|
||||
macpro MacPro support
|
||||
imac24 iMac 24'' with jack detection
|
||||
w2jc ASUS W2JC
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
@ -832,9 +855,15 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
6stack-dig-demo 6-jack digital for Intel demo board
|
||||
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
|
||||
medion Medion Laptops
|
||||
medion-md2 Medion MD2
|
||||
targa-dig Targa/MSI
|
||||
targa-2ch-dig Targs/MSI with 2-channel
|
||||
laptop-eapd 3-jack with SPDIF I/O and EAPD (Clevo M540JE, M550JE)
|
||||
lenovo-101e Lenovo 101E
|
||||
lenovo-nb0763 Lenovo NB0763
|
||||
lenovo-ms7195-dig Lenovo MS7195
|
||||
6stack-hp HP machines with 6stack (Nettle boards)
|
||||
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
ALC861/660
|
||||
@ -853,7 +882,9 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
3stack-dig 3-jack with SPDIF OUT
|
||||
6stack-dig 6-jack with SPDIF OUT
|
||||
3stack-660 3-jack (for ALC660VD)
|
||||
3stack-660-digout 3-jack with SPDIF OUT (for ALC660VD)
|
||||
lenovo Lenovo 3000 C200
|
||||
dallas Dallas laptops
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
CMI9880
|
||||
@ -864,12 +895,26 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
allout 5-jack in back, 2-jack in front, SPDIF out
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
AD1882
|
||||
3stack 3-stack mode (default)
|
||||
6stack 6-stack mode
|
||||
|
||||
AD1884
|
||||
N/A
|
||||
|
||||
AD1981
|
||||
basic 3-jack (default)
|
||||
hp HP nx6320
|
||||
thinkpad Lenovo Thinkpad T60/X60/Z60
|
||||
toshiba Toshiba U205
|
||||
|
||||
AD1983
|
||||
N/A
|
||||
|
||||
AD1984
|
||||
basic default configuration
|
||||
thinkpad Lenovo Thinkpad T61/X61
|
||||
|
||||
AD1986A
|
||||
6stack 6-jack, separate surrounds (default)
|
||||
3stack 3-stack, shared surrounds
|
||||
@ -907,11 +952,18 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
ref Reference board
|
||||
3stack D945 3stack
|
||||
5stack D945 5stack + SPDIF
|
||||
macmini Intel Mac Mini
|
||||
macbook Intel Mac Book
|
||||
macbook-pro-v1 Intel Mac Book Pro 1st generation
|
||||
macbook-pro Intel Mac Book Pro 2nd generation
|
||||
imac-intel Intel iMac
|
||||
dell Dell XPS M1210
|
||||
intel-mac-v1 Intel Mac Type 1
|
||||
intel-mac-v2 Intel Mac Type 2
|
||||
intel-mac-v3 Intel Mac Type 3
|
||||
intel-mac-v4 Intel Mac Type 4
|
||||
intel-mac-v5 Intel Mac Type 5
|
||||
macmini Intel Mac Mini (equivalent with type 3)
|
||||
macbook Intel Mac Book (eq. type 5)
|
||||
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
||||
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||
imac-intel Intel iMac (eq. type 2)
|
||||
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
||||
|
||||
STAC9202/9250/9251
|
||||
ref Reference board, base config
|
||||
@ -956,6 +1008,17 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
from the irq. Remember this is a last resort, and should be
|
||||
avoided as much as possible...
|
||||
|
||||
MORE NOTES ON "azx_get_response timeout" PROBLEMS:
|
||||
On some hardwares, you may need to add a proper probe_mask option
|
||||
to avoid the "azx_get_response timeout" problem above, instead.
|
||||
This occurs when the access to non-existing or non-working codec slot
|
||||
(likely a modem one) causes a stall of the communication via HD-audio
|
||||
bus. You can see which codec slots are probed by enabling
|
||||
CONFIG_SND_DEBUG_DETECT, or simply from the file name of the codec
|
||||
proc files. Then limit the slots to probe by probe_mask option.
|
||||
For example, probe_mask=1 means to probe only the first slot, and
|
||||
probe_mask=4 means only the third slot.
|
||||
|
||||
The power-management is supported.
|
||||
|
||||
Module snd-hdsp
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user