diff --git a/include/cdio/scsi_mmc.h b/include/cdio/scsi_mmc.h index 1e304af0..8a239ccc 100644 --- a/include/cdio/scsi_mmc.h +++ b/include/cdio/scsi_mmc.h @@ -1,5 +1,5 @@ /* - $Id: scsi_mmc.h,v 1.20 2004/07/28 01:09:59 rocky Exp $ + $Id: scsi_mmc.h,v 1.21 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -148,11 +148,18 @@ typedef enum scsi_mmc_direction { #define CDIO_MMC_SET_START_TRACK(cdb, command) \ cdb[6] = command -#define CDIO_MMC_SET_READ_LENGTH(cdb, len) \ +#define CDIO_MMC_SET_READ_LENGTH24(cdb, len) \ cdb[6] = (len >> 16) & 0xff; \ cdb[7] = (len >> 8) & 0xff; \ cdb[8] = (len ) & 0xff +#define CDIO_MMC_SET_READ_LENGTH16(cdb, len) \ + cdb[7] = (len >> 8) & 0xff; \ + cdb[8] = (len ) & 0xff + +#define CDIO_MMC_SET_READ_LENGTH8(cdb, len) \ + cdb[8] = (len ) & 0xff + #define CDIO_MMC_MCSB_ALL_HEADERS 0x78 #define CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb, val) \ diff --git a/lib/FreeBSD/freebsd.c b/lib/FreeBSD/freebsd.c index ff62405b..63f245c5 100644 --- a/lib/FreeBSD/freebsd.c +++ b/lib/FreeBSD/freebsd.c @@ -1,5 +1,5 @@ /* - $Id: freebsd.c,v 1.30 2004/07/25 15:40:02 rocky Exp $ + $Id: freebsd.c,v 1.31 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd.c,v 1.30 2004/07/25 15:40:02 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd.c,v 1.31 2004/07/28 11:45:21 rocky Exp $"; #include "freebsd.h" @@ -288,7 +288,7 @@ _get_mcn_freebsd (const void *p_user_data) { return (p_env->access_mode == _AM_IOCTL) ? get_mcn_freebsd_ioctl(p_env) - : get_mcn_freebsd_cam(p_env); + : scs_mmc_get_mcn(p_env); } diff --git a/lib/FreeBSD/freebsd.h b/lib/FreeBSD/freebsd.h index f3fd126f..2c1342c4 100644 --- a/lib/FreeBSD/freebsd.h +++ b/lib/FreeBSD/freebsd.h @@ -1,5 +1,5 @@ /* - $Id: freebsd.h,v 1.18 2004/07/25 16:16:55 rocky Exp $ + $Id: freebsd.h,v 1.19 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -161,7 +161,6 @@ void get_drive_cap_freebsd_cam (const _img_private_t *p_env, cdio_drive_misc_cap_t *p_misc_cap); char *get_mcn_freebsd_ioctl (const _img_private_t *p_env); -char *get_mcn_freebsd_cam (const _img_private_t *p_env); void free_freebsd_cam (void *obj); diff --git a/lib/FreeBSD/freebsd_cam.c b/lib/FreeBSD/freebsd_cam.c index 01b67e56..bce5f78c 100644 --- a/lib/FreeBSD/freebsd_cam.c +++ b/lib/FreeBSD/freebsd_cam.c @@ -1,5 +1,5 @@ /* - $Id: freebsd_cam.c,v 1.25 2004/07/28 01:09:59 rocky Exp $ + $Id: freebsd_cam.c,v 1.26 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.25 2004/07/28 01:09:59 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd_cam.c,v 1.26 2004/07/28 11:45:21 rocky Exp $"; #ifdef HAVE_FREEBSD_CDROM @@ -160,36 +160,6 @@ free_freebsd_cam (void *user_data) they are doing. *******/ #if 1 -/*! - Return the the kind of drive capabilities of device. - - Note: string is malloc'd so caller should free() then returned - string when done with it. - - */ -char * -get_mcn_freebsd_cam (const _img_private_t *p_env) -{ - scsi_mmc_cdb_t cdb = {{0, }}; - char buf[28] = { 0, }; - int i_status; - - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_SUBCHANNEL); - cdb.field[1] = 0x0; - cdb.field[2] = 0x40; - cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); - - i_status = scsi_mmc_run_cmd_freebsd_cam(p_env, DEFAULT_TIMEOUT_MSECS, - scsi_mmc_get_cmd_len(cdb.field[0]), - &cdb, SCSI_MMC_DATA_READ, - sizeof(buf), buf); - if(i_status == 0) { - return strdup(&buf[9]); - } - return NULL; -} - /*! Return the the kind of drive capabilities of device. @@ -322,20 +292,13 @@ read_mode2_sectors_freebsd_cam (_img_private_t *p_env, void *p_buf, bool b_read_10 = false; - CDIO_MMC_SET_COMMAND(p_env->ccb.csio.cdb_io.cdb_bytes, b_read_10 - ? CDIO_MMC_GPCMD_READ_10 : CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_LBA(cdb.field, lsn); - CDIO_MMC_SET_READ_LENGTH(cdb.field, nblocks); - if (!b_read_10) { - cdb.field[1] = 0; /* sector size mode2 */ - cdb.field[9] = 0x58; /* 2336 mode2 */ - } - if (b_read_10) { int retval; + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_10); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, nblocks); if ((retval = _set_bsize (p_env, M2RAW_SECTOR_SIZE))) return retval; @@ -353,6 +316,10 @@ read_mode2_sectors_freebsd_cam (_img_private_t *p_env, void *p_buf, if ((retval = _set_bsize (p_env, CDIO_CD_FRAMESIZE))) return retval; } else + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); + CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); + cdb.field[1] = 0; /* sector size mode2 */ + cdb.field[9] = 0x58; /* 2336 mode2 */ return scsi_mmc_run_cmd_freebsd_cam (p_env, 0, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, @@ -384,7 +351,7 @@ stat_size_freebsd_cam (_img_private_t *p_env) CDIO_MMC_SET_START_TRACK(cdb.field, CDIO_CDROM_LEADOUT_TRACK); - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(buf)); p_env->ccb.csio.data_ptr = buf; p_env->ccb.csio.dxfer_len = sizeof (buf); diff --git a/lib/FreeBSD/freebsd_ioctl.c b/lib/FreeBSD/freebsd_ioctl.c index 2353a267..a3010b8b 100644 --- a/lib/FreeBSD/freebsd_ioctl.c +++ b/lib/FreeBSD/freebsd_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: freebsd_ioctl.c,v 1.10 2004/07/17 15:31:00 rocky Exp $ + $Id: freebsd_ioctl.c,v 1.11 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.10 2004/07/17 15:31:00 rocky Exp $"; +static const char _rcsid[] = "$Id: freebsd_ioctl.c,v 1.11 2004/07/28 11:45:21 rocky Exp $"; #ifdef HAVE_FREEBSD_CDROM @@ -179,10 +179,10 @@ get_mcn_freebsd_ioctl (const _img_private_t *env) { struct ioc_read_subchannel subchannel; struct cd_sub_channel_info subchannel_info; - subchannel.address_format = CDIO_CDROM_LBA; + subchannel.address_format = CDIO_CDROM_MSF; subchannel.data_format = CDIO_SUBCHANNEL_MEDIA_CATALOG; subchannel.track = 0; - subchannel.data_len = 10; + subchannel.data_len = 28; subchannel.data = &subchannel_info; if(ioctl(env->gen.fd, CDIOCREADSUBCHANNEL, &subchannel) < 0) { diff --git a/lib/MSWindows/aspi32.c b/lib/MSWindows/aspi32.c index 8c8691d1..f97e8f7a 100644 --- a/lib/MSWindows/aspi32.c +++ b/lib/MSWindows/aspi32.c @@ -1,5 +1,5 @@ /* - $Id: aspi32.c,v 1.44 2004/07/28 03:17:56 rocky Exp $ + $Id: aspi32.c,v 1.45 2004/07/28 11:45:22 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: aspi32.c,v 1.44 2004/07/28 03:17:56 rocky Exp $"; +static const char _rcsid[] = "$Id: aspi32.c,v 1.45 2004/07/28 11:45:22 rocky Exp $"; #include #include @@ -567,10 +567,10 @@ read_sectors_aspi (const _img_private_t *env, void *data, lsn_t lsn, #endif /* Set up passthrough command */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_TYPE(cdb.field, sector_type); - CDIO_MMC_SET_READ_LBA(cdb.field, lsn); - CDIO_MMC_SET_READ_LENGTH(cdb.field, nblocks); + CDIO_MMC_SET_COMMAND (cdb.field, CDIO_MMC_GPCMD_READ_CD); + CDIO_MMC_SET_READ_TYPE (cdb.field, sector_type); + CDIO_MMC_SET_READ_LBA (cdb.field, lsn); + CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); #if 1 cdb.field[ 9 ] = (sync << 7) | @@ -666,7 +666,7 @@ read_toc_aspi (_img_private_t *p_env) /* Starting track */ CDIO_MMC_SET_START_TRACK(cdb.field, 0); - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(tocheader)); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(tocheader)); i_status = run_scsi_cmd_aspi (p_env, OP_TIMEOUT_MS, scsi_mmc_get_cmd_len(cdb.field[0]), @@ -692,7 +692,7 @@ read_toc_aspi (_img_private_t *p_env) return false; } - CDIO_MMC_SET_READ_LENGTH(cdb.field, i_toclength); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_toclength); i_status = run_scsi_cmd_aspi (p_env, OP_TIMEOUT_MS, scsi_mmc_get_cmd_len(cdb.field[0]), diff --git a/lib/MSWindows/win32_ioctl.c b/lib/MSWindows/win32_ioctl.c index a446fc77..ad4cd9d1 100644 --- a/lib/MSWindows/win32_ioctl.c +++ b/lib/MSWindows/win32_ioctl.c @@ -1,5 +1,5 @@ /* - $Id: win32_ioctl.c,v 1.30 2004/07/28 03:17:56 rocky Exp $ + $Id: win32_ioctl.c,v 1.31 2004/07/28 11:45:22 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -26,7 +26,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.30 2004/07/28 03:17:56 rocky Exp $"; +static const char _rcsid[] = "$Id: win32_ioctl.c,v 1.31 2004/07/28 11:45:22 rocky Exp $"; #include #include @@ -358,9 +358,9 @@ read_raw_sector (const _img_private_t *p_env, void *p_buf, lsn_t lsn) scsi_mmc_cdb_t cdb = {{0, }}; /* ReadCD CDB12 command. The values were taken from MMC1 draft paper. */ - CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_LBA(cdb.field, lsn); - CDIO_MMC_SET_READ_LENGTH(cdb.field, 1); + CDIO_MMC_SET_COMMAND (cdb.field, CDIO_MMC_GPCMD_READ_CD); + CDIO_MMC_SET_READ_LBA (cdb.field, lsn); + CDIO_MMC_SET_READ_LENGTH24(cdb.field, 1); cdb.field[9]=0xF8; /* Raw read, 2352 bytes per sector */ diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index f9c34a43..2ac1f017 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.84 2004/07/28 01:09:59 rocky Exp $ + $Id: _cdio_linux.c,v 1.85 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.84 2004/07/28 01:09:59 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.85 2004/07/28 11:45:21 rocky Exp $"; #include @@ -584,20 +584,14 @@ _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba, { scsi_mmc_cdb_t cdb = {{0, }}; - CDIO_MMC_SET_COMMAND(cdb.field, b_read_10 - ? CDIO_MMC_GPCMD_READ_10 : CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_LBA(cdb.field, lba); - CDIO_MMC_SET_READ_LENGTH(cdb.field, nblocks); - - if (!b_read_10) { - cdb.field[1] = 0; /* sector size mode2 */ - cdb.field[9] = 0x58; /* 2336 mode2 */ - } if (b_read_10) { int retval; + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_10); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, nblocks); + if ((retval = scsi_mmc_set_bsize (p_env->gen.cdio, M2RAW_SECTOR_SIZE))) return retval; @@ -615,6 +609,13 @@ _read_mode2_sectors_mmc (_img_private_t *p_env, void *p_buf, lba_t lba, if ((retval = scsi_mmc_set_bsize (p_env->gen.cdio, CDIO_CD_FRAMESIZE))) return retval; } else + + cdb.field[1] = 0; /* sector size mode2 */ + cdb.field[9] = 0x58; /* 2336 mode2 */ + + CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); + CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); + return run_scsi_cmd_linux (p_env, 0, scsi_mmc_get_cmd_len(cdb.field[0]), &cdb, SCSI_MMC_DATA_READ, diff --git a/lib/scsi_mmc.c b/lib/scsi_mmc.c index da06e1ff..0a150971 100644 --- a/lib/scsi_mmc.c +++ b/lib/scsi_mmc.c @@ -1,6 +1,6 @@ /* Common SCSI Multimedia Command (MMC) routines. - $Id: scsi_mmc.c,v 1.15 2004/07/28 01:09:59 rocky Exp $ + $Id: scsi_mmc.c,v 1.16 2004/07/28 11:45:21 rocky Exp $ Copyright (C) 2004 Rocky Bernstein @@ -171,9 +171,9 @@ scsi_mmc_read_sectors ( const CdIo *cdio, void *p_buf, lba_t lba, run_scsi_mmc_cmd = cdio->op.run_scsi_mmc_cmd; CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_READ_CD); - CDIO_MMC_SET_READ_TYPE (cdb.field, sector_type); - CDIO_MMC_SET_READ_LBA (cdb.field, lba); - CDIO_MMC_SET_READ_LENGTH(cdb.field, nblocks); + CDIO_MMC_SET_READ_TYPE (cdb.field, sector_type); + CDIO_MMC_SET_READ_LBA (cdb.field, lba); + CDIO_MMC_SET_READ_LENGTH24(cdb.field, nblocks); CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cdb.field, CDIO_MMC_MCSB_ALL_HEADERS); @@ -419,7 +419,7 @@ scsi_mmc_get_mcn_private ( void *p_env, cdb.field[1] = 0x0; cdb.field[2] = 0x40; cdb.field[3] = CDIO_SUBCHANNEL_MEDIA_CATALOG; - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(buf)); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(buf)); i_status = run_scsi_mmc_cmd(p_env, DEFAULT_TIMEOUT_MS, scsi_mmc_get_cmd_len(cdb.field[0]), @@ -473,7 +473,7 @@ scsi_mmc_init_cdtext_private ( void *p_user_data, /* Format */ cdb.field[2] = CDIO_MMC_READTOC_FMT_CDTEXT; - CDIO_MMC_SET_READ_LENGTH(cdb.field, sizeof(wdata)); + CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(wdata)); errno = 0; i_status = run_scsi_mmc_cmd (p_env, DEFAULT_TIMEOUT_MS,