Module Name:    src
Committed By:   reinoud
Date:           Wed Apr  1 12:19:04 UTC 2009

Modified Files:
        src/sys/dev/scsipi: cd.c scsipi_cd.h

Log Message:
Implement MMC_TRACKINFO_DATA and MMC_TRACKINFO_AUDIO detection for cdrom and
dvdrom devices. These two compatibility codes were forgotten when those were
introduced.


To generate a diff of this commit:
cvs rdiff -u -r1.290 -r1.291 src/sys/dev/scsipi/cd.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/scsipi/scsipi_cd.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/scsipi/cd.c
diff -u src/sys/dev/scsipi/cd.c:1.290 src/sys/dev/scsipi/cd.c:1.291
--- src/sys/dev/scsipi/cd.c:1.290	Wed Mar 18 16:00:20 2009
+++ src/sys/dev/scsipi/cd.c	Wed Apr  1 12:19:04 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: cd.c,v 1.290 2009/03/18 16:00:20 cegger Exp $	*/
+/*	$NetBSD: cd.c,v 1.291 2009/04/01 12:19:04 reinoud Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001, 2003, 2004, 2005, 2008 The NetBSD Foundation,
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cd.c,v 1.290 2009/03/18 16:00:20 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cd.c,v 1.291 2009/04/01 12:19:04 reinoud Exp $");
 
 #include "rnd.h"
 
@@ -3181,7 +3181,7 @@
 	const uint32_t buffer_size = 4 * 1024;	/* worst case TOC estimate */
 	uint8_t *buffer;
 	uint8_t track_sessionnr, last_tracknr, sessionnr, adr, tno, point;
-	uint8_t tmin, tsec, tframe, pmin, psec, pframe;
+	uint8_t control, tmin, tsec, tframe, pmin, psec, pframe;
 	int size, req_size;
 	int error, flags;
 
@@ -3225,6 +3225,7 @@
 
 	/* read in complete raw toc */
 	req_size = _2btol(toc_hdr->length);
+	req_size = 2*((req_size + 1) / 2);	/* for ATAPI */
 	_lto2b(req_size, gtoc_cmd.data_len);
 
 	error = scsipi_command(periph,
@@ -3255,6 +3256,7 @@
 		tno       = rawtoc->tno;
 		sessionnr = rawtoc->sessionnr;
 		adr       = rawtoc->adrcontrol >> 4;
+		control   = rawtoc->adrcontrol & 0xf;
 		point     = rawtoc->point;
 		tmin      = rawtoc->min;
 		tsec      = rawtoc->sec;
@@ -3292,6 +3294,14 @@
 			}
 		}
 
+		if ((control & (3<<2)) == 4)		/* 01xxb */
+			flags |= MMC_TRACKINFO_DATA;
+		if ((control & (1<<2)) == 0) {		/* x0xxb */
+			flags |= MMC_TRACKINFO_AUDIO;
+			if (control & 1)		/* xxx1b */
+				flags |= MMC_TRACKINFO_PRE_EMPH;
+		}
+
 		rawtoc++;
 		size -= sizeof(struct scsipi_toc_rawtoc);
 	}
@@ -3351,7 +3361,7 @@
 	uint32_t lba, lead_out;
 	const uint32_t buffer_size = 4 * 1024;	/* worst case TOC estimate */
 	uint8_t *buffer;
-	uint8_t last_tracknr;
+	uint8_t control, last_tracknr;
 	int size, req_size;
 	int error, flags;
 
@@ -3417,12 +3427,15 @@
 	track_start  = 0;
 	track_size   = 0;
 	lead_out     = 0;
+	flags        = 0;
 
 	size = req_size - sizeof(struct scsipi_toc_header) + 1;
 	while (size > 0) {
 		/* remember, DVD-ROM: tracknr == sessionnr */
 		lba     = _4btol(toc->msf_lba);
 		tracknr = toc->tracknr;
+		control = toc->adrcontrol & 0xf;
+
 		if (trackinfo->tracknr == tracknr) {
 			track_start = lba;
 		}
@@ -3433,6 +3446,17 @@
 		if (tracknr == 0xAA) {
 			lead_out = lba;
 		}
+
+		if ((control & (3<<2)) == 4)		/* 01xxb */
+			flags |= MMC_TRACKINFO_DATA;
+		if ((control & (1<<2)) == 0) {		/* x0xxb */
+			flags |= MMC_TRACKINFO_AUDIO;
+			if (control & (1<<3))		/* 10xxb */
+				flags |= MMC_TRACKINFO_AUDIO_4CHAN;
+			if (control & 1)		/* xxx1b */
+				flags |= MMC_TRACKINFO_PRE_EMPH;
+		}
+
 		toc++;
 		size -= sizeof(struct scsipi_toc_formatted);
 	}
@@ -3446,7 +3470,7 @@
 	trackinfo->track_mode = 0;	/* unknown */
 	trackinfo->data_mode  = 8;	/* 2048 bytes mode1   */
 
-	trackinfo->flags         = 0;
+	trackinfo->flags         = flags;
 	trackinfo->track_start   = track_start;
 	trackinfo->next_writable = 0;
 	trackinfo->free_blocks   = 0;

Index: src/sys/dev/scsipi/scsipi_cd.h
diff -u src/sys/dev/scsipi/scsipi_cd.h:1.20 src/sys/dev/scsipi/scsipi_cd.h:1.21
--- src/sys/dev/scsipi/scsipi_cd.h:1.20	Mon Sep  8 23:36:54 2008
+++ src/sys/dev/scsipi/scsipi_cd.h	Wed Apr  1 12:19:04 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: scsipi_cd.h,v 1.20 2008/09/08 23:36:54 gmcgarry Exp $	*/
+/*	$NetBSD: scsipi_cd.h,v 1.21 2009/04/01 12:19:04 reinoud Exp $	*/
 
 /*
  * Written by Julian Elischer ([email protected])
@@ -115,7 +115,7 @@
 /* read TOC form 0 result entries */
 struct scsipi_toc_formatted {
 	uint8_t  unused1;
-	uint8_t  adrcontol;
+	uint8_t  adrcontrol;
 	uint8_t  tracknr;
 	uint8_t  unused2;
 	uint8_t	 msf_lba[4];		/* union msf_lba from cdio.h */

Reply via email to