Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Ioctl Numbers |
| 2 | 19 October 1999 |
| 3 | Michael Elizabeth Chastain |
| 4 | <mec@shout.net> |
| 5 | |
| 6 | If you are adding new ioctl's to the kernel, you should use the _IO |
| 7 | macros defined in <linux/ioctl.h>: |
| 8 | |
| 9 | _IO an ioctl with no parameters |
| 10 | _IOW an ioctl with write parameters (copy_from_user) |
| 11 | _IOR an ioctl with read parameters (copy_to_user) |
| 12 | _IOWR an ioctl with both write and read parameters. |
| 13 | |
| 14 | 'Write' and 'read' are from the user's point of view, just like the |
| 15 | system calls 'write' and 'read'. For example, a SET_FOO ioctl would |
| 16 | be _IOW, although the kernel would actually read data from user space; |
| 17 | a GET_FOO ioctl would be _IOR, although the kernel would actually write |
| 18 | data to user space. |
| 19 | |
| 20 | The first argument to _IO, _IOW, _IOR, or _IOWR is an identifying letter |
| 21 | or number from the table below. Because of the large number of drivers, |
| 22 | many drivers share a partial letter with other drivers. |
| 23 | |
| 24 | If you are writing a driver for a new device and need a letter, pick an |
| 25 | unused block with enough room for expansion: 32 to 256 ioctl commands. |
| 26 | You can register the block by patching this file and submitting the |
| 27 | patch to Linus Torvalds. Or you can e-mail me at <mec@shout.net> and |
| 28 | I'll register one for you. |
| 29 | |
| 30 | The second argument to _IO, _IOW, _IOR, or _IOWR is a sequence number |
| 31 | to distinguish ioctls from each other. The third argument to _IOW, |
| 32 | _IOR, or _IOWR is the type of the data going into the kernel or coming |
| 33 | out of the kernel (e.g. 'int' or 'struct foo'). NOTE! Do NOT use |
| 34 | sizeof(arg) as the third argument as this results in your ioctl thinking |
| 35 | it passes an argument of type size_t. |
| 36 | |
| 37 | Some devices use their major number as the identifier; this is OK, as |
| 38 | long as it is unique. Some devices are irregular and don't follow any |
| 39 | convention at all. |
| 40 | |
| 41 | Following this convention is good because: |
| 42 | |
| 43 | (1) Keeping the ioctl's globally unique helps error checking: |
| 44 | if a program calls an ioctl on the wrong device, it will get an |
| 45 | error rather than some unexpected behaviour. |
| 46 | |
| 47 | (2) The 'strace' build procedure automatically finds ioctl numbers |
| 48 | defined with _IO, _IOW, _IOR, or _IOWR. |
| 49 | |
| 50 | (3) 'strace' can decode numbers back into useful names when the |
| 51 | numbers are unique. |
| 52 | |
| 53 | (4) People looking for ioctls can grep for them more easily when |
| 54 | this convention is used to define the ioctl numbers. |
| 55 | |
| 56 | (5) When following the convention, the driver code can use generic |
| 57 | code to copy the parameters between user and kernel space. |
| 58 | |
| 59 | This table lists ioctls visible from user land for Linux/i386. It contains |
| 60 | most drivers up to 2.3.14, but I know I am missing some. |
| 61 | |
| 62 | Code Seq# Include File Comments |
| 63 | ======================================================== |
| 64 | 0x00 00-1F linux/fs.h conflict! |
| 65 | 0x00 00-1F scsi/scsi_ioctl.h conflict! |
| 66 | 0x00 00-1F linux/fb.h conflict! |
| 67 | 0x00 00-1F linux/wavefront.h conflict! |
| 68 | 0x02 all linux/fd.h |
| 69 | 0x03 all linux/hdreg.h |
| 70 | 0x04 all linux/umsdos_fs.h |
| 71 | 0x06 all linux/lp.h |
| 72 | 0x09 all linux/md.h |
| 73 | 0x12 all linux/fs.h |
| 74 | linux/blkpg.h |
| 75 | 0x1b all InfiniBand Subsystem <http://www.openib.org/> |
| 76 | 0x20 all drivers/cdrom/cm206.h |
| 77 | 0x22 all scsi/sg.h |
| 78 | '#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem |
| 79 | '1' 00-1F <linux/timepps.h> PPS kit from Ulrich Windl |
| 80 | <ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 81 | '8' all SNP8023 advanced NIC card |
| 82 | <mailto:mcr@solidum.com> |
| 83 | 'A' 00-1F linux/apm_bios.h |
| 84 | 'B' C0-FF advanced bbus |
| 85 | <mailto:maassen@uni-freiburg.de> |
| 86 | 'C' all linux/soundcard.h |
| 87 | 'D' all asm-s390/dasd.h |
bjdouma | cb259f0 | 2006-06-23 02:05:53 -0700 | [diff] [blame] | 88 | 'E' all linux/input.h |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 89 | 'F' all linux/fb.h |
bjdouma | cb259f0 | 2006-06-23 02:05:53 -0700 | [diff] [blame] | 90 | 'H' all linux/hiddev.h |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 91 | 'I' all linux/isdn.h |
| 92 | 'J' 00-1F drivers/scsi/gdth_ioctl.h |
| 93 | 'K' all linux/kd.h |
| 94 | 'L' 00-1F linux/loop.h |
| 95 | 'L' E0-FF linux/ppdd.h encrypted disk device driver |
| 96 | <http://linux01.gwdg.de/~alatham/ppdd.html> |
Jiri Slaby | 765d94c | 2007-02-10 01:45:17 -0800 | [diff] [blame] | 97 | 'M' all linux/soundcard.h |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 98 | 'N' 00-1F drivers/usb/scanner.h |
| 99 | 'P' all linux/soundcard.h |
| 100 | 'Q' all linux/soundcard.h |
| 101 | 'R' 00-1F linux/random.h |
| 102 | 'S' all linux/cdrom.h conflict! |
| 103 | 'S' 80-81 scsi/scsi_ioctl.h conflict! |
| 104 | 'S' 82-FF scsi/scsi.h conflict! |
| 105 | 'T' all linux/soundcard.h conflict! |
| 106 | 'T' all asm-i386/ioctls.h conflict! |
| 107 | 'U' 00-EF linux/drivers/usb/usb.h |
| 108 | 'U' F0-FF drivers/usb/auerswald.c |
| 109 | 'V' all linux/vt.h |
| 110 | 'W' 00-1F linux/watchdog.h conflict! |
| 111 | 'W' 00-1F linux/wanrouter.h conflict! |
| 112 | 'X' all linux/xfs_fs.h |
| 113 | 'Y' all linux/cyclades.h |
| 114 | 'a' all ATM on linux |
| 115 | <http://lrcwww.epfl.ch/linux-atm/magic.html> |
| 116 | 'b' 00-FF bit3 vme host bridge |
| 117 | <mailto:natalia@nikhefk.nikhef.nl> |
| 118 | 'c' 00-7F linux/comstats.h conflict! |
| 119 | 'c' 00-7F linux/coda.h conflict! |
| 120 | 'd' 00-FF linux/char/drm/drm/h conflict! |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 121 | 'd' 00-DF linux/video_decoder.h conflict! |
| 122 | 'd' F0-FF linux/digi1.h |
| 123 | 'e' all linux/digi1.h conflict! |
| 124 | 'e' 00-1F linux/video_encoder.h conflict! |
| 125 | 'e' 00-1F net/irda/irtty.h conflict! |
| 126 | 'f' 00-1F linux/ext2_fs.h |
| 127 | 'h' 00-7F Charon filesystem |
| 128 | <mailto:zapman@interlan.net> |
| 129 | 'i' 00-3F linux/i2o.h |
| 130 | 'j' 00-3F linux/joystick.h |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 131 | 'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system |
| 132 | <http://mikonos.dia.unisa.it/tcfs> |
| 133 | 'l' 40-7F linux/udf_fs_i.h in development: |
Randy Dunlap | 98766fb | 2005-11-21 21:32:31 -0800 | [diff] [blame] | 134 | <http://sourceforge.net/projects/linux-udf/> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 | 'm' all linux/mtio.h conflict! |
| 136 | 'm' all linux/soundcard.h conflict! |
| 137 | 'm' all linux/synclink.h conflict! |
| 138 | 'm' 00-1F net/irda/irmod.h conflict! |
| 139 | 'n' 00-7F linux/ncp_fs.h |
| 140 | 'n' E0-FF video/matrox.h matroxfb |
Jiri Slaby | cef2cf0 | 2007-05-08 00:31:45 -0700 | [diff] [blame] | 141 | 'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this) |
| 142 | 'p' 00-3F linux/mc146818rtc.h conflict! |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 143 | 'p' 40-7F linux/nvram.h |
| 144 | 'p' 80-9F user-space parport |
| 145 | <mailto:tim@cyberelk.net> |
| 146 | 'q' 00-1F linux/serio.h |
| 147 | 'q' 80-FF Internet PhoneJACK, Internet LineJACK |
| 148 | <http://www.quicknet.net> |
| 149 | 'r' 00-1F linux/msdos_fs.h |
| 150 | 's' all linux/cdk.h |
| 151 | 't' 00-7F linux/if_ppp.h |
| 152 | 't' 80-8F linux/isdn_ppp.h |
| 153 | 'u' 00-1F linux/smb_fs.h |
| 154 | 'v' 00-1F linux/ext2_fs.h conflict! |
| 155 | 'v' all linux/videodev.h conflict! |
| 156 | 'w' all CERN SCI driver |
| 157 | 'y' 00-1F packet based user level communications |
| 158 | <mailto:zapman@interlan.net> |
| 159 | 'z' 00-3F CAN bus card |
| 160 | <mailto:hdstich@connectu.ulm.circular.de> |
| 161 | 'z' 40-7F CAN bus card |
| 162 | <mailto:oe@port.de> |
| 163 | 0x80 00-1F linux/fb.h |
| 164 | 0x81 00-1F linux/videotext.h |
| 165 | 0x89 00-06 asm-i386/sockios.h |
| 166 | 0x89 0B-DF linux/sockios.h |
| 167 | 0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range |
| 168 | 0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range |
| 169 | 0x8B all linux/wireless.h |
| 170 | 0x8C 00-3F WiNRADiO driver |
| 171 | <http://www.proximity.com.au/~brian/winradio/> |
| 172 | 0x90 00 drivers/cdrom/sbpcd.h |
| 173 | 0x93 60-7F linux/auto_fs.h |
| 174 | 0x99 00-0F 537-Addinboard driver |
| 175 | <mailto:buk@buks.ipn.de> |
| 176 | 0xA0 all linux/sdp/sdp.h Industrial Device Project |
| 177 | <mailto:kenji@bitgate.com> |
| 178 | 0xA3 80-8F Port ACL in development: |
| 179 | <mailto:tlewis@mindspring.com> |
| 180 | 0xA3 90-9F linux/dtlk.h |
| 181 | 0xAB 00-1F linux/nbd.h |
| 182 | 0xAC 00-1F linux/raw.h |
| 183 | 0xAD 00 Netfilter device in development: |
| 184 | <mailto:rusty@rustcorp.com.au> |
| 185 | 0xB0 all RATIO devices in development: |
| 186 | <mailto:vgo@ratio.de> |
| 187 | 0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca> |
| 188 | 0xCB 00-1F CBM serial IEC bus in development: |
| 189 | <mailto:michael.klein@puffin.lb.shuttle.de> |
| 190 | 0xDD 00-3F ZFCP device driver see drivers/s390/scsi/ |
| 191 | <mailto:aherrman@de.ibm.com> |
| 192 | 0xF3 00-3F video/sisfb.h sisfb (in development) |
| 193 | <mailto:thomas@winischhofer.net> |
Raphael Assenat | 1ce4d39 | 2006-12-08 02:40:37 -0800 | [diff] [blame] | 194 | 0xF4 00-1F video/mbxfb.h mbxfb |
| 195 | <mailto:raph@8d.com> |