diff -u cdrtools-1.11/cdrecord/cdr_drv.c cdrtools-1.11.mache/cdrecord/cdr_drv.c --- cdrtools-1.11/cdrecord/cdr_drv.c Sun Oct 7 19:41:52 2001 +++ cdrtools-1.11.mache/cdrecord/cdr_drv.c Tue Oct 30 13:54:17 2001 @@ -42,6 +42,7 @@ extern cdr_t cdr_oldcd; extern cdr_t cdr_cd; extern cdr_t cdr_mmc; +extern cdr_t cdr_mdvd; extern cdr_t cdr_mmc_sony; #ifdef DRV_DVD extern cdr_t cdr_dvd; @@ -83,6 +84,7 @@ #endif &cdr_cd_dvd, &cdr_mmc, + &cdr_mdvd, &cdr_mmc_sony, &cdr_cd, &cdr_oldcd, diff -u cdrtools-1.11/cdrecord/cdrecord.c cdrtools-1.11.mache/cdrecord/cdrecord.c --- cdrtools-1.11/cdrecord/cdrecord.c Thu Sep 13 18:01:49 2001 +++ cdrtools-1.11.mache/cdrecord/cdrecord.c Tue Oct 30 13:54:17 2001 @@ -426,7 +426,7 @@ } is_mmc(scgp, &is_cdwr, &is_dvdwr); - if (is_dvdwr && !set_cdrcmds("mmc_dvd", (cdr_t **)NULL)) { + if (is_dvdwr && !set_cdrcmds("mmc_mdvd", (cdr_t **)NULL)) { errmsgno(EX_BAD, "This version of cdrecord does not include DVD-R/DVD-RW support code.\n"); errmsgno(EX_BAD, @@ -727,6 +727,15 @@ trackno = 0; } scgp->silent--; + + /* If it is DVD, the information in TOC is fabricated :) + The real information is from read disk info command*/ + if((ds.ds_disktype&DT_DVD) && (ds.ds_trlast>0)){ + trackno=ds.ds_trlast-1; + printf("trackno=%d\n",trackno); + } + + for (i = 1; i <= tracks; i++) { track[i].trackno = i + trackno; } @@ -2207,6 +2216,13 @@ if (bltype >= 0) { *flagsp |= F_BLANK; *blankp = bltype; + } + if(ispacket) { + trackp[0].flags |= TI_PACKET; + /*XXX This break the packet support for all drivers but dvd. + What else can I do if cdrecord assume that PACKET imply TAO which + is not true at all???? */ + trackp[0].flags &= ~TI_TAO; } if (dao) { *flagsp |= F_SAO; diff -u cdrtools-1.11/cdrecord/cdrecord.h cdrtools-1.11.mache/cdrecord/cdrecord.h --- cdrtools-1.11/cdrecord/cdrecord.h Sun Oct 7 12:35:26 2001 +++ cdrtools-1.11.mache/cdrecord/cdrecord.h Tue Oct 30 13:54:17 2001 @@ -397,6 +397,11 @@ #define DSF_URU 0x0004 /* Disk is for unrestricted use */ #define DSF_ERA 0x0008 /* Disk is erasable */ +/* + * Definitions for disktype flags + */ +#define DT_CD 0x001 /*is a CD */ +#define DT_DVD 0x002 /*is a DVD */ typedef struct disk_status dstat_t; diff -u cdrtools-1.11/cdrecord/drv_mmc.c cdrtools-1.11.mache/cdrecord/drv_mmc.c --- cdrtools-1.11/cdrecord/drv_mmc.c Sun Oct 7 20:03:27 2001 +++ cdrtools-1.11.mache/cdrecord/drv_mmc.c Tue Oct 30 13:55:42 2001 @@ -65,21 +65,31 @@ LOCAL void mmc_opthelp __PR((cdr_t *dp, int excode)); LOCAL cdr_t *identify_mmc __PR((SCSI *scgp, cdr_t *, struct scsi_inquiry *)); LOCAL int attach_mmc __PR((SCSI *scgp, cdr_t *)); +LOCAL int attach_mdvd __PR((SCSI *scgp, cdr_t *)); LOCAL int check_writemodes_mmc __PR((SCSI *scgp, cdr_t *dp)); +LOCAL int check_writemodes_mdvd __PR((SCSI *scgp, cdr_t *dp)); LOCAL int deflt_writemodes_mmc __PR((SCSI *scgp)); +LOCAL int deflt_writemodes_mdvd __PR((SCSI *scgp)); LOCAL int get_diskinfo __PR((SCSI *scgp, struct disk_info *dip)); LOCAL void di_to_dstat __PR((struct disk_info *dip, dstat_t *dsp)); #ifdef PRINT_ATIP LOCAL int get_pma __PR((SCSI *scgp)); #endif LOCAL int getdisktype_mmc __PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp)); +LOCAL int getdisktype_mdvd __PR((SCSI *scgp, cdr_t *dp, dstat_t *dsp)); LOCAL int speed_select_mmc __PR((SCSI *scgp, int *speedp, int dummy)); +LOCAL int speed_select_mdvd __PR((SCSI *scgp, int *speedp, int dummy)); LOCAL int next_wr_addr_mmc __PR((SCSI *scgp, int track, track_t *trackp, long *ap)); +LOCAL int next_wr_addr_mdvd __PR((SCSI *scgp, int track, track_t *trackp, long *ap)); LOCAL int open_track_mmc __PR((SCSI *scgp, cdr_t *dp, int track, track_t *trackp)); +LOCAL int open_track_mdvd __PR((SCSI *scgp, cdr_t *dp, int track, track_t *trackp)); LOCAL int close_track_mmc __PR((SCSI *scgp, int track, track_t *trackp)); +LOCAL int close_track_mdvd __PR((SCSI *scgp, int track, track_t *trackp)); LOCAL int open_session_mmc __PR((SCSI *scgp, cdr_t *dp, int tracks, track_t *trackp, int toctype, int multi)); +LOCAL int open_session_mdvd __PR((SCSI *scgp, cdr_t *dp, int tracks, track_t *trackp, int toctype, int multi)); LOCAL int waitfix_mmc __PR((SCSI *scgp, int secs)); LOCAL int fixate_mmc __PR((SCSI *scgp, int onp, int dummy, int toctype, int tracks, track_t *trackp)); +LOCAL int fixate_mdvd __PR((SCSI *scgp, int onp, int dummy, int toctype, int tracks, track_t *trackp)); LOCAL int blank_mmc __PR((SCSI *scgp, long addr, int blanktype)); LOCAL int send_opc_mmc __PR((SCSI *scgp, caddr_t, int cnt, int doopc)); LOCAL int scsi_sony_write __PR((SCSI *scgp, caddr_t bp, long sectaddr, long size, int blocks, BOOL islast)); @@ -132,6 +142,38 @@ send_opc_mmc, }; +cdr_t cdr_mdvd = { + 0, + CDR_SWABAUDIO, + "mmc_mdvd", + "generic SCSI-3/mmc DVD-R(W) driver", + 0, + identify_mmc, + attach_mdvd, + getdisktype_mdvd, + scsi_load, +/* mmc_load,*/ + scsi_unload, + read_buff_cap, + (int(*)__PR((SCSI *)))cmd_dummy, /* recovery_needed */ + (int(*)__PR((SCSI *, int)))cmd_dummy, /* recover */ + speed_select_mdvd, + select_secsize, + next_wr_addr_mdvd, + (int(*)__PR((SCSI *, Ulong)))cmd_ill, /* reserve_track */ + scsi_cdr_write, + (int(*)__PR((SCSI *scgp, int, track_t *)))cmd_dummy, /* send_cue */ + open_track_mdvd, + close_track_mdvd, + open_session_mdvd, + cmd_dummy, + read_session_offset, + fixate_mdvd, + blank_mmc, + send_opc_mmc, +}; + + cdr_t cdr_mmc_sony = { 0, /* CDR_TAO|CDR_SAO|CDR_PACKET|CDR_SWABAUDIO,*/ @@ -389,8 +431,9 @@ } #else if (is_dvd) { - errmsgno(EX_BAD, - "Found DVD media but DVD-R/DVD-RW support code is missing.\n"); + /* errmsgno(EX_BAD, + "Found DVD media but DVD-R/DVD-RW support code is missing.\n"); */ + dp = &cdr_mdvd; } #endif return (dp); @@ -403,6 +446,9 @@ { struct cd_mode_page_2A *mp; + Uchar fd[0x100]; + get_configuration(scgp, fd, 0x100, 0x21); + allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */ scgp->silent++; @@ -432,6 +478,43 @@ return (0); } +LOCAL int +attach_mdvd(scgp, dp) + SCSI *scgp; + cdr_t *dp; +{ + struct cd_mode_page_2A *mp; + + + allow_atapi(scgp, TRUE);/* Try to switch to 10 byte mode cmds */ + + scgp->silent++; + mp = mmc_cap(scgp, NULL);/* Get MMC capabilities in allocated mp */ + scgp->silent--; + if (mp == NULL) + return (-1); /* Pre SCSI-3/mmc drive */ + + dp->cdr_cdcap = mp; /* Store MMC cap pointer */ + + if (mp->loading_type == LT_TRAY) + dp->cdr_flags |= CDR_TRAYLOAD; + else if (mp->loading_type == LT_CADDY) + dp->cdr_flags |= CDR_CADDYLOAD; + + if (mp->BUF != 0) + dp->cdr_flags |= CDR_BURNFREE; + + check_writemodes_mdvd(scgp, dp); + + if (driveropts != NULL) { + if (strcmp(driveropts, "help") == 0) { + mmc_opthelp(dp, 0); + } + } + + return (0); +} + LOCAL int check_writemodes_mmc(scgp, dp) @@ -573,6 +656,77 @@ } LOCAL int +check_writemodes_mdvd(scgp, dp) + SCSI *scgp; + cdr_t *dp; +{ + Uchar mode[0x100]; + int len; + struct cd_mode_page_05 *mp; + + if (xdebug) + printf("Checking possible write modes: "); + + deflt_writemodes_mdvd(scgp); + + fillbytes((caddr_t)mode, sizeof(mode), '\0'); + + scgp->silent++; + if (!get_mode_params(scgp, 0x05, "CD write parameter", + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { + scgp->silent--; + return (-1); + } + if (len == 0) { + scgp->silent--; + return (-1); + } + + mp = (struct cd_mode_page_05 *) + (mode + sizeof(struct scsi_mode_header) + + ((struct scsi_mode_header *)mode)->blockdesc_len); + + mp->test_write = 0; + + /*We only check for PACKET and SAO since these are the only supported modes for DVD */ + /*XXX these checks are irrelevant because they are not medium sensitive. ie the device returns + error only when it does not support a given mode for ALL mediums. It should check using + GET CONFIGURATION command.*/ + + mp->write_type = WT_PACKET; + mp->fp = 0; + i_to_4_byte(mp->packet_size, 0); + + if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) { + dp->cdr_flags |= CDR_PACKET; + if (xdebug) + printf("PACKET "); + } else + dp->cdr_flags &= ~CDR_PACKET; + mp->fp = 0; + i_to_4_byte(mp->packet_size, 0); + mp->track_mode = TM_DATA; + + + mp->write_type = WT_SAO; + + if (set_mode_params(scgp, "CD write parameter", mode, len, 0, -1)) { + dp->cdr_flags |= CDR_SAO; + if (xdebug) + printf("SAO "); + } else + dp->cdr_flags &= ~CDR_SAO; + + + if (xdebug) + printf("\n"); + + deflt_writemodes_mdvd(scgp); + scgp->silent--; + return (0); +} + +LOCAL int deflt_writemodes_mmc(scgp) SCSI *scgp; { @@ -629,6 +783,54 @@ return (0); } +LOCAL int +deflt_writemodes_mdvd(scgp) + SCSI *scgp; +{ + Uchar mode[0x100]; + int len; + struct cd_mode_page_05 *mp; + + fillbytes((caddr_t)mode, sizeof(mode), '\0'); + + scgp->silent++; + if (!get_mode_params(scgp, 0x05, "DVD write parameter", + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) { + scgp->silent--; + return (-1); + } + if (len == 0) { + scgp->silent--; + return (-1); + } + + mp = (struct cd_mode_page_05 *) + (mode + sizeof(struct scsi_mode_header) + + ((struct scsi_mode_header *)mode)->blockdesc_len); + + mp->test_write = 0; + + /* + * Set default values: + * Write type = 02 (session at once) + * + * XXX Note: the same code appears in check_writemodes_mmc() and + * XXX in speed_select_mmc(). + */ + mp->write_type = WT_SAO; + mp->track_mode = TM_DATA; + mp->dbtype = DB_ROM_MODE1; + mp->session_format = SES_DA_ROM; + + + if (set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1) < 0) { + scgp->silent--; + return (-1); + } + scgp->silent--; + return (0); +} + #ifdef PRINT_ATIP LOCAL int get_atip __PR((SCSI *scgp, struct atipinfo *atp)); void print_di __PR((struct disk_info *dip)); @@ -693,6 +895,9 @@ if (dsp->ds_last_leadout == 0 && dsp->ds_maxblocks >= 0) dsp->ds_last_leadout = dsp->ds_maxblocks; + dsp->ds_trfirst=dip->first_track; + dsp->ds_trlast=dip->last_track_ls; + dsp->ds_trfirst_ls=dip->first_track_ls; } #ifdef PRINT_ATIP @@ -795,6 +1000,30 @@ #endif /* PRINT_ATIP */ LOCAL int +getdisktype_mdvd(scgp, dp, dsp) + SCSI *scgp; + cdr_t *dp; + dstat_t *dsp; +{ + int ret; + + struct track_info track_info; + if(getdisktype_mmc(scgp, dp, dsp)<0) + return -1; + + /* read rzone info to get the space left on disk */ + /*ds_trlast is the last rzone on disk, can be invisible */ + if(read_rzone_info(scgp, (caddr_t)&track_info, dsp->ds_trlast, sizeof(track_info))>=0) + dsp->ds_maxblocks=a_to_u_4_byte(track_info.free_blocks)+a_to_4_byte(track_info.next_writable_addr); + + dsp->ds_disktype&= ~DT_CD; + dsp->ds_disktype|= DT_DVD; + + return (ret); + +} + +LOCAL int getdisktype_mmc(scgp, dp, dsp) SCSI *scgp; cdr_t *dp; @@ -1097,6 +1326,26 @@ } LOCAL int +speed_select_mdvd(scgp, speedp, dummy) + SCSI *scgp; + int *speedp; + int dummy; +{ + int retcode; + /* For the moment we just divide the CD speed by 7*/ + + if(speedp!=NULL) + (*speedp)=(*speedp)*8; + + retcode=speed_select_mmc(scgp,speedp,dummy); + + if(speedp!=NULL) + (*speedp)=(*speedp)/7; + return retcode; + +} + +LOCAL int next_wr_addr_mmc(scgp, track, trackp, ap) SCSI *scgp; int track; @@ -1147,6 +1396,46 @@ }; LOCAL int +next_wr_addr_mdvd(scgp, track, trackp, ap) + SCSI *scgp; + int track; + track_t *trackp; + long *ap; +{ + struct track_info track_info; + long next_addr; + int result = -1; + struct disk_info disk_info; + + if (track > 0 && is_packet(trackp)) { + scgp->silent++; + result = read_rzone_info(scgp, (caddr_t)&track_info, track, + sizeof(track_info)); + scgp->silent--; + if (scsi_in_progress(scgp)){ + return -1; + } + + } + + if (result < 0) { + /* Get the last rzone*/ + if(read_disk_info(scgp,(caddr_t)&disk_info,8)<0) + return (-1); + + if (read_rzone_info(scgp, (caddr_t)&track_info, disk_info.last_track_ls, sizeof(track_info)) < 0) + return (-1); + } + if (scgp->verbose) + scg_prbytes("track info:", (Uchar *)&track_info, + sizeof(track_info)-scg_getresid(scgp)); + next_addr = a_to_4_byte(track_info.next_writable_addr); + if (ap) + *ap = next_addr; + return (0); +} + +LOCAL int open_track_mmc(scgp, dp, track, trackp) SCSI *scgp; cdr_t *dp; @@ -1225,6 +1514,47 @@ } LOCAL int +open_track_mdvd(scgp, dp, track, trackp) + SCSI *scgp; + cdr_t *dp; + int track; + track_t *trackp; +{ + Uchar mode[0x100]; + int len; + struct cd_mode_page_05 *mp; + + if (is_packet(trackp)) { + fillbytes((caddr_t)mode, sizeof(mode), '\0'); + + if (!get_mode_params(scgp, 0x05, "DVD write parameter", + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) + return (-1); + if (len == 0) + return (-1); + + mp = (struct cd_mode_page_05 *) + (mode + sizeof(struct scsi_mode_header) + + ((struct scsi_mode_header *)mode)->blockdesc_len); + + mp->write_type = WT_PACKET; + mp->LS_V = 1; + /*For now we set the link size to 0x10(32k) because Pioneer-A03 only support this */ + mp->link_size=0x10; + mp->fp = 1; + i_to_4_byte(mp->packet_size, trackp->pktsize); + } else { + return 0; + } + + if (!set_mode_params(scgp, "CD write parameter", mode, len, 0, trackp->secsize)) + return (-1); + + return (0); +} + + +LOCAL int close_track_mmc(scgp, track, trackp) SCSI *scgp; int track; @@ -1249,6 +1579,29 @@ return (0); } +LOCAL int +close_track_mdvd(scgp, track, trackp) + SCSI *scgp; + int track; + track_t *trackp; +{ + int ret; + if (!is_packet(trackp)) + return (0); + + if (scsi_flush_cache(scgp) < 0) { + printf("Trouble flushing the cache\n"); + return -1; + } + if (!is_noclose(trackp)) { + ret = scsi_close_tr_session(scgp, 1, track, FALSE); + wait_unit_ready(scgp, 300); + return (ret); + } + + +} + int toc2sess[] = { SES_DA_ROM, /* CD-DA */ SES_DA_ROM, /* CD-ROM */ @@ -1351,6 +1704,82 @@ } LOCAL int +open_session_mdvd(scgp, dp, tracks, trackp, toctype, multi) + SCSI *scgp; + cdr_t *dp; + int tracks; + track_t *trackp; + int toctype; + int multi; +{ + Uchar mode[0x100]; + + int len; + struct cd_mode_page_05 *mp; + Ulong totalsize; + int i; + struct track_info track_info; + + fillbytes((caddr_t)mode, sizeof(mode), '\0'); + + if (!get_mode_params(scgp, 0x05, "DVD write parameter", + mode, (Uchar *)0, (Uchar *)0, (Uchar *)0, &len)) + return (-1); + if (len == 0) + return (-1); + + mp = (struct cd_mode_page_05 *) + (mode + sizeof(struct scsi_mode_header) + + ((struct scsi_mode_header *)mode)->blockdesc_len); + if(is_packet(trackp)){ + mp->write_type=WT_PACKET; + mp->multi_session = (multi != 0) ? MS_MULTI : MS_NONE; + mp->fp=0; + mp->BUFE=1; + mp->track_mode=1; + }else{ + mp->write_type = WT_SAO; + } + + + if (lverbose && dp->cdr_cdcap->BUF != 0) + printf("BURN-Free is %s.\n", mp->BUFE?"ON":"OFF"); + if (driveropts != NULL) { + if ((strcmp(driveropts, "burnproof") == 0 || + strcmp(driveropts, "burnfree") == 0) && dp->cdr_cdcap->BUF != 0) { + errmsgno(EX_BAD, "Turning BURN-Free on\n"); + mp->BUFE = 1; + } else if ((strcmp(driveropts, "noburnproof") == 0 || + strcmp(driveropts, "noburnfree") == 0)) { + errmsgno(EX_BAD, "Turning BURN-Free off\n"); + mp->BUFE = 0; + } else if (strcmp(driveropts, "help") == 0) { + mmc_opthelp(dp, 0); + } else { + errmsgno(EX_BAD, "Bad driver opts '%s'.\n", driveropts); + mmc_opthelp(dp, EX_BAD); + } + } + + + if (!set_mode_params(scgp, "DVD write parameter", mode, len, 0, -1)) + return (-1); + + + totalsize=0; + for(i=1;i<=tracks;i++) { + totalsize+=trackp[i].tracksecs; + } + + if(!is_packet(trackp)){ + /* in DAO mode we need to reserve space for the track*/ + if(reserve_track(scgp, totalsize)<0) + return (-1); + } + return (0); +} + +LOCAL int waitfix_mmc(scgp, secs) SCSI *scgp; int secs; @@ -1376,6 +1805,28 @@ #undef W_SLEEP } +LOCAL int +fixate_mdvd(scgp, onp, dummy, toctype, tracks, trackp) + SCSI *scgp; + int onp; + int dummy; + int toctype; + int tracks; + track_t *trackp; +{ + /*set a really BIG timeout and call fixate_mmc + The BIG timeout is needed in case there was a very short rzone to write at the + beginning of the disk, because lead-out needs to be at some distance. + */ + scg_settimeout(scgp, 1000); + if(is_packet(trackp)){ + scsi_close_tr_session(scgp, 2, 0, FALSE); + } + fixate_mmc(scgp, onp, dummy, toctype, tracks, trackp); + scg_settimeout(scgp, 200); + +} + LOCAL int fixate_mmc(scgp, onp, dummy, toctype, tracks, trackp) SCSI *scgp; diff -u cdrtools-1.11/cdrecord/scsi_cdr.c cdrtools-1.11.mache/cdrecord/scsi_cdr.c --- cdrtools-1.11/cdrecord/scsi_cdr.c Sun Oct 7 12:35:27 2001 +++ cdrtools-1.11.mache/cdrecord/scsi_cdr.c Tue Oct 30 13:54:17 2001 @@ -82,6 +82,7 @@ EXPORT int write_xg5 __PR((SCSI *scgp, caddr_t, long, long, int)); EXPORT int scsi_flush_cache __PR((SCSI *scgp)); EXPORT int read_buffer __PR((SCSI *scgp, caddr_t bp, int cnt, int mode)); +EXPORT int get_configuration __PR((SCSI *scgp, caddr_t bp, int cnt, int mode)); EXPORT int read_subchannel __PR((SCSI *scgp, caddr_t bp, int track, int cnt,int msf, int subq, int fmt)); EXPORT int read_toc __PR((SCSI *scgp, caddr_t, int, int, int, int)); @@ -652,6 +653,32 @@ } EXPORT int +get_configuration(scgp, bp, cnt, sfn) + SCSI *scgp; + caddr_t bp; + int cnt; + int sfn; +{ + register struct scg_cmd *scmd = scgp->scmd; + + fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); + scmd->addr = bp; + scmd->size = cnt; + scmd->dma_read = 1; + scmd->cdb_len = SC_G1_CDBLEN; + scmd->sense_len = CCS_SENSE_LEN; + scmd->cdb.g1_cdb.cmd = 0x46; /* get configuration */ + scmd->cdb.g1_cdb.lun = scg_lun(scgp); + i_to_2_byte(scmd->cdb.g1_cdb.addr,sfn); + g1_cdblen(&scmd->cdb.g1_cdb, cnt); + + scgp->cmdname = "get configuration"; + + return (scg_cmd(scgp)); +} + + +EXPORT int read_subchannel(scgp, bp, track, cnt, msf, subq, fmt) SCSI *scgp; caddr_t bp; @@ -844,6 +871,61 @@ return (-1); return (0); } + +read_rzone_info(scgp, bp, track, cnt) + SCSI *scgp; + caddr_t bp; + int track; + int cnt; + +{ + register struct scg_cmd *scmd = scgp->scmd; + + fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); + scmd->addr = bp; + scmd->size = cnt; + scmd->flags = SCG_RECV_DATA|SCG_DISRE_ENA; + scmd->cdb_len = SC_G1_CDBLEN; + scmd->sense_len = CCS_SENSE_LEN; + scmd->timeout = 4 * 60; /* Needs up to 2 minutes */ + scmd->cdb.g1_cdb.cmd = 0x52; + scmd->cdb.g1_cdb.lun = scg_lun(scgp); + scmd->cdb.g1_cdb.reladr = 1; + g1_cdbaddr(&scmd->cdb.g1_cdb, track); + g1_cdblen(&scmd->cdb.g1_cdb, cnt); + + scgp->cmdname = "read rzone info"; + + if (scg_cmd(scgp) < 0) + return (-1); + return (0); +} + +EXPORT int +reserve_track(scgp, size) + SCSI *scgp; + Ulong size; + +{ + register struct scg_cmd *scmd = scgp->scmd; + + fillbytes((caddr_t)scmd, sizeof(*scmd), '\0'); + scmd->flags = SCG_DISRE_ENA; + scmd->cdb_len = SC_G1_CDBLEN; + scmd->sense_len = CCS_SENSE_LEN; + scmd->cdb.g1_cdb.cmd = 0x53; + scmd->cdb.g1_cdb.lun = scg_lun(scgp); + i_to_4_byte(&scmd->cdb.g1_cdb.addr[3], size); + + scgp->cmdname = "reserve track"; + + if (scg_cmd(scgp) < 0) + return (-1); + + return (0); + +} + EXPORT int read_dvd_structure(scgp, bp, cnt, fmt) diff -u cdrtools-1.11/include/scg/scsireg.h cdrtools-1.11.mache/include/scg/scsireg.h --- cdrtools-1.11/include/scg/scsireg.h Thu May 31 22:31:46 2001 +++ cdrtools-1.11.mache/include/scg/scsireg.h Tue Oct 30 13:54:17 2001 @@ -781,8 +781,8 @@ Ucbit multi_session : 2; /* Multi session write type */ Ucbit dbtype : 4; /* Data block type */ Ucbit res_4 : 4; /* Reserved */ - Uchar res_6; /* Reserved */ Uchar link_size; /* Link Size (default is 7) */ + Uchar res_6; /* Reserved */ Ucbit host_appl_code : 6; /* Host application code of disk */ Ucbit res_7 : 2; /* Reserved */ Uchar session_format; /* Session format (DA/CDI/XA) */