|
|
1.1 ! root 1: #define _DDI_DKI 1 ! 2: #define _SYSV4 1 ! 3: ! 4: /* ! 5: * Routines for manipulating device numbers. ! 6: * ! 7: * System V defines "dev_t" as 32-bit, which makes some things problematic ! 8: * when attempting to run SVR4 drivers in an iBCS2 environment. The concept ! 9: * of external and internal numbers, introduced at the same time as the 32- ! 10: * bit "dev_t", provides an effective solution. ! 11: * ! 12: * This is of primary importance to clone devices which may want to support ! 13: * more than 256 connections, but any driver which wants or needs to encode ! 14: * more that 8 bits of information in the minor number may also benefit from ! 15: * use of the external/internal mapping regime. ! 16: */ ! 17: ! 18: /* ! 19: *-IMPORTS: ! 20: * <sys/types.h> ! 21: * dev_t ! 22: * <limits.h> ! 23: * CHAR_BIT ! 24: */ ! 25: ! 26: #include <sys/types.h> ! 27: #include <limits.h> ! 28: ! 29: /* ! 30: * Define this symbol to make the code in this module ignore the _max_minor, ! 31: * _major [], and _minor [] configuration tables, and simply map internal and ! 32: * external major and minor numbers one-to-one. ! 33: */ ! 34: /* #define ONE_TO_ONE */ ! 35: ! 36: /* ! 37: * If we are dealing with a situation where we are trying to run DDI/DKI code ! 38: * side-by-side with code that uses a different "dev_t", we rely on a layer ! 39: * that can may the pre-SVR4 or alien calling sequence for the DDI/DKI entry ! 40: * points. This code must deal with converting the old-style "dev_t" to a ! 41: * new-style "dev_t" and vice-versa. ! 42: * ! 43: * In particular, if a device generates a minor number outside the range of ! 44: * precision of the old-style system, the mapping layer must use these ! 45: * functions to select an appropriate major number to overflow to. ! 46: */ ! 47: ! 48: #define DSHIFT (sizeof (dev_t) * CHAR_BIT / 2) ! 49: ! 50: #define GETEMAJOR(dev) ((major_t) ((dev) >> DSHIFT)) ! 51: #define GETEMINOR(dev) ((minor_t) ((dev) & ~ (1L << DSHIFT))) ! 52: #define MAKEDEVICE(maj,min) (((dev_t) (maj) << DSHIFT) + (min)) ! 53: ! 54: ! 55: /* ! 56: * The following external reference is to a table generated by the kernel ! 57: * configuration process for all the devices configured in the system. It ! 58: * defines a many-to-one mapping between external and internal major device ! 59: * numbers. ! 60: * ! 61: * This mapping can also affect internal device numbers; for instance, ! 62: * external major device 10, minor 5 might map to internal 2, minor 30. ! 63: */ ! 64: ! 65: #ifndef ONE_TO_ONE ! 66: ! 67: extern major_t _maxmajor; ! 68: extern major_t _major []; /* internal major number for external major */ ! 69: extern minor_t _minor []; /* value added to external minor number */ ! 70: ! 71: #endif ! 72: ! 73: /* ! 74: *-STATUS: ! 75: * DDI/DKI ! 76: * ! 77: *-NAME: ! 78: * etoimajor Convert external to internal major device number. ! 79: * ! 80: *-SYNOPSIS: ! 81: * #include <sys/types.h> ! 82: * #include <sys/ddi.h> ! 83: * ! 84: * major_t etoimajor (major_t emaj); ! 85: * ! 86: *-ARGUMENTS: ! 87: * emaj External major number. ! 88: * ! 89: *-DESCRIPTION: ! 90: * etoimajor () converts the external major number (emaj) to an internal ! 91: * major number. See getemajor () for a description of external and ! 92: * internal major numbers. ! 93: * ! 94: *-RETURN VALUE: ! 95: * etoimajor () returns the internal major number or NODEV if the ! 96: * external major number is not valid. ! 97: * ! 98: *-LEVEL: ! 99: * Base or interrupt. ! 100: * ! 101: *-NOTES: ! 102: * Does not sleep. ! 103: * ! 104: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 105: * held across calls to this function. ! 106: * ! 107: *-SEE ALSO: ! 108: * getemajor (), geteminor (), getmajor (), getminor (), itoemajor (), ! 109: * makedevice (). ! 110: */ ! 111: ! 112: #if __USE_PROTO__ ! 113: major_t (etoimajor) (major_t emaj) ! 114: #else ! 115: major_t ! 116: etoimajor __ARGS ((emaj)) ! 117: major_t emaj; ! 118: #endif ! 119: { ! 120: #ifdef ONE_TO_ONE ! 121: return emaj; ! 122: #else ! 123: return (emaj >= _maxmajor ? NODEV : _major [emaj]); ! 124: #endif ! 125: } ! 126: ! 127: ! 128: /* ! 129: *-STATUS: ! 130: * DDI/DKI ! 131: * ! 132: *-NAME: ! 133: * getemajor Get external major device number. ! 134: * ! 135: *-SYNOPSIS: ! 136: * #include <sys/types.h> ! 137: * #include <sys/ddi.h> ! 138: * ! 139: * major_t getemajor (dev_t dev); ! 140: * ! 141: *-ARGUMENTS: ! 142: * dev External device number. ! 143: * ! 144: *-DESCRIPTION: ! 145: * getemajor () returns the external major number given a device number, ! 146: * "dev". External major numbers are visible to the user. Internal major ! 147: * numbers are only visible in the kernel. Since the range of major ! 148: * numbers may be large and sparsely populated, the kernel keeps a ! 149: * mapping between external and internal major numbers to save space. ! 150: * ! 151: * All driver entry points are passed device numbers using external ! 152: * major numbers. ! 153: * ! 154: * Usually, a driver with more than one external major number will have ! 155: * only one internal major number. However, some system implementations ! 156: * map one-to-one between internal and external major numbers. Here, the ! 157: * internal major number is the same as the external major number and the ! 158: * driver may have more than one internal major number. ! 159: * ! 160: *-RETURN VALUE: ! 161: * The external major number. ! 162: * ! 163: *-LEVEL: ! 164: * Base or interrupt. ! 165: * ! 166: *-NOTES: ! 167: * Does not sleep. ! 168: * ! 169: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 170: * held across calls to this function. ! 171: * ! 172: *-SEE ALSO: ! 173: * etoimajor (), geteminor (), getmajor (), getminor (), makedevice (). ! 174: */ ! 175: ! 176: #if __USE_PROTO__ ! 177: major_t (getemajor) (n_dev_t dev) ! 178: #else ! 179: major_t ! 180: getemajor __ARGS ((dev)) ! 181: n_dev_t dev; ! 182: #endif ! 183: { ! 184: return GETEMAJOR (dev); ! 185: } ! 186: ! 187: ! 188: /* ! 189: *-STATUS: ! 190: * DDI/DKI ! 191: * ! 192: *-NAME: ! 193: * geteminor Get external minor device number. ! 194: * ! 195: *-SYNOPSIS: ! 196: * #include <sys/types.h> ! 197: * #include <sys/ddi.h> ! 198: * ! 199: * minor_t geteminor (dev_t dev); ! 200: * ! 201: *-ARGUMENTS: ! 202: * dev External device number. ! 203: * ! 204: *-DESCRIPTION: ! 205: * geteminor () returns the external minor number given a device number, ! 206: * "dev". External minor numbers are visible to the user. Internal minor ! 207: * numbers are only visible in the kernel. Since a driver can support ! 208: * more than one external major device that maps to the same internal ! 209: * major device, the kernel keeps a mapping between external minor ! 210: * numbers and internal minor numbers to allow drivers to index arrays ! 211: * more easily. For example, a driver may support two devices, each with ! 212: * five minor numbers. The user may see each set of minor numbers ! 213: * numbered from zero to four, but the driver sees them as one set of ! 214: * minor numbers numbered zero to nine. ! 215: * ! 216: * All driver entry points are passed device numbers using external minor ! 217: * numbers. ! 218: * ! 219: * Systems that map external major numbers one-to-one with internal major ! 220: * numbers also map external minor numbers one-to-one with internal minor ! 221: * numbers. ! 222: * ! 223: *-RETURN VALUE: ! 224: * The external minor number. ! 225: * ! 226: *-LEVEL: ! 227: * Base or interrupt. ! 228: * ! 229: *-NOTES: ! 230: * Does not sleep. ! 231: * ! 232: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 233: * held across calls to this function. ! 234: * ! 235: *-SEE ALSO: ! 236: * etoimajor (), getemajor (), getmajor (), getminor (), makedevice () ! 237: */ ! 238: ! 239: #if __USE_PROTO__ ! 240: minor_t (geteminor) (n_dev_t dev) ! 241: #else ! 242: minor_t ! 243: geteminor __ARGS ((dev)) ! 244: n_dev_t dev; ! 245: #endif ! 246: { ! 247: return GETEMINOR (dev); ! 248: } ! 249: ! 250: ! 251: /* ! 252: *-STATUS: ! 253: * DDI/DKI ! 254: * ! 255: *-NAME: ! 256: * getmajor Get internal major device number. ! 257: * ! 258: *-SYNOPSIS: ! 259: * #include <sys/types.h> ! 260: * #include <sys/ddi.h> ! 261: * ! 262: * major_t getemajor (dev_t dev); ! 263: * ! 264: *-ARGUMENTS: ! 265: * dev Device number. ! 266: * ! 267: *-DESCRIPTION: ! 268: * The getmajor () function extracts the internal major number from a ! 269: * device number. See getemajor () for an explanation of external and ! 270: * internal major numbers. ! 271: * ! 272: *-RETURN VALUE: ! 273: * The internal major number. ! 274: * ! 275: *-LEVEL: ! 276: * Base or interrupt. ! 277: * ! 278: *-NOTES: ! 279: * No validity checking is performed. If "dev" is invalid, an invalid ! 280: * number is returned. ! 281: * ! 282: * Does not sleep. ! 283: * ! 284: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 285: * held across calls to this function. ! 286: * ! 287: *-SEE ALSO: ! 288: * etoimajor (), getemajor (), geteminor (), getminor (), makedevice () ! 289: */ ! 290: ! 291: #if __USE_PROTO__ ! 292: major_t (getmajor) (n_dev_t dev) ! 293: #else ! 294: major_t ! 295: getmajor __ARGS ((dev)) ! 296: n_dev_t dev; ! 297: #endif ! 298: { ! 299: #ifdef ONE_TO_ONE ! 300: return GETEMAJOR (dev); ! 301: #else ! 302: return _major [GETEMAJOR (dev)]; ! 303: #endif ! 304: } ! 305: ! 306: ! 307: /* ! 308: *-STATUS: ! 309: * DDI/DKI ! 310: * ! 311: *-NAME: ! 312: * getminor Get internal minor device number. ! 313: * ! 314: *-SYNOPSIS: ! 315: * #include <sys/types.h> ! 316: * #include <sys/ddi.h> ! 317: * ! 318: * minor_t getminor (dev_t dev); ! 319: * ! 320: *-ARGUMENTS: ! 321: * dev Device number. ! 322: * ! 323: *-DESCRIPTION: ! 324: * The getminor () function extracts the internal minor number from a ! 325: * device number. See getemajor () for an explanation of external and ! 326: * internal major numbers. ! 327: * ! 328: *-RETURN VALUE: ! 329: * The internal minor number. ! 330: * ! 331: *-LEVEL: ! 332: * Base or interrupt. ! 333: * ! 334: *-NOTES: ! 335: * No validity checking is performed. If "dev" is invalid, an invalid ! 336: * number is returned. ! 337: * ! 338: * Does not sleep. ! 339: * ! 340: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 341: * held across calls to this function. ! 342: * ! 343: *-SEE ALSO: ! 344: * etoimajor (), getemajor (), geteminor (), getmajor (), makedevice () ! 345: */ ! 346: ! 347: #if __USE_PROTO__ ! 348: minor_t (getminor) (n_dev_t dev) ! 349: #else ! 350: minor_t ! 351: getminor __ARGS ((dev)) ! 352: n_dev_t dev; ! 353: #endif ! 354: { ! 355: #ifdef ONE_TO_ONE ! 356: return GETEMINOR (dev); ! 357: #else ! 358: return GETEMINOR (dev) + _minor [GETEMAJOR (dev)]; ! 359: #endif ! 360: } ! 361: ! 362: ! 363: /* ! 364: *-STATUS: ! 365: * DDI/DKI ! 366: * ! 367: *-NAME: ! 368: * itoemajor Convert internal to external major number. ! 369: * ! 370: *-SYNOPSIS: ! 371: * #include <sys/types.h> ! 372: * #include <sys/ddi.h> ! 373: * ! 374: * major_t itoemajor (major_t imaj, major_t prevemaj); ! 375: * ! 376: *-ARGUMENTS: ! 377: * imaj Internal major number. ! 378: * ! 379: * prevemaj Most recently obtained external major number (or ! 380: * NODEV, if this is the first time the function has been ! 381: * called). ! 382: * ! 383: *-DESCRIPTION: ! 384: * itoemajor () converts the internal major number to the external major ! 385: * number. The external-to-internal major number mapping can be many-to- ! 386: * one, and so any internal major number may correspond to more than one ! 387: * external major number. By repeatedly invoking this function, the ! 388: * driver can obtain all possible external major number values. See ! 389: * getemajor () for an explanation of external and internal major ! 390: * numbers. ! 391: * ! 392: *-RETURN VALUE: ! 393: * External major number, or NODEV if all have been searched. ! 394: * ! 395: *-LEVEL: ! 396: * Base or interrupt. ! 397: * ! 398: *-NOTES: ! 399: * Does not sleep. ! 400: * ! 401: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 402: * held across calls to this function. ! 403: * ! 404: *-SEE ALSO: ! 405: * etoimajor (), getemajor (), geteminor (), getmajor (), getminor (), ! 406: * makedevice () ! 407: */ ! 408: ! 409: #if __USE_PROTO__ ! 410: major_t (itoemajor) (major_t imaj, major_t prevemaj) ! 411: #else ! 412: major_t ! 413: itoemajor __ARGS ((imaj, prevemaj)) ! 414: major_t imaj; ! 415: major_t prevemaj; ! 416: #endif ! 417: { ! 418: #ifdef ONE_TO_ONE ! 419: return prevemaj == NODEV ? imaj : NODEV; ! 420: #else ! 421: if (prevemaj == NODEV) ! 422: prevemaj = 0; ! 423: else ! 424: prevemaj ++; ! 425: ! 426: while (prevemaj ++ < _maxmajor) ! 427: if (_major [prevemaj] == imaj) ! 428: return prevemaj; ! 429: ! 430: return NODEV; ! 431: #endif ! 432: } ! 433: ! 434: ! 435: /* ! 436: *-STATUS: ! 437: * DDI/DKI ! 438: * ! 439: *-NAME: ! 440: * makedevice Make device number from major and minor numbers. ! 441: * ! 442: *-SYNOPSIS: ! 443: * #include <sys/types.h> ! 444: * #include <sys/ddi.h> ! 445: * ! 446: * dev_t makedevice (major_t majnum, minor_t minnum); ! 447: * ! 448: *-ARGUMENTS: ! 449: * majnum Major number. ! 450: * ! 451: * minnum Minor number. ! 452: * ! 453: *-DESCRIPTION: ! 454: * The makedevice () function creates a device number from a major and ! 455: * minor device number. makedevice () should be used to create device ! 456: * numbers so that the driver will port easily to releases that treat ! 457: * device numbers differently. ! 458: * ! 459: *-RETURN VALUE: ! 460: * The device number, containing both the major number and the minor ! 461: * number, is returned. No validation of the major or number numbers is ! 462: * performed. ! 463: * ! 464: *-LEVEL: ! 465: * Base or interrupt. ! 466: * ! 467: *-NOTES: ! 468: * Does not sleep. ! 469: * ! 470: * Driver-defined basic locks, read/write locks, and sleep locks may be ! 471: * held across calls to this function. ! 472: * ! 473: *-SEE ALSO: ! 474: * getemajor (), geteminor (), getmajor (), getminor () ! 475: */ ! 476: ! 477: #if __USE_PROTO__ ! 478: n_dev_t (makedevice) (major_t majnum, minor_t minnum) ! 479: #else ! 480: n_dev_t ! 481: makedevice __ARGS ((majnum, minnum)) ! 482: major_t majnum; ! 483: minor_t minnum; ! 484: #endif ! 485: { ! 486: return MAKEDEVICE (majnum, minnum); ! 487: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.