home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / aspio02.zip / defects.c < prev    next >
C/C++ Source or Header  |  1999-08-17  |  3KB  |  133 lines

  1. /*
  2.  * $Source: r:/source/aspi/RCS/defects.c,v $
  3.  * $Revision: 1.1 $
  4.  * $Date: 1999/08/18 02:01:08 $
  5.  * $Locker:  $
  6.  *
  7.  *    ASPI Interface Library, READ DEFECT DATA
  8.  *
  9.  * $Log: defects.c,v $
  10.  * Revision 1.1  1999/08/18 02:01:08  vitus
  11.  * Initial revision
  12.  *
  13.  * ----------------------------------------
  14.  * Sample code to demonstrate use of ASPI Interface.
  15.  */
  16. static char const id[]="$Id: defects.c,v 1.1 1999/08/18 02:01:08 vitus Exp $";
  17.  
  18. #include <assert.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21.  
  22. #define INCL_DOS
  23. #define INCL_ERRORS
  24. #include <os2.h>
  25.  
  26. #include "../lib/defines.h"
  27. #include "scsi.h"
  28. #include "srb.h"
  29. #include "aspio.h"
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36. /*# ----------------------------------------------------------------------
  37.  * AspiDefectData(ha,target,lun,pg,format,buf,bufsiz)
  38.  *
  39.  * PARAMETER
  40.  *    ha,target,lun    addresses device
  41.  *    pg        primary defects (0) or grown defects (1)
  42.  *    format        preferred format of list
  43.  *    buf,bufsiz    defects plus header
  44.  *
  45.  * RETURNS
  46.  *    APIRET
  47.  *
  48.  * GLOBAL
  49.  *    strLastSense        updated
  50.  *
  51.  * DESPRIPTION
  52.  *    Uses READ DEFECT DATA (10 or 12) to read all defects.
  53.  *
  54.  * REMARKS
  55.  *    See SCSI spec for possible formats of defect lists.
  56.  */
  57. PUBLIC APIRET _System
  58. AspiDefectData(UCHAR ha,UCHAR target,UCHAR lun,
  59.            UCHAR pg,UCHAR format,PVOID buf,ULONG bufsiz)
  60. {
  61.     APIRET        rc;
  62.     size_t const    srbsize = sizeof(ASPI_SRB_EXECUTE_IO)
  63.                 + (bufsiz > 65535 ? 12 : 10)
  64.                 + sizeof(SCSI_REQSENSE_DATA);
  65.     PASPI_SRB_EXECUTE_IO srb = malloc(srbsize);
  66.  
  67.  
  68.     if( srb == NULL )
  69.     return ERROR_NOT_ENOUGH_MEMORY;
  70.     memset(srb, 0, srbsize);
  71.  
  72.     srb->SRBHdr.CommandCode = ASPI_CMD_EXECUTE_IO;
  73.     srb->SRBHdr.AdapterIndex = ha;
  74.     srb->SRBHdr.ASPIReqFlags = ASPI_REQFLAG_DIR_TO_HOST | ASPI_REQFLAG_POST_ENABLE;
  75.  
  76.     srb->DeviceTargetID = target;
  77.     srb->DeviceTargetLUN = lun;
  78.     srb->DataXferLen = bufsiz;
  79.     srb->pDataBuffer = buf;
  80.     srb->SenseDataLen = sizeof(SCSI_REQSENSE_DATA);
  81.  
  82.     assert( pg <= 1 );
  83.     assert( format <= 0x07 );
  84.     if( bufsiz > 65535 )
  85.     {
  86.     srb->CDBLen = 12;
  87.     srb->CDB[0] = SCSI_READ_DEFECT_DATA_12;
  88.     srb->CDB[1] = (lun << 5) | (pg == 0 ? 0x10 : 0x08) | format;
  89.     srb->CDB[2] = 0;
  90.     srb->CDB[3] = 0;
  91.     srb->CDB[4] = 0;
  92.     srb->CDB[5] = 0;
  93.     srb->CDB[6] = HIUCHAR(HIUSHORT(bufsiz));
  94.     srb->CDB[7] = LOUCHAR(HIUSHORT(bufsiz));
  95.     srb->CDB[8] = HIUCHAR(LOUSHORT(bufsiz));
  96.     srb->CDB[9] = LOUCHAR(LOUSHORT(bufsiz));
  97.     srb->CDB[10] = 0;
  98.     srb->CDB[11] = 0;
  99.     }
  100.     else
  101.     {
  102.     srb->CDBLen = 10;
  103.     srb->CDB[0] = SCSI_READ_DEFECT_DATA;
  104.     srb->CDB[1] = (lun << 5) | 0x00;
  105.     srb->CDB[2] = (pg == 0 ? 0x10 : 0x08) | format;
  106.     srb->CDB[3] = 0;
  107.     srb->CDB[4] = 0;
  108.     srb->CDB[5] = 0;
  109.     srb->CDB[6] = 0;
  110.     srb->CDB[7] = HIUCHAR(LOUSHORT(bufsiz));
  111.     srb->CDB[8] = LOUCHAR(LOUSHORT(bufsiz));
  112.     srb->CDB[9] = 0;
  113.     }
  114.  
  115.     rc = AspiSendSRB(&srb->SRBHdr, srbsize);
  116.  
  117.     if( rc == 0 )
  118.     {
  119.     if( srb->TargetStatus != ASPI_TSTATUS_NO_ERROR )
  120.         rc = 0xF2000000 | srb->TargetStatus;
  121.     else if( srb->HostStatus != ASPI_HSTATUS_NO_ERROR )
  122.         rc = 0xF1000000 | srb->HostStatus;
  123.     else if( srb->SRBHdr.ASPIStatus != ASPI_STATUS_NO_ERROR )
  124.         rc = 0xF0000000 | srb->SRBHdr.ASPIStatus;
  125.     memcpy(&strLastSense,
  126.            &srb->CDB[bufsiz > 255 ? 10 : 6],
  127.            sizeof(SCSI_REQSENSE_DATA));
  128.     }
  129.     free(srb);
  130.  
  131.     return rc;
  132. }
  133.