|
|
1.1 ! root 1: /* @(#)scgcmd.h 2.14 98/11/29 Copyright 1986 J. Schilling */ ! 2: /* ! 3: * Definitions for the SCSI general driver 'scg' ! 4: * ! 5: * Copyright (c) 1986 J. Schilling ! 6: */ ! 7: /* ! 8: * This program is free software; you can redistribute it and/or modify ! 9: * it under the terms of the GNU General Public License as published by ! 10: * the Free Software Foundation; either version 2, or (at your option) ! 11: * any later version. ! 12: * ! 13: * This program is distributed in the hope that it will be useful, ! 14: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 16: * GNU General Public License for more details. ! 17: * ! 18: * You should have received a copy of the GNU General Public License ! 19: * along with this program; see the file COPYING. If not, write to ! 20: * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: */ ! 22: ! 23: #ifndef _SCGCMD_H ! 24: #define _SCGCMD_H ! 25: ! 26: #include "scg/utypes.h" ! 27: #include "scg/btorder.h" ! 28: ! 29: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 30: #elif defined(_BIT_FIELDS_HTOL) /* Motorola byteorder */ ! 31: #else ! 32: /* ! 33: * #error will not work for all compilers (e.g. sunos4) ! 34: * The following line will abort compilation on all compilers ! 35: * if none of the above is defines. And that's what we want. ! 36: */ ! 37: error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined ! 38: #endif ! 39: ! 40: /* ! 41: * SCSI status completion block. ! 42: */ ! 43: #define SCSI_EXTENDED_STATUS ! 44: ! 45: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 46: ! 47: struct scsi_status { ! 48: Ucbit vu_00 : 1; /* vendor unique */ ! 49: Ucbit chk : 1; /* check condition: sense data available */ ! 50: Ucbit cm : 1; /* condition met */ ! 51: Ucbit busy : 1; /* device busy or reserved */ ! 52: Ucbit is : 1; /* intermediate status sent */ ! 53: Ucbit vu_05 : 1; /* vendor unique */ ! 54: #define st_scsi2 vu_05 /* SCSI-2 modifier bit */ ! 55: Ucbit vu_06 : 1; /* vendor unique */ ! 56: Ucbit st_rsvd : 1; /* reserved */ ! 57: ! 58: #ifdef SCSI_EXTENDED_STATUS ! 59: #define ext_st1 st_rsvd /* extended status (next byte valid) */ ! 60: /* byte 1 */ ! 61: Ucbit ha_er : 1; /* host adapter detected error */ ! 62: Ucbit reserved: 6; /* reserved */ ! 63: Ucbit ext_st2 : 1; /* extended status (next byte valid) */ ! 64: /* byte 2 */ ! 65: u_char byte2; /* third byte */ ! 66: #endif /* SCSI_EXTENDED_STATUS */ ! 67: }; ! 68: ! 69: #else /* Motorola byteorder */ ! 70: ! 71: struct scsi_status { ! 72: Ucbit st_rsvd : 1; /* reserved */ ! 73: Ucbit vu_06 : 1; /* vendor unique */ ! 74: Ucbit vu_05 : 1; /* vendor unique */ ! 75: #define st_scsi2 vu_05 /* SCSI-2 modifier bit */ ! 76: Ucbit is : 1; /* intermediate status sent */ ! 77: Ucbit busy : 1; /* device busy or reserved */ ! 78: Ucbit cm : 1; /* condition met */ ! 79: Ucbit chk : 1; /* check condition: sense data available */ ! 80: Ucbit vu_00 : 1; /* vendor unique */ ! 81: #ifdef SCSI_EXTENDED_STATUS ! 82: #define ext_st1 st_rsvd /* extended status (next byte valid) */ ! 83: /* byte 1 */ ! 84: Ucbit ext_st2 : 1; /* extended status (next byte valid) */ ! 85: Ucbit reserved: 6; /* reserved */ ! 86: Ucbit ha_er : 1; /* host adapter detected error */ ! 87: /* byte 2 */ ! 88: u_char byte2; /* third byte */ ! 89: #endif /* SCSI_EXTENDED_STATUS */ ! 90: }; ! 91: #endif ! 92: ! 93: /* ! 94: * OLD Standard (Non Extended) SCSI Sense. Used mainly by the ! 95: * Adaptec ACB 4000 which is the only controller that ! 96: * does not support the Extended sense format. ! 97: */ ! 98: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 99: ! 100: struct scsi_sense { /* scsi sense for error classes 0-6 */ ! 101: Ucbit code : 7; /* error class/code */ ! 102: Ucbit adr_val : 1; /* sense data is valid */ ! 103: #ifdef comment ! 104: Ucbit high_addr:5; /* high byte of block addr */ ! 105: Ucbit rsvd : 3; ! 106: #else ! 107: u_char high_addr; /* high byte of block addr */ ! 108: #endif ! 109: u_char mid_addr; /* middle byte of block addr */ ! 110: u_char low_addr; /* low byte of block addr */ ! 111: }; ! 112: ! 113: #else /* Motorola byteorder */ ! 114: ! 115: struct scsi_sense { /* scsi sense for error classes 0-6 */ ! 116: Ucbit adr_val : 1; /* sense data is valid */ ! 117: Ucbit code : 7; /* error class/code */ ! 118: #ifdef comment ! 119: Ucbit rsvd : 3; ! 120: Ucbit high_addr:5; /* high byte of block addr */ ! 121: #else ! 122: u_char high_addr; /* high byte of block addr */ ! 123: #endif ! 124: u_char mid_addr; /* middle byte of block addr */ ! 125: u_char low_addr; /* low byte of block addr */ ! 126: }; ! 127: #endif ! 128: ! 129: /* ! 130: * SCSI extended sense parameter block. ! 131: */ ! 132: #ifdef comment ! 133: #define SC_CLASS_EXTENDED_SENSE 0x7 /* indicates extended sense */ ! 134: #endif ! 135: ! 136: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 137: ! 138: struct scsi_ext_sense { /* scsi extended sense for error class 7 */ ! 139: /* byte 0 */ ! 140: Ucbit type : 7; /* fixed at 0x70 */ ! 141: Ucbit adr_val : 1; /* sense data is valid */ ! 142: /* byte 1 */ ! 143: u_char seg_num; /* segment number, applies to copy cmd only */ ! 144: /* byte 2 */ ! 145: Ucbit key : 4; /* sense key, see below */ ! 146: Ucbit : 1; /* reserved */ ! 147: Ucbit ili : 1; /* incorrect length indicator */ ! 148: Ucbit eom : 1; /* end of media */ ! 149: Ucbit fil_mk : 1; /* file mark on device */ ! 150: /* bytes 3 through 7 */ ! 151: u_char info_1; /* information byte 1 */ ! 152: u_char info_2; /* information byte 2 */ ! 153: u_char info_3; /* information byte 3 */ ! 154: u_char info_4; /* information byte 4 */ ! 155: u_char add_len; /* number of additional bytes */ ! 156: /* bytes 8 through 13, CCS additions */ ! 157: u_char optional_8; /* CCS search and copy only */ ! 158: u_char optional_9; /* CCS search and copy only */ ! 159: u_char optional_10; /* CCS search and copy only */ ! 160: u_char optional_11; /* CCS search and copy only */ ! 161: u_char sense_code; /* sense code */ ! 162: u_char qual_code; /* sense code qualifier */ ! 163: u_char fru_code; /* Field replacable unit code */ ! 164: Ucbit bptr : 3; /* bit pointer for failure (if bpv) */ ! 165: Ucbit bpv : 1; /* bit pointer is valid */ ! 166: Ucbit : 2; ! 167: Ucbit cd : 1; /* pointers refer to command not data */ ! 168: Ucbit sksv : 1; /* sense key specific valid */ ! 169: u_char field_ptr[2]; /* field pointer for failure */ ! 170: u_char add_info[2]; /* round up to 20 bytes */ ! 171: }; ! 172: ! 173: #else /* Motorola byteorder */ ! 174: ! 175: struct scsi_ext_sense { /* scsi extended sense for error class 7 */ ! 176: /* byte 0 */ ! 177: Ucbit adr_val : 1; /* sense data is valid */ ! 178: Ucbit type : 7; /* fixed at 0x70 */ ! 179: /* byte 1 */ ! 180: u_char seg_num; /* segment number, applies to copy cmd only */ ! 181: /* byte 2 */ ! 182: Ucbit fil_mk : 1; /* file mark on device */ ! 183: Ucbit eom : 1; /* end of media */ ! 184: Ucbit ili : 1; /* incorrect length indicator */ ! 185: Ucbit : 1; /* reserved */ ! 186: Ucbit key : 4; /* sense key, see below */ ! 187: /* bytes 3 through 7 */ ! 188: u_char info_1; /* information byte 1 */ ! 189: u_char info_2; /* information byte 2 */ ! 190: u_char info_3; /* information byte 3 */ ! 191: u_char info_4; /* information byte 4 */ ! 192: u_char add_len; /* number of additional bytes */ ! 193: /* bytes 8 through 13, CCS additions */ ! 194: u_char optional_8; /* CCS search and copy only */ ! 195: u_char optional_9; /* CCS search and copy only */ ! 196: u_char optional_10; /* CCS search and copy only */ ! 197: u_char optional_11; /* CCS search and copy only */ ! 198: u_char sense_code; /* sense code */ ! 199: u_char qual_code; /* sense code qualifier */ ! 200: u_char fru_code; /* Field replacable unit code */ ! 201: Ucbit sksv : 1; /* sense key specific valid */ ! 202: Ucbit cd : 1; /* pointers refer to command not data */ ! 203: Ucbit : 2; ! 204: Ucbit bpv : 1; /* bit pointer is valid */ ! 205: Ucbit bptr : 3; /* bit pointer for failure (if bpv) */ ! 206: u_char field_ptr[2]; /* field pointer for failure */ ! 207: u_char add_info[2]; /* round up to 20 bytes */ ! 208: }; ! 209: #endif ! 210: ! 211: /* ! 212: * SCSI Operation codes. ! 213: */ ! 214: #define SC_TEST_UNIT_READY 0x00 ! 215: #define SC_REZERO_UNIT 0x01 ! 216: #define SC_REQUEST_SENSE 0x03 ! 217: #define SC_FORMAT 0x04 ! 218: #define SC_FORMAT_TRACK 0x06 ! 219: #define SC_REASSIGN_BLOCK 0x07 /* CCS only */ ! 220: #define SC_SEEK 0x0b ! 221: #define SC_TRANSLATE 0x0f /* ACB4000 only */ ! 222: #define SC_INQUIRY 0x12 /* CCS only */ ! 223: #define SC_MODE_SELECT 0x15 ! 224: #define SC_RESERVE 0x16 ! 225: #define SC_RELEASE 0x17 ! 226: #define SC_MODE_SENSE 0x1a ! 227: #define SC_START 0x1b ! 228: #define SC_READ_DEFECT_LIST 0x37 /* CCS only, group 1 */ ! 229: #define SC_READ_BUFFER 0x3c /* CCS only, group 1 */ ! 230: /* ! 231: * Note, these two commands use identical command blocks for all ! 232: * controllers except the Adaptec ACB 4000 which sets bit 1 of byte 1. ! 233: */ ! 234: #define SC_READ 0x08 ! 235: #define SC_WRITE 0x0a ! 236: #define SC_EREAD 0x28 /* 10 byte read */ ! 237: #define SC_EWRITE 0x2a /* 10 byte write */ ! 238: #define SC_WRITE_VERIFY 0x2e /* 10 byte write+verify */ ! 239: #define SC_WRITE_FILE_MARK 0x10 ! 240: #define SC_UNKNOWN 0xff /* cmd list terminator */ ! 241: ! 242: ! 243: /* ! 244: * Messages that SCSI can send. ! 245: */ ! 246: #define SC_COMMAND_COMPLETE 0x00 ! 247: #define SC_SYNCHRONOUS 0x01 ! 248: #define SC_SAVE_DATA_PTR 0x02 ! 249: #define SC_RESTORE_PTRS 0x03 ! 250: #define SC_DISCONNECT 0x04 ! 251: #define SC_ABORT 0x06 ! 252: #define SC_MSG_REJECT 0x07 ! 253: #define SC_NO_OP 0x08 ! 254: #define SC_PARITY 0x09 ! 255: #define SC_IDENTIFY 0x80 ! 256: #define SC_DR_IDENTIFY 0xc0 ! 257: #define SC_DEVICE_RESET 0x0c ! 258: ! 259: /* ! 260: * Standard SCSI control blocks. ! 261: * These go in or out over the SCSI bus. ! 262: */ ! 263: ! 264: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 265: ! 266: struct scsi_g0cdb { /* scsi group 0 command description block */ ! 267: u_char cmd; /* command code */ ! 268: Ucbit high_addr : 5; /* high part of block address */ ! 269: Ucbit lun : 3; /* logical unit number */ ! 270: u_char mid_addr; /* middle part of block address */ ! 271: u_char low_addr; /* low part of block address */ ! 272: u_char count; /* transfer length */ ! 273: Ucbit link : 1; /* link (another command follows) */ ! 274: Ucbit fr : 1; /* flag request (interrupt at completion) */ ! 275: Ucbit rsvd : 4; /* reserved */ ! 276: Ucbit vu_56 : 1; /* vendor unique (byte 5 bit 6) */ ! 277: Ucbit vu_57 : 1; /* vendor unique (byte 5 bit 7) */ ! 278: }; ! 279: ! 280: #else /* Motorola byteorder */ ! 281: ! 282: struct scsi_g0cdb { /* scsi group 0 command description block */ ! 283: u_char cmd; /* command code */ ! 284: Ucbit lun : 3; /* logical unit number */ ! 285: Ucbit high_addr : 5; /* high part of block address */ ! 286: u_char mid_addr; /* middle part of block address */ ! 287: u_char low_addr; /* low part of block address */ ! 288: u_char count; /* transfer length */ ! 289: Ucbit vu_57 : 1; /* vendor unique (byte 5 bit 7) */ ! 290: Ucbit vu_56 : 1; /* vendor unique (byte 5 bit 6) */ ! 291: Ucbit rsvd : 4; /* reserved */ ! 292: Ucbit fr : 1; /* flag request (interrupt at completion) */ ! 293: Ucbit link : 1; /* link (another command follows) */ ! 294: }; ! 295: #endif ! 296: ! 297: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 298: ! 299: struct scsi_g1cdb { /* scsi group 1 command description block */ ! 300: u_char cmd; /* command code */ ! 301: Ucbit reladr : 1; /* address is relative */ ! 302: Ucbit res : 4; /* reserved bits 1-4 of byte 1 */ ! 303: Ucbit lun : 3; /* logical unit number */ ! 304: u_char addr[4]; /* logical block address */ ! 305: u_char res6; /* reserved byte 6 */ ! 306: u_char count[2]; /* transfer length */ ! 307: Ucbit link : 1; /* link (another command follows) */ ! 308: Ucbit fr : 1; /* flag request (interrupt at completion) */ ! 309: Ucbit rsvd : 4; /* reserved */ ! 310: Ucbit vu_96 : 1; /* vendor unique (byte 5 bit 6) */ ! 311: Ucbit vu_97 : 1; /* vendor unique (byte 5 bit 7) */ ! 312: }; ! 313: ! 314: #else /* Motorola byteorder */ ! 315: ! 316: struct scsi_g1cdb { /* scsi group 1 command description block */ ! 317: u_char cmd; /* command code */ ! 318: Ucbit lun : 3; /* logical unit number */ ! 319: Ucbit res : 4; /* reserved bits 1-4 of byte 1 */ ! 320: Ucbit reladr : 1; /* address is relative */ ! 321: u_char addr[4]; /* logical block address */ ! 322: u_char res6; /* reserved byte 6 */ ! 323: u_char count[2]; /* transfer length */ ! 324: Ucbit vu_97 : 1; /* vendor unique (byte 5 bit 7) */ ! 325: Ucbit vu_96 : 1; /* vendor unique (byte 5 bit 6) */ ! 326: Ucbit rsvd : 4; /* reserved */ ! 327: Ucbit fr : 1; /* flag request (interrupt at completion) */ ! 328: Ucbit link : 1; /* link (another command follows) */ ! 329: }; ! 330: #endif ! 331: ! 332: #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */ ! 333: ! 334: struct scsi_g5cdb { /* scsi group 5 command description block */ ! 335: u_char cmd; /* command code */ ! 336: Ucbit reladr : 1; /* address is relative */ ! 337: Ucbit res : 4; /* reserved bits 1-4 of byte 1 */ ! 338: Ucbit lun : 3; /* logical unit number */ ! 339: u_char addr[4]; /* logical block address */ ! 340: u_char count[4]; /* transfer length */ ! 341: u_char res10; /* reserved byte 10 */ ! 342: Ucbit link : 1; /* link (another command follows) */ ! 343: Ucbit fr : 1; /* flag request (interrupt at completion) */ ! 344: Ucbit rsvd : 4; /* reserved */ ! 345: Ucbit vu_B6 : 1; /* vendor unique (byte B bit 6) */ ! 346: Ucbit vu_B7 : 1; /* vendor unique (byte B bit 7) */ ! 347: }; ! 348: ! 349: #else /* Motorola byteorder */ ! 350: ! 351: struct scsi_g5cdb { /* scsi group 5 command description block */ ! 352: u_char cmd; /* command code */ ! 353: Ucbit lun : 3; /* logical unit number */ ! 354: Ucbit res : 4; /* reserved bits 1-4 of byte 1 */ ! 355: Ucbit reladr : 1; /* address is relative */ ! 356: u_char addr[4]; /* logical block address */ ! 357: u_char count[4]; /* transfer length */ ! 358: u_char res10; /* reserved byte 10 */ ! 359: Ucbit vu_B7 : 1; /* vendor unique (byte B bit 7) */ ! 360: Ucbit vu_B6 : 1; /* vendor unique (byte B bit 6) */ ! 361: Ucbit rsvd : 4; /* reserved */ ! 362: Ucbit fr : 1; /* flag request (interrupt at completion) */ ! 363: Ucbit link : 1; /* link (another command follows) */ ! 364: }; ! 365: #endif ! 366: ! 367: #define SC_G0_CDBLEN 6 /* Len of Group 0 commands */ ! 368: #define SC_G1_CDBLEN 10 /* Len of Group 1 commands */ ! 369: #define SC_G5_CDBLEN 12 /* Len of Group 5 commands */ ! 370: ! 371: #define SCG_MAX_CMD 24 /* 24 bytes max. size is supported */ ! 372: #define SCG_MAX_STATUS 3 /* XXX (sollte 4 allign.) Mamimum Status Len */ ! 373: #define SCG_MAX_SENSE 32 /* Mamimum Sense Len for auto Req. Sense */ ! 374: ! 375: #define DEF_SENSE_LEN 16 /* Default Sense Len */ ! 376: #define CCS_SENSE_LEN 18 /* Sense Len for CCS compatible devices */ ! 377: ! 378: struct scg_cmd { ! 379: caddr_t addr; /* Address of data in user space */ ! 380: int size; /* DMA count for data transfer */ ! 381: int flags; /* see below for definition */ ! 382: int cdb_len; /* Size of SCSI command in bytes */ ! 383: /* NOTE: rel 4 uses this field only */ ! 384: /* with commands not in group 1 or 2*/ ! 385: int sense_len; /* for intr() if -1 don't get sense */ ! 386: int timeout; /* timeout in seconds */ ! 387: /* NOTE: actual resolution depends */ ! 388: /* on driver implementation */ ! 389: int kdebug; /* driver kernel debug level */ ! 390: int resid; /* Bytes not transfered */ ! 391: int error; /* Error code from scgintr() */ ! 392: int ux_errno; /* UNIX error code */ ! 393: #ifdef comment ! 394: XXX struct scsi_status scb; ??? /* Status returnd by command */ ! 395: #endif ! 396: union { ! 397: struct scsi_status Scb;/* Status returnd by command */ ! 398: u_char cmd_scb[SCG_MAX_STATUS]; ! 399: } u_scb; ! 400: #define scb u_scb.Scb ! 401: #ifdef comment ! 402: XXX struct scsi_sense sense; ??? /* Sense bytes from command */ ! 403: #endif ! 404: union { ! 405: struct scsi_sense Sense;/* Sense bytes from command */ ! 406: u_char cmd_sense[SCG_MAX_SENSE]; ! 407: } u_sense; ! 408: #define sense u_sense.Sense ! 409: int sense_count; /* Number of bytes valid in sense */ ! 410: int target; /* SCSI target id */ ! 411: union { /* SCSI command descriptor block */ ! 412: struct scsi_g0cdb g0_cdb; ! 413: struct scsi_g1cdb g1_cdb; ! 414: struct scsi_g5cdb g5_cdb; ! 415: u_char cmd_cdb[SCG_MAX_CMD]; ! 416: } cdb; /* 24 bytes max. size is supported */ ! 417: }; ! 418: ! 419: #define dma_read flags /* 1 if DMA to Sun, 0 otherwise */ ! 420: ! 421: /* ! 422: * definition for flags field in scg_cmd struct ! 423: */ ! 424: #define SCG_RECV_DATA 0x0001 /* DMA direction to Sun */ ! 425: #define SCG_DISRE_ENA 0x0002 /* enable disconnect/reconnect */ ! 426: #define SCG_SILENT 0x0004 /* be silent on errors */ ! 427: #define SCG_CMD_RETRY 0x0008 /* enable retries */ ! 428: #define SCG_NOPARITY 0x0010 /* disable parity for this command */ ! 429: ! 430: /* ! 431: * definition for error field in scg_cmd struct ! 432: * ! 433: * The codes refer to SCSI general errors, not to device ! 434: * specific errors. Device specific errors are discovered ! 435: * by checking the sense data. ! 436: * The distinction between retryable and fatal is somewhat ad hoc. ! 437: */ ! 438: #define SCG_NO_ERROR 0 /* cdb transported without error */ ! 439: #define SCG_RETRYABLE 1 /* any other case */ ! 440: #define SCG_FATAL 2 /* could not select target */ ! 441: #define SCG_TIMEOUT 3 /* driver timed out */ ! 442: ! 443: #define g0_cdbaddr(cdb, a) ((cdb)->high_addr = (a) >> 16,\ ! 444: (cdb)->mid_addr = ((a) >> 8) & 0xFF,\ ! 445: (cdb)->low_addr = (a) & 0xFF) ! 446: ! 447: #define g1_cdbaddr(cdb, a) ((cdb)->addr[0] = (a) >> 24,\ ! 448: (cdb)->addr[1] = ((a) >> 16)& 0xFF,\ ! 449: (cdb)->addr[2] = ((a) >> 8) & 0xFF,\ ! 450: (cdb)->addr[3] = (a) & 0xFF) ! 451: ! 452: #define g5_cdbaddr(cdb, a) g1_cdbaddr(cdb, a) ! 453: ! 454: #define g0_cdblen(cdb, len) ((cdb)->count = (len)) ! 455: ! 456: #define g1_cdblen(cdb, len) ((cdb)->count[0] = ((len) >> 8) & 0xFF,\ ! 457: (cdb)->count[1] = (len) & 0xFF) ! 458: ! 459: #define g5_cdblen(cdb, len) ((cdb)->count[0] = (len) >> 24L,\ ! 460: (cdb)->count[1] = ((len) >> 16L)& 0xFF,\ ! 461: (cdb)->count[2] = ((len) >> 8L) & 0xFF,\ ! 462: (cdb)->count[3] = (len) & 0xFF) ! 463: ! 464: #define i_to_long(a, i) (((u_char *)(a))[0] = ((i) >> 24)& 0xFF,\ ! 465: ((u_char *)(a))[1] = ((i) >> 16)& 0xFF,\ ! 466: ((u_char *)(a))[2] = ((i) >> 8) & 0xFF,\ ! 467: ((u_char *)(a))[3] = (i) & 0xFF) ! 468: ! 469: #define i_to_3_byte(a, i) (((u_char *)(a))[0] = ((i) >> 16)& 0xFF,\ ! 470: ((u_char *)(a))[1] = ((i) >> 8) & 0xFF,\ ! 471: ((u_char *)(a))[2] = (i) & 0xFF) ! 472: ! 473: #define i_to_4_byte(a, i) (((u_char *)(a))[0] = ((i) >> 24)& 0xFF,\ ! 474: ((u_char *)(a))[1] = ((i) >> 16)& 0xFF,\ ! 475: ((u_char *)(a))[2] = ((i) >> 8) & 0xFF,\ ! 476: ((u_char *)(a))[3] = (i) & 0xFF) ! 477: ! 478: #define i_to_short(a, i) (((u_char *)(a))[0] = ((i) >> 8) & 0xFF,\ ! 479: ((u_char *)(a))[1] = (i) & 0xFF) ! 480: ! 481: #define a_to_u_short(a) ((unsigned short) \ ! 482: ((((unsigned char*) a)[1] & 0xFF) | \ ! 483: (((unsigned char*) a)[0] << 8 & 0xFF00))) ! 484: ! 485: #define a_to_3_byte(a) ((unsigned long) \ ! 486: ((((unsigned char*) a)[2] & 0xFF) | \ ! 487: (((unsigned char*) a)[1] << 8 & 0xFF00) | \ ! 488: (((unsigned char*) a)[0] << 16 & 0xFF0000))) ! 489: ! 490: #ifdef __STDC__ ! 491: #define a_to_u_long(a) ((unsigned long) \ ! 492: ((((unsigned char*) a)[3] & 0xFF) | \ ! 493: (((unsigned char*) a)[2] << 8 & 0xFF00) | \ ! 494: (((unsigned char*) a)[1] << 16 & 0xFF0000) | \ ! 495: (((unsigned char*) a)[0] << 24 & 0xFF000000UL))) ! 496: #else ! 497: #define a_to_u_long(a) ((unsigned long) \ ! 498: ((((unsigned char*) a)[3] & 0xFF) | \ ! 499: (((unsigned char*) a)[2] << 8 & 0xFF00) | \ ! 500: (((unsigned char*) a)[1] << 16 & 0xFF0000) | \ ! 501: (((unsigned char*) a)[0] << 24 & 0xFF000000))) ! 502: #endif ! 503: ! 504: ! 505: /* Peripheral Device Type */ ! 506: ! 507: #define SC_DASD 0x00 ! 508: #define SC_SEQD 0x01 ! 509: #define SC_PRTD 0x02 ! 510: #define SC_PROCD 0x03 ! 511: #define SC_OPTD 0x04 ! 512: #define SC_ROMD 0x05 ! 513: #define SC_SCAN 0x06 ! 514: #define SC_OMEM 0x07 ! 515: #define SC_JUKE 0x08 ! 516: #define SC_COMM 0x09 ! 517: #define SC_NOTPR 0x7F ! 518: ! 519: #endif /* _SCGCMD_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.