home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / drivers / scsi / futrdomn / samples / oemlist.c next >
Encoding:
C/C++ Source or Header  |  1990-08-15  |  6.7 KB  |  240 lines

  1. /**************************  PROGRAM OEMLIST.C  **************************/
  2. /*    AUTHOR               KJC: APPLICATIONS ENGINEERING                 */
  3. /*    DATE LAST REVISED    08/16/90                                      */
  4. /*    VERSION              1.01                                          */
  5. /*    FUNCTION             TO PROVIDE A PROGRAMING EXAMPLE USING THE     */
  6. /*                         THE OEMSCSI INTERFACE.                        */
  7. /*    DESCRIPTION          THIS EXAMPLE USES THE TEST UNIT READY AND THE */
  8. /*               INQUIRY COMMAND TO OBTAIN AND DISPLAY DATA    */
  9. /*                         FOR EACH SCSI ADDRESS ON EACH HOST ADAPTER    */
  10. /*                         FOUND.                     */
  11. /*************************************************************************/
  12.  
  13. /**********************
  14.  *  REQUIRED INCLUDES *
  15.  **********************/
  16.  
  17.   #include <string.h>
  18.   #include <dos.h>
  19.   #include <stdlib.h>
  20.   #include <stdio.h>
  21.   #include <conio.h>
  22.  
  23. /*******************************
  24.  *  REQUIRED MACRO DEFINITIONS *
  25.  *******************************/
  26.  
  27.   #define MAKE_FP(seg,ofs)   ((void far *) \
  28.                  (((unsigned long)(seg) << 16) | (unsigned)(ofs)))
  29.  
  30. /*********************************
  31.  * REQUIRED FUNCTION DEFINITIONS *
  32.  *********************************/
  33.  
  34.   void display_screen(void);
  35.   void display_device_data(void);
  36.   int check_host_adapter(char adapter_id);
  37.   int  test_unit_ready(int adapter_id,int scsi_id);
  38.   int inquiry_command(int adapter_id,int scsi_id);
  39.  
  40. /*******************************
  41.  * REQUIRED GLOBAL DEFINITIONS *
  42.  *******************************/
  43.  
  44.   unsigned char buf[512];        /* Buffer Space               */
  45.   unsigned char cmds[12];            /* Command Block Space        */
  46.   int    i,                /* Counters & varibles           */
  47.     i2,
  48.     ha,
  49.     ierr;
  50.   char    id_string[23];            /* Space for Device ID string */
  51.   struct SREGS segregs ;
  52.  
  53. /******************************
  54.  * DEFINE OEM TABLE STRUCTURE *
  55.  ******************************/
  56.  
  57.   struct oem_cmd_table
  58.       {
  59.     unsigned char (far *cmdblock)[];
  60.     unsigned char (far *datablock)[];
  61.     long expectlen;
  62.     long actuallen;
  63.     int timeout;
  64.     int blkfactora;
  65.     int blkfactorb;
  66.     unsigned char scsistatus;
  67.     unsigned char scsimsg;
  68.     unsigned char scsibits;
  69.     unsigned char scsiaddress;
  70.     unsigned char scsiparity;
  71.     int adaptererr;
  72.     } oem;
  73.  
  74. /*****************************
  75.  * MAIN PROGRAM STARTS HERE  *
  76.  *****************************/
  77.  
  78. main()
  79. {
  80.  
  81. /*  SET UP OEM TABLE   */
  82.  
  83.    segread(&segregs) ;
  84.    oem.cmdblock = MAKE_FP(segregs.ds,&cmds[0]);  /* Set pointer to CMDS */
  85.    oem.datablock = MAKE_FP(segregs.ds,&buf[0]);  /* Set pointer to DATA */
  86.    oem.expectlen=1;            /* Set expeded length to 1 */
  87.    oem.timeout=5;            /* Set time out value in seconds */
  88.    oem.blkfactora=1;            /* Set blocking factor A */
  89.    oem.blkfactorb=1;            /* Set blocking factor B */
  90.    oem.scsiaddress=0;            /* Test SCSI address 0 */
  91.    oem.scsiparity=1;            /* Enable SCSI Parity Checking */
  92.  
  93.   display_screen();
  94.   for(ha=0;ha<8;ha++)
  95.    {
  96.  
  97.  
  98.       if(check_host_adapter(ha) == -16)
  99.     continue;
  100.  
  101.       printf("\nHBA %d\n",ha);
  102.       for (i = 0;i <= 7;i++)
  103.     {
  104.        ierr = test_unit_ready(ha,i);
  105.        if(ierr != 0)
  106.          {
  107.            if(ierr == -2)          /* Timeout durring selection  */
  108.          continue;                 /* skip address device not there */
  109.            else                    /* Display error and continue */
  110.          printf(" %i   Error Code :%i\n",i,oem.adaptererr);
  111.           }
  112.        for (i2 = 0;i2 <= sizeof(buf);i2++)buf[i2] = 0;
  113.        ierr = inquiry_command(ha,i);/* Issue Inquiry command to id*/
  114.        display_device_data();    /* Display data              */
  115.      };
  116.      }
  117.   exit (0);
  118. }
  119.  
  120. int check_host_adapter(char adapter_id)
  121. {
  122.  
  123.   int    rtn_err;
  124.  
  125.  
  126.   /* SET UP COMMAND BLOCK FOR TEST UNIT READY  */
  127.  
  128.    cmds[0]= 0;
  129.    cmds[1]= 0;
  130.    cmds[4]= 0;
  131.    cmds[5]= 0;
  132.  
  133.    /* SET OEM TABLE FOR TEST UNIT READY COMMAND  */
  134.  
  135.    segread(&segregs) ;
  136.    oem.cmdblock = MAKE_FP(segregs.ds,&cmds[0]);  /* Set pointer to CMDS */
  137.    oem.datablock = MAKE_FP(segregs.ds,&buf[0]);  /* Set pointer to DATA */
  138.    oem.expectlen=1;                /* Set expeded length to 1 */
  139.    oem.timeout=5;                /* Set time out value */
  140.    oem.blkfactora=1;                /* Set blocking factor A */
  141.    oem.blkfactorb=1;                    /* Set blocking factor B */
  142.    oem.scsiaddress= (adapter_id << 4) & 0xf0;  /* Test SCSI address 0 */
  143.  
  144.  
  145.    /* CALL OEM TOOLKIT FOR TRANSFER  */
  146.  
  147.    rtn_err = oemscsi(&oem);
  148.    if(rtn_err != 0)
  149.    {
  150.      if (oem.adaptererr == -7)        /* Parity error detected */
  151.        {
  152.     oem.scsiparity = 0;        /* Disable parity checking*/
  153.     check_host_adapter(adapter_id);    /* Send call again      */
  154.        }
  155.      if (oem.adaptererr == -16 && ha == 0)
  156.     {
  157.       printf("\nNo Host Adapter Found Address %d",adapter_id);
  158.       exit(1);
  159.        }
  160.      if (oem.adaptererr == -16)        /* No host adapter found */
  161.       return(-16);
  162.    }
  163. }
  164.  
  165. void display_screen(void)
  166. {
  167.    clrscr();
  168.    printf("                                Future Domain\n");
  169.    printf("                             SCSI Inquiry Utility\n\n");
  170.    printf("\n\n\n");
  171.    printf("SCSI ID     Inquiry String     Revision  Level             Type\n");
  172.    for(i = 0;i <= 79;i++)printf("▓");
  173.    printf("\n");
  174. }
  175.  
  176. void display_device_data(void)
  177. {
  178.   for(i2 =0;i2 <= sizeof(id_string);i2++)id_string[i2] = 0;
  179.   for(i2 =0;i2 <= sizeof(id_string)-1;i2++)id_string[i2] = buf[i2 + 8];
  180.   printf("   %i    %.16s          %c%c%c%c                 "
  181.     ,i
  182.     ,&id_string
  183.     ,buf[32]
  184.     ,buf[33]
  185.     ,buf[34]
  186.     ,buf[35]);
  187.   if(buf[1] & 0x80)
  188.     printf(" Removable\n");
  189.   else
  190.     printf(" Fixed\n");
  191. }
  192.  
  193. int  test_unit_ready(int adapter_id,int scsi_id)
  194. {
  195.    int    ierr;
  196.  
  197. /* SET UP COMMAND BLOCK FOR TEST UNIT READY  */
  198.  
  199.      cmds[0]= 0;
  200.      cmds[1]= 0;
  201.      cmds[4]= 0;
  202.      cmds[5]= 0;
  203.  
  204.   /* SET OEM TABLE FOR TEST UNIT READY COMMAND  */
  205.  
  206.      segread(&segregs) ;
  207.      oem.cmdblock = MAKE_FP(segregs.ds,&cmds[0]);
  208.      oem.datablock = MAKE_FP(segregs.ds,&buf[0]);
  209.      oem.expectlen=1;
  210.      oem.timeout=5;
  211.      oem.blkfactora=1;
  212.      oem.blkfactorb=1;
  213.      oem.scsiaddress=(adapter_id << 4 &0xf0) | scsi_id;
  214.      oem.expectlen = 1;
  215.  
  216.   /* CALL OEM TOOLKIT FOR TRANSFER  */
  217.  
  218.      ierr = oemscsi(&oem);
  219.  
  220.      return(ierr);
  221. }
  222.  
  223. int inquiry_command(int adapter_id,int scsi_id)
  224. {
  225.   cmds[0]= 0x12;                 /* Set command block for Inquiry */
  226.   cmds[1]= 0;             /* command                */
  227.   cmds[4]= 0x27;                 /* Expected length is 39 bytes   */
  228.   cmds[5]= 0;
  229.   segread(&segregs) ;
  230.   oem.cmdblock = MAKE_FP(segregs.ds,&cmds[0]);
  231.   oem.datablock = MAKE_FP(segregs.ds,&buf[0]);
  232.   oem.expectlen=1;
  233.   oem.timeout=5;
  234.   oem.blkfactora=1;
  235.   oem.blkfactorb=1;
  236.   oem.scsiaddress=(adapter_id << 4 &0xf0) | scsi_id;
  237.   oem.expectlen = 39;
  238.   ierr = oemscsi(&oem);        /* Call OEM TOOLKIT          */
  239.  
  240. }