  The Linux SCSI programming HOWTO
  Heiko Eissfeldt heiko@colossus.escape.de
  v1.5, 7 May 1996
  II Ryouta( ) pessi@kmc.kyoto-u.ac.jp
  a 5 March 1998

  ̕ Linux ̔ėp SCSI C^[tF[X̃vO~O戵
  ܂B
  ______________________________________________________________________

  ڎ

  1. ŐV
  2. _
  3. ėp SCSI C^[tF[XƂ́H
  4. gpɂĕKvȂ̂́H
     4.1 J[l̃RtBM[V
     4.2 foCXt@C
     4.3 foCX̑Ήt
        4.3.1 SCSI u̓Iȑ}ƍ폜

  5. vO}̂߂̃KCh
  6. foCXvO~O̊Tv
  7. foCXI[v
  8. wb_\
  9. Inquiry[Ɖ]R}h̗
  10. ZXobt@
  11. ZXobt@p
  12. ioctl ֐
  13. hCõftHg
     13.1 Transfer Lengths `B
     13.2 ^CAEgyэĎs̒l

  14. SCSI ̎dl̎擾
  15. ֘A
     15.1 HOWTOs and FAQs HOWTO  FAQ
     15.2 [OXg
     15.3 R[h

  16. ɖɗ
     16.1 foCXhCol̏ɂȂ
     16.2 [eBeB

  17. SCSI ɃANZX邻̑̃C^[tF[X
  18. 
  19. ӎ
  A. t^
  B. G[
     B.1 G[Xe[^X̉
     B.2 Xe[^XR[h
     B.3 SCSI Sense Keys
     B.4 Host codes
     B.5 Driver codes

  C. Additional sense codes   additional sense code qualifiers
     C.1 ASC and ASCQ()
     C.2 ASC and ASCQ(ԍ)

  D. SCSIR}hR[h̃NCbNt@X
  E. vO

  ______________________________________________________________________

  1.  ŐV

  VJ[lł̓C^[tF[Xς܂B͈ȑOɁuf
  oCX̍ăXLvƑ肵Ă͂ɉe܂Bł SCSI @
  VXeғɒǉ/폜邱Ƃ\łB

  J[l 1.3.98 ȍ~A̏dvȃwb_t@Cړ/
   (sg.h  scsi.h)B

  ΂ȃoÔȂɂ͐V̂Ɏ芷ꂽ̂܂B

  2.  _

  ̕ Linux ̔ėp SCSI C^[tF[X̓ƃvO~O
  ߂̎łB

  ̓̕J[lł̕KvAuƂ̑ΉAёuԂ̊{Iȑ
  ݍpJo[܂B̒P C vO~O̗܂܂
  BSCSI R}hZbgɂĂ̈ʓIȒmKvłGSCSI WKi
  Ɗ֘AɊւڂɂẮA̕̕t^QƂĂ
  B

  ̃̕v[eLXg̃o[Wł́AݎQ(``''Ŏ܂)
  Ă邱ƂɒӂĂB

  3.  ėp SCSI C^[tF[XƂ́H

  ėp(generic) SCSI C^[tF[X SCSI n[hEFA(ЂƂ
  GL]`bN)iւ̈ʓI SCSI ̃ANZX񋟂邽߂Ɏ
  ܂BLawrence Foard ( entropy@world.std.com) ɂĊJA
  Killy Corporation (scsi/sg.hɂRgQƂĂ) ɂ
  ㉇܂B

  ̃C^[tF[X̓[Ux̃AvP[V(Ȃ킿AJ[l
  ̊O)ʂȋ@푀\ɂ܂BAJ[lhCo
  J́A댯ŃfobOȂ̂Ȃ̂łAKv܂B

  Ƃ͂AK؂ɃhCo쓮ȂƁASCSI oXhCo邢
  J[lnO\܂BłAėphCo𐳂
  邱ƂƁAf[^̑r邽߂ɍŏɑSẴt@CobN
  Abv邱Ƃ؂łBɂȂ̃vO𑖂点OɂĂ
  ƖɗƂ܂BSẴobt@fBXNɃtbV
  Ƃmɂ邽߂ sync R}h𔭍s邱ƂŁAVXen
  OĂf[^X͍ŏɂȂ܂B

  ėphCô̗_ƂẮAC^[tF[XgωȂ
  ASẴAvP[V͐VJ[l̊JƗĂ
  ƂłBrȂ΁A̒჌xȃJ[lhCo͑̃J[l
  ̕ωƕ킳Ȃ΂Ȃ܂B

  T^Iɂ́AėphCo͂Ƃ̋@\̒𐶂߂ɓȃ[UA
  vP[VKv̂V SCSI n[hEFAu(: X
  Li[Av^ACD-ROM W[N{bNX)ƒʐM邽߂Ɏgp
  BėpC^[tF[XɂẴAvP[Vvɍ邱
  Ƃł܂B

  4.  gpɂĕKvȂ̂́H

  4.1.  J[l̃RtBM[V

  Ȃ Linux ɂăT|[gĂ SCSI Rg[Ă
  Ȃ΂ȂȂ͖̂炩łBāAȂ̃J[lɔėp SCSI T
  |[głȂRg[̃T|[gg܂˂΂Ȃ܂B Linux
  J[l(/usr/src/linux ł make config ɂ)RtBM[V
  ͓T^Iɂ͎̂悤ɂȂ܂B

        ...
       *
       * SCSI support
       *
       SCSI support? (CONFIG_SCSI) [n] y
       *
       * SCSI support type (disk, tape, CDrom)
       *
        ...
       Scsi generic support (CONFIG_CHR_DEV_SG) [n] y
       *
       * SCSI low-level drivers
       *
        ...

  płȂ΁AɃW[쐬Ă܂܂B [
  ]

  make menuconfig

  4.2.  foCXt@C

  ėp SCSI hCóA SCSI foCXhCoɂėp
  Ƃ͕ʂ́AŗL̃foCXt@Cgp܂B̃foCXt@C
  ́Aʏ /devfBNgɂAMAKEDEV XNvgɂĐ
  Ƃł܂BMAKEDEV sg𑖂点ƈȉ̃t@C쐬܂F

       crw-------   1 root     system    21,   0 Aug 20 20:09 /dev/sga
       crw-------   1 root     system    21,   1 Aug 20 20:09 /dev/sgb
       crw-------   1 root     system    21,   2 Aug 20 20:09 /dev/sgc
       crw-------   1 root     system    21,   3 Aug 20 20:09 /dev/sgd
       crw-------   1 root     system    21,   4 Aug 20 20:09 /dev/sge
       crw-------   1 root     system    21,   5 Aug 20 20:09 /dev/sgf
       crw-------   1 root     system    21,   6 Aug 20 20:09 /dev/sgg
       crw-------   1 root     system    21,   7 Aug 20 20:09 /dev/sgh
                                          |    |
                                      major,   minor device numbers
                                   W[,   }Ci[  foCXԍ

  ͒ɃANZX邽߂ɃLN^foCXł邱ƂɒӂĂ
  BVXeɂĂ͂̃foCX /dev/{sg0, sg1,...} ƌ
  ΂Ă邩܂񂪁ACXg[(
  :Slackware,RedHat,DebianȂǂ̃pbP[W)Ɉˑ܂̂ŁAȉ̗
  ͓Kɓǂ݊ĂB

  4.3.  foCX̑Ήt

  ̃foCXt@C SCSI oX SCSI ID/LUN ɑ΂ēIɑ
  t܂(LUN = WJjbg)B̑Ήtł͒ʂ LUN/ID/
  oX n܂āASCSI ̃XL̎_ɂ݂ꂽe SCSI oX
  eůe LUN ɑ΂ĘAIɃfoCX(t@C̃}Ci[ԍ)
  Ă܂B͍ŏ SCSI Rg[n܂ASĂ̈ȍ~̃R
  g[ɂĒfȂp܂B݂͌̂Ƃ SCSI h
  CȍɂĂȂ܂B

  Ⴆ΁AO SCSI uŏ SCSI oX ID 1,3,5 ɂȂĂ
  Ƃ܂傤(ꂼꂪLUNĂ܂)BƁAʂƂ
  ȉ̂悤ȑΉtȂł傤F

       /dev/sga -> SCSI id 1
       /dev/sgb -> SCSI id 3
       /dev/sgc -> SCSI id 5

  Vu ID 4 ŒǉȂ΁A(̍ăXL)Ήt
  ́F

       /dev/sga -> SCSI id 1
       /dev/sgb -> SCSI id 3
       /dev/sgc -> SCSI id 4
       /dev/sgd -> SCSI id 5

  ƂȂ܂B

  ID 5 Ɋւωɒӂ܂傤BΉfoCX(t@C)͂͂
  /dev/sgcł͂ȂāA/dev/sgd̉ɑΉĂ܂B

  KɂAVJ[lł͏ԂύX邱Ƃł܂B

  4.3.1.  SCSI u̓Iȑ}ƍ폜

  VJ[l/proct@CVXeĂȂ΁AgpĂ
  ȂuVXeғɎO蓱邱Ƃł܂B

  SCSI uOɂ́F

  echo "scsi remove-single-device a b c d" > /proc/scsi/scsi

  lɂāASCSI uǉɂ́A

       echo "scsi add-single-device a b c d" > /proc/scsi/scsi

  Ƃ܂B

  

             a == zXgA_v^̔ԍ (ŏ̂̂ 0)
             b == zXgA_v^ SCSI `l (ŏ̂̂ 0)
             c == ID
             d == LUN (ŏ̂̂ 0)

  łOq̗ɂ /dev/sgc  /dev/sgd ̑Ήtւ邽
  ߂ɂ́Â悤ɂ΂łł傤B [󒍁Fcat /proc/scsi/scsi
  s΁A4̒lɂȂɂݒ肷΂߂Ǝv
  B]

       echo "scsi remove-single-device 0 0 4 0" > /proc/scsi/scsi
       echo "scsi remove-single-device 0 0 5 0" > /proc/scsi/scsi
       echo "scsi add-single-device 0 0 5 0" > /proc/scsi/scsi
       echo "scsi add-single-device 0 0 4 0" > /proc/scsi/scsi

  ȂȂAėpfoCX͂炪}ꂽԂőΉt邩
  B

  ɑu SCSI oXɒǉƂ́AVuɂ͓o^ł\
  Ă邱ƂSɗ߂Ă܂傤B̃̓u[gɊ
  A̑u邽߂̗]n܂B

  []initrd@\Ƒgݍ킹邱ƂɂA̎dg݂pċ@\
  ωɑ΂_ȃVXe\z邱Ƃłł傤B

  5.  vO}̂߂̃KCh

  ȉ͔̏͂ėp SCSI C^[tF[X̃AvP[V̂߂Ɏg
  pƂvO}̂߂̂̂łBpāASCSI u
  INQUIRY  TESTUNITREADY R}hɂăANZXɂ͂ǂ΂
  ܂B

  ̃R[hgpۂ́Aȉ̂ƂɒӂĂF

  o  wb_t@Csg.h  scsi.h ̈ʒu̓J[lo[W 1.3.98
     ŕύXɂȂ܂Bł͂̃t@C
     /usr/src/linux/include/scsiɈʒuĂ܂B
     /usr/include/scsi ɑ΂ăNĂ邱Ƃ҂܂B
     ÓA /usr/src/linux/drivers/scsiɂ܂BeLXg
     ȉł͐VJ[lz肵Ă܂B

  o  ėp SCSI C^[tF[X̓J[lo[W 1.1.68 Ŋg
     Gȍ~̗ɂ͏ȂƂ̃o[WKvƂȂ܂B
     J[lo[W1.1.771.1.89܂ŁAсA1.3.521.3.56
     ܂ŁA͂ǂĂBƂ̂́ÃJ[lł͔ėp
     SCSI C^[tF[XŒꒃłB

  o  ANZXfoCX\wb_̒萔 DEVICE ͂Ȃ
     płfoCXɏ]̂łȂĂ͂Ȃ܂(``''͂QƂ
     )B

  6.  foCXvO~O̊Tv

  wb_t@C include/scsi/sg.h ̓C^[tF[X̋Lq܂ł
  (J[lo[W 1.3.98 ɊÂĂ܂)F

       struct sg_header
        {
         int pack_len;    /* ĂpPbg (wb_) */
         int reply_len;   /* ҂鉞̍ő咷 */
         int pack_id;     /* pPbg id io[ */
         int result;      /* 0==ok, ȊO errno R[hw */
         unsigned int twelve_byte:1;
                      /* O[v 6 & 7 R}hɑ΂ 12 oCgR}h */
         unsigned int other_flags:31;                  /* p */
         unsigned char sense_buffer[16]; /* read ɂĂ̂ݎgp */
         /* R}hɑăR}ĥ߂̃f[^(?) */
        };

  ̍\̂͂ǂ̂悤 SCSI R}hA܂AR}h̎s
  ʂێԂĂ邩\Ă܂BX̍\̂̍\vf
  Ă``''͂Ōɋc_܂B

  ėpfoCXƃf[^ʏ̕@͈ȉ̂悤ɂȂ܂FI[v
  ėpfoCXɑ΂R}h𑗂邽߂Ɏ̎O̕܂ރub
  NfoCXɑ΂ write() ܂B

       struct sg_header
       SCSI R}h
       R}hƈꏏɑׂf[^

  R}ȟʂlɂ́A(Ɠl)ubN\̂pău
  bN read() ܂B

       struct sg_header
       foCXėf[^

  ꂪߒ̒ʏ̊TvłBȍ~̏͂ŊeXebvƏڂLq
  ܂B

  ӁFŋ߂̃J[lo[WɎ܂ŁASIGINT VOi write()
  Ήread()̌Ăяo̊ԂŃubNKv܂(܂
  sigprocmask() ɂ)Bwrite() 猋ʂĂ邽߂ read()
  ȂŕA邱Ƃ͑ċNANZXubN邱ƂɂȂ܂B
  ̃VOĩubN͌{̃R[hɂ͊܂܂Ă܂Bł炱
  ̌{𑖂点ۂɂ SIGINT (a la 󂹂Ȃ^C )𔭍sׂł
  ܂B

  7.  foCXI[v

  ėpfoCX read  write ANZXŃI[vKv
  F

               int fd = open (device_name, O_RDWR);

  (CD-ROMhCû悤ȓǂݏop̃n[hEFAuɑ΂Ă
  Ă͂܂܂)B

  R}h𑗏oɂwriteAȂ炩̌ʂ𓾂ɂreads
  ΂Ȃ܂BG[̏ꍇɂ͕Ԃl͕ł(SȃXg``''
  QƂĂ)B

  8.  wb_\

  wb_\ struct sg_header ̓AvP[VƃJ[lhCo̊
  ̒wƂ߂܂Bł͍\vfɂďڂ_邱Ƃɂ܂
  B

     int pack_len
        ̓hCoɏubÑTCY`܂B̓J[l
        ɂēł̎gp̂߂ɒ`܂B

     int reply_len
        ͉Ŏ󂯎ubÑTCY`܂B̓Av
        P[V̑`܂B

     int pack_id
        ̃tB[h͗vɑ΂񓚂Ă̂ɖ𗧂܂BAv
        P[V͊evɑ΂Ĉӂid^邱Ƃł܂B
        R}h(Ⴆ 4)̃foCX write Ƃ܂傤B
        ̃R}h͕ɓ삵Aǂꂩłł傤B 4
         read ɂĉ񓚂󂯎ہA񓚂͗vʂ菇Ԃł
        Kv͂܂B^vɑ΂鐳񓚂肷邽߂
        pack_id tB[hgp邱Ƃł܂BT^Iɂ͂̒l͊e
        vƂɉ܂(Ăɂ͈܂)B̗v
        őʂ̓J[lɂ SG_MAX_QUEUE (Ⴆ 4)ɐĂ
        B

     int result
        read 邢 write ĂяǒʃR[hB(܂)ėph
        Co(J[l)`܂B write ďoOɂ NULL 
        Ă̂SłB̃R[h errno.h ɂĒ`
        Ă܂(0 ̓G[ȂӖ)B

     unsigned int twelve_byte:1
        ̃tB[h͔W̃x_ŗL̃R}hgp鎞ɂK
        vł (0xf0 - 0xff ͈̔)B̃R}h̃R}h 10
        ł͂Ȃ 12 ̂Ƃ́ÃtB[h write ̌ĂяȏO 1
        ɃZbg˂΂Ȃ܂BȊOR}h̓T|[gĂ
        ܂B̓AvP[V`܂B

     unsigned char sense_buffer[16]
        ̃obt@̓R}h(read() ̌Ăяǒ)ŃZb
        g SCSI ̃ZXR[h܂ł܂BR}ȟʂɂ
        ͂ǂݏo˂΂ȂȂ̂܂(Ⴆ
        TESTUNITREADY)Bʏ 0 oCg܂B̃tB[h
        l͔ėphCo (J[l)Zbg܂B

  ̌{̊֐͒ڔėpJ[lhCoɍp܂Bwb_\̂
  `A write păR}h𑗏oAread ɂČʂ󂯎A
  (ꂽ)G[`FbNs܂BZXobt@f[^͏o̓ob
  t@̒Ŏɓ邱Ƃł܂(k|C^^ĂȂ
  Ȁꍇ͓̓obt@ɂ܂)Bȉ̗̒ŗp邱
  Ƃɂ܂B

  ӁFDEVICE̒lȂ̃foCXLq̂ɐݒ肵ĂB

  #define DEVICE "/dev/sgc"

  /* ėp SCSI C^[tF[XۂɓĂ݂錩{vO */
  #include <stdio.h>
  #include <unistd.h>
  #include <string.h>
  #include <fcntl.h>
  #include <errno.h>
  #include <scsi/sg.h>

  #define SCSI_OFF sizeof(struct sg_header)
  static unsigned char cmd[SCSI_OFF + 18];      /* SCSI R}h obt@ */
  int fd;                               /* SCSI foCX/t@C fBXNv^ */

  /*  SCSI R}hB ėp SCSI C^[tF[Xgp */
  static int handle_SCSI_cmd(unsigned cmd_len,         /* R}h */
                             unsigned in_size,         /* ̓f[^TCY */
                             unsigned char *i_buff,    /* ̓obt@ */
                             unsigned out_size,        /* o̓f[^TCY */
                             unsigned char *o_buff     /* o̓obt@ */
                             )
  {
      int status = 0;
      struct sg_header *sg_hd;

      /* S */
      if (!cmd_len) return -1;            /* cmd_len != 0 Kv */
      if (!i_buff) return -1;             /* ̓obt@ NULL łȂ */
  #ifdef SG_BIG_BUFF
      if (SCSI_OFF + cmd_len + in_size > SG_BIG_BUFF) return -1;
      if (SCSI_OFF + out_size > SG_BIG_BUFF) return -1;
  #else
      if (SCSI_OFF + cmd_len + in_size > 4096) return -1;
      if (SCSI_OFF + out_size > 4096) return -1;
  #endif

      if (!o_buff) out_size = 0;      /* o̓obt@ȂAo̓TCYȂ */

      /* ėp SCSI foCXwb_̍\z */
      sg_hd = (struct sg_header *) i_buff;
      sg_hd->reply_len   = SCSI_OFF + out_size;
      sg_hd->twelve_byte = cmd_len == 12;
      sg_hd->result = 0;
  #if     0
      sg_hd->pack_len    = SCSI_OFF + cmd_len + in_size; /* sv */
      sg_hd->pack_id;     /* gp */
      sg_hd->other_flags; /* gp */
  #endif

      /* R}ho */
      status = write( fd, i_buff, SCSI_OFF + cmd_len + in_size );
      if ( status < 0 || status != SCSI_OFF + cmd_len + in_size ||
                         sg_hd->result ) {
          /* Ȃ炩̃G[ */
          fprintf( stderr, "write(generic) result = 0x%x cmd = 0x%x\n",
                      sg_hd->result, i_buff[SCSI_OFF] );
          perror("");
          return status;
      }

      if (!o_buff) o_buff = i_buff;       /* obt@̃|C^`FbN */

      /* ʂ */
      status = read( fd, o_buff, SCSI_OFF + out_size);
      if ( status < 0 || status != SCSI_OFF + out_size || sg_hd->result ) {
          /* Ȃ炩̃G[ */
          fprintf( stderr, "read(generic) status = 0x%x, result = 0x%x, "
                           "cmd = 0x%x\n",
                           status, sg_hd->result, o_buff[SCSI_OFF] );
          fprintf( stderr, "read(generic) sense "
                  "%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
                  sg_hd->sense_buffer[0],         sg_hd->sense_buffer[1],
                  sg_hd->sense_buffer[2],         sg_hd->sense_buffer[3],
                  sg_hd->sense_buffer[4],         sg_hd->sense_buffer[5],
                  sg_hd->sense_buffer[6],         sg_hd->sense_buffer[7],
                  sg_hd->sense_buffer[8],         sg_hd->sense_buffer[9],
                  sg_hd->sense_buffer[10],        sg_hd->sense_buffer[11],
                  sg_hd->sense_buffer[12],        sg_hd->sense_buffer[13],
                  sg_hd->sense_buffer[14],        sg_hd->sense_buffer[15]);
          if (status < 0)
              perror("");
      }
      /* 󂯎ׂ̂󂯎ǂ݂ */
      if (status == SCSI_OFF + out_size) status = 0; /* S */

      return status;  /* 0 ̓G[ȂӖ */
  }

  ͍ŏ͂Ԃ񂩕Gɂ݂邩܂񂪁AR[ĥقƂǂ
  G[̃`FbNƕ񍐂ł(̓R[h삷悤ɂȂƂł
  ɗ܂)B

  Handle_SCSI_cmd ͑SĂ SCSI R}h̎ނɑ΂Ă̈ʓIȌ`
  ĂāAȉ̂悤ɕނ܂F

           f[^[h     | R}h̗
       ===============================================
        ́Eo̓f[^ƂɂȂ | test unit ready
       ̓f[^ȂAo̓f[^| inquiry, read
       ̓f[^Ao̓f[^Ȃ| mode select, write
        ́Eo̓f[^Ƃɂ | mode sense

  9.  Inquiry[Ɖ]R}h̗

  Ƃ{I SCSI R}ḧ INQUIRY R}hŁAu̎
  ƍ\𖾂炩ɂ邽߂Ɏgp܂BȉSCSI-2 dl̒`
  ł(ڍׂ SCSI-2 WKiQƂ̂)B

                              Table 44: INQUIRY Command
  +=====-========-========-========-========-========-========-========-========+
  |  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
  |Byte |        |        |        |        |        |        |        |        |
  |=====+=======================================================================|
  | 0   |                           Operation Code (12h)                        |
  |-----+-----------------------------------------------------------------------|
  | 1   | Logical Unit Number      |                  Reserved         |  EVPD  |
  |-----+-----------------------------------------------------------------------|
  | 2   |                           Page Code                                   |
  |-----+-----------------------------------------------------------------------|
  | 3   |                           Reserved                                    |
  |-----+-----------------------------------------------------------------------|
  | 4   |                           Allocation Length                           |
  |-----+-----------------------------------------------------------------------|
  | 5   |                           Control                                     |
  +=============================================================================+

  o̓f[^͈ȉ̒ʂF

                       Table 45: Standard INQUIRY Data Format
  +=====-========-========-========-========-========-========-========-========+
  |  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
  |Byte |        |        |        |        |        |        |        |        |
  |=====+==========================+============================================|
  | 0   | Peripheral Qualifier     |           Peripheral Device Type           |
  |-----+-----------------------------------------------------------------------|
  | 1   |  RMB   |                  Device-Type Modifier                        |
  |-----+-----------------------------------------------------------------------|
  | 2   |   ISO Version   |       ECMA Version       |  ANSI-Approved Version   |
  |-----+-----------------+-----------------------------------------------------|
  | 3   |  AENC  | TrmIOP |     Reserved    |         Response Data Format      |
  |-----+-----------------------------------------------------------------------|
  | 4   |                           Additional Length (n-4)                     |
  |-----+-----------------------------------------------------------------------|
  | 5   |                           Reserved                                    |
  |-----+-----------------------------------------------------------------------|
  | 6   |                           Reserved                                    |
  |-----+-----------------------------------------------------------------------|
  | 7   | RelAdr | WBus32 | WBus16 |  Sync  | Linked |Reserved| CmdQue | SftRe  |
  |-----+-----------------------------------------------------------------------|
  | 8   | (MSB)                                                                 |
  |- - -+---                        Vendor Identification                    ---|
  | 15  |                                                                 (LSB) |
  |-----+-----------------------------------------------------------------------|
  | 16  | (MSB)                                                                 |
  |- - -+---                        Product Identification                   ---|
  | 31  |                                                                 (LSB) |
  |-----+-----------------------------------------------------------------------|
  | 32  | (MSB)                                                                 |
  |- - -+---                        Product Revision Level                   ---|
  | 35  |                                                                 (LSB) |
  |-----+-----------------------------------------------------------------------|
  | 36  |                                                                       |
  |- - -+---                        Vendor Specific                          ---|
  | 55  |                                                                       |
  |-----+-----------------------------------------------------------------------|
  | 56  |                                                                       |
  |- - -+---                        Reserved                                 ---|
  | 95  |                                                                       |
  |=====+=======================================================================|
  |     |                       Vendor-Specific Parameters                      |
  |=====+=======================================================================|
  | 96  |                                                                       |
  |- - -+---                        Vendor Specific                          ---|
  | n   |                                                                       |
  +=============================================================================+

  ̗͒჌x֐ handle_SCSI_cmd  Inquiry SCSI R}hs
  邽߂Ɏgp܂B

  ŏɋʃwb_ɃR}hǉAꂩ handle_SCSI_cmd Ă
  o܂Bhandle_SCSI_cmd ̌Ăяoɑ΂o̓obt@TCŸ
  ʃwb_̃TCYOĂ邱ƂɒӂĂBG[
  ȂȂ΁AR}hɏo̓obt@͗vꂽf[^
  ۗL邱ƂɂȂ܂B

  #define INQUIRY_CMD     0x12
  #define INQUIRY_CMDLEN  6
  #define INQUIRY_REPLY_LEN 96
  #define INQUIRY_VENDOR  8       /* ԓf[^̃x_̃ItZbg */

  /* x_̃uhƃfv */
  static unsigned char *Inquiry ( void )
  {
    static unsigned char Inqbuffer[ SCSI_OFF + INQUIRY_REPLY_LEN ];
    unsigned char cmdblk [ INQUIRY_CMDLEN ] =
        { INQUIRY_CMD,  /* command */
                    0,  /* lun/reserved */
                    0,  /* page code */
                    0,  /* reserved */
    INQUIRY_REPLY_LEN,  /* allocation length */
                    0 };/* reserved/flag/link */

    memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );

    /*
     * +------------------+
     * | struct sg_header | <- cmd
     * +------------------+
     * | copy of cmdblk   | <- cmd + SCSI_OFF
     * +------------------+
     */

    if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd,
                        sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
        fprintf( stderr, "Inquiry failed\n" );
        exit(2);
    }
    return (Inqbuffer + SCSI_OFF);
  }

  ̗͎̂悤ȍ\ɂȂĂ܂BInquiry ֐͂̃R}h
  ʃwb_̂(SCSI_OFFɂė^܂)ɃRs[܂B̓f[^
  ͂̃R}hɑ΂Ă݂͑܂B Handle_SCSI_cmd wb_\
  `܂B֐ main A̍ƒ̌{vO
  ł܂B

       void main( void )
       {
         fd = open(DEVICE, O_RDWR);
         if (fd < 0) {
           fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
           exit(1);
         }

         /* Inquiry ̌ʂ̈ꕔ̃tB[h\ */
         printf( "%s\n", Inquiry() + INQUIRY_VENDOR );
       }

  ŏɃfoCXI[vAG[`FbNĂAʂ̃Tu[`
  Ăяo܂B̌Ax_AiyуrWȂǂ̌ʂlԂ
  ߂`ŕ\܂B
  : Inquiry ̌ʂɂ͂̏ȃvOƑ
  񂪂܂B̃vOfoCX̎ނ ANSI ̃o[WȂ
  o悤ɊgȂ邩܂BfoCX̎ނɂ͓ʂȏdv
  ܂BƂ̂͂ꂪ̑uɑ΂K{уIvṼR
  }hZbg肷邩łBłvOȂ̂ł
  ΁AEric Youngdale ɂ scsiinfo vOgp邱Ƃł
  Bscsiinfo  SCSI uɂĂ̂قƂǑSĂ̏v̂
  Btsx-11.mit.edu  pub/Linux/ALPHA/scsi ĂB

  10.  ZXobt@

  o̓f[^̂ȂR}h̓ZXobt@(wb_\̂̈ꕔł)ɂ
  ăXe[^X񋟂ł܂BZXf[^͒ÕR}h CHECK
  CONDITION Xe[^X𔺂ȂďIƂɗp邱Ƃł܂B
  ̏ꍇ̓J[lIɃZXf[^ REQUEST SENSE R}hɂ
  ĉ܂B̍\͈ȉ̒ʂłF

       +=====-========-========-========-========-========-========-========-========+
       |  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
       |Byte |        |        |        |        |        |        |        |        |
       |=====+========+==============================================================|
       | 0   | Valid  |                  Error Code (70h or 71h)                     |
       |-----+-----------------------------------------------------------------------|
       | 1   |                           Segment Number                              |
       |-----+-----------------------------------------------------------------------|
       | 2   |Filemark|  EOM   |  ILI   |Reserved|         Sense Key                 |
       |-----+-----------------------------------------------------------------------|
       | 3   | (MSB)                                                                 |
       |- - -+---                        Information                              ---|
       | 6   |                                                                 (LSB) |
       |-----+-----------------------------------------------------------------------|
       | 7   |                           Additional Sense Length (n-7)               |
       |-----+-----------------------------------------------------------------------|
       | 8   | (MSB)                                                                 |
       |- - -+---                        Command-Specific Information             ---|
       | 11  |                                                                 (LSB) |
       |-----+-----------------------------------------------------------------------|
       | 12  |                           Additional Sense Code                       |
       |-----+-----------------------------------------------------------------------|
       | 13  |                           Additional Sense Code Qualifier             |
       |-----+-----------------------------------------------------------------------|
       | 14  |                           Field Replaceable Unit Code                 |
       |-----+-----------------------------------------------------------------------|
       | 15  |  SKSV  |                                                              |
       |- - -+------------               Sense-Key Specific                       ---|
       | 17  |                                                                       |
       |-----+-----------------------------------------------------------------------|
       | 18  |                                                                       |
       |- - -+---                        Additional Sense Bytes                   ---|
       | n   |                                                                       |
       +=============================================================================+

  ӁFłɗtB[h Sense Key(``''݂͂Ă
  )AAdditional Sense Code  Additional Sense Code Qualifier(``''
  ݂͂Ă)łB

  11.  ZXobt@p

  ł̓fBAuɓڂĂ邩ǂ邽߂ TEST
  UNIT READY R}hgp܂Binquiry ̗ɂwb_̐錾Ɗ֐
  handle_SCSI_cmd lɕKvłB

                               Table 73: TEST UNIT READY Command
       +=====-========-========-========-========-========-========-========-========+
       |  Bit|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
       |Byte |        |        |        |        |        |        |        |        |
       |=====+=======================================================================|
       | 0   |                           Operation Code (00h)                        |
       |-----+-----------------------------------------------------------------------|
       | 1   | Logical Unit Number      |                  Reserved                  |
       |-----+-----------------------------------------------------------------------|
       | 2   |                           Reserved                                    |
       |-----+-----------------------------------------------------------------------|
       | 3   |                           Reserved                                    |
       |-----+-----------------------------------------------------------------------|
       | 4   |                           Reserved                                    |
       |-----+-----------------------------------------------------------------------|
       | 5   |                           Control                                     |
       +=============================================================================+

  ȉ֐łF

  #define TESTUNITREADY_CMD 0
  #define TESTUNITREADY_CMDLEN 6

  #define ADD_SENSECODE 12
  #define ADD_SC_QUALIFIER 13
  #define NO_MEDIA_SC 0x3a
  #define NO_MEDIA_SCQ 0x00

  int TestForMedium ( void )
  {
    /* request READY status */
    static unsigned char cmdblk [TESTUNITREADY_CMDLEN] = {
        TESTUNITREADY_CMD, /* command */
                        0, /* lun/reserved */
                        0, /* reserved */
                        0, /* reserved */
                        0, /* reserved */
                        0};/* control */

    memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );

    /*
     * +------------------+
     * | struct sg_header | <- cmd
     * +------------------+
     * | copy of cmdblk   | <- cmd + SCSI_OFF
     * +------------------+
     */

    if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd,
                              0, NULL)) {
        fprintf (stderr, "Test unit ready failed\n");
        exit(2);
    }

    return
     *(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) !=
                                                          NO_MEDIA_SC ||
     *(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) !=
                                                          NO_MEDIA_SCQ;
  }

  main֐Ƒgݍ킹ƁA`FbNsƂł܂B

       void main( void )
       {
         fd = open(DEVICE, O_RDWR);
         if (fd < 0) {
           fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
           exit(1);
         }

         /* look if medium is loaded */

         if (!TestForMedium()) {
           printf("device is unloaded\n");
         } else {
           printf("device is loaded\n");
         }
       }

  t^̃t@C generic_demo.c ɂ̗͗Ⴊ܂܂܂B

  12.  ioctl ֐

   ioctl ֐p邱Ƃł܂F

  o  ioctl(fd, SG_SET_TIMEOUT, &Timeout); ̓^CAEgl Timeout *
     10 ~bɐݒ肵܂B Timeout  int ƂĐ錾˂΂Ȃ܂
     B

  o  ioctl(fd, SG_GET_TIMEOUT, &Timeout); ݂͌̃^CAEgl𓾂
     BTimeout  int ƂĐ錾˂΂Ȃ܂B

  13.  hCõftHg

  13.1.  Transfer Lengths `B

  (ȂƂJ[lo[W 1.1.68 ܂)͓͂яo͂̑傫
  ̓J[l SG_BIG_BUFF `ăRpCĂȂ4096 oC
  gȉłȂ΂Ȃ܂B`ꍇ SG_BIG_BUFF (: 32768)oC
  gɐ܂B̑傫͓͂̃R}hubNłȂ
  wb_܂݂܂B SG_BIG_BUFF  (131072-512) ܂ňSɑ₹܂B
  񂱂̗_󂷂邽߂ɂ́A_AVJ[lRpC
  NKv܂B

  13.2.  ^CAEgyэĎs̒l

  ftHg̃^CAEgl͈ꕪ(Timeout = 6000)ɃZbgĂ
  B ioctl Ăяo(``''݂͂Ă)ƂŕύXł܂BĎs
  ̃ftHg̒l 1 łB

  14.  SCSI ̎dl̎擾

  SCSI-1  SCSI-2 (ĂЂƂƂ܂Ȃ SCSI-3) Ɩ
  WKi݂܂BWKi͑啔ʌ݊łB

  SCSI-1 WKi(M҂̈ӌł)قƂǎxŁASCSI-2 łL
  ͂ɂ킽ĎgĂ܂BSCSI-3 ͂ւVĂƂĂłB
  ̕WꂽR}hZbg SCSI Ǝ҂ɑ΂ĕK{̂
  IvṼR}hw肵ĂAWĂ炸vO~O
  ̂߂̏őɗpłȂx_Ǝ̊gR}hɗD悵đI
  ׂłB

  ŐV̑Ă̓dqIȕʂ͈ȉ anonymous ftp ł܂F

  o  ftp.cs.tulane.edu:pub/scsi

  o  ftp.symbios.com:/pub/standards

  o  ftp.cs.uni-sb.de:/pub/misc/doc/scsi

  ( Yggdrasil Linux CD-ROM ̃fBNg /usr/doc/scsi-2 
  /usr/doc/scsi-1  SCSI dlɓ܂B)

  SCSI FAQ łȉ̈̏񌹂Ă܂F

  The SCSI specification: Available from: SCSI dlFȉ
  \F

             Global Engineering Documents
             15 Inverness Way East
             Englewood Co  80112-5704
             (800) 854-7179
               SCSI-1: X3.131-1986
               SCSI-2: X3.131-199x
               SCSI-3 X3T9.2/91-010R4 Working Draft

       (Global Engineering Documentation in Irvine, CA (714)261-1455??)

       SCSI-1: Doc \# X3.131-1986 from ANSI, 1430 Broadway, NY, NY 10018

       IN-DEPTH EXPLORATION OF SCSI can be obtained from
       Solution Technology, Attn: SCSI Publications, POB 104, Boulder Creek,
       CA 95006, (408)338-4285, FAX (408)338-4374

       THE SCSI ENCYLOPEDIA and the SCSI BENCH REFERENCE can be obtained from
       ENDL Publishing, 14426 Black Walnut Ct., Saratoga, CA 95090,
       (408)867-6642, FAX (408)867-2115

       SCSI: UNDERSTANDING THE SMALL COMPUTER SYSTEM INTERFACE was published
       by Prentice-Hall, ISBN 0-13-796855-8

       []{̏
       (񂠂̂łłAƂ肠A҂̎苖ɂ̂܂B
       Rg҂Ă܂B)

       (1)SCSI-2ڍ׉FŐVSCSIKiƃR}hEt@X. J  .
       CQoŎ. 1994 . ISBN 4-7898-3523-5

       (2)SCSIC^[tF[XeNjJubN NEC PC-9800V[YΉ ŊwSCSIC^[tF[X NEC PC-9800V[YvO}Kg
       1989.8.1 Ŕs
       ()R[ (C)NEC Corporation

       SCSIC^[tF[X{[h(PC-9801-55ɓڂĂWD33C93ւ̃ANZX@)ASCSIC^[tF[XBIOS(SCSI@ėpIɐł郌x)ASCSIC^[tF[XΉŒBIOS̎O\ȂB

  15.  ֘A

  15.1.  HOWTOs and FAQs HOWTO  FAQ

  Drew Eckhardt ɂ Linux SCSI-HOWTO ͑uŗL̎₾łȂSĂ
  T|[g SCSI Rg[ԗĂ܂B

  SCSI ɂĂ̈ʓIȎ̓j[XO[v Comp.Periphs.Scsi ł
  SCSI-FAQ ̒ŉ񓚂Ă܂( tsx-11  pub/linux/ALPHA/scsi 
  ~[TCg\)

  15.2.  [OXg

  Linux ł SCSI ̊JɊ֌WoO񍐂ƎɂĂ mailing list
  ܂BQ邽߂ɂ́AʐM̖{̂ subscribe linux-scsi ̍s
  āAmajordomo@vger.rutgers.edu ɓdq[𑗂ĂB
  M linux-scsi@vger.rutgers.edu ɓe܂傤Bwv
  "help" ̍s majordomo@vger.rutgers.edu ɓdq[𑗂Ηv
  ł܂B

  15.3.  R[h

     sunsite.unc.edu: apps/graphics/hpscanpbm-0.3a.tar.gz
        ̃pbP[W HP XLWFbgXLi[ėpC^[
        tF[Xʂđc܂B

     tsx-11.mit.edu: BETA/cdrom/private/mkisofs/cdwrite-1.3.tar.gz
        cdwrite pbP[W͔ėpC^[tF[X CD ̃C[W CD 
        C^[ɏ̂Ɏg܂B

     sunsite.unc.edu: apps/sound/cds/cdda2wav*.src.tar.gz
        pm炸ɂ̃AvP[V̐`ŁAI[fBI CD gb
        N wav t@CւƃRs[܂B[]ŋ߁Acdda2wav荂
        \tg[X܂BȂĂH

  16.  ɖɗ

  Ȃɂƒ@̂ɂāBƐVƂDĂ̂邩
  Ȃǂ͂悭킩܂BЂӌB

  16.1.  foCXhCol̏ɂȂ

  ̕ sunsite.unc.edu ftp T[oт̃~[ł݂邱
  Ƃł܂B

     /pub/Linux/docs/kernel/kernel-hackers-guide
        LDP (Linux Documentation Project) ̃J[lnbJ[YKChB
        Ǝxꂩ܂񂪁AƂbIȎJo[
        Ă܂B

     /pub/Linux/docs/kernel/drivers.doc.z
        ̓̕LN^hCȍĂ܂B

     /pub/Linux/docs/kernel/tutorial.doc.z
        LN^foCX̍쐬ɂăR[htł̃`[gAB

     /pub/Linux/docs/kernel/scsi.paper.tar.gz
        SCSI hCȍLqLaTeX B

     /pub/Linux/docs/hardware/DEVICES
        Linux Ŏgp郁W[foCXƃ}Ci[foCX̃Xg

      The Linux Kernel
        󕶂ŏɒǉ܂BLDP̕B David A Rusling 
        ́B\Ǝv܂BƂĂ LINUX Kernel
        Internals (Addison Wesley)ɎĂ܂AR[h͂܂肠܂
        B

  16.2.  [eBeB

     tsx-11.mit.edu: ALPHA/scsi/scsiinfo*.tar.gz
        SCSI uɑ΂đp[^A׃XgȂǂ₢킹邽
        ߂̃vOBX EBhEVXex[X̃C^[tF[X
        p邱Ƃł܂B Tk/Tcl/wish ̃CXg[Kv
        B X x[X̃C^[tF[XpΗeՂɃhCu̐ݒ
        ύX邱Ƃł܂B

     tsx-11.mit.edu: ALPHA/kdebug
        J[lfobO邽߂ gdb ̊g

  17.  SCSI ɃANZX邻̑̃C^[tF[X

  Linux ł  SCSI_IOCTL_SEND_COMMAND ioctl ̌Ăяop SCSI ɃA
  NZXƂsȎi܂A߂܂B

  un*x Eł͈ʂɗpĂ鑼̗ގ̃C^[tF[X
  ݂܂ALinux ŎgƂ͂ł܂B

  1. CAM (Common Access MethodʃANZX@])BFuture Domain yё
     SCSI x_JBLinux  SCSI CAM VXe܂قƂǃT|[
     gĂ܂(Ƀn[hfBXÑu[gɊւ)B CAM ̓^[
     Qbg[hT|[g܂ÃRs[^Ӌ@
     邩̂悤ɋU邱Ƃ肦܂(܂菬 SCSI lbg[
     N)B

  2. ASPI (Advanced SCSI Programming Interface)BAdaptecJB
     MS-DOS }V[ɂƂĂ̎̕WłB

  ɓlɂ SCO(TM), NeXT(TM), Silicon Graphics(TM)  SUN(TM)
  ł̃AvP[VC^[tF[X܂B

  18.  

  ėp SCSI C^[tF[X̓[UAvP[VƓ̃foCX̊
  ̍an܂Bގᐅ̊֐QvO
  т݂́Aʂ̖ړIɑ΂ʉꂽᐅ֐Q
  LCuɓ]܂Ƃ܂BvȖڕW
  C^[tF[XƗwɓ邱ƂłׂłBAv
  P[V჌xȃ[`ƃn[hEFAɈˑ郋[`Ƃɕ
  ̂悢݌vł傤Bᐅ[`͋LCuɓ邱Ƃ
  łł傤ASẴAvP[V痘pł悤ɂȂł
  BŁAWꂽC^[tF[XłV̂
  ɑׂłB

  ł݂͂Ȃ͎ Linux ėp SCSI C^[tF[Xɂ
  ďڂ͂łBł炢܂SE Linux R~jeB̗v̂
  ߂ɁA͂ȃAvP[V̊Jɒł܂B

  19.  ӎ

  Jeff Tranter ɂ͂̕OɍZǂĂꂽƂɂقƂ
  ӂ܂Bɗ] Carlos Phchol ɂB̃C^[
  tF[X̎gpɂčŏ(΂)₵Ƃ Drew Eckhardt 
  Eric Youngdale ĂꂽƂ肪vĂ܂B

  A.  t^

  B.  G[

  ֐ open, ioctl, write  read ̓G[񍐂\
  B̏ꍇA֐̕Ԃl -1 őϐ errno ɃG[ԍ^
  ܂B errno ̒l /usr/include/errno.h ɂĒ`Ă܂B
  ȉ̂悤ȒlƂ肦܂F

       ֐     | G[       | 
       =========|==============|=============================================
       open     | ENXIO        | foCX
                | EACCES       | ANZX[hread/write(O_RDWR)łȂ
                | EBUSY        | foCXɑ΂ubNȂANZXv
                |              | ꂽA݂̓rW[ԁB
                | ERESTARTSYS  | ͓̃G[BČ\ɂ
                |              | SCSI `lɕ񂹂ꂽ(oO񍐂̏ڍ
                |              |  Drew Eckhardts ɂ SCSI-HOWTO ݂)
       ioctl    | ENXIO        | foCX
       read     | EAGAIN       | foCXubN悤ƂBōĎsB
                | ERESTARTSYS  | ꂪ̃G[BČ\ɂ
                |              | SCSI `lɕ񂹂ꂽ(oO񍐂̏ڍ
                |              |  Drew Eckhardts ɂ SCSI-HOWTO ݂)
       write    | EIO          | Z (ʃwb_\̂菬)B
                |              | x: ݂̏A߂̊mF͂ȂB
                | EAGAIN       | foCXubN悤ƂBōĎsB
                | ENOMEM       | ̗vɕKvȃĂłȂB
                |              | ő`TCY𒴂ĂȂȂΌōĎs
                |              | (݂)B
       select   |              | Ȃ
       close    |              | Ȃ

  read/write ̐̕Ԃl͗ɂē`ɐoCgĂ
  B͗voCgƓׂłB

  B.1.  G[Xe[^X̉

  ɂڍׂȕ񍐂J[l hd_status  foCX sense_buffer
  ɂĂȂ܂(``''݂͂Ă)Bʃwb_\̂ɂ
  ܂B

  hd_status ̈Ӗ drivers/scsi/scsi.h Œ񋟂܂F unsigned
  int ͈قȂ镔\Ă܂B

         lsb  |    ...    |    ...    | msb
       =======|===========|===========|============
       status | sense key | host code | driver byte

  drivers/scsi/scsi.hł̃}Nɓ邱Ƃł̂łA
  sKɂĖsvcȃwb_t@C݈̑ˑ̂߂ɊȒPɂ͎g܂
  BꂢɂȂƂ܂B

         }N          | 
  =======================|====================================================
  status_byte(hd_status) | SCSI ȕԁBXe[^XR[h݂̏͂B
  msg_byte(hd_status)    | uBSCSI sense keys ݂̏͂B
  host_byte(hd_status)   | J[lB Hostcodes ݂̏͂B
  driver_byte(hd_status) | J[lB. midlevel codes ݂̏͂B

  B.2.  Xe[^XR[h

  ȉSCSI uԂXe[^XR[h(scsi/scsi.hŒ`
  ܂)p\łB

        l   | V{
       ======|=====================
       0x00  | GOOD
       0x01  | CHECK_CONDITION
       0x02  | CONDITION_GOOD
       0x04  | BUSY
       0x08  | INTERMEDIATE_GOOD
       0x0a  | INTERMEDIATE_C_GOOD
       0x0c  | RESERVATION_CONFLICT

  ̃V{̒l͉EɈVtgĂ邱ƂɒӂĂB
  Xe[^X CHECK_CONDITION ̂ƂȂ΁AZXobt@̃ZX
  f[^͗Lł(ɒǉIȃZXR[hƒǉIȃZXR[hNI
  t@CAmFĂ)B

  ̒lɂ SCSI-2 dlɂƎ̂悤ȈӖ܂B

                                  Table 27: Status Byte Code
       +=================================-==============================+
       |       Bits of Status Byte       |  Status                      |
       |  7   6   5   4   3   2   1   0  |                              |
       |---------------------------------+------------------------------|
       |  R   R   0   0   0   0   0   R  |  GOOD                        |
       |  R   R   0   0   0   0   1   R  |  CHECK CONDITION             |
       |  R   R   0   0   0   1   0   R  |  CONDITION MET               |
       |  R   R   0   0   1   0   0   R  |  BUSY                        |
       |  R   R   0   1   0   0   0   R  |  INTERMEDIATE                |
       |  R   R   0   1   0   1   0   R  |  INTERMEDIATE-CONDITION MET  |
       |  R   R   0   1   1   0   0   R  |  RESERVATION CONFLICT        |
       |  R   R   1   0   0   0   1   R  |  COMMAND TERMINATED          |
       |  R   R   1   0   1   0   0   R  |  QUEUE FULL                  |
       |                                 |                              |
       |       All Other Codes           |  Reserved                    |
       |----------------------------------------------------------------|
       |  Key: R = Reserved bit                                         |
       +================================================================+

  Xe[^XoCgR[h̒`ȉɗ^B
       GOOD.  ̏Ԃ̓^[QbgR}h̎sɐƂB

       CHECK CONDITION.  ̏Ԃ contingent allegiance condition 
       ƂB(6.6݂)B

       CONDITION MET.  ̏Ԃ INTERMEDIATE-CONDITION MET ͗v
       삪BꂽƂɂ͂łԂB(SEARCH DATA y PRE-FETCH
       R}h݂)B

       BUSY.  ̏Ԃ̓^[QbgrW[ł邱ƂB̏Ԃ̓^[Qbg
       R}h̑̎t\ȃCjVG[^(Ȃ킿ۗłȂՓ)
       R}h󂯕t邱ƂłȂƂ͂łԂł낤B
       CjVG[^̉񕜓͌̎_ōĂуR}h𔭍s邱ƂłB

       INTERMEDIATE. ̏Ԃ INTERMEDIATE-CONDITION MET ́AR}h
       CHECK CONDITION, RESERVATION CONFLICT  COMMAND TERMINATED Xe[^X
       ɂĂ͏IȂꍇɁAȂ̘AR}hQ(Ō̃R}
       h)ɂĊeR}h̎sɐƂɕԂB INTERMEDIATE
       邢 INTERMEDIATE-CONDITION MET Xe[^XԂȂȂ΁A̘A
       R}h͏Iēo͑͏IĂB

       INTERMEDIATE-CONDITION MET.  ̏Ԃ CONDITON MET  INTERMEDIATE Xe[^
       XĝłB

       RESERVATION CONFLICT.  ̏Ԃ̓CjVG[^ʂ SCSI uɑ΂ďՓ˕ۗ
       \^ƂĎw肳Ă郍WJjbg̓WJjbg̒x
       [?? extent ??]ɃANZX݂ꍇɕKԂBCjVG[^̉
       ͌̎_ōēxR}h𔭍s邱ƂłB

       COMMAND TERMINATED.  ̏Ԃ TERMINATE I/O PROCESS bZ[W(5.6.22 ݂)
       󂯎ƂŃ^[Qbg݂̓o͑IꍇɕԂB
       Ԃ͂܂ contingent allegiance condition ƂĂ(6.6 ݂)B

       QUEUE FULL.  ̏Ԃ̓^OtꂽL[삪ĂꍇɎ
       ƂB̏Ԃ SIMPLE QUEUE TAG, ORDERED QUEUE TAG  HEAD OF QUEUE TAG
       bZ[W󂯎R}hL[ςłƂɕԂBo͑
       ̓R}hL[ɔzuȂB

  B.3.  SCSI Sense Keys

  ̃J[lV{(scsi/scsi.h)炩ߒ`Ă
  B

  Value | Symbol
  ======|================
  0x00  | NO_SENSE
  0x01  | RECOVERED_ERROR
  0x02  | NOT_READY
  0x03  | MEDIUM_ERROR
  0x04  | HARDWARE_ERROR
  0x05  | ILLEGAL_REQUEST
  0x06  | UNIT_ATTENTION
  0x07  | DATA_PROTECT
  0x08  | BLANK_CHECK
  0x0a  | COPY_ABORTED
  0x0b  | ABORTED_COMMAND
  0x0d  | VOLUME_OVERFLOW
  0x0e  | MISCOMPARE

  SCSI-2 ɂ郊Xĝ܂܂͈ȉ̒ʂł(7.2.14.3 ͂)B

                      Table 69: Sense Key (0h-7h) Descriptions
  +========-====================================================================+
  | Sense  |  Description                                                       |
  |  Key   |                                                                    |
  |--------+--------------------------------------------------------------------|
  |   0h   |  NO SENSE.  Indicates that there is no specific sense key          |
  |        |  information to be reported for the designated logical unit.  This |
  |        |  would be the case for a successful command or a command that      |
  |        |  received CHECK CONDITION or COMMAND TERMINATED status because one |
  |        |  of the filemark, EOM, or ILI bits is set to one.                  |
  |--------+--------------------------------------------------------------------|
  |   1h   |  RECOVERED ERROR.  Indicates that the last command completed       |
  |        |  successfully with some recovery action performed by the target.   |
  |        |  Details may be determinable by examining the additional sense     |
  |        |  bytes and the information field.  When multiple recovered errors  |
  |        |  occur during one command, the choice of which error to report     |
  |        |  (first, last, most severe, etc.) is device specific.              |
  |--------+--------------------------------------------------------------------|
  |   2h   |  NOT READY.  Indicates that the logical unit addressed cannot be   |
  |        |  accessed.  Operator intervention may be required to correct this  |
  |        |  condition.                                                        |
  |--------+--------------------------------------------------------------------|
  |   3h   |  MEDIUM ERROR.  Indicates that the command terminated with a non-  |
  |        |  recovered error condition that was probably caused by a flaw in   |
  |        |  the medium or an error in the recorded data.  This sense key may  |
  |        |  also be returned if the target is unable to distinguish between a |
  |        |  flaw in the medium and a specific hardware failure (sense key 4h).|
  |--------+--------------------------------------------------------------------|
  |   4h   |  HARDWARE ERROR.  Indicates that the target detected a non-        |
  |        |  recoverable hardware failure (for example, controller failure,    |
  |        |  device failure, parity error, etc.) while performing the command  |
  |        |  or during a self test.                                            |
  |--------+--------------------------------------------------------------------|
  |   5h   |  ILLEGAL REQUEST.  Indicates that there was an illegal parameter in|
  |        |  the command descriptor block or in the additional parameters      |
  |        |  supplied as data for some commands (FORMAT UNIT, SEARCH DATA,     |
  |        |  etc.).  If the target detects an invalid parameter in the command |
  |        |  descriptor block, then it shall terminate the command without     |
  |        |  altering the medium.  If the target detects an invalid parameter  |
  |        |  in the additional parameters supplied as data, then the target may|
  |        |  have already altered the medium.  This sense key may also indicate|
  |        |  that an invalid IDENTIFY message was received (5.6.7).            |
  |--------+--------------------------------------------------------------------|
  |   6h   |  UNIT ATTENTION.  Indicates that the removable medium may have been|
  |        |  changed or the target has been reset.  See 6.9 for more detailed  |
  |        |  information about the unit attention condition.                   |
  |--------+--------------------------------------------------------------------|
  |   7h   |  DATA PROTECT.  Indicates that a command that reads or writes the  |
  |        |  medium was attempted on a block that is protected from this       |
  |        |  operation.  The read or write operation is not performed.         |
  +=============================================================================+

                      Table 70: Sense Key (8h-Fh) Descriptions
  +========-====================================================================+
  | Sense  |  Description                                                       |
  |  Key   |                                                                    |
  |--------+--------------------------------------------------------------------|
  |   8h   |  BLANK CHECK.  Indicates that a write-once device or a sequential- |
  |        |  access device encountered blank medium or format-defined end-of-  |
  |        |  data indication while reading or a write-once device encountered a|
  |        |  non-blank medium while writing.                                   |
  |--------+--------------------------------------------------------------------|
  |   9h   |  Vendor Specific.  This sense key is available for reporting vendor|
  |        |  specific conditions.                                              |
  |--------+--------------------------------------------------------------------|
  |   Ah   |  COPY ABORTED.  Indicates a COPY, COMPARE, or COPY AND VERIFY      |
  |        |  command was aborted due to an error condition on the source       |
  |        |  device, the destination device, or both.  (See 7.2.3.2 for        |
  |        |  additional information about this sense key.)                     |
  |--------+--------------------------------------------------------------------|
  |   Bh   |  ABORTED COMMAND.  Indicates that the target aborted the command.  |
  |        |  The initiator may be able to recover by trying the command again. |
  |--------+--------------------------------------------------------------------|
  |   Ch   |  EQUAL.  Indicates a SEARCH DATA command has satisfied an equal    |
  |        |  comparison.                                                       |
  |--------+--------------------------------------------------------------------|
  |   Dh   |  VOLUME OVERFLOW.  Indicates that a buffered peripheral device has |
  |        |  reached the end-of-partition and data may remain in the buffer    |
  |        |  that has not been written to the medium.  A RECOVER BUFFERED DATA |
  |        |  command(s) may be issued to read the unwritten data from the      |
  |        |  buffer.                                                           |
  |--------+--------------------------------------------------------------------|
  |   Eh   |  MISCOMPARE.  Indicates that the source data did not match the data|
  |        |  read from the medium.                                             |
  |--------+--------------------------------------------------------------------|
  |   Fh   |  RESERVED.                                                         |
  +=============================================================================+

  B.4.  Host codes

  ȉ host code  drivers/scsi/scsi.h ɂĒ`Ă܂B
  ̓J[lhCoɂZbg܂B

       Value | Symbol         | Description
       ======|================|========================================
       0x00  | DID_OK         | No error
       0x01  | DID_NO_CONNECT | Couldn't connect before timeout period
       0x02  | DID_BUS_BUSY   | BUS stayed busy through time out period
       0x03  | DID_TIME_OUT   | TIMED OUT for other reason
       0x04  | DID_BAD_TARGET | BAD target
       0x05  | DID_ABORT      | Told to abort for some other reason
       0x06  | DID_PARITY     | Parity error
       0x07  | DID_ERROR      | internal error
       0x08  | DID_RESET      | Reset by somebody
       0x09  | DID_BAD_INTR   | Got an interrupt we weren't expecting

  B.5.  Driver codes

  ԑw̃hCo͑ũZXL[ɊÂĒᐅhCoԂ
  ꂽԂޕʂ܂BɍĎsA~邢͍ă}bvƂƂ
  ̓܂B

  Value | Symbol         | Description of Driver status
  ======|================|========================================
  0x00  | DRIVER_OK      | No error
  0x01  | DRIVER_BUSY    | not used
  0x02  | DRIVER_SOFT    | not used
  0x03  | DRIVER_MEDIA   | not used
  0x04  | DRIVER_ERROR   | internal driver error
  0x05  | DRIVER_INVALID | finished (DID_BAD_TARGET or DID_ABORT)
  0x06  | DRIVER_TIMEOUT | finished with timeout
  0x07  | DRIVER_HARD    | finished with fatal error
  0x08  | DRIVER_SENSE   | had sense information available

       Value | Symbol         | Description of suggestion
       ======|================|========================================
       0x10  | SUGGEST_RETRY  | retry the SCSI request
       0x20  | SUGGEST_ABORT  | abort the request
       0x30  | SUGGEST_REMAP  | remap the block (not yet implemented)
       0x40  | SUGGEST_DIE    | let the kernel panic
       0x80  | SUGGEST_SENSE  | get sense information from the device
       0xff  | SUGGEST_IS_OK  | nothing to be done

  C.  Additional sense codes   additional sense code qualifiers

  sꂽ SCSI R}h̏Ԃ CHECK_CONDItiON ̎ɂ́AZXob
  t@̃ZXf[^p\łBadditional sense code 
  additional sense code qualifier ̃obt@̒Ɋ܂܂Ă܂B

  SCSI-2 ̎dl̕\Z܂Bŏ͎̂̂ŁAԖ
  ͔̂̂ԍłB

  C.1.  ASC and ASCQ()

  ̕\̃Xg͉̃XgƂꂪKpfoCX̎ނƂ
  B

  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                                          |
  |           .T - SEQUENTIAL ACCESS DEVICE                                     |
  |           . L - PRINTER DEVICE                                              |
  |           .  P - PROCESSOR DEVICE                                           |
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
  | --- ----              ----------------------------------------------------- |
  | 13h  00h  D   W  O    ADDRESS MARK NOT FOUND FOR DATA FIELD                 |
  | 12h  00h  D   W  O    ADDRESS MARK NOT FOUND FOR ID FIELD                   |
  | 00h  11h       R      AUDIO PLAY OPERATION IN PROGRESS                      |
  | 00h  12h       R      AUDIO PLAY OPERATION PAUSED                           |
  | 00h  14h       R      AUDIO PLAY OPERATION STOPPED DUE TO ERROR             |
  | 00h  13h       R      AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED           |
  | 00h  04h   T    S     BEGINNING-OF-PARTITION/MEDIUM DETECTED                |
  | 14h  04h   T          BLOCK SEQUENCE ERROR                                  |
  | 30h  02h  DT  WR O    CANNOT READ MEDIUM - INCOMPATIBLE FORMAT              |
  | 30h  01h  DT  WR O    CANNOT READ MEDIUM - UNKNOWN FORMAT                   |
  | 52h  00h   T          CARTRIDGE FAULT                                       |
  | 3Fh  02h  DTLPWRSOMC  CHANGED OPERATING DEFINITION                          |
  | 11h  06h      WR O    CIRC UNRECOVERED ERROR                                |
  | 30h  03h  DT          CLEANING CARTRIDGE INSTALLED                          |
  | 4Ah  00h  DTLPWRSOMC  COMMAND PHASE ERROR                                   |
  | 2Ch  00h  DTLPWRSOMC  COMMAND SEQUENCE ERROR                                |
  | 2Fh  00h  DTLPWRSOMC  COMMANDS CLEARED BY ANOTHER INITIATOR                 |
  | 2Bh  00h  DTLPWRSO C  COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT      |
  | 41h  00h  D           DATA PATH FAILURE (SHOULD USE 40 NN)                  |
  | 4Bh  00h  DTLPWRSOMC  DATA PHASE ERROR                                      |
  | 11h  07h      W  O    DATA RESYCHRONIZATION ERROR                           |
  | 16h  00h  D   W  O    DATA SYNCHRONIZATION MARK ERROR                       |
  | 19h  00h  D      O    DEFECT LIST ERROR                                     |
  | 19h  03h  D      O    DEFECT LIST ERROR IN GROWN LIST                       |
  | 19h  02h  D      O    DEFECT LIST ERROR IN PRIMARY LIST                     |
  | 19h  01h  D      O    DEFECT LIST NOT AVAILABLE                             |
  | 1Ch  00h  D      O    DEFECT LIST NOT FOUND                                 |
  | 32h  01h  D   W  O    DEFECT LIST UPDATE FAILURE                            |
  | 40h  NNh  DTLPWRSOMC  DIAGNOSTIC FAILURE ON COMPONENT NN (80H-FFH)          |
  | 63h  00h       R      END OF USER AREA ENCOUNTERED ON THIS TRACK            |
  | 00h  05h   T    S     END-OF-DATA DETECTED                                  |
  | 14h  03h   T          END-OF-DATA NOT FOUND                                 |
  | 00h  02h   T    S     END-OF-PARTITION/MEDIUM DETECTED                      |
  | 51h  00h   T     O    ERASE FAILURE                                         |
  | 0Ah  00h  DTLPWRSOMC  ERROR LOG OVERFLOW                                    |
  | 11h  02h  DT  W SO    ERROR TOO LONG TO CORRECT                             |
  | 03h  02h   T          EXCESSIVE WRITE ERRORS                                |
  | 3Bh  07h    L         FAILED TO SENSE BOTTOM-OF-FORM                        |
  | 3Bh  06h    L         FAILED TO SENSE TOP-OF-FORM                           |
  | 00h  01h   T          FILEMARK DETECTED                                     |
  | 14h  02h   T          FILEMARK OR SETMARK NOT FOUND                         |
  | 09h  02h      WR O    FOCUS SERVO FAILURE                                   |
  | 31h  01h  D L    O    FORMAT COMMAND FAILED                                 |
  | 58h  00h         O    GENERATION DOES NOT EXIST                             |
  +=============================================================================+

  Table 71: (continued)
  +=============================================================================+
  | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
  | --- ----              ----------------------------------------------------- |
  | 1Ch  02h  D      O    GROWN DEFECT LIST NOT FOUND                           |
  | 00h  06h  DTLPWRSOMC  I/O PROCESS TERMINATED                                |
  | 10h  00h  D   W  O    ID CRC OR ECC ERROR                                   |
  | 22h  00h  D           ILLEGAL FUNCTION (SHOULD USE 20 00, 24 00, OR 26 00)  |
  | 64h  00h       R      ILLEGAL MODE FOR THIS TRACK                           |
  | 28h  01h          M   IMPORT OR EXPORT ELEMENT ACCESSED                     |
  | 30h  00h  DT  WR OM   INCOMPATIBLE MEDIUM INSTALLED                         |
  | 11h  08h   T          INCOMPLETE BLOCK READ                                 |
  | 48h  00h  DTLPWRSOMC  INITIATOR DETECTED ERROR MESSAGE RECEIVED             |
  | 3Fh  03h  DTLPWRSOMC  INQUIRY DATA HAS CHANGED                              |
  | 44h  00h  DTLPWRSOMC  INTERNAL TARGET FAILURE                               |
  | 3Dh  00h  DTLPWRSOMC  INVALID BITS IN IDENTIFY MESSAGE                      |
  | 2Ch  02h        S     INVALID COMBINATION OF WINDOWS SPECIFIED              |
  | 20h  00h  DTLPWRSOMC  INVALID COMMAND OPERATION CODE                        |
  | 21h  01h          M   INVALID ELEMENT ADDRESS                               |
  | 24h  00h  DTLPWRSOMC  INVALID FIELD IN CDB                                  |
  | 26h  00h  DTLPWRSOMC  INVALID FIELD IN PARAMETER LIST                       |
  | 49h  00h  DTLPWRSOMC  INVALID MESSAGE ERROR                                 |
  | 11h  05h      WR O    L-EC UNCORRECTABLE ERROR                              |
  | 60h  00h        S     LAMP FAILURE                                          |
  | 5Bh  02h  DTLPWRSOM   LOG COUNTER AT MAXIMUM                                |
  | 5Bh  00h  DTLPWRSOM   LOG EXCEPTION                                         |
  | 5Bh  03h  DTLPWRSOM   LOG LIST CODES EXHAUSTED                              |
  | 2Ah  02h  DTL WRSOMC  LOG PARAMETERS CHANGED                                |
  | 21h  00h  DT  WR OM   LOGICAL BLOCK ADDRESS OUT OF RANGE                    |
  | 08h  00h  DTL WRSOMC  LOGICAL UNIT COMMUNICATION FAILURE                    |
  | 08h  02h  DTL WRSOMC  LOGICAL UNIT COMMUNICATION PARITY ERROR               |
  | 08h  01h  DTL WRSOMC  LOGICAL UNIT COMMUNICATION TIME-OUT                   |
  | 4Ch  00h  DTLPWRSOMC  LOGICAL UNIT FAILED SELF-CONFIGURATION                |
  | 3Eh  00h  DTLPWRSOMC  LOGICAL UNIT HAS NOT SELF-CONFIGURED YET              |
  | 04h  01h  DTLPWRSOMC  LOGICAL UNIT IS IN PROCESS OF BECOMING READY          |
  | 04h  00h  DTLPWRSOMC  LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE          |
  | 04h  04h  DTL    O    LOGICAL UNIT NOT READY, FORMAT IN PROGRESS            |
  | 04h  02h  DTLPWRSOMC  LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED |
  | 04h  03h  DTLPWRSOMC  LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED  |
  | 25h  00h  DTLPWRSOMC  LOGICAL UNIT NOT SUPPORTED                            |
  | 15h  01h  DTL WRSOM   MECHANICAL POSITIONING ERROR                          |
  | 53h  00h  DTL WRSOM   MEDIA LOAD OR EJECT FAILED                            |
  | 3Bh  0Dh          M   MEDIUM DESTINATION ELEMENT FULL                       |
  | 31h  00h  DT  W  O    MEDIUM FORMAT CORRUPTED                               |
  | 3Ah  00h  DTL WRSOM   MEDIUM NOT PRESENT                                    |
  | 53h  02h  DT  WR OM   MEDIUM REMOVAL PREVENTED                              |
  | 3Bh  0Eh          M   MEDIUM SOURCE ELEMENT EMPTY                           |
  | 43h  00h  DTLPWRSOMC  MESSAGE ERROR                                         |
  | 3Fh  01h  DTLPWRSOMC  MICROCODE HAS BEEN CHANGED                            |
  | 1Dh  00h  D   W  O    MISCOMPARE DURING VERIFY OPERATION                    |
  | 11h  0Ah  DT     O    MISCORRECTED ERROR                                    |
  | 2Ah  01h  DTL WRSOMC  MODE PARAMETERS CHANGED                               |
  | 07h  00h  DTL WRSOM   MULTIPLE PERIPHERAL DEVICES SELECTED                  |
  | 11h  03h  DT  W SO    MULTIPLE READ ERRORS                                  |
  | 00h  00h  DTLPWRSOMC  NO ADDITIONAL SENSE INFORMATION                       |
  | 00h  15h       R      NO CURRENT AUDIO STATUS TO RETURN                     |
  | 32h  00h  D   W  O    NO DEFECT SPARE LOCATION AVAILABLE                    |
  | 11h  09h   T          NO GAP FOUND                                          |
  | 01h  00h  D   W  O    NO INDEX/SECTOR SIGNAL                                |
  | 06h  00h  D   WR OM   NO REFERENCE POSITION FOUND                           |
  +=============================================================================+

       Table 71: (continued)
       +=============================================================================+
       | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
       | --- ----              ----------------------------------------------------- |
       | 02h  00h  D   WR OM   NO SEEK COMPLETE                                      |
       | 03h  01h   T          NO WRITE CURRENT                                      |
       | 28h  00h  DTLPWRSOMC  NOT READY TO READY TRANSITION, MEDIUM MAY HAVE CHANGED|
       | 5Ah  01h  DT  WR OM   OPERATOR MEDIUM REMOVAL REQUEST                       |
       | 5Ah  00h  DTLPWRSOM   OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED)  |
       | 5Ah  03h  DT  W  O    OPERATOR SELECTED WRITE PERMIT                        |
       | 5Ah  02h  DT  W  O    OPERATOR SELECTED WRITE PROTECT                       |
       | 61h  02h        S     OUT OF FOCUS                                          |
       | 4Eh  00h  DTLPWRSOMC  OVERLAPPED COMMANDS ATTEMPTED                         |
       | 2Dh  00h   T          OVERWRITE ERROR ON UPDATE IN PLACE                    |
       | 3Bh  05h    L         PAPER JAM                                             |
       | 1Ah  00h  DTLPWRSOMC  PARAMETER LIST LENGTH ERROR                           |
       | 26h  01h  DTLPWRSOMC  PARAMETER NOT SUPPORTED                               |
       | 26h  02h  DTLPWRSOMC  PARAMETER VALUE INVALID                               |
       | 2Ah  00h  DTL WRSOMC  PARAMETERS CHANGED                                    |
       | 03h  00h  DTL W SO    PERIPHERAL DEVICE WRITE FAULT                         |
       | 50h  02h   T          POSITION ERROR RELATED TO TIMING                      |
       | 3Bh  0Ch        S     POSITION PAST BEGINNING OF MEDIUM                     |
       | 3Bh  0Bh        S     POSITION PAST END OF MEDIUM                           |
       | 15h  02h  DT  WR O    POSITIONING ERROR DETECTED BY READ OF MEDIUM          |
       | 29h  00h  DTLPWRSOMC  POWER ON, RESET, OR BUS DEVICE RESET OCCURRED         |
       | 42h  00h  D           POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN)      |
       | 1Ch  01h  D      O    PRIMARY DEFECT LIST NOT FOUND                         |
       | 40h  00h  D           RAM FAILURE (SHOULD USE 40 NN)                        |
       | 15h  00h  DTL WRSOM   RANDOM POSITIONING ERROR                              |
       | 3Bh  0Ah        S     READ PAST BEGINNING OF MEDIUM                         |
       | 3Bh  09h        S     READ PAST END OF MEDIUM                               |
       | 11h  01h  DT  W SO    READ RETRIES EXHAUSTED                                |
       | 14h  01h  DT  WR O    RECORD NOT FOUND                                      |
       | 14h  00h  DTL WRSO    RECORDED ENTITY NOT FOUND                             |
       | 18h  02h  D   WR O    RECOVERED DATA - DATA AUTO-REALLOCATED                |
       | 18h  05h  D   WR O    RECOVERED DATA - RECOMMEND REASSIGNMENT               |
       | 18h  06h  D   WR O    RECOVERED DATA - RECOMMEND REWRITE                    |
       | 17h  05h  D   WR O    RECOVERED DATA USING PREVIOUS SECTOR ID               |
       | 18h  03h       R      RECOVERED DATA WITH CIRC                              |
       | 18h  01h  D   WR O    RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED|
       | 18h  00h  DT  WR O    RECOVERED DATA WITH ERROR CORRECTION APPLIED          |
       | 18h  04h       R      RECOVERED DATA WITH L-EC                              |
       | 17h  03h  DT  WR O    RECOVERED DATA WITH NEGATIVE HEAD OFFSET              |
       | 17h  00h  DT  WRSO    RECOVERED DATA WITH NO ERROR CORRECTION APPLIED       |
       | 17h  02h  DT  WR O    RECOVERED DATA WITH POSITIVE HEAD OFFSET              |
       | 17h  01h  DT  WRSO    RECOVERED DATA WITH RETRIES                           |
       | 17h  04h      WR O    RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED       |
       | 17h  06h  D   W  O    RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED    |
       | 17h  07h  D   W  O    RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT   |
       | 17h  08h  D   W  O    RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE        |
       | 1Eh  00h  D   W  O    RECOVERED ID WITH ECC CORRECTION                      |
       | 3Bh  08h   T          REPOSITION ERROR                                      |
       | 36h  00h    L         RIBBON, INK, OR TONER FAILURE                         |
       | 37h  00h  DTL WRSOMC  ROUNDED PARAMETER                                     |
       | 5Ch  00h  D      O    RPL STATUS CHANGE                                     |
       | 39h  00h  DTL WRSOMC  SAVING PARAMETERS NOT SUPPORTED                       |
       | 62h  00h        S     SCAN HEAD POSITIONING ERROR                           |
       | 47h  00h  DTLPWRSOMC  SCSI PARITY ERROR                                     |
       | 54h  00h     P        SCSI TO HOST SYSTEM INTERFACE FAILURE                 |
       | 45h  00h  DTLPWRSOMC  SELECT OR RESELECT FAILURE                            |
       +=============================================================================+

       Table 71: (concluded)
       +=============================================================================+
       | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
       | --- ----              ----------------------------------------------------- |
       | 3Bh  00h   TL         SEQUENTIAL POSITIONING ERROR                          |
       | 00h  03h   T          SETMARK DETECTED                                      |
       | 3Bh  04h    L         SLEW FAILURE                                          |
       | 09h  03h      WR O    SPINDLE SERVO FAILURE                                 |
       | 5Ch  02h  D      O    SPINDLES NOT SYNCHRONIZED                             |
       | 5Ch  01h  D      O    SPINDLES SYNCHRONIZED                                 |
       | 1Bh  00h  DTLPWRSOMC  SYNCHRONOUS DATA TRANSFER ERROR                       |
       | 55h  00h     P        SYSTEM RESOURCE FAILURE                               |
       | 33h  00h   T          TAPE LENGTH ERROR                                     |
       | 3Bh  03h    L         TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY      |
       | 3Bh  01h   T          TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM            |
       | 3Bh  02h   T          TAPE POSITION ERROR AT END-OF-MEDIUM                  |
       | 3Fh  00h  DTLPWRSOMC  TARGET OPERATING CONDITIONS HAVE CHANGED              |
       | 5Bh  01h  DTLPWRSOM   THRESHOLD CONDITION MET                               |
       | 26h  03h  DTLPWRSOMC  THRESHOLD PARAMETERS NOT SUPPORTED                    |
       | 2Ch  01h        S     TOO MANY WINDOWS SPECIFIED                            |
       | 09h  00h  DT  WR O    TRACK FOLLOWING ERROR                                 |
       | 09h  01h      WR O    TRACKING SERVO FAILURE                                |
       | 61h  01h        S     UNABLE TO ACQUIRE VIDEO                               |
       | 57h  00h       R      UNABLE TO RECOVER TABLE-OF-CONTENTS                   |
       | 53h  01h   T          UNLOAD TAPE FAILURE                                   |
       | 11h  00h  DT  WRSO    UNRECOVERED READ ERROR                                |
       | 11h  04h  D   W  O    UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED       |
       | 11h  0Bh  D   W  O    UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT       |
       | 11h  0Ch  D   W  O    UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA   |
       | 46h  00h  DTLPWRSOMC  UNSUCCESSFUL SOFT RESET                               |
       | 59h  00h         O    UPDATED BLOCK READ                                    |
       | 61h  00h        S     VIDEO ACQUISITION ERROR                               |
       | 50h  00h   T          WRITE APPEND ERROR                                    |
       | 50h  01h   T          WRITE APPEND POSITION ERROR                           |
       | 0Ch  00h   T    S     WRITE ERROR                                           |
       | 0Ch  02h  D   W  O    WRITE ERROR - AUTO REALLOCATION FAILED                |
       | 0Ch  01h  D   W  O    WRITE ERROR RECOVERED WITH AUTO REALLOCATION          |
       | 27h  00h  DT  W  O    WRITE PROTECTED                                       |
       |                                                                             |
       | 80h  XXh     \                                                              |
       | THROUGH       >       VENDOR SPECIFIC.                                      |
       | FFh  XX      /                                                              |
       |                                                                             |
       | XXh  80h     \                                                              |
       | THROUGH       >       VENDOR SPECIFIC QUALIFICATION OF STANDARD ASC.        |
       | XXh  FFh     /                                                              |
       |                       ALL CODES NOT SHOWN ARE RESERVED.                     |
       |-----------------------------------------------------------------------------|

  C.2.  ASC and ASCQ(ԍ)

                         Table 364: ASC and ASCQ Assignments

  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                                          |
  |           .T - SEQUENTIAL ACCESS DEVICE                                     |
  |           . L - PRINTER DEVICE                                              |
  |           .  P - PROCESSOR DEVICE                                           |
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
  | --- ----              ----------------------------------------------------- |
  |  00  00   DTLPWRSOMC  NO ADDITIONAL SENSE INFORMATION                       |
  |  00  01    T          FILEMARK DETECTED                                     |
  |  00  02    T    S     END-OF-PARTITION/MEDIUM DETECTED                      |
  |  00  03    T          SETMARK DETECTED                                      |
  |  00  04    T    S     BEGINNING-OF-PARTITION/MEDIUM DETECTED                |
  |  00  05    T    S     END-OF-DATA DETECTED                                  |
  |  00  06   DTLPWRSOMC  I/O PROCESS TERMINATED                                |
  |  00  11   R           AUDIO PLAY OPERATION IN PROGRESS                      |
  |  00  12   R           AUDIO PLAY OPERATION PAUSED                           |
  |  00  13   R           AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED           |
  |  00  14   R           AUDIO PLAY OPERATION STOPPED DUE TO ERROR             |
  |  00  15   R           NO CURRENT AUDIO STATUS TO RETURN                     |
  |  01  00   DW  O       NO INDEX/SECTOR SIGNAL                                |
  |  02  00   DWR OM      NO SEEK COMPLETE                                      |
  |  03  00   DTL W SO    PERIPHERAL DEVICE WRITE FAULT                         |
  |  03  01    T          NO WRITE CURRENT                                      |
  |  03  02    T          EXCESSIVE WRITE ERRORS                                |
  |  04  00   DTLPWRSOMC  LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE          |
  |  04  01   DTLPWRSOMC  LOGICAL UNIT IS IN PROCESS OF BECOMING READY          |
  |  04  02   DTLPWRSOMC  LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED |
  |  04  03   DTLPWRSOMC  LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED  |
  |  04  04   DTL    O    LOGICAL UNIT NOT READY, FORMAT IN PROGRESS            |
  |  05  00   DTL WRSOMC  LOGICAL UNIT DOES NOT RESPOND TO SELECTION            |
  |  06  00   DWR OM  NO  REFERENCE POSITION FOUND                              |
  |  07  00   DTL WRSOM   MULTIPLE PERIPHERAL DEVICES SELECTED                  |
  |  08  00   DTL WRSOMC  LOGICAL UNIT COMMUNICATION FAILURE                    |
  |  08  01   DTL WRSOMC  LOGICAL UNIT COMMUNICATION TIME-OUT                   |
  |  08  02   DTL WRSOMC  LOGICAL UNIT COMMUNICATION PARITY ERROR               |
  |  09  00   DT  WR O    TRACK FOLLOWING ERROR                                 |
  |  09  01       WR O    TRA CKING SERVO FAILURE                               |
  |  09  02       WR O    FOC US SERVO FAILURE                                  |
  |  09  03       WR O    SPI NDLE SERVO FAILURE                                |
  +=============================================================================+

  Table 364: (continued)
  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                                          |
  |           .T - SEQUENTIAL ACCESS DEVICE                                     |
  |           . L - PRINTER DEVICE                                              |
  |           .  P - PROCESSOR DEVICE                                           |
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
  | --- ----              ----------------------------------------------------- |
  |  0A  00   DTLPWRSOMC  ERROR LOG OVERFLOW                                    |
  |  0B  00                                                                     |
  |  0C  00    T     S    WRITE ERROR                                           |
  |  0C  01   D   W  O    WRITE ERROR RECOVERED WITH AUTO REALLOCATION          |
  |  0C  02   D   W  O    WRITE ERROR - AUTO REALLOCATION FAILED                |
  |  0D  00                                                                     |
  |  0E  00                                                                     |
  |  0F  00                                                                     |
  |  10  00   D   W  O    ID CRC OR ECC ERROR                                   |
  |  11  00   DT  WRSO    UNRECOVERED READ ERROR                                |
  |  11  01   DT  W SO    READ RETRIES EXHAUSTED                                |
  |  11  02   DT  W SO    ERROR TOO LONG TO CORRECT                             |
  |  11  03   DT  W SO    MULTIPLE READ ERRORS                                  |
  |  11  04   D   W  O    UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED       |
  |  11  05       WR O    L-EC UNCORRECTABLE ERROR                              |
  |  11  06       WR O    CIRC UNRECOVERED ERROR                                |
  |  11  07       W  O    DATA RESYCHRONIZATION ERROR                           |
  |  11  08    T          INCOMPLETE BLOCK READ                                 |
  |  11  09    T          NO GAP FOUND                                          |
  |  11  0A   DT     O    MISCORRECTED ERROR                                    |
  |  11  0B   D   W  O    UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT       |
  |  11  0C   D   W  O    UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA   |
  |  12  00   D   W  O    ADDRESS MARK NOT FOUND FOR ID FIELD                   |
  |  13  00   D   W  O    ADDRESS MARK NOT FOUND FOR DATA FIELD                 |
  |  14  00   DTL WRSO    RECORDED ENTITY NOT FOUND                             |
  |  14  01   DT  WR O    RECORD NOT FOUND                                      |
  |  14  02    T          FILEMARK OR SETMARK NOT FOUND                         |
  |  14  03    T          END-OF-DATA NOT FOUND                                 |
  |  14  04    T          BLOCK SEQUENCE ERROR                                  |
  |  15  00   DTL WRSOM   RANDOM POSITIONING ERROR                              |
  |  15  01   DTL WRSOM   MECHANICAL POSITIONING ERROR                          |
  |  15  02   DT  WR O    POSITIONING ERROR DETECTED BY READ OF MEDIUM          |
  |  16  00   DW     O    DATA SYNCHRONIZATION MARK ERROR                       |
  |  17  00   DT  WRSO    RECOVERED DATA WITH NO ERROR CORRECTION APPLIED       |
  |  17  01   DT  WRSO    RECOVERED DATA WITH RETRIES                           |
  |  17  02   DT  WR O    RECOVERED DATA WITH POSITIVE HEAD OFFSET              |
  |  17  03   DT  WR O    RECOVERED DATA WITH NEGATIVE HEAD OFFSET              |
  |  17  04       WR O    RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED       |
  |  17  05   D   WR O    RECOVERED DATA USING PREVIOUS SECTOR ID               |
  |  17  06   D   W  O    RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED    |
  |  17  07   D   W  O    RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT   |
  |  17  08   D   W  O    RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE        |
  |  18  00   DT  WR O    RECOVERED DATA WITH ERROR CORRECTION APPLIED          |
  |  18  01   D   WR O    RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED|
  |  18  02   D   WR O    RECOVERED DATA - DATA AUTO-REALLOCATED                |
  |  18  03        R      RECOVERED DATA WITH CIRC                              |
  |  18  04        R      RECOVERED DATA WITH LEC                               |
  |  18  05   D   WR O    RECOVERED DATA - RECOMMEND REASSIGNMENT               |
  |  18  06   D   WR O    RECOVERED DATA - RECOMMEND REWRITE                    |
  +=============================================================================+

       Table 364: (continued)
       +=============================================================================+
       |           D - DIRECT ACCESS DEVICE                                          |
       |           .T - SEQUENTIAL ACCESS DEVICE                                     |
       |           . L - PRINTER DEVICE                                              |
       |           .  P - PROCESSOR DEVICE                                           |
       |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
       |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
       |           .  .  S - SCANNER DEVICE                                          |
       |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
       |           .  .  . M - MEDIA CHANGER DEVICE                                  |
       |           .  .  .  C - COMMUNICATION DEVICE                                 |
       |           .  .  .  .                                                        |
       | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
       | --- ----              ----------------------------------------------------- |
       |  19  00   D      O    DEFECT LIST ERROR                                     |
       |  19  01   D      O    DEFECT LIST NOT AVAILABLE                             |
       |  19  02   D      O    DEFECT LIST ERROR IN PRIMARY LIST                     |
       |  19  03   D      O    DEFECT LIST ERROR IN GROWN LIST                       |
       |  1A  00   DTLPWRSOMC  PARAMETER LIST LENGTH ERROR                           |
       |  1B  00   DTLPWRSOMC  SYNCHRONOUS DATA TRANSFER ERROR                       |
       |  1C  00   D      O    DEFECT LIST NOT FOUND                                 |
       |  1C  01   D      O    PRIMARY DEFECT LIST NOT FOUND                         |
       |  1C  02   D      O    GROWN DEFECT LIST NOT FOUND                           |
       |  1D  00   D   W  O    MISCOMPARE DURING VERIFY OPERATION                    |
       |  1E  00   D   W  O    RECOVERED ID WITH ECC                                 |
       |  1F  00                                                                     |
       |  20  00   DTLPWRSOMC  INVALID COMMAND OPERATION CODE                        |
       |  21  00   DT  WR OM   LOGICAL BLOCK ADDRESS OUT OF RANGE                    |
       |  21  01           M   INVALID ELEMENT ADDRESS                               |
       |  22  00   D           ILLEGAL FUNCTION (SHOULD USE 20 00, 24 00, OR 26 00)  |
       |  23  00                                                                     |
       |  24  00   DTLPWRSOMC  INVALID FIELD IN CDB                                  |
       |  25  00   DTLPWRSOMC  LOGICAL UNIT NOT SUPPORTED                            |
       |  26  00   DTLPWRSOMC  INVALID FIELD IN PARAMETER LIST                       |
       |  26  01   DTLPWRSOMC  PARAMETER NOT SUPPORTED                               |
       |  26  02   DTLPWRSOMC  PARAMETER VALUE INVALID                               |
       |  26  03   DTLPWRSOMC  THRESHOLD PARAMETERS NOT SUPPORTED                    |
       |  27  00   DT  W  O    WRITE PROTECTED                                       |
       |  28  00   DTLPWRSOMC  NOT READY TO READY TRANSITION(MEDIUM MAY HAVE CHANGED)|
       |  28  01           M   IMPORT OR EXPORT ELEMENT ACCESSED                     |
       |  29  00   DTLPWRSOMC  POWER ON, RESET, OR BUS DEVICE RESET OCCURRED         |
       |  2A  00   DTL WRSOMC  PARAMETERS CHANGED                                    |
       |  2A  01   DTL WRSOMC  MODE PARAMETERS CHANGED                               |
       |  2A  02   DTL WRSOMC  LOG PARAMETERS CHANGED                                |
       |  2B  00   DTLPWRSO C  COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT      |
       |  2C  00   DTLPWRSOMC  COMMAND SEQUENCE ERROR                                |
       |  2C  01         S     TOO MANY WINDOWS SPECIFIED                            |
       |  2C  02         S     INVALID COMBINATION OF WINDOWS SPECIFIED              |
       |  2D  00    T          OVERWRITE ERROR ON UPDATE IN PLACE                    |
       |  2E  00                                                                     |
       |  2F  00   DTLPWRSOMC  COMMANDS CLEARED BY ANOTHER INITIATOR                 |
       |  30  00   DT  WR OM   INCOMPATIBLE MEDIUM INSTALLED                         |
       |  30  01   DT  WR O    CANNOT READ MEDIUM - UNKNOWN FORMAT                   |
       |  30  02   DT  WR O    CANNOT READ MEDIUM - INCOMPATIBLE FORMAT              |
       |  30  03   DT          CLEANING CARTRIDGE INSTALLED                          |
       |  31  00   DT  W  O    MEDIUM FORMAT CORRUPTED                               |
       |  31  01   D L    O    FORMAT COMMAND FAILED                                 |
       |  32  00   D   W  O    NO DEFECT SPARE LOCATION AVAILABLE                    |
       |  32  01   D   W  O    DEFECT LIST UPDATE FAILURE                            |
       |  33  00    T          TAPE LENGTH ERROR                                     |
       |  34  00                                                                     |
       |  35  00                                                                     |
       |  36  00     L         RIBBON, INK, OR TONER FAILURE                         |
       +=============================================================================+

       Table 364: (continued)
       +=============================================================================+
       |           D - DIRECT ACCESS DEVICE                                          |
       |           .T - SEQUENTIAL ACCESS DEVICE                                     |
       |           . L - PRINTER DEVICE                                              |
       |           .  P - PROCESSOR DEVICE                                           |
       |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
       |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
       |           .  .  S - SCANNER DEVICE                                          |
       |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
       |           .  .  . M - MEDIA CHANGER DEVICE                                  |
       |           .  .  .  C - COMMUNICATION DEVICE                                 |
       |           .  .  .  .                                                        |
       | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
       | --- ----              ----------------------------------------------------- |
       |  37  00   DTL WRSOMC  ROUNDED PARAMETER                                     |
       |  38  00                                                                     |
       |  39  00   DTL WRSOMC  SAVING PARAMETERS NOT SUPPORTED                       |
       |  3A  00   DTL WRSOM   MEDIUM NOT PRESENT                                    |
       |  3B  00    TL         SEQUENTIAL POSITIONING ERROR                          |
       |  3B  01    T          TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM            |
       |  3B  02    T          TAPE POSITION ERROR AT END-OF-MEDIUM                  |
       |  3B  03     L         TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY      |
       |  3B  04     L         SLEW FAILURE                                          |
       |  3B  05     L         PAPER JAM                                             |
       |  3B  06     L         FAILED TO SENSE TOP-OF-FORM                           |
       |  3B  07     L         FAILED TO SENSE BOTTOM-OF-FORM                        |
       |  3B  08    T          REPOSITION ERROR                                      |
       |  3B  09         S     READ PAST END OF MEDIUM                               |
       |  3B  0A         S     READ PAST BEGINNING OF MEDIUM                         |
       |  3B  0B         S     POSITION PAST END OF MEDIUM                           |
       |  3B  0C         S     POSITION PAST BEGINNING OF MEDIUM                     |
       |  3B  0D           M   MEDIUM DESTINATION ELEMENT FULL                       |
       |  3B  0E           M   MEDIUM SOURCE ELEMENT EMPTY                           |
       |  3C  00                                                                     |
       |  3D  00   DTLPWRSOMC  INVALID BITS IN IDENTIFY MESSAGE                      |
       |  3E  00   DTLPWRSOMC  LOGICAL UNIT HAS NOT SELF-CONFIGURED YET              |
       |  3F  00   DTLPWRSOMC  TARGET OPERATING CONDITIONS HAVE CHANGED              |
       |  3F  01   DTLPWRSOMC  MICROCODE HAS BEEN CHANGED                            |
       |  3F  02   DTLPWRSOMC  CHANGED OPERATING DEFINITION                          |
       |  3F  03   DTLPWRSOMC  INQUIRY DATA HAS CHANGED                              |
       |  40  00   D           RAM FAILURE (SHOULD USE 40 NN)                        |
       |  40  NN   DTLPWRSOMC  DIAGNOSTIC FAILURE ON COMPONENT NN (80H-FFH)          |
       |  41  00   D           DATA PATH FAILURE (SHOULD USE 40 NN)                  |
       |  42  00   D           POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN)      |
       |  43  00   DTLPWRSOMC  MESSAGE ERROR                                         |
       |  44  00   DTLPWRSOMC  INTERNAL TARGET FAILURE                               |
       |  45  00   DTLPWRSOMC  SELECT OR RESELECT FAILURE                            |
       |  46  00   DTLPWRSOMC  UNSUCCESSFUL SOFT RESET                               |
       |  47  00   DTLPWRSOMC  SCSI PARITY ERROR                                     |
       |  48  00   DTLPWRSOMC  INITIATOR DETECTED ERROR MESSAGE RECEIVED             |
       |  49  00   DTLPWRSOMC  INVALID MESSAGE ERROR                                 |
       |  4A  00   DTLPWRSOMC  COMMAND PHASE ERROR                                   |
       |  4B  00   DTLPWRSOMC  DATA PHASE ERROR                                      |
       |  4C  00   DTLPWRSOMC  LOGICAL UNIT FAILED SELF-CONFIGURATION                |
       |  4D  00                                                                     |
       |  4E  00   DTLPWRSOMC  OVERLAPPED COMMANDS ATTEMPTED                         |
       |  4F  00                                                                     |
       |  50  00    T          WRITE APPEND ERROR                                    |
       |  50  01    T          WRITE APPEND POSITION ERROR                           |
       |  50  02    T          POSITION ERROR RELATED TO TIMING                      |
       |  51  00    T     O    ERASE FAILURE                                         |
       |  52  00    T          CARTRIDGE FAULT                                       |
       +=============================================================================+

       Table 364: (continued)
       +=============================================================================+
       |           D - DIRECT ACCESS DEVICE                                          |
       |           .T - SEQUENTIAL ACCESS DEVICE                                     |
       |           . L - PRINTER DEVICE                                              |
       |           .  P - PROCESSOR DEVICE                                           |
       |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
       |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
       |           .  .  S - SCANNER DEVICE                                          |
       |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
       |           .  .  . M - MEDIA CHANGER DEVICE                                  |
       |           .  .  .  C - COMMUNICATION DEVICE                                 |
       |           .  .  .  .                                                        |
       | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
       | --- ----              ----------------------------------------------------- |
       |  53  00   DTL WRSOM   MEDIA LOAD OR EJECT FAILED                            |
       |  53  01    T          UNLOAD TAPE FAILURE                                   |
       |  53  02   DT  WR OM   MEDIUM REMOVAL PREVENTED                              |
       |  54  00      P        SCSI TO HOST SYSTEM INTERFACE FAILURE                 |
       |  55  00      P        SYSTEM RESOURCE FAILURE                               |
       |  56  00                                                                     |
       |  57  00        R      UNABLE TO RECOVER TABLE-OF-CONTENTS                   |
       |  58  00     O         GENERATION DOES NOT EXIST                             |
       |  59  00     O         UPDATED BLOCK READ                                    |
       |  5A  00   DTLPWRSOM   OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED)  |
       |  5A  01   DT  WR OM   OPERATOR MEDIUM REMOVAL REQUEST                       |
       |  5A  02   DT  W  O    OPERATOR SELECTED WRITE PROTECT                       |
       |  5A  03   DT  W  O    OPERATOR SELECTED WRITE PERMIT                        |
       |  5B  00   DTLPWRSOM   LOG EXCEPTION                                         |
       |  5B  01   DTLPWRSOM   THRESHOLD CONDITION MET                               |
       |  5B  02   DTLPWRSOM   LOG COUNTER AT MAXIMUM                                |
       |  5B  03   DTLPWRSOM   LOG LIST CODES EXHAUSTED                              |
       |  5C  00   D   O       RPL STATUS CHANGE                                     |
       |  5C  01   D   O       SPINDLES SYNCHRONIZED                                 |
       |  5C  02   D   O       SPINDLES NOT SYNCHRONIZED                             |
       |  5D  00                                                                     |
       |  5E  00                                                                     |
       |  5F  00                                                                     |
       |  60  00         S     LAMP FAILURE                                          |
       |  61  00         S     VIDEO ACQUISITION ERROR                               |
       |  61  01         S     UNABLE TO ACQUIRE VIDEO                               |
       |  61  02         S     OUT OF FOCUS                                          |
       |  62  00         S     SCAN HEAD POSITIONING ERROR                           |
       |  63  00        R      END OF USER AREA ENCOUNTERED ON THIS TRACK            |
       |  64  00        R      ILLEGAL MODE FOR THIS TRACK                           |
       |  65  00                                                                     |
       |  66  00                                                                     |
       |  67  00                                                                     |
       |  68  00                                                                     |
       |  69  00                                                                     |
       |  6A  00                                                                     |
       |  6B  00                                                                     |
       |  6C  00                                                                     |
       |  6D  00                                                                     |
       |  6E  00                                                                     |
       |  6F  00                                                                     |
       +=============================================================================+

  Table 364: (concluded)
  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                                          |
  |           .T - SEQUENTIAL ACCESS DEVICE                                     |
  |           . L - PRINTER DEVICE                                              |
  |           .  P - PROCESSOR DEVICE                                           |
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE                           |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  | ASC ASCQ  DTLPWRSOMC  DESCRIPTION                                           |
  | --- ----              ----------------------------------------------------- |
  |  70  00                                                                     |
  |  71  00                                                                     |
  |  72  00                                                                     |
  |  73  00                                                                     |
  |  74  00                                                                     |
  |  75  00                                                                     |
  |  76  00                                                                     |
  |  77  00                                                                     |
  |  78  00                                                                     |
  |  79  00                                                                     |
  |  7A  00                                                                     |
  |  7B  00                                                                     |
  |  7C  00                                                                     |
  |  7D  00                                                                     |
  |  7E  00                                                                     |
  |  7F  00                                                                     |
  |                                                                             |
  |  80  xxh \                                                                  |
  |   THROUGH >  VENDOR SPECIFIC.                                               |
  |  FF  xxh /                                                                  |
  |                                                                             |
  |  xxh 80 \                                                                   |
  |  THROUGH >  VENDOR SPECIFIC QUALIFICATION OF STANDARD ASC.                  |
  |  xxh FF /                                                                   |
  |               ALL CODES NOT SHOWN OR BLANK ARE RESERVED.                    |
  +=============================================================================+

  D.  SCSIR}hR[h̃NCbNt@X

  \365̓R}hR[h̔ԍ̖ژ^łB

                          Table 365: SCSI-2 Operation Codes

  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                       Device Column Key  |
  |           .T - SEQUENTIAL ACCESS DEVICE                  M = Mandatory      |
  |           . L - PRINTER DEVICE                           O = Optional       |
  |           .  P - PROCESSOR DEVICE                        V = Vendor Specific|
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE        R = Reserved       |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  |        OP DTLPWRSOMC Description                                            |
  |----------+----------+-------------------------------------------------------|
  |        00 MMMMMMMMMM TEST UNIT READY                                        |
  |        01  M         REWIND                                                 |
  |        01 O V OO OO  REZERO UNIT                                            |
  |        02 VVVVVV  V                                                         |
  |        03 MMMMMMMMMM REQUEST SENSE                                          |
  |        04   O        FORMAT                                                 |
  |        04 M      O   FORMAT UNIT                                            |
  |        05 VMVVVV  V  READ BLOCK LIMITS                                      |
  |        06 VVVVVV  V                                                         |
  |        07         O  INITIALIZE ELEMENT STATUS                              |
  |        07 OVV O  OV  REASSIGN BLOCKS                                        |
  |        08          M GET MESSAGE(06)                                        |
  |        08 OMV OO OV  READ(06)                                               |
  |        08    O       RECEIVE                                                |
  |        09 VVVVVV  V                                                         |
  |        0A   M        PRINT                                                  |
  |        0A          M SEND MESSAGE(06)                                       |
  |        0A    M       SEND(06)                                               |
  |        0A OM  O  OV  WRITE(06)                                              |
  |        0B O   OO OV  SEEK(06)                                               |
  |        0B   O        SLEW AND PRINT                                         |
  |        0C VVVVVV  V                                                         |
  |        0D VVVVVV  V                                                         |
  |        0E VVVVVV  V                                                         |
  |        0F VOVVVV  V  READ REVERSE                                           |
  |        10   O O      SYNCHRONIZE BUFFER                                     |
  |        10 VM VVV     WRITE FILEMARKS                                        |
  |        11 VMVVVV     SPACE                                                  |
  |        12 MMMMMMMMMM INQUIRY                                                |
  |        13 VOVVVV     VERIFY(06)                                             |
  |        14 VOOVVV     RECOVER BUFFERED DATA                                  |
  |        15 OMO OOOOOO MODE SELECT(06)                                        |
  |        16 M   MM MO  RESERVE                                                |
  |        16  MM   M    RESERVE UNIT                                           |
  |        17 M   MM MO  RELEASE                                                |
  |        17  MM   M    RELEASE UNIT                                           |
  |        18 OOOOOOOO   COPY                                                   |
  |        19 VMVVVV     ERASE                                                  |
  |        1A OMO OOOOOO MODE SENSE(06)                                         |
  |        1B  O         LOAD UNLOAD                                            |
  |        1B       O    SCAN                                                   |
  |        1B   O        STOP PRINT                                             |
  |        1B O   OO O   STOP START UNIT                                        |
  +=============================================================================+

  Table 365: (continued)
  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                       Device Column Key  |
  |           .T - SEQUENTIAL ACCESS DEVICE                  M = Mandatory      |
  |           . L - PRINTER DEVICE                           O = Optional       |
  |           .  P - PROCESSOR DEVICE                        V = Vendor Specific|
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE        R = Reserved       |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  |        OP DTLPWRSOMC Description                                            |
  |----------+----------+-------------------------------------------------------|
  |        1C OOOOOOOOOO RECEIVE DIAGNOSTIC RESULTS                             |
  |        1D MMMMMMMMMM SEND DIAGNOSTIC                                        |
  |        1E OO  OO OO  PREVENT ALLOW MEDIUM REMOVAL                           |
  |        1F                                                                   |
  |        20 V   VV V                                                          |
  |        21 V   VV V                                                          |
  |        22 V   VV V                                                          |
  |        23 V   VV V                                                          |
  |        24 V   VVM    SET WINDOW                                             |
  |        25       O    GET WINDOW                                             |
  |        25 M   M  M   READ CAPACITY                                          |
  |        25      M     READ CD-ROM CAPACITY                                   |
  |        26 V   VV                                                            |
  |        27 V   VV                                                            |
  |        28          O GET MESSAGE(10)                                        |
  |        28 M   MMMM   READ(10)                                               |
  |        29 V   VV O   READ GENERATION                                        |
  |        2A          O SEND MESSAGE(10)                                       |
  |        2A       O    SEND(10)                                               |
  |        2A M   M  M   WRITE(10)                                              |
  |        2B  O         LOCATE                                                 |
  |        2B         O  POSITION TO ELEMENT                                    |
  |        2B O   OO O   SEEK(10)                                               |
  |        2C V      O   ERASE(10)                                              |
  |        2D V   O  O   READ UPDATED BLOCK                                     |
  |        2E O   O  O   WRITE AND VERIFY(10)                                   |
  |        2F O   OO O   VERIFY(10)                                             |
  |        30 O   OO O   SEARCH DATA HIGH(10)                                   |
  |        31       O    OBJECT POSITION                                        |
  |        31 O   OO O   SEARCH DATA EQUAL(10)                                  |
  |        32 O   OO O   SEARCH DATA LOW(10)                                    |
  |        33 O   OO O   SET LIMITS(10)                                         |
  |        34       O    GET DATA BUFFER STATUS                                 |
  |        34 O   OO O   PRE-FETCH                                              |
  |        34  O         READ POSITION                                          |
  |        35 O   OO O   SYNCHRONIZE CACHE                                      |
  |        36 O   OO O   LOCK UNLOCK CACHE                                      |
  |        37 O      O   READ DEFECT DATA(10)                                   |
  |        38     O  O   MEDIUM SCAN                                            |
  |        39 OOOOOOOO   COMPARE                                                |
  |        3A OOOOOOOO   COPY AND VERIFY                                        |
  |        3B OOOOOOOOOO WRITE BUFFER                                           |
  |        3C OOOOOOOOOO READ BUFFER                                            |
  |        3D     O  O   UPDATE BLOCK                                           |
  |        3E O   OO O   READ LONG                                              |
  |        3F O   O  O   WRITE LONG                                             |
  +=============================================================================+

       Table 365: (continued)
       +=============================================================================+
       |           D - DIRECT ACCESS DEVICE                       Device Column Key  |
       |           .T - SEQUENTIAL ACCESS DEVICE                  M = Mandatory      |
       |           . L - PRINTER DEVICE                           O = Optional       |
       |           .  P - PROCESSOR DEVICE                        V = Vendor Specific|
       |           .  .W - WRITE ONCE READ MULTIPLE DEVICE        R = Reserved       |
       |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
       |           .  .  S - SCANNER DEVICE                                          |
       |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
       |           .  .  . M - MEDIA CHANGER DEVICE                                  |
       |           .  .  .  C - COMMUNICATION DEVICE                                 |
       |           .  .  .  .                                                        |
       |        OP DTLPWRSOMC Description                                            |
       |----------+----------+-------------------------------------------------------|
       |        40 OOOOOOOOOO CHANGE DEFINITION                                      |
       |        41 O          WRITE SAME                                             |
       |        42      O     READ SUB-CHANNEL                                       |
       |        43      O     READ TOC                                               |
       |        44      O     READ HEADER                                            |
       |        45      O     PLAY AUDIO(10)                                         |
       |        46                                                                   |
       |        47      O     PLAY AUDIO MSF                                         |
       |        48      O     PLAY AUDIO TRACK INDEX                                 |
       |        49      O     PLAY TRACK RELATIVE(10)                                |
       |        4A                                                                   |
       |        4B      O     PAUSE RESUME                                           |
       |        4C OOOOOOOOOO LOG SELECT                                             |
       |        4D OOOOOOOOOO LOG SENSE                                              |
       |        4E                                                                   |
       |        4F                                                                   |
       |        50                                                                   |
       |        51                                                                   |
       |        52                                                                   |
       |        53                                                                   |
       |        54                                                                   |
       |        55 OOO OOOOOO MODE SELECT(10)                                        |
       |        56                                                                   |
       |        57                                                                   |
       |        58                                                                   |
       |        59                                                                   |
       |        5A OOO OOOOOO MODE SENSE(10)                                         |
       |        5B                                                                   |
       |        5C                                                                   |
       |        5D                                                                   |
       |        5E                                                                   |
       |        5F                                                                   |
       +=============================================================================+

  Table 365: (concluded)
  +=============================================================================+
  |           D - DIRECT ACCESS DEVICE                       Device Column Key  |
  |           .T - SEQUENTIAL ACCESS DEVICE                  M = Mandatory      |
  |           . L - PRINTER DEVICE                           O = Optional       |
  |           .  P - PROCESSOR DEVICE                        V = Vendor Specific|
  |           .  .W - WRITE ONCE READ MULTIPLE DEVICE        R = Reserved       |
  |           .  . R - READ ONLY (CD-ROM) DEVICE                                |
  |           .  .  S - SCANNER DEVICE                                          |
  |           .  .  .O - OPTICAL MEMORY DEVICE                                  |
  |           .  .  . M - MEDIA CHANGER DEVICE                                  |
  |           .  .  .  C - COMMUNICATION DEVICE                                 |
  |           .  .  .  .                                                        |
  |        OP DTLPWRSOMC Description                                            |
  |----------+----------+-------------------------------------------------------|
  |        A0                                                                   |
  |        A1                                                                   |
  |        A2                                                                   |
  |        A3                                                                   |
  |        A4                                                                   |
  |        A5         M  MOVE MEDIUM                                            |
  |        A5      O     PLAY AUDIO(12)                                         |
  |        A6         O  EXCHANGE MEDIUM                                        |
  |        A7                                                                   |
  |        A8          O GET MESSAGE(12)                                        |
  |        A8     OO O   READ(12)                                               |
  |        A9      O     PLAY TRACK RELATIVE(12)                                |
  |        AA          O SEND MESSAGE(12)                                       |
  |        AA     O  O   WRITE(12)                                              |
  |        AB                                                                   |
  |        AC        O   ERASE(12)                                              |
  |        AD                                                                   |
  |        AE     O  O   WRITE AND VERIFY(12)                                   |
  |        AF     OO O   VERIFY(12)                                             |
  |        B0     OO O   SEARCH DATA HIGH(12)                                   |
  |        B1     OO O   SEARCH DATA EQUAL(12)                                  |
  |        B2     OO O   SEARCH DATA LOW(12)                                    |
  |        B3     OO O   SET LIMITS(12)                                         |
  |        B4                                                                   |
  |        B5                                                                   |
  |        B5         O  REQUEST VOLUME ELEMENT ADDRESS                         |
  |        B6                                                                   |
  |        B6         O  SEND VOLUME TAG                                        |
  |        B7        O   READ DEFECT DATA(12)                                   |
  |        B8                                                                   |
  |        B8         O  READ ELEMENT STATUS                                    |
  |        B9                                                                   |
  |        BA                                                                   |
  |        BB                                                                   |
  |        BC                                                                   |
  |        BD                                                                   |
  |        BE                                                                   |
  |        BF                                                                   |
  +=============================================================================+

  E.  vO

  ꂪ C ɂvOłB͐/fvA
  fBAuɓڂĂ邩ǂ񍐂܂B

       #define DEVICE "/dev/sgc"
       /* ėp SCSI C^[tF[XۂɓĂ݂錩{vO */
       #include <stdio.h>
       #include <unistd.h>
       #include <string.h>
       #include <fcntl.h>
       #include <errno.h>
       #include <scsi/sg.h>

       #define SCSI_OFF sizeof(struct sg_header)
       static unsigned char cmd[SCSI_OFF + 18];      /* SCSI R}h obt@ */
       int fd;                               /* SCSI foCX/t@C fBXNv^ */

       /*  SCSI R}hB ėp SCSI C^[tF[Xgp */
       static int handle_scsi_cmd(unsigned cmd_len,         /* R}h */
                                  unsigned in_size,         /* ̓f[^TCY */
                                  unsigned char *i_buff,    /* ̓obt@ */
                                  unsigned out_size,        /* o̓f[^TCY */
                                  unsigned char *o_buff     /* o̓obt@ */
                                  )
       {
           int status = 0;
           struct sg_header *sg_hd;

           /* S */
           if (!cmd_len) return -1;            /* cmd_len != 0 Kv */
           if (!i_buff) return -1;             /* ̓obt@ NULL łȂ */
       #ifdef SG_BIG_BUFF
           if (SCSI_OFF + cmd_len + in_size > SG_BIG_BUFF) return -1;
           if (SCSI_OFF + out_size > SG_BIG_BUFF) return -1;
       #else
           if (SCSI_OFF + cmd_len + in_size > 4096) return -1;
           if (SCSI_OFF + out_size > 4096) return -1;
       #endif

           if (!o_buff) out_size = 0;

           /* ėp SCSI foCXwb_̍\z */
           sg_hd = (struct sg_header *) i_buff;
           sg_hd->reply_len   = SCSI_OFF + out_size;
           sg_hd->twelve_byte = cmd_len == 12;
           sg_hd->result = 0;
       #if     0
           sg_hd->pack_len    = SCSI_OFF + cmd_len + in_size; /* sv */
           sg_hd->pack_id;     /* gp */
           sg_hd->other_flags; /* gp */
       #endif

           /* R}ho */
           status = write( fd, i_buff, SCSI_OFF + cmd_len + in_size );
           if ( status < 0 || status != SCSI_OFF + cmd_len + in_size ||
                              sg_hd->result ) {
               /* Ȃ炩̃G[ */
               fprintf( stderr, "write(generic) result = 0x%x cmd = 0x%x\n",
                           sg_hd->result, i_buff[SCSI_OFF] );
               perror("");
               return status;
           }

           if (!o_buff) o_buff = i_buff;       /* obt@̃|C^`FbN */

           /* ʂ */
           status = read( fd, o_buff, SCSI_OFF + out_size);
           if ( status < 0 || status != SCSI_OFF + out_size || sg_hd->result ) {
               /* Ȃ炩̃G[ */
               fprintf( stderr, "read(generic) result = 0x%x cmd = 0x%x\n",
                  sg_hd->result, o_buff[SCSI_OFF] );
          fprintf( stderr, "read(generic) sense "
                  "%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
                  sg_hd->sense_buffer[0],         sg_hd->sense_buffer[1],
                  sg_hd->sense_buffer[2],         sg_hd->sense_buffer[3],
                  sg_hd->sense_buffer[4],         sg_hd->sense_buffer[5],
                  sg_hd->sense_buffer[6],         sg_hd->sense_buffer[7],
                  sg_hd->sense_buffer[8],         sg_hd->sense_buffer[9],
                  sg_hd->sense_buffer[10],        sg_hd->sense_buffer[11],
                  sg_hd->sense_buffer[12],        sg_hd->sense_buffer[13],
                  sg_hd->sense_buffer[14],        sg_hd->sense_buffer[15]);
          if (status < 0)
              perror("");
      }
      /* 󂯎ׂ̂󂯎ǂ݂ */
      if (status == SCSI_OFF + out_size) status = 0; /* S */

      return status;  /* 0 ̓G[ȂӖ */
  }

  #define INQUIRY_CMD     0x12
  #define INQUIRY_CMDLEN  6
  #define INQUIRY_REPLY_LEN 96
  #define INQUIRY_VENDOR  8       /* ԓf[^̃x_̃ItZbg */

  /* x_̃uhƃfv */
  static unsigned char *Inquiry ( void )
  {
    static unsigned char Inqbuffer[ SCSI_OFF + INQUIRY_REPLY_LEN ];
    unsigned char cmdblk [ INQUIRY_CMDLEN ] =
        { INQUIRY_CMD,  /* command */
                    0,  /* lun/reserved */
                    0,  /* page code */
                    0,  /* reserved */
    INQUIRY_REPLY_LEN,  /* allocation length */
                    0 };/* reserved/flag/link */

    memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );

    /*
     * +------------------+
     * | struct sg_header | <- cmd
     * +------------------+
     * | copy of cmdblk   | <- cmd + SCSI_OFF
     * +------------------+
     */

    if (handle_scsi_cmd(sizeof(cmdblk), 0, cmd,
                        sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
        fprintf( stderr, "Inquiry failed\n" );
        exit(2);
    }
    return (Inqbuffer + SCSI_OFF);
  }

  #define TESTUNITREADY_CMD 0
  #define TESTUNITREADY_CMDLEN 6

  #define ADD_SENSECODE 12
  #define ADD_SC_QUALIFIER 13
  #define NO_MEDIA_SC 0x3a
  #define NO_MEDIA_SCQ 0x00
  int TestForMedium ( void )
  {
    /* READY Ԃv */
    static unsigned char cmdblk [TESTUNITREADY_CMDLEN] = {
        TESTUNITREADY_CMD, /* command */
                        0, /* lun/reserved */
                        0, /* reserved */
                        0, /* reserved */
                        0, /* reserved */
                        0};/* reserved */

    memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );

    /*
     * +------------------+
     * | struct sg_header | <- cmd
     * +------------------+
     * | copy of cmdblk   | <- cmd + SCSI_OFF
     * +------------------+
     */

    if (handle_scsi_cmd(sizeof(cmdblk), 0, cmd,
                              0, NULL)) {
        fprintf (stderr, "Test unit ready failed\n");
        exit(2);
    }

    return
     *(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) !=
                                                          NO_MEDIA_SC ||
     *(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) !=
                                                          NO_MEDIA_SCQ;
  }

  void main( void )
  {
    fd = open(DEVICE, O_RDWR);
    if (fd < 0) {
      fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
      exit(1);
    }

    /* Inquiry ̌ʂ̈ꕔ̃tB[h\ */
    printf( "%s\n", Inquiry() + INQUIRY_VENDOR );

    /* fBAڂĂ邩ǂ݂ */
    if (!TestForMedium()) {
      printf("device is unloaded\n");
    } else {
      printf("device is loaded\n");
    }
  }

