| Ioctl Numbers | |
| 19 October 1999 | |
| Michael Elizabeth Chastain | |
| <mec@shout.net> | |
| If you are adding new ioctl's to the kernel, you should use the _IO | |
| macros defined in <linux/ioctl.h>: | |
| _IO an ioctl with no parameters | |
| _IOW an ioctl with write parameters (copy_from_user) | |
| _IOR an ioctl with read parameters (copy_to_user) | |
| _IOWR an ioctl with both write and read parameters. | |
| 'Write' and 'read' are from the user's point of view, just like the | |
| system calls 'write' and 'read'. For example, a SET_FOO ioctl would | |
| be _IOW, although the kernel would actually read data from user space; | |
| a GET_FOO ioctl would be _IOR, although the kernel would actually write | |
| data to user space. | |
| The first argument to _IO, _IOW, _IOR, or _IOWR is an identifying letter | |
| or number from the table below. Because of the large number of drivers, | |
| many drivers share a partial letter with other drivers. | |
| If you are writing a driver for a new device and need a letter, pick an | |
| unused block with enough room for expansion: 32 to 256 ioctl commands. | |
| You can register the block by patching this file and submitting the | |
| patch to Linus Torvalds. Or you can e-mail me at <mec@shout.net> and | |
| I'll register one for you. | |
| The second argument to _IO, _IOW, _IOR, or _IOWR is a sequence number | |
| to distinguish ioctls from each other. The third argument to _IOW, | |
| _IOR, or _IOWR is the type of the data going into the kernel or coming | |
| out of the kernel (e.g. 'int' or 'struct foo'). NOTE! Do NOT use | |
| sizeof(arg) as the third argument as this results in your ioctl thinking | |
| it passes an argument of type size_t. | |
| Some devices use their major number as the identifier; this is OK, as | |
| long as it is unique. Some devices are irregular and don't follow any | |
| convention at all. | |
| Following this convention is good because: | |
| (1) Keeping the ioctl's globally unique helps error checking: | |
| if a program calls an ioctl on the wrong device, it will get an | |
| error rather than some unexpected behaviour. | |
| (2) The 'strace' build procedure automatically finds ioctl numbers | |
| defined with _IO, _IOW, _IOR, or _IOWR. | |
| (3) 'strace' can decode numbers back into useful names when the | |
| numbers are unique. | |
| (4) People looking for ioctls can grep for them more easily when | |
| this convention is used to define the ioctl numbers. | |
| (5) When following the convention, the driver code can use generic | |
| code to copy the parameters between user and kernel space. | |
| This table lists ioctls visible from user land for Linux/i386. It contains | |
| most drivers up to 2.3.14, but I know I am missing some. | |
| Code Seq# Include File Comments | |
| ======================================================== | |
| 0x00 00-1F linux/fs.h conflict! | |
| 0x00 00-1F scsi/scsi_ioctl.h conflict! | |
| 0x00 00-1F linux/fb.h conflict! | |
| 0x00 00-1F linux/wavefront.h conflict! | |
| 0x02 all linux/fd.h | |
| 0x03 all linux/hdreg.h | |
| 0x04 all linux/umsdos_fs.h | |
| 0x06 all linux/lp.h | |
| 0x09 all linux/md.h | |
| 0x12 all linux/fs.h | |
| linux/blkpg.h | |
| 0x1b all InfiniBand Subsystem <http://www.openib.org/> | |
| 0x20 all drivers/cdrom/cm206.h | |
| 0x22 all scsi/sg.h | |
| '#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem | |
| '1' 00-1F <linux/timepps.h> PPS kit from Ulrich Windl | |
| <ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/> | |
| '8' all SNP8023 advanced NIC card | |
| <mailto:mcr@solidum.com> | |
| 'A' 00-1F linux/apm_bios.h | |
| 'B' C0-FF advanced bbus | |
| <mailto:maassen@uni-freiburg.de> | |
| 'C' all linux/soundcard.h | |
| 'D' all asm-s390/dasd.h | |
| 'E' all linux/input.h | |
| 'F' all linux/fb.h | |
| 'H' all linux/hiddev.h | |
| 'I' all linux/isdn.h | |
| 'J' 00-1F drivers/scsi/gdth_ioctl.h | |
| 'K' all linux/kd.h | |
| 'L' 00-1F linux/loop.h | |
| 'L' E0-FF linux/ppdd.h encrypted disk device driver | |
| <http://linux01.gwdg.de/~alatham/ppdd.html> | |
| 'M' all linux/soundcard.h conflict! | |
| 'M' 00-1F linux/isicom.h conflict! | |
| 'N' 00-1F drivers/usb/scanner.h | |
| 'P' all linux/soundcard.h | |
| 'Q' all linux/soundcard.h | |
| 'R' 00-1F linux/random.h | |
| 'S' all linux/cdrom.h conflict! | |
| 'S' 80-81 scsi/scsi_ioctl.h conflict! | |
| 'S' 82-FF scsi/scsi.h conflict! | |
| 'T' all linux/soundcard.h conflict! | |
| 'T' all asm-i386/ioctls.h conflict! | |
| 'U' 00-EF linux/drivers/usb/usb.h | |
| 'U' F0-FF drivers/usb/auerswald.c | |
| 'V' all linux/vt.h | |
| 'W' 00-1F linux/watchdog.h conflict! | |
| 'W' 00-1F linux/wanrouter.h conflict! | |
| 'X' all linux/xfs_fs.h | |
| 'Y' all linux/cyclades.h | |
| 'a' all ATM on linux | |
| <http://lrcwww.epfl.ch/linux-atm/magic.html> | |
| 'b' 00-FF bit3 vme host bridge | |
| <mailto:natalia@nikhefk.nikhef.nl> | |
| 'c' 00-7F linux/comstats.h conflict! | |
| 'c' 00-7F linux/coda.h conflict! | |
| 'd' 00-FF linux/char/drm/drm/h conflict! | |
| 'd' 00-DF linux/video_decoder.h conflict! | |
| 'd' F0-FF linux/digi1.h | |
| 'e' all linux/digi1.h conflict! | |
| 'e' 00-1F linux/video_encoder.h conflict! | |
| 'e' 00-1F net/irda/irtty.h conflict! | |
| 'f' 00-1F linux/ext2_fs.h | |
| 'h' 00-7F Charon filesystem | |
| <mailto:zapman@interlan.net> | |
| 'i' 00-3F linux/i2o.h | |
| 'j' 00-3F linux/joystick.h | |
| 'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system | |
| <http://mikonos.dia.unisa.it/tcfs> | |
| 'l' 40-7F linux/udf_fs_i.h in development: | |
| <http://sourceforge.net/projects/linux-udf/> | |
| 'm' all linux/mtio.h conflict! | |
| 'm' all linux/soundcard.h conflict! | |
| 'm' all linux/synclink.h conflict! | |
| 'm' 00-1F net/irda/irmod.h conflict! | |
| 'n' 00-7F linux/ncp_fs.h | |
| 'n' E0-FF video/matrox.h matroxfb | |
| 'p' 00-3F linux/mc146818rtc.h | |
| 'p' 40-7F linux/nvram.h | |
| 'p' 80-9F user-space parport | |
| <mailto:tim@cyberelk.net> | |
| 'q' 00-1F linux/serio.h | |
| 'q' 80-FF Internet PhoneJACK, Internet LineJACK | |
| <http://www.quicknet.net> | |
| 'r' 00-1F linux/msdos_fs.h | |
| 's' all linux/cdk.h | |
| 't' 00-7F linux/if_ppp.h | |
| 't' 80-8F linux/isdn_ppp.h | |
| 'u' 00-1F linux/smb_fs.h | |
| 'v' 00-1F linux/ext2_fs.h conflict! | |
| 'v' all linux/videodev.h conflict! | |
| 'w' all CERN SCI driver | |
| 'y' 00-1F packet based user level communications | |
| <mailto:zapman@interlan.net> | |
| 'z' 00-3F CAN bus card | |
| <mailto:hdstich@connectu.ulm.circular.de> | |
| 'z' 40-7F CAN bus card | |
| <mailto:oe@port.de> | |
| 0x80 00-1F linux/fb.h | |
| 0x81 00-1F linux/videotext.h | |
| 0x89 00-06 asm-i386/sockios.h | |
| 0x89 0B-DF linux/sockios.h | |
| 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range | |
| 0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range | |
| 0x8B all linux/wireless.h | |
| 0x8C 00-3F WiNRADiO driver | |
| <http://www.proximity.com.au/~brian/winradio/> | |
| 0x90 00 drivers/cdrom/sbpcd.h | |
| 0x93 60-7F linux/auto_fs.h | |
| 0x99 00-0F 537-Addinboard driver | |
| <mailto:buk@buks.ipn.de> | |
| 0xA0 all linux/sdp/sdp.h Industrial Device Project | |
| <mailto:kenji@bitgate.com> | |
| 0xA3 80-8F Port ACL in development: | |
| <mailto:tlewis@mindspring.com> | |
| 0xA3 90-9F linux/dtlk.h | |
| 0xAB 00-1F linux/nbd.h | |
| 0xAC 00-1F linux/raw.h | |
| 0xAD 00 Netfilter device in development: | |
| <mailto:rusty@rustcorp.com.au> | |
| 0xB0 all RATIO devices in development: | |
| <mailto:vgo@ratio.de> | |
| 0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca> | |
| 0xCB 00-1F CBM serial IEC bus in development: | |
| <mailto:michael.klein@puffin.lb.shuttle.de> | |
| 0xDD 00-3F ZFCP device driver see drivers/s390/scsi/ | |
| <mailto:aherrman@de.ibm.com> | |
| 0xF3 00-3F video/sisfb.h sisfb (in development) | |
| <mailto:thomas@winischhofer.net> |