17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
5*aefd6f19Szk * Common Development and Distribution License (the "License").
6*aefd6f19Szk * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
217c478bd9Sstevel@tonic-gate /*
22*aefd6f19Szk * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
237c478bd9Sstevel@tonic-gate * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate */
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI"
277c478bd9Sstevel@tonic-gate
287c478bd9Sstevel@tonic-gate #include <sys/types.h>
297c478bd9Sstevel@tonic-gate #include <stdlib.h>
307c478bd9Sstevel@tonic-gate #include <libintl.h>
317c478bd9Sstevel@tonic-gate
327c478bd9Sstevel@tonic-gate #include "msgs.h"
337c478bd9Sstevel@tonic-gate #include "mmc.h"
347c478bd9Sstevel@tonic-gate #include "misc_scsi.h"
357c478bd9Sstevel@tonic-gate #include "device.h"
367c478bd9Sstevel@tonic-gate #include "main.h"
377c478bd9Sstevel@tonic-gate #include "util.h"
387c478bd9Sstevel@tonic-gate #include "toshiba.h"
397c478bd9Sstevel@tonic-gate
407c478bd9Sstevel@tonic-gate void
info(void)417c478bd9Sstevel@tonic-gate info(void)
427c478bd9Sstevel@tonic-gate {
43*aefd6f19Szk uchar_t *toc, *p, *conf;
447c478bd9Sstevel@tonic-gate int ret, toc_size;
45*aefd6f19Szk uint_t bsize;
46*aefd6f19Szk size_t cap = 0;
477c478bd9Sstevel@tonic-gate char *msg;
487c478bd9Sstevel@tonic-gate struct track_info *ti;
497c478bd9Sstevel@tonic-gate
507c478bd9Sstevel@tonic-gate msg = gettext("Cannot read Table of contents\n");
517c478bd9Sstevel@tonic-gate
527c478bd9Sstevel@tonic-gate get_media_type(target->d_fd);
537c478bd9Sstevel@tonic-gate
547c478bd9Sstevel@tonic-gate (void) printf(gettext("\nDevice : %.8s %.16s\n"),
557c478bd9Sstevel@tonic-gate &target->d_inq[8], &target->d_inq[16]);
567c478bd9Sstevel@tonic-gate (void) printf(gettext("Firmware : Rev. %.4s (%.12s)\n"),
577c478bd9Sstevel@tonic-gate &target->d_inq[32], &target->d_inq[36]);
587c478bd9Sstevel@tonic-gate
597c478bd9Sstevel@tonic-gate if (check_device(target, CHECK_DEVICE_NOT_READY)) {
607c478bd9Sstevel@tonic-gate (void) check_device(target, CHECK_NO_MEDIA |
617c478bd9Sstevel@tonic-gate EXIT_IF_CHECK_FAILED);
627c478bd9Sstevel@tonic-gate (void) check_device(target, CHECK_DEVICE_NOT_READY |
637c478bd9Sstevel@tonic-gate EXIT_IF_CHECK_FAILED);
647c478bd9Sstevel@tonic-gate }
65*aefd6f19Szk
66*aefd6f19Szk if (verbose != 0) {
67*aefd6f19Szk /*
68*aefd6f19Szk * Determine the media type by reading the active profile
69*aefd6f19Szk * from the profile list.
70*aefd6f19Szk */
71*aefd6f19Szk (void) printf(gettext("Media Type : "));
72*aefd6f19Szk
73*aefd6f19Szk conf = (uchar_t *)my_zalloc(MMC_FTR_HDR_LEN);
74*aefd6f19Szk
75*aefd6f19Szk if (get_configuration(target->d_fd, MMC_FTR_PRFL_LIST,
76*aefd6f19Szk MMC_FTR_HDR_LEN, conf))
77*aefd6f19Szk print_profile_name(read_scsi16(&conf[6]), 0, 1);
78*aefd6f19Szk else
79*aefd6f19Szk (void) printf(gettext("UNKNOWN\n"));
80*aefd6f19Szk
81*aefd6f19Szk free(conf);
82*aefd6f19Szk
83*aefd6f19Szk /*
84*aefd6f19Szk * Get the start address of the last possible lead out.
85*aefd6f19Szk */
86*aefd6f19Szk cap = get_last_possible_lba(target);
87*aefd6f19Szk
88*aefd6f19Szk /*
89*aefd6f19Szk * The start address of the last possible leadout will only
90*aefd6f19Szk * be zero if the disc is full or this drive does not support
91*aefd6f19Szk * this method of determining capacity.
92*aefd6f19Szk */
93*aefd6f19Szk if (cap == 0)
94*aefd6f19Szk cap = read_format_capacity(target->d_fd, &bsize);
95*aefd6f19Szk
96*aefd6f19Szk /*
97*aefd6f19Szk * Since both methods of determining the capacity of the
98*aefd6f19Szk * media count the correct number of blocks, just multiply
99*aefd6f19Szk * the capacity by the block size.
100*aefd6f19Szk */
101*aefd6f19Szk cap *= target->d_blksize;
102*aefd6f19Szk
103*aefd6f19Szk if (device_type == CD_RW) {
104*aefd6f19Szk (void) printf(gettext("Media Capacity : %.2f MB "),
105*aefd6f19Szk ((double)cap/ONE_MB_BASE2));
106*aefd6f19Szk } else {
107*aefd6f19Szk /*
108*aefd6f19Szk * For DVD's make sure we print out "Formatted Media
109*aefd6f19Szk * Capacity". Don't do this for CD-RWs as only
110*aefd6f19Szk * DVDs are formatted.
111*aefd6f19Szk */
112*aefd6f19Szk (void) printf(gettext("Formatted Media Capacity : "
113*aefd6f19Szk "%.2f GB "), ((double)cap/ONE_GB_BASE10));
114*aefd6f19Szk }
115*aefd6f19Szk
116*aefd6f19Szk cap /= target->d_blksize;
117*aefd6f19Szk (void) printf(gettext("(%u blocks)\n"), (uint_t)cap);
118*aefd6f19Szk }
119*aefd6f19Szk
1207c478bd9Sstevel@tonic-gate if (!check_device(target, CHECK_MEDIA_IS_NOT_BLANK)) {
1217c478bd9Sstevel@tonic-gate (void) printf(gettext("Media is blank\n"));
1227c478bd9Sstevel@tonic-gate exit(0);
1237c478bd9Sstevel@tonic-gate }
1247c478bd9Sstevel@tonic-gate
1257c478bd9Sstevel@tonic-gate /* Find out the number of entries in the toc */
1267c478bd9Sstevel@tonic-gate toc = (uchar_t *)my_zalloc(12);
1277c478bd9Sstevel@tonic-gate if (!read_toc(target->d_fd, 0, 1, 4, toc)) {
1287c478bd9Sstevel@tonic-gate err_msg(msg);
1297c478bd9Sstevel@tonic-gate } else {
1307c478bd9Sstevel@tonic-gate toc_size = 256*toc[0] + toc[1] + 2;
1317c478bd9Sstevel@tonic-gate free(toc);
1327c478bd9Sstevel@tonic-gate
1337c478bd9Sstevel@tonic-gate /* allocate enough space for each track entry */
1347c478bd9Sstevel@tonic-gate toc = (uchar_t *)my_zalloc(toc_size);
1357c478bd9Sstevel@tonic-gate
1367c478bd9Sstevel@tonic-gate if (!read_toc(target->d_fd, 0, 1, toc_size, toc)) {
1377c478bd9Sstevel@tonic-gate err_msg(msg);
1387c478bd9Sstevel@tonic-gate exit(1);
1397c478bd9Sstevel@tonic-gate }
1407c478bd9Sstevel@tonic-gate (void) printf("\n");
1417c478bd9Sstevel@tonic-gate
1427c478bd9Sstevel@tonic-gate /* l10n_NOTE : Preserve column numbers of '|' character */
1437c478bd9Sstevel@tonic-gate (void) printf(gettext("Track No. |Type |Start address\n"));
1447c478bd9Sstevel@tonic-gate (void) printf("----------+--------+-------------\n");
1457c478bd9Sstevel@tonic-gate
1467c478bd9Sstevel@tonic-gate
1477c478bd9Sstevel@tonic-gate /* look at each track and display it's type. */
1487c478bd9Sstevel@tonic-gate
1497c478bd9Sstevel@tonic-gate for (p = &toc[4]; p < (toc + toc_size); p += 8) {
1507c478bd9Sstevel@tonic-gate if (p[2] != 0xAA)
1517c478bd9Sstevel@tonic-gate (void) printf(" %-3d |", p[2]);
1527c478bd9Sstevel@tonic-gate else
1537c478bd9Sstevel@tonic-gate (void) printf("Leadout |");
1547c478bd9Sstevel@tonic-gate (void) printf("%s |", (p[1] & 4) ? gettext("Data ") :
1557c478bd9Sstevel@tonic-gate gettext("Audio"));
1567c478bd9Sstevel@tonic-gate (void) printf("%u\n", read_scsi32(&p[4]));
1577c478bd9Sstevel@tonic-gate }
1587c478bd9Sstevel@tonic-gate }
1597c478bd9Sstevel@tonic-gate (void) printf("\n");
1607c478bd9Sstevel@tonic-gate ret = read_toc(target->d_fd, 1, 0, 12, toc);
1617c478bd9Sstevel@tonic-gate if ((ret == 0) || (toc[1] != 0x0a))
1627c478bd9Sstevel@tonic-gate /* For ATAPI drives or old Toshiba drives */
1637c478bd9Sstevel@tonic-gate ret = read_toc_as_per_8020(target->d_fd, 1, 0, 12, toc);
1647c478bd9Sstevel@tonic-gate
1657c478bd9Sstevel@tonic-gate if (ret && (toc[1] == 0x0a)) {
1667c478bd9Sstevel@tonic-gate (void) printf(gettext("Last session start address: %u\n"),
1677c478bd9Sstevel@tonic-gate read_scsi32(&toc[8]));
1687c478bd9Sstevel@tonic-gate }
1697c478bd9Sstevel@tonic-gate free(toc);
1707c478bd9Sstevel@tonic-gate ti = (struct track_info *)my_zalloc(sizeof (struct track_info));
1717c478bd9Sstevel@tonic-gate
1727c478bd9Sstevel@tonic-gate if (build_track_info(target, -1, ti) && (ti->ti_flags & TI_NWA_VALID)) {
1737c478bd9Sstevel@tonic-gate (void) printf(gettext("Next writable address: %u\n"),
1747c478bd9Sstevel@tonic-gate ti->ti_nwa);
1757c478bd9Sstevel@tonic-gate }
1767c478bd9Sstevel@tonic-gate free(ti);
1777c478bd9Sstevel@tonic-gate exit(0);
1787c478bd9Sstevel@tonic-gate }
179