scsi_cmds.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:33k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)scsi_cmds.c 1.2 99/12/19 Copyright 1998,1999 Heiko Eissfeldt */
  2. #ifndef lint
  3. static char     sccsid[] =
  4. "@(#)scsi_cmds.c 1.2 99/12/19 Copyright 1998,1999 Heiko Eissfeldt";
  5. #endif
  6. /* file for all SCSI commands
  7.  * FUA (Force Unit Access) bit handling copied from Monty's cdparanoia.
  8.  */
  9. #define TESTSUBQFALLBACK 0
  10. #include "config.h"
  11. #include <stdio.h>
  12. #include <standard.h>
  13. #include <stdlib.h>
  14. #include <strdefs.h>
  15. #include <btorder.h>
  16. #define        g5x_cdblen(cdb, len)    ((cdb)->count[0] = ((len) >> 16L)& 0xFF,
  17.                                 (cdb)->count[1] = ((len) >> 8L) & 0xFF,
  18.                                 (cdb)->count[2] = (len) & 0xFF)
  19. #include <scg/scgcmd.h>
  20. #include <scg/scsidefs.h>
  21. #include <scg/scsireg.h>
  22. #include <scg/scsitransp.h>
  23. #include "mytype.h"
  24. #include "cdda2wav.h"
  25. #include "interface.h"
  26. #include "byteorder.h"
  27. #include "global.h"
  28. #include "cdrecord.h"
  29. #include "scsi_cmds.h"
  30. unsigned char *bufferTOC;
  31. subq_chnl *SubQbuffer;
  32. unsigned char *cmd;
  33. int SCSI_emulated_ATAPI_on(scgp)
  34. SCSI *scgp;
  35. {
  36. /* return is_atapi;*/
  37. if (scsi_isatapi(scgp) > 0)
  38. return (TRUE);
  39. (void) allow_atapi(scgp, TRUE);
  40. return (allow_atapi(scgp, TRUE));
  41. }
  42. int heiko_mmc(scgp)
  43. SCSI *scgp;
  44. {
  45.         unsigned char mode[0x100];
  46. int was_atapi;
  47.         struct  cd_mode_page_2A *mp;
  48. int retval;
  49.         fillbytes((caddr_t)mode, sizeof(mode), '');
  50.         was_atapi = allow_atapi(scgp, 1);
  51.         scgp->silent++;
  52.         mp = mmc_cap(scgp, mode);
  53.         scgp->silent--;
  54.         allow_atapi(scgp, was_atapi);
  55.         if (mp == NULL)
  56.                 return (0);
  57.         /* have a look at the capabilities */
  58. if (mp->cd_da_supported == 0) {
  59.   retval = -1;
  60. } else {
  61.   retval = 1 + mp->cd_da_accurate;
  62.         }
  63. return retval;
  64. }
  65. int accepts_fua_bit;
  66. unsigned char density = 0;
  67. unsigned char orgmode4 = 0;
  68. unsigned char orgmode10, orgmode11;
  69. /* get current sector size from SCSI cdrom drive */
  70. unsigned int 
  71. get_orig_sectorsize(scgp, m4, m10, m11)
  72. SCSI *scgp;
  73. unsigned char *m4;
  74. unsigned char *m10; 
  75. unsigned char *m11;
  76. {
  77.       /* first get current values for density, etc. */
  78.       static unsigned char *modesense = NULL;
  79.    
  80.       if (modesense == NULL) {
  81.         modesense = (unsigned char *) malloc(12);
  82.         if (modesense == NULL) {
  83.           fprintf(stderr, "Cannot allocate memory for mode sense command in line %dn", __LINE__);
  84.           return 0;
  85.         }
  86.       }
  87.       /* do the scsi cmd */
  88.       if (scgp->verbose) fprintf(stderr, "nget density and sector size...");
  89.       if (mode_sense(scgp, modesense, 12, 0x01, 0) < 0)
  90.   fprintf(stderr, "get_orig_sectorsize mode sense failedn");
  91.       /* FIXME: some drives dont deliver block descriptors !!! */
  92.       if (modesense[3] == 0)
  93.         return 0;
  94.       if (m4 != NULL)                       /* density */
  95.         *m4 = modesense[4];
  96.       if (m10 != NULL)                      /* MSB sector size */
  97.         *m10 = modesense[10];
  98.       if (m11 != NULL)                      /* LSB sector size */
  99.         *m11 = modesense[11];
  100.       return (modesense[10] << 8) + modesense[11];
  101. }
  102. /* switch CDROM scsi drives to given sector size  */
  103. int set_sectorsize (scgp, secsize)
  104. SCSI *scgp;
  105. unsigned int secsize;
  106. {
  107.   static unsigned char mode [4 + 8];
  108.   int retval;
  109.   if (orgmode4 == 0xff) {
  110.     get_orig_sectorsize(scgp, &orgmode4, &orgmode10, &orgmode11);
  111.   }
  112.   if (orgmode4 == 0x82 && secsize == 2048)
  113.     orgmode4 = 0x81;
  114.   /* prepare to read cds in the previous mode */
  115.   fillbytes((caddr_t)mode, sizeof(mode), '');
  116.   mode[ 3] = 8;         /* Block Descriptor Length */
  117.   mode[ 4] = orgmode4;         /* normal density */
  118.   mode[10] =  secsize >> 8;   /* block length "msb" */
  119.   mode[11] =  secsize & 0xFF; /* block length lsb */
  120.   if (scgp->verbose) fprintf(stderr, "nset density and sector size...");
  121.   /* do the scsi cmd */
  122.   if ((retval = mode_select(scgp, mode, 12, 0, scgp->inq->data_format >= 2)) < 0)
  123.         fprintf (stderr, "setting sector size failedn");
  124.   return retval;
  125. }
  126. /* switch Toshiba/DEC and HP drives from/to cdda density */
  127. void EnableCddaModeSelect (scgp, fAudioMode)
  128. SCSI *scgp;
  129. int fAudioMode;
  130. {
  131.   /* reserved, Medium type=0, Dev spec Parm = 0, block descriptor len 0 oder 8,
  132.      Density (cd format) 
  133.      (0=YellowBook, XA Mode 2=81h, XA Mode1=83h and raw audio via SCSI=82h),
  134.      # blks msb, #blks, #blks lsb, reserved,
  135.      blocksize, blocklen msb, blocklen lsb,
  136.    */
  137.   /* MODE_SELECT, page = SCSI-2  save page disabled, reserved, reserved, 
  138.      parm list len, flags */
  139.   static unsigned char mode [4 + 8] = { 
  140.        /* mode section */
  141.     0, 
  142.                             0, 0, 
  143.                             8,       /* Block Descriptor Length */
  144.        /* block descriptor */
  145.                             0,       /* Density Code */
  146.                             0, 0, 0, /* # of Blocks */
  147.                             0,       /* reserved */
  148.                             0, 0, 0};/* Blocklen */
  149.   if (orgmode4 == 0 && fAudioMode) {
  150.     if (0 == get_orig_sectorsize(scgp, &orgmode4, &orgmode10, &orgmode11)) {
  151.         /* cannot retrieve density, sectorsize */
  152. orgmode10 = (CD_FRAMESIZE >> 8L);
  153. orgmode11 = (CD_FRAMESIZE & 0xFF);
  154.     }
  155.   }
  156.   if (fAudioMode) {
  157.     /* prepare to read audio cdda */
  158.     mode [4] = density;   /* cdda density */
  159.     mode [10] = (CD_FRAMESIZE_RAW >> 8L);   /* block length "msb" */
  160.     mode [11] = (CD_FRAMESIZE_RAW & 0xFF);  /* block length "lsb" */
  161.   } else {
  162.     /* prepare to read cds in the previous mode */
  163.     mode [4] = orgmode4; /* 0x00;  * normal density */
  164.     mode [10] = orgmode10; /* (CD_FRAMESIZE >> 8L);  * block length "msb" */
  165.     mode [11] = orgmode11; /* (CD_FRAMESIZE & 0xFF); * block length lsb */
  166.   }
  167.   if (scgp->verbose) fprintf(stderr, "nset density/sector size (EnableCddaModeSelect)...n");
  168.   /* do the scsi cmd */
  169.   if (mode_select(scgp, mode, 12, 0, scgp->inq->data_format >= 2) < 0)
  170.         fprintf (stderr, "Audio mode switch failedn");
  171. }
  172. /* read CD Text information from the table of contents */
  173. void ReadTocTextSCSIMMC ( scgp )
  174. SCSI *scgp;
  175. {
  176.     short int datalength;
  177.     unsigned char *p = bufferTOC;
  178. #if 1
  179.   /* READTOC, MSF, format, res, res, res, Start track/session, len msb,
  180.      len lsb, control */
  181. register struct scg_cmd *scmd = scgp->scmd;
  182. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  183.         scmd->addr = (caddr_t)bufferTOC;
  184.         scmd->size = 4;
  185.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  186.         scmd->cdb_len = SC_G1_CDBLEN;
  187.         scmd->sense_len = CCS_SENSE_LEN;
  188.         scmd->target = scgp->target;
  189.         scmd->cdb.g1_cdb.cmd = 0x43; /* Read TOC command */
  190.         scmd->cdb.g1_cdb.lun = scgp->lun;
  191.         scmd->cdb.g1_cdb.addr[0] = 5; /* format field */
  192.         scmd->cdb.g1_cdb.res6 = 1; /* track/session */
  193.         g1_cdblen(&scmd->cdb.g1_cdb, 4);
  194.         scgp->silent++;
  195.         if (scgp->verbose) fprintf(stderr, "nRead TOC CD Text size ...");
  196. scgp->cmdname = "read toc size (text)";
  197.         if (scsicmd(scgp) < 0) {
  198.           scgp->silent--;
  199.   if (global.quiet != 1)
  200.             fprintf (stderr, "Read TOC CD Text failed (probably not supported).n");
  201.   p[0] = p[1] = '';
  202.           return ;
  203.         }
  204.         scgp->silent--;
  205.     datalength  = (p[0] << 8) | (p[1]);
  206.     if (datalength <= 2) return;
  207. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  208.         scmd->addr = (caddr_t)bufferTOC;
  209.         scmd->size = 2+datalength;
  210.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  211.         scmd->cdb_len = SC_G1_CDBLEN;
  212.         scmd->sense_len = CCS_SENSE_LEN;
  213.         scmd->target = scgp->target;
  214.         scmd->cdb.g1_cdb.cmd = 0x43; /* Read TOC command */
  215.         scmd->cdb.g1_cdb.lun = scgp->lun;
  216.         scmd->cdb.g1_cdb.addr[0] = 5; /* format field */
  217.         scmd->cdb.g1_cdb.res6 = 1; /* track/session */
  218.         g1_cdblen(&scmd->cdb.g1_cdb, 2+datalength);
  219.         scgp->silent++;
  220.         if (scgp->verbose) fprintf(stderr, "nRead TOC CD Text data ...");
  221. scgp->cmdname = "read toc data (text)";
  222.         if (scsicmd(scgp) < 0) {
  223.           scgp->silent--;
  224.   if (global.quiet != 1)
  225.             fprintf (stderr,  "Read TOC CD Text data failed (probably not supported).n");
  226.   p[0] = p[1] = '';
  227.           return ;
  228.         }
  229.         scgp->silent--;
  230. #else
  231. { FILE *fp;
  232. int read_;
  233. fp = fopen("PearlJam.cdtext", "rb");
  234. /*fp = fopen("celine.cdtext", "rb");*/
  235. if (fp == NULL) { perror(""); return; }
  236. fillbytes(bufferTOC, CD_FRAMESIZE, '');
  237. read_ = fread(bufferTOC, 1, CD_FRAMESIZE, fp );
  238. fprintf(stderr, "read %d bytes. sizeof(bufferTOC)=%un", read_, CD_FRAMESIZE);
  239.         datalength  = (bufferTOC[0] << 8) | (bufferTOC[1]);
  240. fclose(fp);
  241. }
  242. #endif
  243. }
  244. /* read the start of the lead-out from the first session TOC */
  245. unsigned ReadFirstSessionTOCSony ( scgp, tracks )
  246. SCSI *scgp;
  247. unsigned tracks;
  248. {
  249.   /* READTOC, MSF, format, res, res, res, Start track/session, len msb,
  250.      len lsb, control */
  251. register struct scg_cmd *scmd = scgp->scmd;
  252. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  253.         scmd->addr = (caddr_t)bufferTOC;
  254.         scmd->size = 4 + (tracks + 3) * 11;
  255.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  256.         scmd->cdb_len = SC_G1_CDBLEN;
  257.         scmd->sense_len = CCS_SENSE_LEN;
  258.         scmd->target = scgp->target;
  259.         scmd->cdb.g1_cdb.cmd = 0x43; /* Read TOC command */
  260.         scmd->cdb.g1_cdb.lun = scgp->lun;
  261.         scmd->cdb.g1_cdb.res6 = 1;     /* session */
  262.         g1_cdblen(&scmd->cdb.g1_cdb, 4 + (tracks + 3) * 11);
  263.         scmd->cdb.g1_cdb.vu_97 = 1;    /* format */
  264.         scgp->silent++;
  265.         if (scgp->verbose) fprintf(stderr, "nRead TOC first session ...");
  266. scgp->cmdname = "read toc first session";
  267.         if (scsicmd(scgp) < 0) {
  268.           scgp->silent--;
  269.   if (global.quiet != 1)
  270.             fprintf (stderr, "Read TOC first session failed (probably not supported).n");
  271.           return 0;
  272.         }
  273.         scgp->silent--;
  274.         if ((unsigned)((bufferTOC[0] << 8) | bufferTOC[1]) >= 4 + (tracks + 3) * 11 -2) {
  275.           unsigned off;
  276.           /* We want the entry with POINT = 0xA2, which has the start position
  277.              of the first session lead out */
  278.           off = 4 + 2 * 11 + 3;
  279.           if (bufferTOC[off-3] == 1 && bufferTOC[off] == 0xA2) {
  280.             unsigned retval;
  281.             off = 4 + 2 * 11 + 8;
  282.             retval = bufferTOC[off] >> 4;
  283.     retval *= 10; retval += bufferTOC[off] & 0xf;
  284.     retval *= 60;
  285.     off++;
  286.             retval += 10 * (bufferTOC[off] >> 4) + (bufferTOC[off] & 0xf);
  287.     retval *= 75;
  288.     off++;
  289.             retval += 10 * (bufferTOC[off] >> 4) + (bufferTOC[off] & 0xf);
  290.     retval -= 150;
  291.             return retval;
  292.           }
  293.         }
  294.         return 0;
  295. }
  296. /* read the start of the lead-out from the first session TOC */
  297. unsigned ReadFirstSessionTOCMMC ( scgp, tracks )
  298. SCSI *scgp;
  299. unsigned tracks;
  300. {
  301.   /* READTOC, MSF, format, res, res, res, Start track/session, len msb,
  302.      len lsb, control */
  303. register struct scg_cmd *scmd = scgp->scmd;
  304. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  305.         scmd->addr = (caddr_t)bufferTOC;
  306.         scmd->size = 4 + (tracks + 3) * 11;
  307.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  308.         scmd->cdb_len = SC_G1_CDBLEN;
  309.         scmd->sense_len = CCS_SENSE_LEN;
  310.         scmd->target = scgp->target;
  311.         scmd->cdb.g1_cdb.cmd = 0x43; /* Read TOC command */
  312.         scmd->cdb.g1_cdb.lun = scgp->lun;
  313.         scmd->cdb.g1_cdb.addr[0] = 2; /* format */
  314.         scmd->cdb.g1_cdb.res6 = 1; /* session */
  315.         g1_cdblen(&scmd->cdb.g1_cdb, 4 + (tracks + 3) * 11);
  316.         scgp->silent++;
  317.         if (scgp->verbose) fprintf(stderr, "nRead TOC first session ...");
  318. scgp->cmdname = "read toc first session";
  319.         if (scsicmd(scgp) < 0) {
  320.           scgp->silent--;
  321.   if (global.quiet != 1)
  322.             fprintf (stderr, "Read TOC first session failed (probably not supported).n");
  323.           return 0;
  324.         }
  325.         scgp->silent--;
  326.         if ((unsigned)((bufferTOC[0] << 8) | bufferTOC[1]) >= 4 + (tracks + 3) * 11 - 2) {
  327.           unsigned off;
  328.           /* We want the entry with POINT = 0xA2, which has the start position
  329.              of the first session lead out */
  330.           off = 4 + 3;
  331.           while (off < 4 + (tracks + 3) * 11 && bufferTOC[off] != 0xA2) {
  332.             off += 11;
  333.           }
  334.           if (off < 4 + (tracks + 3) * 11) {
  335.             off += 5;
  336.             return (bufferTOC[off]*60 + bufferTOC[off+1])*75 + bufferTOC[off+2] - 150;
  337.           }
  338.         }
  339.         return 0;
  340. }
  341. /* read the table of contents from the cd and fill the TOC array */
  342. unsigned ReadTocSCSI ( scgp, toc )
  343. SCSI *scgp;
  344. TOC *toc;
  345. {
  346.   unsigned i;
  347.   unsigned tracks;
  348.   /* first read the first and last track number */
  349.   /* READTOC, MSF format flag, res, res, res, res, Start track, len msb,
  350.      len lsb, flags */
  351. register struct scg_cmd *scmd = scgp->scmd;
  352. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  353.         scmd->addr = (caddr_t)bufferTOC;
  354.         scmd->size = 4;
  355.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  356.         scmd->cdb_len = SC_G1_CDBLEN;
  357.         scmd->sense_len = CCS_SENSE_LEN;
  358.         scmd->target = scgp->target;
  359.         scmd->cdb.g1_cdb.cmd = 0x43; /* read TOC command */
  360.         scmd->cdb.g1_cdb.lun = scgp->lun;
  361.         scmd->cdb.g1_cdb.res6 = 1; /* start track */
  362.         g1_cdblen(&scmd->cdb.g1_cdb, 4);
  363.         if (scgp->verbose) fprintf(stderr, "nRead TOC size (standard)...");
  364.   /* do the scsi cmd (read table of contents) */
  365. scgp->cmdname = "read toc size";
  366.   if (scsicmd(scgp) < 0)
  367.       FatalError ("Read TOC size failed.n");
  368.   tracks = ((bufferTOC [3] ) - bufferTOC [2] + 2) ;
  369.   if (tracks > MAXTRK) return 0;
  370.   if (tracks == 0) return 0;
  371. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  372.         scmd->addr = (caddr_t)bufferTOC;
  373.         scmd->size = 4 + tracks * 8;
  374.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  375.         scmd->cdb_len = SC_G1_CDBLEN;
  376.         scmd->sense_len = CCS_SENSE_LEN;
  377.         scmd->target = scgp->target;
  378.         scmd->cdb.g1_cdb.cmd = 0x43; /* read TOC command */
  379.         scmd->cdb.g1_cdb.lun = scgp->lun;
  380.         scmd->cdb.g1_cdb.res = 1; /* MSF format */
  381.         scmd->cdb.g1_cdb.res6 = 1; /* start track */
  382.         g1_cdblen(&scmd->cdb.g1_cdb, 4 + tracks * 8);
  383.         if (scgp->verbose) fprintf(stderr, "nRead TOC tracks (standard MSF)...");
  384.         /* do the scsi cmd (read table of contents) */
  385. scgp->cmdname = "read toc tracks ";
  386.   if (scsicmd(scgp) < 0) {
  387.       /* fallback to LBA format for cd burners like Philips CD-522 */
  388. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  389.         scmd->addr = (caddr_t)bufferTOC;
  390.         scmd->size = 4 + tracks * 8;
  391.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  392.         scmd->cdb_len = SC_G1_CDBLEN;
  393.         scmd->sense_len = CCS_SENSE_LEN;
  394.         scmd->target = scgp->target;
  395.         scmd->cdb.g1_cdb.cmd = 0x43; /* read TOC command */
  396.         scmd->cdb.g1_cdb.lun = scgp->lun;
  397.         scmd->cdb.g1_cdb.res = 0; /* LBA format */
  398.         scmd->cdb.g1_cdb.res6 = 1; /* start track */
  399.         g1_cdblen(&scmd->cdb.g1_cdb, 4 + tracks * 8);
  400.         if (scgp->verbose) fprintf(stderr, "nRead TOC tracks (standard LBA)...");
  401.         /* do the scsi cmd (read table of contents) */
  402. scgp->cmdname = "read toc tracks ";
  403.         if (scsicmd(scgp) < 0) {
  404.           FatalError ("Read TOC tracks failed.n");
  405.         }
  406.         for (i = 0; i < tracks; i++) {
  407.           memcpy (&toc[i], bufferTOC + 4 + 8*i, 8);
  408.           toc[i].ISRC[0] = 0;
  409.           toc[i].dwStartSector = be32_to_cpu(toc[i].dwStartSector);
  410.           if ( toc [i].bTrack != i+1 )
  411.     toc [i].bTrack = i+1;
  412.         }
  413.   } else {
  414.     /* copy to our structure and convert start sector */
  415.     for (i = 0; i < tracks; i++) {
  416.       memcpy (&toc[i], bufferTOC + 4 + 8*i, 8);
  417.       toc[i].ISRC[0] = 0;
  418.       toc[i].dwStartSector = -150 + 75*60* bufferTOC[4 + 8*i + 5]+
  419.                                     75*    bufferTOC[4 + 8*i + 6]+
  420.                                            bufferTOC[4 + 8*i + 7];
  421.       if ( toc [i].bTrack != i+1 )
  422.   toc [i].bTrack = i+1;
  423.     }
  424.   }
  425.   return --tracks;           /* without lead-out */
  426. }
  427. /* ---------------- Read methods ------------------------------ */
  428. /* Read max. SectorBurst of cdda sectors to buffer
  429.    via standard SCSI-2 Read(10) command */
  430. void ReadStandard (scgp, p, lSector, SectorBurstVal )
  431. SCSI *scgp;
  432. UINT4 *p;
  433. unsigned lSector;
  434. unsigned SectorBurstVal;
  435. {
  436.   /* READ10, flags, block1 msb, block2, block3, block4 lsb, reserved, 
  437.      transfer len msb, transfer len lsb, block addressing mode */
  438. register struct scg_cmd *scmd = scgp->scmd;
  439. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  440.         scmd->addr = (caddr_t)p;
  441.         scmd->size = SectorBurstVal*CD_FRAMESIZE_RAW;
  442.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  443.         scmd->cdb_len = SC_G1_CDBLEN;
  444.         scmd->sense_len = CCS_SENSE_LEN;
  445.         scmd->target = scgp->target;
  446.         scmd->cdb.g1_cdb.cmd = 0x28; /* read 10 command */
  447.         scmd->cdb.g1_cdb.lun = scgp->lun;
  448. scmd->cdb.g1_cdb.res |= (accepts_fua_bit == 1 ? 1 << 2 : 0);
  449.         g1_cdbaddr(&scmd->cdb.g1_cdb, lSector);
  450.         g1_cdblen(&scmd->cdb.g1_cdb, SectorBurstVal);
  451.         if (scgp->verbose) fprintf(stderr, "nReadStandard10 CDDA...");
  452. scgp->cmdname = "ReadStandard10";
  453. if (scsicmd(scgp) < 0)
  454. FatalError ("Read CD-ROM10 failedn");
  455. }
  456. /* Read max. SectorBurst of cdda sectors to buffer
  457.    via vendor-specific ReadCdda(10) command */
  458. void ReadCdda10 (scgp, p, lSector, SectorBurstVal )
  459. SCSI *scgp;
  460. UINT4 *p;
  461. unsigned lSector;
  462. unsigned SectorBurstVal;
  463. {
  464.   /* READ10, flags, block1 msb, block2, block3, block4 lsb, reserved, 
  465.      transfer len msb, transfer len lsb, block addressing mode */
  466. register struct scg_cmd *scmd = scgp->scmd;
  467. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  468.         scmd->addr = (caddr_t)p;
  469.         scmd->size = SectorBurstVal*CD_FRAMESIZE_RAW;
  470.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  471.         scmd->cdb_len = SC_G1_CDBLEN;
  472.         scmd->sense_len = CCS_SENSE_LEN;
  473.         scmd->target = scgp->target;
  474.         scmd->cdb.g1_cdb.cmd = 0xd4; /* Read audio command */
  475.         scmd->cdb.g1_cdb.lun = scgp->lun;
  476. scmd->cdb.g1_cdb.res |= (accepts_fua_bit == 1 ? 1 << 2 : 0);
  477.         g1_cdbaddr(&scmd->cdb.g1_cdb, lSector);
  478.         g1_cdblen(&scmd->cdb.g1_cdb, SectorBurstVal);
  479.         if (scgp->verbose) fprintf(stderr, "nReadNEC10 CDDA...");
  480. scgp->cmdname = "Read10 NEC";
  481. if (scsicmd(scgp) < 0)
  482. FatalError ("Read CD-ROM10 (NEC) failedn");
  483. }
  484. /* Read max. SectorBurst of cdda sectors to buffer
  485.    via vendor-specific ReadCdda(12) command */
  486. void ReadCdda12 (scgp, p, lSector, SectorBurstVal )
  487. SCSI *scgp;
  488. UINT4 *p;
  489. unsigned lSector;
  490. unsigned SectorBurstVal;
  491. {
  492. register struct scg_cmd *scmd = scgp->scmd;
  493. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  494.         scmd->addr = (caddr_t)p;
  495.         scmd->size = SectorBurstVal*CD_FRAMESIZE_RAW;
  496.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  497.         scmd->cdb_len = SC_G5_CDBLEN;
  498.         scmd->sense_len = CCS_SENSE_LEN;
  499.         scmd->target = scgp->target;
  500.         scmd->cdb.g5_cdb.cmd = 0xd8; /* read audio command */
  501.         scmd->cdb.g5_cdb.lun = scgp->lun;
  502. scmd->cdb.g5_cdb.res |= (accepts_fua_bit == 1 ? 1 << 2 : 0);
  503.         g5_cdbaddr(&scmd->cdb.g5_cdb, lSector);
  504.         g5_cdblen(&scmd->cdb.g5_cdb, SectorBurstVal);
  505.         if (scgp->verbose) fprintf(stderr, "nReadSony12 CDDA...");
  506. scgp->cmdname = "Read12";
  507. if (scsicmd(scgp) < 0)
  508. FatalError ("Read CD-ROM12 failedn");
  509. }
  510. /* Read max. SectorBurst of cdda sectors to buffer
  511.    via vendor-specific ReadCdda(12) command */
  512. /*
  513. > It uses a 12 Byte CDB with 0xd4 as opcode, the start sector is coded as
  514. > normal and the number of sectors is coded in Byte 8 and 9 (begining with 0).
  515. */
  516. void ReadCdda12Matsushita (scgp, p, lSector, SectorBurstVal )
  517. SCSI *scgp;
  518. UINT4 *p;
  519. unsigned lSector;
  520. unsigned SectorBurstVal;
  521. {
  522. register struct scg_cmd *scmd = scgp->scmd;
  523.         fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  524.         scmd->addr = (caddr_t)p;
  525.         scmd->size = SectorBurstVal*CD_FRAMESIZE_RAW;
  526.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  527.         scmd->cdb_len = SC_G5_CDBLEN;
  528.         scmd->sense_len = CCS_SENSE_LEN;
  529.         scmd->target = scgp->target;
  530.         scmd->cdb.g5_cdb.cmd = 0xd4; /* read audio command */
  531.         scmd->cdb.g5_cdb.lun = scgp->lun;
  532. scmd->cdb.g5_cdb.res |= (accepts_fua_bit == 1 ? 1 << 2 : 0);
  533.         g5_cdbaddr(&scmd->cdb.g5_cdb, lSector);
  534.         g5_cdblen(&scmd->cdb.g5_cdb, SectorBurstVal);
  535.         if (scgp->verbose) fprintf(stderr, "nReadMatsushita12 CDDA...");
  536. scgp->cmdname = "Read12Matsushita";
  537. if (scsicmd(scgp) < 0)
  538. FatalError ("Read CD-ROM12 (Matsushita) failedn");
  539. }
  540. /* Read max. SectorBurst of cdda sectors to buffer
  541.    via MMC standard READ CD command */
  542. void ReadCddaMMC12 (scgp, p, lSector, SectorBurstVal )
  543. SCSI *scgp;
  544. UINT4 *p;
  545. unsigned lSector;
  546. unsigned SectorBurstVal;
  547. {
  548. register struct scg_cmd *scmd;
  549. int i;
  550.   for (i = 5; i > 0; i--) {
  551. scmd = scgp->scmd;
  552. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  553.         scmd->addr = (caddr_t)p;
  554.         scmd->size = SectorBurstVal*CD_FRAMESIZE_RAW;
  555.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  556.         scmd->cdb_len = SC_G5_CDBLEN;
  557.         scmd->sense_len = CCS_SENSE_LEN;
  558.         scmd->target = scgp->target;
  559.         scmd->cdb.g5_cdb.cmd = 0xbe; /* read cd command */
  560.         scmd->cdb.g5_cdb.lun = scgp->lun;
  561.         scmd->cdb.g5_cdb.res = 1 << 1; /* expected sector type field CDDA */
  562.         g5_cdbaddr(&scmd->cdb.g5_cdb, lSector);
  563.         g5x_cdblen(&scmd->cdb.g5_cdb, SectorBurstVal);
  564. scmd->cdb.g5_cdb.count[3] = 1 << 4; /* User data */
  565.         if (scgp->verbose) fprintf(stderr, "nReadMMC12 CDDA...");
  566. scgp->cmdname = "ReadCD MMC 12";
  567. if (scsicmd(scgp) >= 0)
  568. break;
  569.   }
  570.   if (i == 0) FatalError("ReadCD MMC 12 failed");
  571. }
  572. /* Read the Sub-Q-Channel to SubQbuffer. This is the method for
  573.  * drives that do not support subchannel parameters. */
  574. #ifdef PROTOTYPES
  575. static subq_chnl *ReadSubQFallback (SCSI *scgp, unsigned char sq_format, unsigned char track)
  576. #else
  577. static subq_chnl *ReadSubQFallback ( scgp, sq_format, track )
  578. SCSI *scgp;
  579. unsigned char sq_format;
  580. unsigned char track;
  581. #endif
  582. {
  583. register struct scg_cmd *scmd = scgp->scmd;
  584. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  585.         scmd->addr = (caddr_t)SubQbuffer;
  586.         scmd->size = 24;
  587.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  588.         scmd->cdb_len = SC_G1_CDBLEN;
  589.         scmd->sense_len = CCS_SENSE_LEN;
  590.         scmd->target = scgp->target;
  591.         scmd->cdb.g1_cdb.cmd = 0x42; /* Read SubQChannel */
  592. /* use LBA */
  593.         scmd->cdb.g1_cdb.lun = scgp->lun;
  594.         scmd->cdb.g1_cdb.addr[0] = 0x40;  /* SubQ info */
  595.         scmd->cdb.g1_cdb.addr[1] = 0;   /* parameter list: all */
  596.         scmd->cdb.g1_cdb.res6 = track; /* track number */
  597.         g1_cdblen(&scmd->cdb.g1_cdb, 24);
  598.         if (scgp->verbose) fprintf(stderr, "nRead Subchannel_dumb...");
  599. scgp->cmdname = "Read Subchannel_dumb";
  600. if (scsicmd(scgp) < 0) {
  601.   fprintf( stderr, "Read SubQ failedn");
  602. }
  603. /* check, if the requested format is delivered */
  604. { unsigned char *p = (unsigned char *) SubQbuffer;
  605.   if ((((unsigned)p[2] << 8) | p[3]) /* LENGTH */ > ULONG_C(11) &&
  606.     (p[5] >> 4) /* ADR */ == sq_format) {
  607.     return SubQbuffer;
  608.   }
  609. }
  610. /* FIXME: we might actively search for the requested info ... */
  611. return NULL;
  612. }
  613. /* Read the Sub-Q-Channel to SubQbuffer */
  614. #ifdef PROTOTYPES
  615. subq_chnl *ReadSubQSCSI (SCSI *scgp, unsigned char sq_format, unsigned char track)
  616. #else
  617. subq_chnl *ReadSubQSCSI ( scgp, sq_format, track )
  618. SCSI *scgp;
  619. unsigned char sq_format;
  620. unsigned char track;
  621. #endif
  622. {
  623.         int resp_size;
  624. register struct scg_cmd *scmd = scgp->scmd;
  625.         switch (sq_format) {
  626.           case GET_POSITIONDATA:
  627.             resp_size = 16;
  628.     track = 0;
  629.           break;
  630.           case GET_CATALOGNUMBER:
  631.             resp_size = 24;
  632.     track = 0;
  633.           break;
  634.           case GET_TRACK_ISRC:
  635.             resp_size = 24;
  636.           break;
  637.           default:
  638.                 fprintf(stderr, "ReadSubQSCSI: unknown format %dn", sq_format);
  639.                 return NULL;
  640.         }
  641. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  642.         scmd->addr = (caddr_t)SubQbuffer;
  643.         scmd->size = resp_size;
  644.         scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  645.         scmd->cdb_len = SC_G1_CDBLEN;
  646.         scmd->sense_len = CCS_SENSE_LEN;
  647.         scmd->target = scgp->target;
  648.         scmd->cdb.g1_cdb.cmd = 0x42;
  649. /* use LBA */
  650.         scmd->cdb.g1_cdb.lun = scgp->lun;
  651.         scmd->cdb.g1_cdb.addr[0] = 0x40;  /* SubQ info */
  652.         scmd->cdb.g1_cdb.addr[1] = sq_format; /* parameter list: all */
  653.         scmd->cdb.g1_cdb.res6 = track; /* track number */
  654.         g1_cdblen(&scmd->cdb.g1_cdb, resp_size);
  655.         if (scgp->verbose) fprintf(stderr, "nRead Subchannel...");
  656. scgp->cmdname = "Read Subchannel";
  657.   if (scsicmd(scgp) < 0) {
  658.     /* in case of error do a fallback for dumb firmwares */
  659.     return ReadSubQFallback(scgp, sq_format, track);
  660.   }
  661.   return SubQbuffer;
  662. }
  663. /********* non standardized speed selects ***********************/
  664. void SpeedSelectSCSIToshiba (scgp, speed)
  665. SCSI *scgp;
  666. unsigned speed;
  667. {
  668.   static unsigned char mode [4 + 3];
  669.   unsigned char *page = mode + 4;
  670.   int retval;
  671.   fillbytes((caddr_t)mode, sizeof(mode), '');
  672.   /* the first 4 mode bytes are zero. */
  673.   page[0] = 0x20;
  674.   page[1] = 1;
  675.   page[2] = speed;   /* 0 for single speed, 1 for double speed (3401) */
  676.   if (scgp->verbose) fprintf(stderr, "nspeed select Toshiba...");
  677.   scgp->silent++;
  678.   /* do the scsi cmd */
  679.   if ((retval = mode_select(scgp, mode, 7, 0, scgp->inq->data_format >= 2)) < 0)
  680.         fprintf (stderr, "speed select Toshiba failedn");
  681.   scgp->silent--;
  682. }
  683. void SpeedSelectSCSINEC (scgp, speed)
  684. SCSI *scgp;
  685. unsigned speed;
  686. {
  687.   static unsigned char mode [4 + 8];
  688.   unsigned char *page = mode + 4;
  689.   int retval;
  690. register struct scg_cmd *scmd = scgp->scmd;
  691.   fillbytes((caddr_t)mode, sizeof(mode), '');
  692.   /* the first 4 mode bytes are zero. */
  693.   page [0] = 0x0f; /* page code */
  694.   page [1] = 6;    /* parameter length */
  695.   /* bit 5 == 1 for single speed, otherwise double speed */
  696.   page [2] = speed == 1 ? 1 << 5 : 0;
  697. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  698.   scmd->addr = (caddr_t)mode;
  699.   scmd->size = 12;
  700.   scmd->flags = SCG_DISRE_ENA;
  701.   scmd->cdb_len = SC_G1_CDBLEN;
  702.   scmd->sense_len = CCS_SENSE_LEN;
  703.   scmd->target = scgp->target;
  704.   scmd->cdb.g1_cdb.cmd = 0xC5;
  705.   scmd->cdb.g1_cdb.lun = scgp->lun;
  706.   scmd->cdb.g1_cdb.addr[0] = 0 ? 1 : 0 | 1 ? 0x10 : 0;
  707.   g1_cdblen(&scmd->cdb.g1_cdb, 12);
  708.   if (scgp->verbose) fprintf(stderr, "nspeed select NEC...");
  709.   /* do the scsi cmd */
  710. scgp->cmdname = "speed select NEC";
  711.   if ((retval = scsicmd(scgp)) < 0)
  712.         fprintf(stderr ,"speed select NEC failedn");
  713. }
  714. void SpeedSelectSCSIPhilipsCDD2600 (scgp, speed)
  715. SCSI *scgp;
  716. unsigned speed;
  717. {
  718.   /* MODE_SELECT, page = SCSI-2  save page disabled, reserved, reserved,
  719.      parm list len, flags */
  720.   static unsigned char mode [4 + 8];
  721.   unsigned char *page = mode + 4;
  722.   int retval;
  723.   fillbytes((caddr_t)mode, sizeof(mode), '');
  724.   /* the first 4 mode bytes are zero. */
  725.   page[0] = 0x23;
  726.   page[1] = 6;
  727.   page[2] = page [4] = speed;
  728.   page[3] = 1;
  729.   if (scgp->verbose) fprintf(stderr, "nspeed select Philips...");
  730.   /* do the scsi cmd */
  731.   if ((retval = mode_select(scgp, mode, 12, 0, scgp->inq->data_format >= 2)) < 0)
  732.         fprintf (stderr, "speed select PhilipsCDD2600 failedn");
  733. }
  734. void SpeedSelectSCSISony (scgp, speed)
  735. SCSI *scgp;
  736. unsigned speed;
  737. {
  738.   static unsigned char mode [4 + 4];
  739.   unsigned char *page = mode + 4;
  740.   int retval;
  741.   fillbytes((caddr_t)mode, sizeof(mode), '');
  742.   /* the first 4 mode bytes are zero. */
  743.   page[0] = 0x31;
  744.   page[1] = 2;
  745.   page[2] = speed;
  746.   if (scgp->verbose) fprintf(stderr, "nspeed select Sony...");
  747.   /* do the scsi cmd */
  748.   scgp->silent++;
  749.   if ((retval = mode_select(scgp, mode, 8, 0, scgp->inq->data_format >= 2)) < 0)
  750.         fprintf (stderr, "speed select Sony failedn");
  751.   scgp->silent--;
  752. }
  753. void SpeedSelectSCSIYamaha (scgp, speed)
  754. SCSI *scgp;
  755. unsigned speed;
  756. {
  757.   static unsigned char mode [4 + 4];
  758.   unsigned char *page = mode + 4;
  759.   int retval;
  760.   fillbytes((caddr_t)mode, sizeof(mode), '');
  761.   /* the first 4 mode bytes are zero. */
  762.   page[0] = 0x31;
  763.   page[1] = 2;
  764.   page[2] = speed;
  765.   if (scgp->verbose) fprintf(stderr, "nspeed select Yamaha...");
  766.   /* do the scsi cmd */
  767.   if ((retval = mode_select(scgp, mode, 8, 0, scgp->inq->data_format >= 2)) < 0)
  768.         fprintf (stderr, "speed select Yamaha failedn");
  769. }
  770. void SpeedSelectSCSIMMC (scgp, speed)
  771. SCSI *scgp;
  772. unsigned speed;
  773. {
  774.   int spd;
  775. register struct scg_cmd *scmd = scgp->scmd;
  776.    if (speed == 0 || speed == 0xFFFF) {
  777.       spd = 0xFFFF;
  778.    } else {
  779.       spd = (1764 * speed) / 10;
  780.    }
  781. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  782.         scmd->flags = SCG_DISRE_ENA;
  783.         scmd->cdb_len = SC_G5_CDBLEN;
  784.         scmd->sense_len = CCS_SENSE_LEN;
  785.         scmd->target = scgp->target;
  786.         scmd->cdb.g5_cdb.cmd = 0xBB;
  787.         scmd->cdb.g5_cdb.lun = scgp->lun;
  788.         i_to_2_byte(&scmd->cdb.g5_cdb.addr[0], spd);
  789.         i_to_2_byte(&scmd->cdb.g5_cdb.addr[2], spd);
  790.         if (scgp->verbose) fprintf(stderr, "nspeed select MMC...");
  791. scgp->cmdname = "set cd speed";
  792.         if (scsicmd(scgp) < 0)
  793.                 fprintf (stderr, "speed select MMC failedn");
  794. }
  795. /* request vendor brand and model */
  796. unsigned char *Inquiry ( scgp )
  797. SCSI *scgp;
  798. {
  799.   static unsigned char *Inqbuffer = NULL;
  800. register struct scg_cmd *scmd = scgp->scmd;
  801.   if (Inqbuffer == NULL) {
  802.     Inqbuffer = (unsigned char *) malloc(42);
  803.     if (Inqbuffer == NULL) {
  804.       fprintf(stderr, "Cannot allocate memory for inquiry command in line %dn", __LINE__);
  805.         return NULL;
  806.     }
  807.   }
  808.   fillbytes(Inqbuffer, 42, '');
  809. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  810.   scmd->addr = (caddr_t)Inqbuffer;
  811.   scmd->size = 42;
  812.   scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA;
  813.   scmd->cdb_len = SC_G0_CDBLEN;
  814.   scmd->sense_len = CCS_SENSE_LEN;
  815.   scmd->target = scgp->target;
  816.   scmd->cdb.g0_cdb.cmd = SC_INQUIRY;
  817.   scmd->cdb.g0_cdb.lun = scgp->lun;
  818.   scmd->cdb.g0_cdb.count = 42;
  819.         
  820. scgp->cmdname = "inquiry";
  821.   if (scsicmd(scgp) < 0)
  822.      return (NULL);
  823.   /* define structure with inquiry data */
  824.   memcpy(scgp->inq, Inqbuffer, sizeof(*scgp->inq)); 
  825.   if (scgp->verbose)
  826.      scsiprbytes("Inquiry Data   :", (u_char *)Inqbuffer, 22 - scmd->resid);
  827.   return (Inqbuffer);
  828. }
  829. #define SC_CLASS_EXTENDED_SENSE 0x07
  830. #define TESTUNITREADY_CMD 0
  831. #define TESTUNITREADY_CMDLEN 6
  832. #define ADD_SENSECODE 12
  833. #define ADD_SC_QUALIFIER 13
  834. #define NO_MEDIA_SC 0x3a
  835. #define NO_MEDIA_SCQ 0x00
  836. int TestForMedium ( scgp )
  837. SCSI *scgp;
  838. {
  839. register struct scg_cmd *scmd = scgp->scmd;
  840.   if (interface != GENERIC_SCSI) {
  841.     return 1;
  842.   }
  843.   /* request READY status */
  844. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  845.   scmd->addr = (caddr_t)0;
  846.   scmd->size = 0;
  847.   scmd->flags = SCG_DISRE_ENA | (1 ? SCG_SILENT:0);
  848.   scmd->cdb_len = SC_G0_CDBLEN;
  849.   scmd->sense_len = CCS_SENSE_LEN;
  850.   scmd->target = scgp->target;
  851.   scmd->cdb.g0_cdb.cmd = SC_TEST_UNIT_READY;
  852.   scmd->cdb.g0_cdb.lun = scgp->lun;
  853.         
  854.   if (scgp->verbose) fprintf(stderr, "ntest unit ready...");
  855.   scgp->silent++;
  856. scgp->cmdname = "test unit ready";
  857.   if (scsicmd(scgp) >= 0) {
  858.     scgp->silent--;
  859.     return 1;
  860.   }
  861.   scgp->silent--;
  862.   if (scmd->sense.code >= SC_CLASS_EXTENDED_SENSE) {
  863.     return 
  864.       scmd->u_sense.cmd_sense[ADD_SENSECODE] != NO_MEDIA_SC ||
  865.       scmd->u_sense.cmd_sense[ADD_SC_QUALIFIER] != NO_MEDIA_SCQ;
  866.   } else {
  867.     /* analyse status. */
  868.     /* 'check condition' is interpreted as not ready. */
  869.     return (scmd->u_scb.cmd_scb[0] & 0x1e) != 0x02;
  870.   }
  871. }
  872. int StopPlaySCSI ( scgp )
  873. SCSI *scgp;
  874. {
  875. register struct scg_cmd *scmd = scgp->scmd;
  876. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  877.   scmd->addr = NULL;
  878.   scmd->size = 0;
  879.   scmd->flags = SCG_DISRE_ENA;
  880.   scmd->cdb_len = SC_G0_CDBLEN;
  881.   scmd->sense_len = CCS_SENSE_LEN;
  882.   scmd->target = scgp->target;
  883.   scmd->cdb.g0_cdb.cmd = 0x1b;
  884.   scmd->cdb.g0_cdb.lun = scgp->lun;
  885.   if (scgp->verbose) fprintf(stderr, "nstop audio play");
  886.   /* do the scsi cmd */
  887. scgp->cmdname = "stop audio play";
  888.   return scsicmd(scgp) >= 0 ? 0 : -1;
  889. }
  890. int Play_atSCSI ( scgp, from_sector, sectors)
  891. SCSI *scgp;
  892. unsigned int from_sector;
  893. unsigned int sectors;
  894. {
  895. register struct scg_cmd *scmd = scgp->scmd;
  896. fillbytes((caddr_t)scmd, sizeof(*scmd), '');
  897.   scmd->addr = NULL;
  898.   scmd->size = 0;
  899.   scmd->flags = SCG_DISRE_ENA;
  900.   scmd->cdb_len = SC_G1_CDBLEN;
  901.   scmd->sense_len = CCS_SENSE_LEN;
  902.   scmd->target = scgp->target;
  903.   scmd->cdb.g1_cdb.cmd = 0x47;
  904.   scmd->cdb.g1_cdb.lun = scgp->lun;
  905.   scmd->cdb.g1_cdb.addr[1] = (from_sector + 150) / (60*75);
  906.   scmd->cdb.g1_cdb.addr[2] = ((from_sector + 150) / 75) % 60;
  907.   scmd->cdb.g1_cdb.addr[3] = (from_sector + 150) % 75;
  908.   scmd->cdb.g1_cdb.res6 = (from_sector + 150 + sectors) / (60*75);
  909.   scmd->cdb.g1_cdb.count[0] = ((from_sector + 150 + sectors) / 75) % 60;
  910.   scmd->cdb.g1_cdb.count[1] = (from_sector + 150 + sectors) % 75;
  911.   if (scgp->verbose) fprintf(stderr, "nplay sectors...");
  912.   /* do the scsi cmd */
  913. scgp->cmdname = "play sectors";
  914.   return scsicmd(scgp) >= 0 ? 0 : -1;
  915. }
  916. static caddr_t scsibuffer; /* page aligned scsi transfer buffer */
  917. void init_scsibuf __PR((SCSI *, unsigned));
  918. void init_scsibuf(scgp, amt)
  919. SCSI *scgp;
  920. unsigned amt;
  921. {
  922. if (scsibuffer != NULL) {
  923. fprintf(stderr, "the SCSI transfer buffer has already been allocated!n");
  924. exit(3);
  925. }
  926. scsibuffer = scsi_getbuf(scgp, amt);
  927. if (scsibuffer == NULL) {
  928. fprintf(stderr, "could not get SCSI transfer buffer!n");
  929. exit(3);
  930. }
  931. }