mmc_discinfo
sz_guess = mmc_discinfo.sector_size; /* assume media is bigger */
if (mmc_discinfo.sector_size != (unsigned int) sz_guess) {
for (int i = 1; i <= mmc_discinfo.num_tracks; i++) {
for (int i = mmc_discinfo.num_tracks; i > 0; i--) {
layout.last_lba = mmc_discinfo.last_possible_lba;
ti_s = calloc(mmc_discinfo.num_tracks, sizeof(struct mmc_trackinfo));
for (tracknr = 1; tracknr <= mmc_discinfo.num_tracks; tracknr++) {
num_tracks = mmc_discinfo.num_tracks;
if (mmc_discinfo.disc_state == MMC_STATE_FULL)
ti.tracknr = mmc_discinfo.last_track_last_session;
context.last_ti.tracknr = mmc_discinfo.first_track_last_session;
assert(mmc_discinfo.last_session_state == MMC_STATE_EMPTY);
ti.tracknr = mmc_discinfo.first_track;
if (mmc_discinfo.mmc_cur & MMC_CAP_SEQUENTIAL)
((mmc_discinfo.disc_state == MMC_STATE_CLOSED) ||
(mmc_discinfo.disc_state == MMC_STATE_FULL))) {
target_session += mmc_discinfo.num_sessions;
target_session = mmc_discinfo.num_sessions;
if (mmc_discinfo.last_session_state == MMC_STATE_EMPTY)
op.mmc_profile = mmc_discinfo.mmc_profile;
udf_dump_discinfo(&mmc_discinfo);
ti.tracknr = mmc_discinfo.last_track_last_session;
if (mmc_discinfo.mmc_class == MMC_CLASS_DISC)
udf_dump_discinfo(struct mmc_discinfo *di)
memset(&mmc_discinfo, 0, sizeof(struct mmc_discinfo));
error = ioctl(dev_fd, MMCGETDISCINFO, &mmc_discinfo);
(emul_mmc_profile != mmc_discinfo.mmc_profile)) {
mmc_discinfo.mmc_profile = emul_mmc_profile;
mmc_discinfo.disc_state = MMC_STATE_CLOSED;
mmc_discinfo.last_session_state = MMC_STATE_CLOSED;
mmc_discinfo.bg_format_state = MMC_BGFSTATE_COMPLETED;
mmc_discinfo.link_block_penalty = 0;
mmc_discinfo.disc_flags = MMC_DFLAGS_UNRESTRICTED;
mmc_discinfo.last_possible_lba = last_sector;
mmc_discinfo.sector_size = secsize;
mmc_discinfo.num_sessions = 1;
mmc_discinfo.num_tracks = 1;
mmc_discinfo.first_track = 1;
mmc_discinfo.first_track_last_session = mmc_discinfo.last_track_last_session = 1;
mmc_discinfo.mmc_cur = MMC_CAP_RECORDABLE | MMC_CAP_ZEROLINKBLK;
mmc_discinfo.mmc_class = MMC_CLASS_DISC;
mmc_discinfo.mmc_cur |= MMC_CAP_REWRITABLE | MMC_CAP_HW_DEFECTFREE;
mmc_discinfo.mmc_class = MMC_CLASS_CD;
mmc_discinfo.mmc_cur |= MMC_CAP_SEQUENTIAL;
mmc_discinfo.disc_state = MMC_STATE_EMPTY;
mmc_discinfo.mmc_class = MMC_CLASS_CD;
mmc_discinfo.mmc_cur |= MMC_CAP_REWRITABLE;
mmc_discinfo.mmc_class = MMC_CLASS_DVD;
mmc_discinfo.mmc_cur |= MMC_CAP_REWRITABLE;
mmc_discinfo.mmc_class = MMC_CLASS_DVD;
mmc_discinfo.mmc_cur |= MMC_CAP_SEQUENTIAL;
mmc_discinfo.disc_state = MMC_STATE_EMPTY;
mmc_discinfo.mmc_class = MMC_CLASS_BD;
mmc_discinfo.mmc_cur |= MMC_CAP_SEQUENTIAL | MMC_CAP_HW_DEFECTFREE;
mmc_discinfo.disc_state = MMC_STATE_EMPTY;
mmc_discinfo.mmc_class = MMC_CLASS_BD;
mmc_discinfo.mmc_cur |= MMC_CAP_REWRITABLE | MMC_CAP_HW_DEFECTFREE;
mmc_discinfo.mmc_cap = mmc_discinfo.mmc_cur;
class = mmc_discinfo.mmc_class;
ti->track_size = mmc_discinfo.last_possible_lba;
ti->next_writable = mmc_discinfo.last_possible_lba + 1; //0;
if (mmc_discinfo.sector_size > context.sector_size)
context.sector_size = mmc_discinfo.sector_size;
if (mmc_discinfo.mmc_cur & MMC_CAP_SEQUENTIAL)
if (mmc_discinfo.mmc_class == MMC_CLASS_DISC)
mmc_writeparams.mmc_class = mmc_discinfo.mmc_class;
mmc_writeparams.mmc_cur = mmc_discinfo.mmc_cur;
if ((mmc_discinfo.mmc_cur & MMC_CAP_SEQUENTIAL) == 0)
if (mmc_discinfo.last_session_state == MMC_STATE_INCOMPLETE) {
tracknr = mmc_discinfo.first_track_last_session;
while (tracknr <= mmc_discinfo.last_track_last_session) {
op.mmc_profile = mmc_discinfo.mmc_profile;
op.mmc_profile = mmc_discinfo.mmc_profile;
op.sessionnr = mmc_discinfo.num_sessions;
tracknr = mmc_discinfo.first_track_last_session;
while (tracknr <= mmc_discinfo.last_track_last_session) {
op.mmc_profile = mmc_discinfo.mmc_profile;
wsects = (mmc_discinfo.last_possible_lba + 1 - packet->start_sectornr);
if ((mmc_discinfo.mmc_cur & MMC_CAP_RECORDABLE) == 0) {
if (mmc_discinfo.mmc_cur & MMC_CAP_SEQUENTIAL) {
if (mmc_discinfo.disc_state == MMC_STATE_CLOSED) {
if ((mmc_discinfo.disc_state != MMC_STATE_EMPTY) &&
if (mmc_discinfo.disc_state == MMC_STATE_EMPTY) {
if (mmc_discinfo.mmc_cur & MMC_CAP_REWRITABLE) {
if ((mmc_discinfo.mmc_cur & MMC_CAP_HW_DEFECTFREE) == 0) {
if (mmc_discinfo.mmc_cur & MMC_CAP_SEQUENTIAL) {
if (mmc_discinfo.mmc_cur & MMC_CAP_PSEUDOOVERWRITE) {
if (mmc_discinfo.mmc_cur & MMC_CAP_REWRITABLE) {
if (mmc_discinfo.mmc_cur & MMC_CAP_ERASABLE)
if (mmc_discinfo.mmc_cur & MMC_CAP_PSEUDOOVERWRITE)
if (mmc_discinfo.disc_flags & MMC_DFLAGS_DISCIDVALID) {
primary_nr = mmc_discinfo.disc_id;
if (mmc_discinfo.disc_flags & MMC_DFLAGS_BARCODEVALID) {
volset_nr = mmc_discinfo.disc_barcode;
switch (mmc_discinfo.mmc_profile) {
if (mmc_discinfo.mmc_class == MMC_CLASS_CD) {
ti.tracknr = mmc_discinfo.first_track_last_session;
ti.tracknr = mmc_discinfo.first_track_last_session;
if (mmc_discinfo.sector_size > context.sector_size) {
context.sector_size, mmc_discinfo.sector_size);
"type %d", mmc_discinfo.mmc_profile);
if (mmc_discinfo.mmc_cur & MMC_CAP_SEQUENTIAL)
ti.track_start, mmc_discinfo.last_possible_lba,
struct mmc_discinfo mmc_discinfo; /* device: disc info */
extern struct mmc_discinfo mmc_discinfo; /* device: disc info */
extern void udf_dump_discinfo(struct mmc_discinfo *di);
return mmc_getdiscinfo(periph, (struct mmc_discinfo *) addr);
static int mmc_getdiscinfo(struct scsipi_periph *, struct mmc_discinfo *);
mmc_process_feature(struct mmc_discinfo *mmc_discinfo,
flags = mmc_discinfo->mmc_cur;
flags = mmc_discinfo->mmc_cap;
mmc_discinfo->link_block_penalty = rpos[4];
mmc_discinfo->mmc_cur = flags;
mmc_discinfo->mmc_cap = flags;
struct mmc_discinfo *mmc_discinfo)
mmc_discinfo->disc_state = MMC_STATE_FULL;
mmc_discinfo->last_session_state = MMC_STATE_FULL;
mmc_discinfo->bg_format_state = MMC_BGFSTATE_COMPLETED;
mmc_discinfo->link_block_penalty = 7; /* not relevant */
mmc_discinfo->num_sessions = toc_hdr->last - toc_hdr->first + 1;
mmc_discinfo->first_track = toc_hdr->first;
mmc_discinfo->first_track_last_session = toc_msinfo->tracknr;
mmc_discinfo->last_track_last_session = toc_hdr->last;
mmc_discinfo->num_tracks = toc_hdr->last - toc_hdr->first + 1;
struct mmc_discinfo *mmc_discinfo)
mmc_discinfo->disc_state = MMC_STATE_FULL;
mmc_discinfo->last_session_state = MMC_STATE_FULL;
mmc_discinfo->bg_format_state = MMC_BGFSTATE_COMPLETED;
mmc_discinfo->link_block_penalty = 16; /* not relevant */
mmc_discinfo->num_sessions = toc_hdr.last - toc_hdr.first + 1;
mmc_discinfo->num_tracks = mmc_discinfo->num_sessions;
mmc_discinfo->first_track = toc_hdr.first;
mmc_discinfo->first_track_last_session = toc_hdr.last;
mmc_discinfo->last_track_last_session = toc_hdr.last;
struct mmc_discinfo *mmc_discinfo)
memset(mmc_discinfo, 0, sizeof(struct mmc_discinfo));
mmc_discinfo->mmc_profile = 0x00; /* unknown */
mmc_discinfo->mmc_class = MMC_CLASS_UNKN;
mmc_discinfo->mmc_cur = 0;
mmc_discinfo->mmc_cap = 0;
mmc_discinfo->link_block_penalty = 0;
mmc_discinfo->mmc_profile = _2btol(gc->mmc_profile);
mmc_discinfo->mmc_class = mmc_profile2class(mmc_discinfo->mmc_profile);
mmc_discinfo->sector_size = 2048;
error = read_cd_capacity(periph, &mmc_discinfo->sector_size, &last_lba);
mmc_discinfo->last_possible_lba = (uint32_t) last_lba;
mmc_process_feature(mmc_discinfo,
if (mmc_discinfo->mmc_profile == 0x0a) {
if ((mmc_discinfo->mmc_cur & MMC_CAP_SEQUENTIAL) == 0)
mmc_discinfo->mmc_cur |= MMC_CAP_STRICTOVERWRITE;
if (mmc_discinfo->mmc_cur & MMC_CAP_STRICTOVERWRITE)
mmc_discinfo->mmc_cur &= ~MMC_CAP_SEQUENTIAL;
if (mmc_discinfo->mmc_cur & MMC_CAP_MRW) {
mmc_discinfo->mmc_cur &= ~MMC_CAP_SEQUENTIAL;
mmc_discinfo->mmc_cur &= ~MMC_CAP_STRICTOVERWRITE;
mmc_discinfo->mmc_cur &= ~MMC_CAP_HW_DEFECTFREE;
if (mmc_discinfo->mmc_profile == 0x09) {
mmc_discinfo->mmc_cur &= ~MMC_CAP_REWRITABLE;
mmc_discinfo->mmc_profile,
mmc_discinfo->mmc_cur, mmc_discinfo->mmc_cap);
if (mmc_discinfo->mmc_profile == 0x08) /* CD-ROM */
error = mmc_getdiscinfo_cdrom(periph, mmc_discinfo);
else if (mmc_discinfo->mmc_profile == 0x10) /* DVD-ROM */
error = mmc_getdiscinfo_dvdrom(periph, mmc_discinfo);
mmc_discinfo->disc_state = di.disc_state & 3;
mmc_discinfo->last_session_state = (di.disc_state >> 2) & 3;
mmc_discinfo->bg_format_state = (di.disc_state2 & 3);
mmc_discinfo->num_sessions = lsb | (msb << 8);
mmc_discinfo->first_track = di.first_track;
mmc_discinfo->first_track_last_session = lsb | (msb << 8);
mmc_discinfo->last_track_last_session = lsb | (msb << 8);
mmc_discinfo->num_tracks = mmc_discinfo->last_track_last_session -
mmc_discinfo->first_track + 1;
mmc_discinfo->mmc_cur |= MMC_CAP_BLANKABLE;
mmc_discinfo->disc_id = _4btol(di.discid);
mmc_discinfo->disc_flags |= MMC_DFLAGS_DISCIDVALID;
mmc_discinfo->disc_barcode = _8btol(di.disc_bar_code);
mmc_discinfo->disc_flags |= MMC_DFLAGS_BARCODEVALID;
mmc_discinfo->disc_flags |= MMC_DFLAGS_UNRESTRICTED;
mmc_discinfo->application_code = di.application_code;
mmc_discinfo->disc_flags |= MMC_DFLAGS_APPCODEVALID;
struct mmc_discinfo discinfo;
struct mmc_discinfo *di = &ump->discinfo;
struct mmc_discinfo *di;
memset(di, 0, sizeof(struct mmc_discinfo));
struct mmc_discinfo *di = &ump->discinfo;
struct mmc_discinfo di;
#define MMCGETDISCINFO _IOR('c', 28, struct mmc_discinfo)
ti.tracknr = mmc_discinfo.first_track_last_session;
udf_dump_discinfo(&mmc_discinfo);
#define MMCGETDISCINFO _IOR('c', 28, struct mmc_discinfo)