scsicdb.h
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:8k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)scsicdb.h 2.15 99/10/18 Copyright 1986 J. Schilling */
  2. /*
  3.  * Definitions for the SCSI Command Descriptor Block
  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. #ifndef _SCG_SCSICDB_H
  23. #define _SCG_SCSICDB_H
  24. /*
  25.  * SCSI Operation codes. 
  26.  */
  27. #define SC_TEST_UNIT_READY 0x00
  28. #define SC_REZERO_UNIT 0x01
  29. #define SC_REQUEST_SENSE 0x03
  30. #define SC_FORMAT 0x04
  31. #define SC_FORMAT_TRACK 0x06
  32. #define SC_REASSIGN_BLOCK 0x07 /* CCS only */
  33. #define SC_SEEK 0x0b
  34. #define SC_TRANSLATE 0x0f /* ACB4000 only */
  35. #define SC_INQUIRY 0x12 /* CCS only */
  36. #define SC_MODE_SELECT 0x15
  37. #define SC_RESERVE 0x16
  38. #define SC_RELEASE 0x17
  39. #define SC_MODE_SENSE 0x1a
  40. #define SC_START 0x1b
  41. #define SC_READ_DEFECT_LIST 0x37 /* CCS only, group 1 */
  42. #define SC_READ_BUFFER          0x3c            /* CCS only, group 1 */
  43. /*
  44.  * Note, these two commands use identical command blocks for all
  45.    * controllers except the Adaptec ACB 4000 which sets bit 1 of byte 1.
  46.  */
  47. #define SC_READ 0x08
  48. #define SC_WRITE 0x0a
  49. #define SC_EREAD 0x28 /* 10 byte read */
  50. #define SC_EWRITE 0x2a /* 10 byte write */
  51. #define SC_WRITE_VERIFY 0x2e            /* 10 byte write+verify */
  52. #define SC_WRITE_FILE_MARK 0x10
  53. #define SC_UNKNOWN 0xff /* cmd list terminator */
  54. /*
  55.  * Standard SCSI control blocks.
  56.  * These go in or out over the SCSI bus.
  57.  */
  58. #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */
  59. struct scsi_g0cdb { /* scsi group 0 command description block */
  60. u_char cmd; /* command code */
  61. Ucbit high_addr : 5; /* high part of block address */
  62. Ucbit lun   : 3; /* logical unit number */
  63. u_char mid_addr; /* middle part of block address */
  64. u_char low_addr; /* low part of block address */
  65. u_char count; /* transfer length */
  66. Ucbit link   : 1; /* link (another command follows) */
  67. Ucbit fr   : 1; /* flag request (interrupt at completion) */
  68. Ucbit rsvd   : 4; /* reserved */
  69. Ucbit vu_56   : 1; /* vendor unique (byte 5 bit 6) */
  70. Ucbit vu_57   : 1; /* vendor unique (byte 5 bit 7) */
  71. };
  72. #else /* Motorola byteorder */
  73. struct scsi_g0cdb { /* scsi group 0 command description block */
  74. u_char cmd; /* command code */
  75. Ucbit lun   : 3; /* logical unit number */
  76. Ucbit high_addr : 5; /* high part of block address */
  77. u_char mid_addr; /* middle part of block address */
  78. u_char low_addr; /* low part of block address */
  79. u_char count; /* transfer length */
  80. Ucbit vu_57   : 1; /* vendor unique (byte 5 bit 7) */
  81. Ucbit vu_56   : 1; /* vendor unique (byte 5 bit 6) */
  82. Ucbit rsvd   : 4; /* reserved */
  83. Ucbit fr   : 1; /* flag request (interrupt at completion) */
  84. Ucbit link   : 1; /* link (another command follows) */
  85. };
  86. #endif
  87. #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */
  88. struct scsi_g1cdb { /* scsi group 1 command description block */
  89. u_char cmd; /* command code */
  90. Ucbit reladr   : 1; /* address is relative */
  91. Ucbit res   : 4; /* reserved bits 1-4 of byte 1 */
  92. Ucbit lun   : 3; /* logical unit number */
  93. u_char addr[4]; /* logical block address */
  94. u_char res6; /* reserved byte 6 */
  95. u_char count[2]; /* transfer length */
  96. Ucbit link   : 1; /* link (another command follows) */
  97. Ucbit fr   : 1; /* flag request (interrupt at completion) */
  98. Ucbit rsvd   : 4; /* reserved */
  99. Ucbit vu_96   : 1; /* vendor unique (byte 5 bit 6) */
  100. Ucbit vu_97   : 1; /* vendor unique (byte 5 bit 7) */
  101. };
  102. #else /* Motorola byteorder */
  103. struct scsi_g1cdb { /* scsi group 1 command description block */
  104. u_char cmd; /* command code */
  105. Ucbit lun   : 3; /* logical unit number */
  106. Ucbit res   : 4; /* reserved bits 1-4 of byte 1 */
  107. Ucbit reladr   : 1; /* address is relative */
  108. u_char addr[4]; /* logical block address */
  109. u_char res6; /* reserved byte 6 */
  110. u_char count[2]; /* transfer length */
  111. Ucbit vu_97   : 1; /* vendor unique (byte 5 bit 7) */
  112. Ucbit vu_96   : 1; /* vendor unique (byte 5 bit 6) */
  113. Ucbit rsvd   : 4; /* reserved */
  114. Ucbit fr   : 1; /* flag request (interrupt at completion) */
  115. Ucbit link   : 1; /* link (another command follows) */
  116. };
  117. #endif
  118. #if defined(_BIT_FIELDS_LTOH) /* Intel byteorder */
  119. struct scsi_g5cdb { /* scsi group 5 command description block */
  120. u_char cmd; /* command code */
  121. Ucbit reladr   : 1; /* address is relative */
  122. Ucbit res   : 4; /* reserved bits 1-4 of byte 1 */
  123. Ucbit lun   : 3; /* logical unit number */
  124. u_char addr[4]; /* logical block address */
  125. u_char count[4]; /* transfer length */
  126. u_char res10; /* reserved byte 10 */
  127. Ucbit link   : 1; /* link (another command follows) */
  128. Ucbit fr   : 1; /* flag request (interrupt at completion) */
  129. Ucbit rsvd   : 4; /* reserved */
  130. Ucbit vu_B6   : 1; /* vendor unique (byte B bit 6) */
  131. Ucbit vu_B7   : 1; /* vendor unique (byte B bit 7) */
  132. };
  133. #else /* Motorola byteorder */
  134. struct scsi_g5cdb { /* scsi group 5 command description block */
  135. u_char cmd; /* command code */
  136. Ucbit lun   : 3; /* logical unit number */
  137. Ucbit res   : 4; /* reserved bits 1-4 of byte 1 */
  138. Ucbit reladr   : 1; /* address is relative */
  139. u_char addr[4]; /* logical block address */
  140. u_char count[4]; /* transfer length */
  141. u_char res10; /* reserved byte 10 */
  142. Ucbit vu_B7   : 1; /* vendor unique (byte B bit 7) */
  143. Ucbit vu_B6   : 1; /* vendor unique (byte B bit 6) */
  144. Ucbit rsvd   : 4; /* reserved */
  145. Ucbit fr   : 1; /* flag request (interrupt at completion) */
  146. Ucbit link   : 1; /* link (another command follows) */
  147. };
  148. #endif
  149. #define g0_cdbaddr(cdb, a) ((cdb)->high_addr = (a) >> 16,
  150.  (cdb)->mid_addr = ((a) >> 8) & 0xFF,
  151.  (cdb)->low_addr = (a) & 0xFF)
  152. #define g1_cdbaddr(cdb, a) ((cdb)->addr[0] = (a) >> 24,
  153.  (cdb)->addr[1] = ((a) >> 16)& 0xFF,
  154.  (cdb)->addr[2] = ((a) >> 8) & 0xFF,
  155.  (cdb)->addr[3] = (a) & 0xFF)
  156. #define g5_cdbaddr(cdb, a) g1_cdbaddr(cdb, a)
  157. #define g0_cdblen(cdb, len) ((cdb)->count = (len))
  158. #define g1_cdblen(cdb, len) ((cdb)->count[0] = ((len) >> 8) & 0xFF,
  159.  (cdb)->count[1] = (len) & 0xFF)
  160. #define g5_cdblen(cdb, len) ((cdb)->count[0] = (len) >> 24L,
  161.  (cdb)->count[1] = ((len) >> 16L)& 0xFF,
  162.  (cdb)->count[2] = ((len) >> 8L) & 0xFF,
  163.  (cdb)->count[3] = (len) & 0xFF)
  164. /*#define XXXXX*/
  165. #ifdef XXXXX
  166. #define i_to_long(a, i) (((u_char *)(a))[0] = ((i) >> 24)& 0xFF,
  167.  ((u_char *)(a))[1] = ((i) >> 16)& 0xFF,
  168.  ((u_char *)(a))[2] = ((i) >> 8) & 0xFF,
  169.  ((u_char *)(a))[3] = (i) & 0xFF)
  170. #define i_to_3_byte(a, i) (((u_char *)(a))[0] = ((i) >> 16)& 0xFF,
  171.  ((u_char *)(a))[1] = ((i) >> 8) & 0xFF,
  172.  ((u_char *)(a))[2] = (i) & 0xFF)
  173. #define i_to_4_byte(a, i) (((u_char *)(a))[0] = ((i) >> 24)& 0xFF,
  174.  ((u_char *)(a))[1] = ((i) >> 16)& 0xFF,
  175.  ((u_char *)(a))[2] = ((i) >> 8) & 0xFF,
  176.  ((u_char *)(a))[3] = (i) & 0xFF)
  177. #define i_to_short(a, i) (((u_char *)(a))[0] = ((i) >> 8) & 0xFF,
  178.  ((u_char *)(a))[1] = (i) & 0xFF)
  179. #define a_to_u_short(a) ((unsigned short) 
  180. ((((unsigned char*) a)[1]       & 0xFF) | 
  181.  (((unsigned char*) a)[0] << 8  & 0xFF00)))
  182. #define a_to_3_byte(a) ((unsigned long) 
  183. ((((unsigned char*) a)[2]       & 0xFF) | 
  184.  (((unsigned char*) a)[1] << 8  & 0xFF00) | 
  185.  (((unsigned char*) a)[0] << 16 & 0xFF0000)))
  186. #ifdef __STDC__
  187. #define a_to_u_long(a) ((unsigned long) 
  188. ((((unsigned char*) a)[3]       & 0xFF) | 
  189.  (((unsigned char*) a)[2] << 8  & 0xFF00) | 
  190.  (((unsigned char*) a)[1] << 16 & 0xFF0000) | 
  191.  (((unsigned char*) a)[0] << 24 & 0xFF000000UL)))
  192. #else
  193. #define a_to_u_long(a) ((unsigned long) 
  194. ((((unsigned char*) a)[3]       & 0xFF) | 
  195.  (((unsigned char*) a)[2] << 8  & 0xFF00) | 
  196.  (((unsigned char*) a)[1] << 16 & 0xFF0000) | 
  197.  (((unsigned char*) a)[0] << 24 & 0xFF000000)))
  198. #endif
  199. #endif /* XXXX */
  200. #endif /* _SCG_SCSICDB_H */