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. foCXðI[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 foCXhCoðl̯ÉÈéàÌ 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îñ Vµ¢J[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ÅÌKvðAuÆÌÎA¨æÑuÔÌî{IÈ ÝìpðJo[µÜ·B¢Â©ÌPÈ C vO~OÌáàÜÜêÜ ·BSCSI R}hZbgÉ¢ÄÌêÊIÈm¯ªKvÅ·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) ÉæÁÄJ³êA Killy Corporation (scsi/sg.hÉ éRgðQƵľ³¢) ÉæÁÄ ã³êܵ½B ±ÌC^[tF[XÍ[UxÌAvP[V(·Èí¿AJ[l ÌO¤)©çÁÊÈ@íìðÂ\ɵܷB¾©çAJ[lhCoÌ JÍAæèë¯ÅfobO¢ïÈàÌÈÌÅ·ªAKv èܹñB ÆÍ¢¦AKØÉhCoð쮳¹È¢ÆASCSI oXâhCo é¢Í J[lðnO·éÂ\«ª èÜ·BÅ·©çAÄphCoð³µì ®³¹é±ÆÆAf[^Ìr¸ðð¯é½ßÉÅÉSÄÌt@CðobN Abv·é±ÆªåØÅ·B¼Éà ȽÌvOðç¹éOɵĨ Æðɧ±ƪ èÜ·BSÄÌobt@ªfBXNÉtbV ³êé ±ÆðmÀÉ·é½ßÉ sync R}hðs·é±ÆÅAàµVXeªn OµÄàf[^XÍŬÉÈèÜ·B ÄphCoÌà¤êÂÌ_ƵÄÍAC^[tF[X©gªÏ»µÈ¢ ÀèASÄÌAvP[VÍVµ¢J[lÌJ©çƧµÄ¢çêé ±ÆÅ·Bär·éÈçÎA¼ÌáxÈJ[lhCoͼÌJ[l àÌÏ»Æà²ðí³È¯êÎÈèܹñB T^IÉÍAÄphCoÍÆ»Ì@\̷𶩷½ßÉÁêÈ[UA vP[Vª©êéKvÌ éVµ¢ SCSI n[hEFAu(á: X Li[Av^ACD-ROM W [N{bNX)ÆÊM·é½ßÉgp³êÜ ·BÄpC^[tF[XÉæÁıêçÌAvP[Vðv¬Éìé± ÆªÅ«Ü·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|[gàgÜËÎÈèܹñ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@CðgpµÜ·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 ÉεÄA±IÉ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 àµVµ¢uð 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¢ÉàAVµ¢J[lÅÍÔðÏX·é±ÆªÅ«Ü·B 4.3.1. SCSI uÌ®IÈ}üÆí Vµ¢J[lÆ/proct@CVXeªÁÄ¢éÈçÎAgp³êÄ¢ È¢uðVXeÒÉæèOµ½è±ü·é±ÆªÅ«Ü·B SCSI uðæèO·ÉÍ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·êÎA±êçÌ4ÂÌ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ÉÇÁ·éÆ«ÍAVµ¢uÉÍ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}̽ßÌàÌÅ·Báðp¢ÄASCSI uÉ INQUIRY Æ TESTUNITREADY R}hÉæÁÄANZX·éÉÍǤ·êÎæ ¢©ð¦µÜ·B ±êçÌR[háðgp·éÛÍ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Ì ÈºÅÍVµ¢J[lðzèµÄ¢Ü·B o Äp SCSI C^[tF[XÍJ[lo[W 1.1.68 Åg£³êÜ µ½GÈ~ÌáÉÍÈÆà±Ìo[WªKvÆÈèÜ·Bµ©µ J[lo[WÌ1.1.77©ç1.1.89ÜÅA¨æÑA1.3.52© ç1.3.56ÜÅAÍǤ¼ð¯Ä¾³¢BÆ¢¤ÌÍA±êçÌJ[l ÅÍÄp SCSI C^[tF[XªÅ꾩çÅ·B o ANZX³êéfoCXð\»·é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[hðw¦ */ 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}hª³êAܽAR}hÌÀs ÊðÛ·éóÔðÁÄ¢é©ð\µÄ¢Ü·BÂXÌ\¢ÌÌ\¬vfÉ Â¢ÄÍ``''ÍÅãÉc_µÜ·B ÄpfoCXÆf[^ðð··éÊíÌû@ÍȺÌæ¤ÉÈèÜ·FI[v µ½ÄpfoCXÉεR}hðé½ßÉÌOÂ̪ðÜÞub NðfoCXÉ뵀 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µÌÔÅubN·éKvª èܵ½(ÂÜè sigprocmask() ÉæÁÄ)Bwrite() ©çÊðæÁÄé½ßÌ read() ȵÅA·é±Æͱ¢ÄN±éANZXðubN·é±ÆÉÈèÜ·B ±ÌVOiÌubNÍ©{ÌR[hÉÍÜÜêĢܹñBÅ·©ç±ê çÌ©{ðç¹éÛÉÍ SIGINT (a la ªó¹È¢^C )ðs·é׫ÅÍ èܹñB 7. foCXðI[v·é ÄpfoCXÍ read ¨æÑ write ANZXÅI[v³êéKvª èÜ ·F int fd = open (device_name, O_RDWR); (±êÍCD-ROMhCuÌæ¤ÈÇÝoµêpÌn[hEFAuÉεÄà ÄÍÜèÜ·)B R}hðo·éÉÍwriteðAÈñç©ÌÊð¾éÉÍreadðÀsµÈ ¯êÎÈèܹñ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±êÍAvP [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[hðgp·é±ÆªÅ«Ü·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 ðÄo·OÉÍ NULL É µÄ¨ÌªÀSÅ·B±êçÌR[hÍ errno.h ɨ¢Äè`³ê Ģܷ(0 ÍG[ȵðÓ¡)B unsigned int twelve_byte:1 ±ÌtB[hÍñWÌx_ÅLÌR}hðgp·éɾ¯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ðoµAread ÉæÁÄÊðó¯æèA½ Ì(Àçê½)G[`FbNðs¢Ü·BZXobt@f[^ÍoÍob t@ÌÅèÉüêé±ÆªÅ«Ü·(k|C^ª^¦çêĢȢÀ èA»ÌêÍüÍobt@àÉ èÜ·)B±êðȺÌáÌÅp¢é± ÆɵܷB ÓFDEVICEÌlð ȽÌfoCXðLq·éàÌÉÝèµÄ¾³¢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}hðB Äp SCSI C^[tF[Xðgp */ 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 WKiðQÆ̱Æ)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}hðÀs· é½ßÉgpµÜ·B ÅɤÊwb_ÉR}hðÇÁµA»ê©ç handle_SCSI_cmd ðÄÑ oµÜ·Bhandle_SCSI_cmd ÌÄÑoµÉηéoÍobt@TCYÌøÍ ¤Êwb_ÌTCYðOµÄ¢é±ÆÉӵľ³¢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Æfðv */ 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[vµAG[ð`FbNµÄ©çAÊÌTu[` ðÄÑoµÜ·B»ÌãAx_A»iyÑrWÈÇÌÊðlﻂ ßé`®Å\¦µÜ·B Ó: Inquiry ÌÊÉͱ̬³ÈvOª·éæèààÁÆ½Ì îñª èÜ·B±ÌvOðfoCXÌíÞâ ANSI Ìo[WÈÇ ðo·æ¤Ég£µ½Èé©àµêܹñBfoCXÌíÞÉÍÁÊÈdv «ª èÜ·BÆ¢¤ÌͱꪻÌuÉηéK{¨æÑIvVÌR }hZbgðè·é©çÅ·B©ªÅ±êðvOµ½È¢ÌÅ êÎAEric Youngdale Éæé scsiinfo vOðgp·é±ÆàÅ«Ü ·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[lª©®IÉ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¢éá ±±ÅÍfBAªuÉÚ³êÄ¢é©Ç¤©ð¸·é½ßÉ TEST UNIT READY R}hðgpµÜ·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`FbNðs¤±ÆªÅ«Ü·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³_AVµ¢J[lðRpCµ N®³êéKvª èÜ·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}hðwèµÄ¨èAW»³êĨç¸vO~O ̽ßÌîñðŽÉpÅ«È¢x_Æ©Ìg£R}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Î ÀáÅwÔSCSIC^[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[X¤ÊBIOS(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ÉÖWµ½oOñÆ¿âÉ¢ÄÌ 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. foCXhCoðl̯ÉÈéàÌ ±êçÌ¶Í 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Ì«ûðLqµ½ðLaTeX ¶B /pub/Linux/docs/hardware/DEVICES Linux Ågp³êéW[foCXÆ}Ci[foCXÌXg The Linux Kernel ó¶ÅèÉÇÁµÜµ½B½ªLDP̶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[Xðp¢êÎeÕÉhCuÌÝèð ÏX·é±ÆªÅ«Ü·B tsx-11.mit.edu: ALPHA/kdebug J[lðfobO·é½ßÌ gdb Ìg£ 17. SCSI ÉANZX·é»Ì¼ÌC^[tF[X Linux ÅÍ SCSI_IOCTL_SEND_COMMAND ioctl ÌÄÑoµðp¢Ä 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[hðàT|[gµÜ·©çA©ªÌRs [^ðüÓ@íÅ é©Ìæ¤ÉU·é±Æà è¦Ü·(ÂÜè¬³È SCSI lbg[ N)B 2. ASPI (Advanced SCSI Programming Interface)BAdaptecªJB±êÍ 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ÌÔ Ìað´nµµÜ·Bµ©µÞµ½á ÌÖQðõ¦½vOð¨ ѽ¾µ¤Ý¾·æèÍAÁÊÌÚIÉηéêÊ»³ê½á ÖQð à¤LCuðèÉüêéûªæè]ܵ¢Æ¢¦Ü·BåvÈÚWÍ C^[tF[X©çƧµ½wðèÉüêé±ÆÅ é׫ŷBAvP [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Å·©ç¢ÜâS¢EÌ 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[hªread/write(O_RDWR)ÅÈ¢ | EBUSY | foCXÉεubNµÈ¢ANZXªv | | ³ê½ªA»ÝÍrW[óÔB | ERESTARTSYS | ±êÍàÌG[ð¦·BÄ»Â\ÉµÄ | | SCSI `lÉñ¹çê½¢(oOñÌÚ× | | Í Drew Eckhardts Éæé SCSI-HOWTO ðÝæ) ioctl | ENXIO | foCXª³ø read | EAGAIN | foCXªubNµæ¤Æ·éBãÅÄsðB | ERESTARTSYS | ±êªàÌG[ð¦·BÄ»Â\ÉµÄ | | SCSI `lÉñ¹çê½¢(oOñÌÚ× | | Í Drew Eckhardts Éæé SCSI-HOWTO ðÝæ) write | EIO | ·³ªZ©·¬ (¤Êwb_\¢Ìæ謳¢)B | | x: »ÝÌA·³´ßÌmFÍÈ¢B | EAGAIN | foCXªubNµæ¤Æ·éBãÅÄsðB | ENOMEM | ±ÌvÉKvÈðÄÅ«È©Á½B | | Åå`TCYð´¦Ä¢È¢ÈçÎãÅÄs | | ð(ãðÝæ)B select | | ȵ close | | ȵ read/write ̳ÌÔèlÍáÉæÁÄ`ɬ÷µ½oCgð¦µÄ¢Ü ·B±êÍvµ½oCgƵ¢×«Å·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) | uæèBSCSI sense keys ÌÍðÝæB host_byte(hd_status) | J[læèB Hostcodes ÌÍðÝæB driver_byte(hd_status) | J[læèB. 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@àÌZXf [^ÍLøÅ·(ÁÉÇÁIÈZXR[hÆÇÁIÈZXR[hNI t@CAðmFµÄ¾³¢)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. ±ÌóÔÍ^[QbgªR}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. ±ÌóÔÍ^[QbgªrW[Å é±Æð¦·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êÂȪèÌAµ½R}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[^ Xªg³Á½àÌÅ éB RESERVATION CONFLICT. ±ÌóÔÍCjVG[^ªÊÌ SCSI uÉεÄÕËÛ¯ \ñ^ƵÄwè³êÄ¢éWJjbgàµÍWJjbgàÌöx [?? extent ??]ÉANZXðݽêÉK¸Ô³êéB§³êéCjVG[^Ìñ ®ìÍãÌ_ÅÄ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 [ª¢ÁϢŠéÆ«ÉÔ³êéBüoÍì Í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Æ»êªKp³êéfoCXÌíÞÆð¦µÜ ·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}hìR[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±êÍ»¢Ò/fðvµA fBAªuÉÚ³êÄ¢é©Ç¤©ðñµÜ·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}hðB Äp SCSI C^[tF[Xðgp */ 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Æfðv */ 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"); } }