home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / MISC / scsiutil.lzh / SCSIUTIL / doscsicmd.c < prev    next >
Text File  |  1996-10-22  |  3KB  |  79 lines

  1. typedef unsigned char uchar;
  2. typedef unsigned short ushort;
  3. typedef unsigned long ulong;
  4. #include "dcmd.h"
  5.  
  6. extern int path, devtyp;
  7.  
  8. struct d_cmd dcd;        /* direct command structure */
  9. struct cmdblk cmd;       /* command block for the driver */
  10.  
  11. union errdetails {
  12.    struct rbferr {
  13.       unsigned ed_valid:1,      /* error is valid */
  14.        ed_class:3,              /* error class = 7 */
  15.        ed_zero:4;               /* always 0 */
  16.       uchar ed_seg;             /* segment number always 0 */
  17.       unsigned ed_filemrk:1,    /* filemark */
  18.        ed_eom:1,                /* end of medium */
  19.        ed_ili:1,                /* incorrect length indicator */
  20.        ed_zero2:1,              /* always zero */
  21.        ed_main:4;               /* main sense key */
  22.       uchar ed_info[4],         /* info byte [lba] */
  23.        ed_senslen;              /* additional sense info length */
  24.       ulong ed_zero3;           /* always zero */
  25.       uchar ed_code,            /* error code */
  26.        ed_zero4,                /* always 0 */
  27.        ed_fru;                  /* fru code */
  28.       unsigned ed_fpv:1,        /* field pointer valid */
  29.        ed_cd:1,                 /* command/data bit */
  30.        ed_zero5:2,              /* always zero */
  31.        ed_bpv:1,                /* block pointer valid */
  32.        ed_bitptr:3;             /* bit pointer */
  33.       uchar ed_fptr[2];         /* field pointer */
  34.    } rerr;
  35.    struct sbferr {
  36.       unsigned ed_valid:1,      /* error is valid */
  37.        ed_class:3,              /* error class = 7 */
  38.        ed_zero:4;               /* always 0 */
  39.       uchar ed_seg;             /* segment number always 0 */
  40.       unsigned ed_filemrk:1,    /* filemark */
  41.        ed_eom:1,                /* end of medium */
  42.        ed_ili:1,                /* incorrect length indicator */
  43.        ed_zero2:1,              /* always zero */
  44.        ed_main:4;               /* main sense key */
  45.       uchar ed_info[4];         /* info byte [lba] */
  46.       uchar ed_senslen;         /* additional sense info length */
  47.       uchar ed_cpsrc;           /* COPY source sense data ptr */
  48.       uchar ed_cpdest;          /* COPY destination sense data ptr */
  49.       uchar ed_zero3[2];        /* always zero */
  50.       uchar ed_recov[2];        /* # recoverable errors */
  51.       uchar ed_cptstat;         /* COPY target status */
  52.       uchar ed_cptsens[8];      /* COPY target sense data (0-7) */
  53.    } serr;
  54. } edat;
  55.  
  56. int DoScsiCmd(uchar * data, int datasize, uchar * cmdb, int cmdsize, uchar flags)
  57. {
  58.    /* set up the direct command structure */
  59.    dcd.manager = devtyp;             /* device  manager */
  60.    dcd.dcmdsync = DCMDSYNC;     /* set sync to validate the call */
  61.    dcd.device = SCSIdevice;     /* this is indeed a SCSI specific op */
  62.    dcd.dcmdblk = &cmd;          /* pointer to command block */
  63.  
  64.    /* and now the SCSI driver required block */
  65.    cmd._cb_cmdptr = cmdb;       /* pointer to the command */
  66.    cmd._cb_datptr = data;       /* place for the data */
  67.    cmd._cb_cmdlen = cmdsize;
  68.    cmd._cb_datlen = datasize;    /* the number of data bytes to xfer */
  69.    cmd._cb_xfer = flags;        /* read data flag */
  70.    cmd._cb_errptr = &edat;      /* pointer to the error block */
  71.    cmd._cb_errlen = sizeof edat;/* and the size reserved for it */
  72.  
  73.    if ( flags == INPUT )
  74.       return _gs_dcmd(path, &dcd);
  75.    else
  76.       return _ss_dcmd(path, &dcd);
  77. }
  78.  
  79.