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

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