xref: /linux/drivers/scsi/sr_vendor.c (revision d94d94969a4ba07a43d62429c60372320519c391)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /* -*-linux-c-*-
31da177e4SLinus Torvalds 
41da177e4SLinus Torvalds  * vendor-specific code for SCSI CD-ROM's goes here.
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * This is needed becauce most of the new features (multisession and
71da177e4SLinus Torvalds  * the like) are too new to be included into the SCSI-II standard (to
81da177e4SLinus Torvalds  * be exact: there is'nt anything in my draft copy).
91da177e4SLinus Torvalds  *
101da177e4SLinus Torvalds  * Aug 1997: Ha! Got a SCSI-3 cdrom spec across my fingers. SCSI-3 does
111da177e4SLinus Torvalds  *           multisession using the READ TOC command (like SONY).
121da177e4SLinus Torvalds  *
131da177e4SLinus Torvalds  *           Rearranged stuff here: SCSI-3 is included allways, support
141da177e4SLinus Torvalds  *           for NEC/TOSHIBA/HP commands is optional.
151da177e4SLinus Torvalds  *
161da177e4SLinus Torvalds  *   Gerd Knorr <kraxel@cs.tu-berlin.de>
171da177e4SLinus Torvalds  *
181da177e4SLinus Torvalds  * --------------------------------------------------------------------------
191da177e4SLinus Torvalds  *
201da177e4SLinus Torvalds  * support for XA/multisession-CD's
211da177e4SLinus Torvalds  *
221da177e4SLinus Torvalds  *   - NEC:     Detection and support of multisession CD's.
231da177e4SLinus Torvalds  *
241da177e4SLinus Torvalds  *   - TOSHIBA: Detection and support of multisession CD's.
251da177e4SLinus Torvalds  *              Some XA-Sector tweaking, required for older drives.
261da177e4SLinus Torvalds  *
271da177e4SLinus Torvalds  *   - SONY:    Detection and support of multisession CD's.
281da177e4SLinus Torvalds  *              added by Thomas Quinot <thomas@cuivre.freenix.fr>
291da177e4SLinus Torvalds  *
301da177e4SLinus Torvalds  *   - PIONEER, HITACHI, PLEXTOR, MATSHITA, TEAC, PHILIPS: known to
311da177e4SLinus Torvalds  *              work with SONY (SCSI3 now)  code.
321da177e4SLinus Torvalds  *
331da177e4SLinus Torvalds  *   - HP:      Much like SONY, but a little different... (Thomas)
341da177e4SLinus Torvalds  *              HP-Writers only ??? Maybe other CD-Writers work with this too ?
351da177e4SLinus Torvalds  *              HP 6020 writers now supported.
361da177e4SLinus Torvalds  */
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds #include <linux/cdrom.h>
391da177e4SLinus Torvalds #include <linux/errno.h>
401da177e4SLinus Torvalds #include <linux/string.h>
411da177e4SLinus Torvalds #include <linux/bcd.h>
421da177e4SLinus Torvalds #include <linux/blkdev.h>
435a0e3ad6STejun Heo #include <linux/slab.h>
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds #include <scsi/scsi.h>
461da177e4SLinus Torvalds #include <scsi/scsi_cmnd.h>
471da177e4SLinus Torvalds #include <scsi/scsi_device.h>
481da177e4SLinus Torvalds #include <scsi/scsi_host.h>
491da177e4SLinus Torvalds #include <scsi/scsi_ioctl.h>
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds #include "sr.h"
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds #if 0
541da177e4SLinus Torvalds #define DEBUG
551da177e4SLinus Torvalds #endif
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds /* here are some constants to sort the vendors into groups */
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds #define VENDOR_SCSI3           1	/* default: scsi-3 mmc */
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds #define VENDOR_NEC             2
621da177e4SLinus Torvalds #define VENDOR_TOSHIBA         3
631da177e4SLinus Torvalds #define VENDOR_WRITER          4	/* pre-scsi3 writers */
64396bbe14SDiego Elio Pettenò #define VENDOR_CYGNAL_85ED     5	/* CD-on-a-chip */
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds #define VENDOR_TIMEOUT	30*HZ
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds void sr_vendor_init(Scsi_CD *cd)
691da177e4SLinus Torvalds {
707b32b8e0SMatthew Wilcox 	const char *vendor = cd->device->vendor;
717b32b8e0SMatthew Wilcox 	const char *model = cd->device->model;
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds 	/* default */
741da177e4SLinus Torvalds 	cd->vendor = VENDOR_SCSI3;
751da177e4SLinus Torvalds 	if (cd->readcd_known)
761da177e4SLinus Torvalds 		/* this is true for scsi3/mmc drives - no more checks */
771da177e4SLinus Torvalds 		return;
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds 	if (cd->device->type == TYPE_WORM) {
801da177e4SLinus Torvalds 		cd->vendor = VENDOR_WRITER;
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds 	} else if (!strncmp(vendor, "NEC", 3)) {
831da177e4SLinus Torvalds 		cd->vendor = VENDOR_NEC;
841da177e4SLinus Torvalds 		if (!strncmp(model, "CD-ROM DRIVE:25", 15) ||
851da177e4SLinus Torvalds 		    !strncmp(model, "CD-ROM DRIVE:36", 15) ||
861da177e4SLinus Torvalds 		    !strncmp(model, "CD-ROM DRIVE:83", 15) ||
871da177e4SLinus Torvalds 		    !strncmp(model, "CD-ROM DRIVE:84 ", 16)
881da177e4SLinus Torvalds #if 0
891da177e4SLinus Torvalds 		/* my NEC 3x returns the read-raw data if a read-raw
901da177e4SLinus Torvalds 		   is followed by a read for the same sector - aeb */
911da177e4SLinus Torvalds 		    || !strncmp(model, "CD-ROM DRIVE:500", 16)
921da177e4SLinus Torvalds #endif
931da177e4SLinus Torvalds 		    )
941da177e4SLinus Torvalds 			/* these can't handle multisession, may hang */
951da177e4SLinus Torvalds 			cd->cdi.mask |= CDC_MULTI_SESSION;
961da177e4SLinus Torvalds 
971da177e4SLinus Torvalds 	} else if (!strncmp(vendor, "TOSHIBA", 7)) {
981da177e4SLinus Torvalds 		cd->vendor = VENDOR_TOSHIBA;
991da177e4SLinus Torvalds 
100396bbe14SDiego Elio Pettenò 	} else if (!strncmp(vendor, "Beurer", 6) &&
101396bbe14SDiego Elio Pettenò 		   !strncmp(model, "Gluco Memory", 12)) {
102396bbe14SDiego Elio Pettenò 		/* The Beurer GL50 evo uses a Cygnal-manufactured CD-on-a-chip
103396bbe14SDiego Elio Pettenò 		   that only accepts a subset of SCSI commands.  Most of the
104396bbe14SDiego Elio Pettenò 		   not-implemented commands are fine to fail, but a few,
105396bbe14SDiego Elio Pettenò 		   particularly around the MMC or Audio commands, will put the
106396bbe14SDiego Elio Pettenò 		   device into an unrecoverable state, so they need to be
107396bbe14SDiego Elio Pettenò 		   avoided at all costs.
108396bbe14SDiego Elio Pettenò 		*/
109396bbe14SDiego Elio Pettenò 		cd->vendor = VENDOR_CYGNAL_85ED;
110396bbe14SDiego Elio Pettenò 		cd->cdi.mask |= (
111396bbe14SDiego Elio Pettenò 			CDC_MULTI_SESSION |
112396bbe14SDiego Elio Pettenò 			CDC_CLOSE_TRAY | CDC_OPEN_TRAY |
113396bbe14SDiego Elio Pettenò 			CDC_LOCK |
114396bbe14SDiego Elio Pettenò 			CDC_GENERIC_PACKET |
115396bbe14SDiego Elio Pettenò 			CDC_PLAY_AUDIO
116396bbe14SDiego Elio Pettenò 			);
1171da177e4SLinus Torvalds 	}
1181da177e4SLinus Torvalds }
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds 
1211da177e4SLinus Torvalds /* small handy function for switching block length using MODE SELECT,
1221da177e4SLinus Torvalds  * used by sr_read_sector() */
1231da177e4SLinus Torvalds 
1241da177e4SLinus Torvalds int sr_set_blocklength(Scsi_CD *cd, int blocklength)
1251da177e4SLinus Torvalds {
1261da177e4SLinus Torvalds 	unsigned char *buffer;	/* the buffer for the ioctl */
1271da177e4SLinus Torvalds 	struct packet_command cgc;
1281da177e4SLinus Torvalds 	struct ccs_modesel_head *modesel;
1291da177e4SLinus Torvalds 	int rc, density = 0;
1301da177e4SLinus Torvalds 
1311da177e4SLinus Torvalds 	if (cd->vendor == VENDOR_TOSHIBA)
1321da177e4SLinus Torvalds 		density = (blocklength > 2048) ? 0x81 : 0x83;
1331da177e4SLinus Torvalds 
134*d94d9496SChristoph Hellwig 	buffer = kmalloc(512, GFP_KERNEL);
1351da177e4SLinus Torvalds 	if (!buffer)
1361da177e4SLinus Torvalds 		return -ENOMEM;
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds #ifdef DEBUG
13996eefad2SHannes Reinecke 	sr_printk(KERN_INFO, cd, "MODE SELECT 0x%x/%d\n", density, blocklength);
1401da177e4SLinus Torvalds #endif
1411da177e4SLinus Torvalds 	memset(&cgc, 0, sizeof(struct packet_command));
1421da177e4SLinus Torvalds 	cgc.cmd[0] = MODE_SELECT;
1431da177e4SLinus Torvalds 	cgc.cmd[1] = (1 << 4);
1441da177e4SLinus Torvalds 	cgc.cmd[4] = 12;
1451da177e4SLinus Torvalds 	modesel = (struct ccs_modesel_head *) buffer;
1461da177e4SLinus Torvalds 	memset(modesel, 0, sizeof(*modesel));
1471da177e4SLinus Torvalds 	modesel->block_desc_length = 0x08;
1481da177e4SLinus Torvalds 	modesel->density = density;
1491da177e4SLinus Torvalds 	modesel->block_length_med = (blocklength >> 8) & 0xff;
1501da177e4SLinus Torvalds 	modesel->block_length_lo = blocklength & 0xff;
1511da177e4SLinus Torvalds 	cgc.buffer = buffer;
1521da177e4SLinus Torvalds 	cgc.buflen = sizeof(*modesel);
1531da177e4SLinus Torvalds 	cgc.data_direction = DMA_TO_DEVICE;
1541da177e4SLinus Torvalds 	cgc.timeout = VENDOR_TIMEOUT;
1551da177e4SLinus Torvalds 	if (0 == (rc = sr_do_ioctl(cd, &cgc))) {
1561da177e4SLinus Torvalds 		cd->device->sector_size = blocklength;
1571da177e4SLinus Torvalds 	}
1581da177e4SLinus Torvalds #ifdef DEBUG
1591da177e4SLinus Torvalds 	else
16096eefad2SHannes Reinecke 		sr_printk(KERN_INFO, cd,
16196eefad2SHannes Reinecke 			  "switching blocklength to %d bytes failed\n",
16296eefad2SHannes Reinecke 			  blocklength);
1631da177e4SLinus Torvalds #endif
1641da177e4SLinus Torvalds 	kfree(buffer);
1651da177e4SLinus Torvalds 	return rc;
1661da177e4SLinus Torvalds }
1671da177e4SLinus Torvalds 
1681da177e4SLinus Torvalds /* This function gets called after a media change. Checks if the CD is
1691da177e4SLinus Torvalds    multisession, asks for offset etc. */
1701da177e4SLinus Torvalds 
1711da177e4SLinus Torvalds int sr_cd_check(struct cdrom_device_info *cdi)
1721da177e4SLinus Torvalds {
1731da177e4SLinus Torvalds 	Scsi_CD *cd = cdi->handle;
1741da177e4SLinus Torvalds 	unsigned long sector;
1751da177e4SLinus Torvalds 	unsigned char *buffer;	/* the buffer for the ioctl */
1761da177e4SLinus Torvalds 	struct packet_command cgc;
1771da177e4SLinus Torvalds 	int rc, no_multi;
1781da177e4SLinus Torvalds 
1791da177e4SLinus Torvalds 	if (cd->cdi.mask & CDC_MULTI_SESSION)
1801da177e4SLinus Torvalds 		return 0;
1811da177e4SLinus Torvalds 
182*d94d9496SChristoph Hellwig 	buffer = kmalloc(512, GFP_KERNEL);
1831da177e4SLinus Torvalds 	if (!buffer)
1841da177e4SLinus Torvalds 		return -ENOMEM;
1851da177e4SLinus Torvalds 
1861da177e4SLinus Torvalds 	sector = 0;		/* the multisession sector offset goes here  */
1871da177e4SLinus Torvalds 	no_multi = 0;		/* flag: the drive can't handle multisession */
1881da177e4SLinus Torvalds 	rc = 0;
1891da177e4SLinus Torvalds 
1901da177e4SLinus Torvalds 	memset(&cgc, 0, sizeof(struct packet_command));
1911da177e4SLinus Torvalds 
1921da177e4SLinus Torvalds 	switch (cd->vendor) {
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds 	case VENDOR_SCSI3:
1951da177e4SLinus Torvalds 		cgc.cmd[0] = READ_TOC;
1961da177e4SLinus Torvalds 		cgc.cmd[8] = 12;
1971da177e4SLinus Torvalds 		cgc.cmd[9] = 0x40;
1981da177e4SLinus Torvalds 		cgc.buffer = buffer;
1991da177e4SLinus Torvalds 		cgc.buflen = 12;
2001da177e4SLinus Torvalds 		cgc.quiet = 1;
2011da177e4SLinus Torvalds 		cgc.data_direction = DMA_FROM_DEVICE;
2021da177e4SLinus Torvalds 		cgc.timeout = VENDOR_TIMEOUT;
2031da177e4SLinus Torvalds 		rc = sr_do_ioctl(cd, &cgc);
2041da177e4SLinus Torvalds 		if (rc != 0)
2051da177e4SLinus Torvalds 			break;
2061da177e4SLinus Torvalds 		if ((buffer[0] << 8) + buffer[1] < 0x0a) {
20796eefad2SHannes Reinecke 			sr_printk(KERN_INFO, cd, "Hmm, seems the drive "
20896eefad2SHannes Reinecke 			   "doesn't support multisession CD's\n");
2091da177e4SLinus Torvalds 			no_multi = 1;
2101da177e4SLinus Torvalds 			break;
2111da177e4SLinus Torvalds 		}
2121da177e4SLinus Torvalds 		sector = buffer[11] + (buffer[10] << 8) +
2131da177e4SLinus Torvalds 		    (buffer[9] << 16) + (buffer[8] << 24);
2141da177e4SLinus Torvalds 		if (buffer[6] <= 1) {
2151da177e4SLinus Torvalds 			/* ignore sector offsets from first track */
2161da177e4SLinus Torvalds 			sector = 0;
2171da177e4SLinus Torvalds 		}
2181da177e4SLinus Torvalds 		break;
2191da177e4SLinus Torvalds 
2201da177e4SLinus Torvalds 	case VENDOR_NEC:{
2211da177e4SLinus Torvalds 			unsigned long min, sec, frame;
2221da177e4SLinus Torvalds 			cgc.cmd[0] = 0xde;
2231da177e4SLinus Torvalds 			cgc.cmd[1] = 0x03;
2241da177e4SLinus Torvalds 			cgc.cmd[2] = 0xb0;
2251da177e4SLinus Torvalds 			cgc.buffer = buffer;
2261da177e4SLinus Torvalds 			cgc.buflen = 0x16;
2271da177e4SLinus Torvalds 			cgc.quiet = 1;
2281da177e4SLinus Torvalds 			cgc.data_direction = DMA_FROM_DEVICE;
2291da177e4SLinus Torvalds 			cgc.timeout = VENDOR_TIMEOUT;
2301da177e4SLinus Torvalds 			rc = sr_do_ioctl(cd, &cgc);
2311da177e4SLinus Torvalds 			if (rc != 0)
2321da177e4SLinus Torvalds 				break;
2331da177e4SLinus Torvalds 			if (buffer[14] != 0 && buffer[14] != 0xb0) {
23496eefad2SHannes Reinecke 				sr_printk(KERN_INFO, cd, "Hmm, seems the cdrom "
23596eefad2SHannes Reinecke 					  "doesn't support multisession CD's\n");
23696eefad2SHannes Reinecke 
2371da177e4SLinus Torvalds 				no_multi = 1;
2381da177e4SLinus Torvalds 				break;
2391da177e4SLinus Torvalds 			}
2402cee5dfaSAdrian Bunk 			min = bcd2bin(buffer[15]);
2412cee5dfaSAdrian Bunk 			sec = bcd2bin(buffer[16]);
2422cee5dfaSAdrian Bunk 			frame = bcd2bin(buffer[17]);
2431da177e4SLinus Torvalds 			sector = min * CD_SECS * CD_FRAMES + sec * CD_FRAMES + frame;
2441da177e4SLinus Torvalds 			break;
2451da177e4SLinus Torvalds 		}
2461da177e4SLinus Torvalds 
2471da177e4SLinus Torvalds 	case VENDOR_TOSHIBA:{
2481da177e4SLinus Torvalds 			unsigned long min, sec, frame;
2491da177e4SLinus Torvalds 
2501da177e4SLinus Torvalds 			/* we request some disc information (is it a XA-CD ?,
2511da177e4SLinus Torvalds 			 * where starts the last session ?) */
2521da177e4SLinus Torvalds 			cgc.cmd[0] = 0xc7;
2531da177e4SLinus Torvalds 			cgc.cmd[1] = 0x03;
2541da177e4SLinus Torvalds 			cgc.buffer = buffer;
2551da177e4SLinus Torvalds 			cgc.buflen = 4;
2561da177e4SLinus Torvalds 			cgc.quiet = 1;
2571da177e4SLinus Torvalds 			cgc.data_direction = DMA_FROM_DEVICE;
2581da177e4SLinus Torvalds 			cgc.timeout = VENDOR_TIMEOUT;
2591da177e4SLinus Torvalds 			rc = sr_do_ioctl(cd, &cgc);
2601da177e4SLinus Torvalds 			if (rc == -EINVAL) {
26196eefad2SHannes Reinecke 				sr_printk(KERN_INFO, cd, "Hmm, seems the drive "
26296eefad2SHannes Reinecke 					  "doesn't support multisession CD's\n");
2631da177e4SLinus Torvalds 				no_multi = 1;
2641da177e4SLinus Torvalds 				break;
2651da177e4SLinus Torvalds 			}
2661da177e4SLinus Torvalds 			if (rc != 0)
2671da177e4SLinus Torvalds 				break;
2682cee5dfaSAdrian Bunk 			min = bcd2bin(buffer[1]);
2692cee5dfaSAdrian Bunk 			sec = bcd2bin(buffer[2]);
2702cee5dfaSAdrian Bunk 			frame = bcd2bin(buffer[3]);
2711da177e4SLinus Torvalds 			sector = min * CD_SECS * CD_FRAMES + sec * CD_FRAMES + frame;
2721da177e4SLinus Torvalds 			if (sector)
2731da177e4SLinus Torvalds 				sector -= CD_MSF_OFFSET;
2741da177e4SLinus Torvalds 			sr_set_blocklength(cd, 2048);
2751da177e4SLinus Torvalds 			break;
2761da177e4SLinus Torvalds 		}
2771da177e4SLinus Torvalds 
2781da177e4SLinus Torvalds 	case VENDOR_WRITER:
2791da177e4SLinus Torvalds 		cgc.cmd[0] = READ_TOC;
2801da177e4SLinus Torvalds 		cgc.cmd[8] = 0x04;
2811da177e4SLinus Torvalds 		cgc.cmd[9] = 0x40;
2821da177e4SLinus Torvalds 		cgc.buffer = buffer;
2831da177e4SLinus Torvalds 		cgc.buflen = 0x04;
2841da177e4SLinus Torvalds 		cgc.quiet = 1;
2851da177e4SLinus Torvalds 		cgc.data_direction = DMA_FROM_DEVICE;
2861da177e4SLinus Torvalds 		cgc.timeout = VENDOR_TIMEOUT;
2871da177e4SLinus Torvalds 		rc = sr_do_ioctl(cd, &cgc);
2881da177e4SLinus Torvalds 		if (rc != 0) {
2891da177e4SLinus Torvalds 			break;
2901da177e4SLinus Torvalds 		}
2911da177e4SLinus Torvalds 		if ((rc = buffer[2]) == 0) {
29296eefad2SHannes Reinecke 			sr_printk(KERN_WARNING, cd,
29396eefad2SHannes Reinecke 				  "No finished session\n");
2941da177e4SLinus Torvalds 			break;
2951da177e4SLinus Torvalds 		}
2961da177e4SLinus Torvalds 		cgc.cmd[0] = READ_TOC;	/* Read TOC */
2971da177e4SLinus Torvalds 		cgc.cmd[6] = rc & 0x7f;	/* number of last session */
2981da177e4SLinus Torvalds 		cgc.cmd[8] = 0x0c;
2991da177e4SLinus Torvalds 		cgc.cmd[9] = 0x40;
3001da177e4SLinus Torvalds 		cgc.buffer = buffer;
3011da177e4SLinus Torvalds 		cgc.buflen = 12;
3021da177e4SLinus Torvalds 		cgc.quiet = 1;
3031da177e4SLinus Torvalds 		cgc.data_direction = DMA_FROM_DEVICE;
3041da177e4SLinus Torvalds 		cgc.timeout = VENDOR_TIMEOUT;
3051da177e4SLinus Torvalds 		rc = sr_do_ioctl(cd, &cgc);
3061da177e4SLinus Torvalds 		if (rc != 0) {
3071da177e4SLinus Torvalds 			break;
3081da177e4SLinus Torvalds 		}
3091da177e4SLinus Torvalds 		sector = buffer[11] + (buffer[10] << 8) +
3101da177e4SLinus Torvalds 		    (buffer[9] << 16) + (buffer[8] << 24);
3111da177e4SLinus Torvalds 		break;
3121da177e4SLinus Torvalds 
3131da177e4SLinus Torvalds 	default:
3141da177e4SLinus Torvalds 		/* should not happen */
31596eefad2SHannes Reinecke 		sr_printk(KERN_WARNING, cd,
31696eefad2SHannes Reinecke 			  "unknown vendor code (%i), not initialized ?\n",
31796eefad2SHannes Reinecke 			  cd->vendor);
3181da177e4SLinus Torvalds 		sector = 0;
3191da177e4SLinus Torvalds 		no_multi = 1;
3201da177e4SLinus Torvalds 		break;
3211da177e4SLinus Torvalds 	}
3221da177e4SLinus Torvalds 	cd->ms_offset = sector;
3231da177e4SLinus Torvalds 	cd->xa_flag = 0;
3241da177e4SLinus Torvalds 	if (CDS_AUDIO != sr_disk_status(cdi) && 1 == sr_is_xa(cd))
3251da177e4SLinus Torvalds 		cd->xa_flag = 1;
3261da177e4SLinus Torvalds 
3271da177e4SLinus Torvalds 	if (2048 != cd->device->sector_size) {
3281da177e4SLinus Torvalds 		sr_set_blocklength(cd, 2048);
3291da177e4SLinus Torvalds 	}
3301da177e4SLinus Torvalds 	if (no_multi)
3311da177e4SLinus Torvalds 		cdi->mask |= CDC_MULTI_SESSION;
3321da177e4SLinus Torvalds 
3331da177e4SLinus Torvalds #ifdef DEBUG
3341da177e4SLinus Torvalds 	if (sector)
33596eefad2SHannes Reinecke 		sr_printk(KERN_DEBUG, cd, "multisession offset=%lu\n",
33696eefad2SHannes Reinecke 			  sector);
3371da177e4SLinus Torvalds #endif
3381da177e4SLinus Torvalds 	kfree(buffer);
3391da177e4SLinus Torvalds 	return rc;
3401da177e4SLinus Torvalds }
341