Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Dec 2011 16:40:35 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r228808 - head/sys/cam/scsi
Message-ID:  <201112221640.pBMGeZod025237@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Dec 22 16:40:35 2011
New Revision: 228808
URL: http://svn.freebsd.org/changeset/base/228808

Log:
  Make cd driver to handle Audio CDs, reporting their 2352 bytes sectors to
  GEOM and using READ CD command for reading data, same as acd driver does.
  Audio CDs identified by checking respective bit of the control field of
  the first track in TOC.
  
  This fixes bunch of error messages during boot (GEOM taste) with Audio CD
  inserted and allows to grab Audio CD image using just dd.
  
  MFC after:	1 month

Modified:
  head/sys/cam/scsi/scsi_all.h
  head/sys/cam/scsi/scsi_cd.c

Modified: head/sys/cam/scsi/scsi_all.h
==============================================================================
--- head/sys/cam/scsi/scsi_all.h	Thu Dec 22 16:36:08 2011	(r228807)
+++ head/sys/cam/scsi/scsi_all.h	Thu Dec 22 16:40:35 2011	(r228808)
@@ -932,6 +932,7 @@ struct ata_pass_16 {
 #define	WRITE_12		0xAA
 #define	WRITE_VERIFY_12		0xAE
 #define	READ_ELEMENT_STATUS	0xB8
+#define	READ_CD			0xBE
 
 /* Maintenance In Service Action Codes */
 #define	REPORT_IDENTIFYING_INFRMATION		0x05

Modified: head/sys/cam/scsi/scsi_cd.c
==============================================================================
--- head/sys/cam/scsi/scsi_cd.c	Thu Dec 22 16:36:08 2011	(r228807)
+++ head/sys/cam/scsi/scsi_cd.c	Thu Dec 22 16:40:35 2011	(r228808)
@@ -1483,6 +1483,11 @@ cdstart(struct cam_periph *periph, union
 					/* dxfer_len */ bp->bio_bcount,
 					/* sense_len */ SSD_FULL_SIZE,
 					/* timeout */ 30000);
+			/* Use READ CD command for audio tracks. */
+			if (softc->params.blksize == 2352) {
+				start_ccb->csio.cdb_io.cdb_bytes[0] = READ_CD;
+				start_ccb->csio.cdb_io.cdb_bytes[9] = 0xf8;
+			}
 			start_ccb->ccb_h.ccb_state = CD_CCB_BUFFER_IO;
 
 			
@@ -2880,6 +2885,13 @@ cdcheckmedia(struct cam_periph *periph)
 
 	softc->flags |= CD_FLAG_VALID_TOC;
 
+	/* If the first track is audio, correct sector size. */
+	if ((softc->toc.entries[0].control & 4) == 0) {
+		softc->disk->d_sectorsize = softc->params.blksize = 2352;
+		softc->disk->d_mediasize =
+		    (off_t)softc->params.blksize * softc->params.disksize;
+	}
+
 bailout:
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112221640.pBMGeZod025237>