From owner-svn-src-head@FreeBSD.ORG Thu Dec 22 16:40:36 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 304EB1065670; Thu, 22 Dec 2011 16:40:36 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 04F518FC0C; Thu, 22 Dec 2011 16:40:36 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id pBMGeZ3i025240; Thu, 22 Dec 2011 16:40:35 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id pBMGeZod025237; Thu, 22 Dec 2011 16:40:35 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201112221640.pBMGeZod025237@svn.freebsd.org> From: Alexander Motin Date: Thu, 22 Dec 2011 16:40:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r228808 - head/sys/cam/scsi X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Dec 2011 16:40:36 -0000 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: /*