scsiCommonLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* scsiCommonLib.c - SCSI library common commands for all devices (SCSI-2) */
  2. /* Copyright 1989-1995 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01d,06may96,jds  yet more doc tweaks...
  8. 01c,13nov95,jds  more doc tweaks
  9. 01b,20sep95,jdi  doc tweak.
  10. 01a,24jul95,jds  written by extracting from scsi2Lib.
  11. */
  12. /*
  13. DESCRIPTION
  14. This library contains commands common to all SCSI devices. The content of 
  15. this library is separated from the other SCSI libraries in order to create
  16. an additional layer for better support of all SCSI devices.
  17. Commands in this library include:
  18. .TS
  19. tab(|);
  20. lf3 lf3
  21. l l.
  22. Command         | Op Code
  23. _
  24. INQUIRY         | (0x12)
  25. REQUEST SENSE   | (0x03)
  26. TEST UNIT READY | (0x00)
  27. .TE
  28. INCLUDE FILES
  29. scsiLib.h, scsi2Lib.h
  30. SEE ALSO: dosFsLib, rt11FsLib, rawFsLib, tapeFsLib, scsi2Lib,
  31. .pG "I/O System, Local File Systems"
  32. */
  33. #define  INCLUDE_SCSI2
  34. #include "vxWorks.h"
  35. #include "ioLib.h"
  36. #include "intLib.h"
  37. #include "ctype.h"
  38. #include "cacheLib.h"
  39. #include "stdlib.h"
  40. #include "errnoLib.h"
  41. #include "taskLib.h"
  42. #include "lstLib.h"
  43. #include "logLib.h"
  44. #include "msgQLib.h"
  45. #include "string.h"
  46. #include "stdio.h"
  47. #include "sysLib.h"
  48. #include "scsiLib.h"
  49. #include "wdLib.h"
  50. /* imported globals */
  51. IMPORT BOOL scsiErrors; /* enable SCSI error messages */
  52. IMPORT BOOL scsiDebug; /* enable task level debug messages */
  53. IMPORT BOOL scsiIntsDebug; /* enable int level debug messages */
  54. /* forward static functions */
  55. void scsiCommonLibTblInit ();
  56. /*
  57.  * Backward compatability functions localised
  58.  */
  59. LOCAL STATUS          scsi2TestUnitRdy (SCSI_PHYS_DEV *);
  60. LOCAL STATUS          scsi2Inquiry (SCSI_PHYS_DEV *, char *, int);
  61. LOCAL STATUS          scsi2ReqSense (SCSI_PHYS_DEV *, char *, int);
  62. /*******************************************************************************
  63. *
  64. * scsiCommonLibTblInit -
  65. *
  66. * Initialises the SCSI common commands interface.
  67. *
  68. * NOMANUAL
  69. */
  70. void scsiCommonLibTblInit ()
  71.     {
  72.     pScsiIfTbl->scsiTestUnitRdy   = (FUNCPTR) scsi2TestUnitRdy;
  73.     pScsiIfTbl->scsiInquiry       = (FUNCPTR) scsi2Inquiry;
  74.     pScsiIfTbl->scsiReqSense      = (FUNCPTR) scsi2ReqSense;
  75.     }
  76. /*******************************************************************************
  77. *
  78. * scsi2TestUnitRdy - issue a TEST_UNIT_READY command to a SCSI device
  79. *
  80. * This routine issues a TEST_UNIT_READY command to a specified SCSI device.
  81. *
  82. * RETURNS: OK, or ERROR if the command fails.
  83. */
  84. LOCAL STATUS scsi2TestUnitRdy
  85.     (
  86.     SCSI_PHYS_DEV *pScsiPhysDev         /* ptr to SCSI physical device */
  87.     )
  88.     {
  89.     SCSI_COMMAND testUnitRdyCommand; /* SCSI command byte array */
  90.     SCSI_TRANSACTION scsiXaction; /* info on a SCSI transaction */
  91.     SCSI_DEBUG_MSG ("scsiTestUnitRdy:n", 0, 0, 0, 0, 0, 0);
  92.     if (scsiCmdBuild (testUnitRdyCommand, &scsiXaction.cmdLength,
  93. SCSI_OPCODE_TEST_UNIT_READY, pScsiPhysDev->scsiDevLUN, FALSE,
  94. 0, 0, (UINT8) 0)
  95. == ERROR)
  96.      return (ERROR);
  97.     scsiXaction.cmdAddress    = testUnitRdyCommand;
  98.     scsiXaction.dataAddress   = NULL;
  99.     scsiXaction.dataDirection = NONE;
  100.     scsiXaction.dataLength    = 0;
  101.     scsiXaction.addLengthByte = NONE;
  102.     scsiXaction.cmdTimeout    = SCSI_TIMEOUT_5SEC;
  103.     scsiXaction.tagType       = SCSI_TAG_DEFAULT;
  104.     scsiXaction.priority      = SCSI_THREAD_TASK_PRIORITY;
  105.     return ((*pScsiPhysDev->pScsiCtrl->scsiTransact)
  106.     (pScsiPhysDev, &scsiXaction));
  107.     }
  108. /*******************************************************************************
  109. *
  110. * scsi2Inquiry - issue an INQUIRY command to a SCSI device
  111. *
  112. * This routine issues an INQUIRY command to a specified SCSI device.
  113. *
  114. * RETURNS: OK, or ERROR if the command fails.
  115. */
  116. LOCAL STATUS scsi2Inquiry
  117.     (
  118.     SCSI_PHYS_DEV *pScsiPhysDev,/* ptr to SCSI physical device */
  119.     char *buffer,               /* ptr to input data buffer */
  120.     int bufLength               /* length of buffer in bytes */
  121.     )
  122.     {
  123.     SCSI_COMMAND inquiryCommand; /* SCSI command byte array */
  124.     SCSI_TRANSACTION scsiXaction; /* info on a SCSI transaction */
  125.     SCSI_DEBUG_MSG ("scsiInquiry:n", 0, 0, 0, 0, 0, 0);
  126.     if (scsiCmdBuild (inquiryCommand, &scsiXaction.cmdLength,
  127. SCSI_OPCODE_INQUIRY, pScsiPhysDev->scsiDevLUN, FALSE,
  128. 0, bufLength, (UINT8) 0)
  129. == ERROR)
  130.      return (ERROR);
  131.     scsiXaction.cmdAddress    = inquiryCommand;
  132.     scsiXaction.dataAddress   = (UINT8 *) buffer;
  133.     scsiXaction.dataDirection = O_RDONLY;
  134.     scsiXaction.dataLength    = bufLength;
  135.     scsiXaction.addLengthByte = INQUIRY_ADD_LENGTH_BYTE;
  136.     scsiXaction.cmdTimeout    = SCSI_TIMEOUT_5SEC;
  137.     scsiXaction.tagType       = SCSI_TAG_DEFAULT;
  138.     scsiXaction.priority      = SCSI_THREAD_TASK_PRIORITY;
  139.     return ((*pScsiPhysDev->pScsiCtrl->scsiTransact)
  140.     (pScsiPhysDev, &scsiXaction));
  141.     }
  142. /*******************************************************************************
  143. *
  144. * scsi2ReqSense - issue a REQUEST_SENSE command to a device and read the results
  145. *
  146. * This routine issues a REQUEST_SENSE command to a specified SCSI device and
  147. * read the results.
  148. *
  149. * RETURNS: OK, or ERROR if the command fails.
  150. */
  151. LOCAL STATUS scsi2ReqSense
  152.     (
  153.     SCSI_PHYS_DEV *pScsiPhysDev,/* ptr to SCSI physical device */
  154.     char *buffer,               /* ptr to input data buffer */
  155.     int bufLength               /* length of buffer in bytes */
  156.     )
  157.     {
  158.     SCSI_COMMAND reqSenseCommand; /* SCSI command byte array */
  159.     SCSI_TRANSACTION scsiXaction; /* info on a SCSI transaction */
  160.     SCSI_DEBUG_MSG ("scsiReqSense:n", 0, 0, 0, 0, 0, 0);
  161.     if (scsiCmdBuild (reqSenseCommand, &scsiXaction.cmdLength,
  162.       SCSI_OPCODE_REQUEST_SENSE, pScsiPhysDev->scsiDevLUN,
  163.       FALSE, 0, bufLength, (UINT8) 0)
  164.         == ERROR)
  165.         return (ERROR);
  166.     scsiXaction.cmdAddress    = reqSenseCommand;
  167.     scsiXaction.dataAddress   = (UINT8 *) buffer;
  168.     scsiXaction.dataDirection = O_RDONLY;
  169.     scsiXaction.dataLength    = bufLength;
  170.     scsiXaction.addLengthByte = REQ_SENSE_ADD_LENGTH_BYTE;
  171.     scsiXaction.cmdTimeout    = SCSI_TIMEOUT_5SEC;
  172.     scsiXaction.tagType       = SCSI_TAG_DEFAULT;
  173.     scsiXaction.priority      = SCSI_THREAD_TASK_PRIORITY;
  174.     return ((*pScsiPhysDev->pScsiCtrl->scsiTransact)
  175.     (pScsiPhysDev, &scsiXaction));
  176.     }