lkml.org 
[lkml]   [2003]   [Dec]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] 2.6: ATAPI MO drive support

Hi!

The below patch is needed to support ATAPI MO drives in 2.6. ide-scsi
doesn't work any more for this, so ide-cd has to take over the job of
running the MO drive. Without this, there is no way to write to an
ATAPI MO drive.

This patch has been discussed with Linus and Jens already around test9
time and it was agreed this is the right way to go about it. I have
rediffed it against 2.6.0. Compiles, runs, works just fine for me.

Somebody please apply.


--- linux-2.6.0/drivers/ide/ide-cd.c Thu Dec 18 23:36:59 2003
+++ linux-2.6.0-mo/drivers/ide/ide-cd.c Thu Dec 18 23:46:47 2003
@@ -2242,6 +2242,7 @@ static int cdrom_read_toc(ide_drive_t *d
struct atapi_toc_header hdr;
struct atapi_toc_entry ent;
} ms_tmp;
+ long last_written;

if (toc == NULL) {
/* Try to allocate space. */
@@ -2261,6 +2262,13 @@ static int cdrom_read_toc(ide_drive_t *d
if (CDROM_STATE_FLAGS(drive)->toc_valid)
return 0;

+ /* Try to get the total cdrom capacity. */
+ stat = cdrom_read_capacity(drive, &toc->capacity, sense);
+ if (stat)
+ toc->capacity = 0x1fffff;
+
+ set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
+
/* First read just the header, so we know how long the TOC is. */
stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
sizeof(struct atapi_toc_header), sense);
@@ -2368,13 +2376,11 @@ static int cdrom_read_toc(ide_drive_t *d
toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);

/* Now try to get the total cdrom capacity. */
- stat = cdrom_get_last_written(cdi, (long *) &toc->capacity);
- if (stat || !toc->capacity)
- stat = cdrom_read_capacity(drive, &toc->capacity, sense);
- if (stat)
- toc->capacity = 0x1fffff;
-
- set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
+ stat = cdrom_get_last_written(cdi, &last_written);
+ if (!stat && last_written) {
+ toc->capacity = last_written;
+ set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME);
+ }

/* Remember that we've read this stuff. */
CDROM_STATE_FLAGS(drive)->toc_valid = 1;
@@ -3215,7 +3221,8 @@ int ide_cdrom_setup (ide_drive_t *drive)

nslots = ide_cdrom_probe_capabilities (drive);

- if (CDROM_CONFIG_FLAGS(drive)->dvd_ram)
+ if (CDROM_CONFIG_FLAGS(drive)->dvd_ram ||
+ CDROM_CONFIG_FLAGS(drive)->mo_drive)
set_disk_ro(drive->disk, 0);

#if 0
--- linux-2.6.0/drivers/cdrom/cdrom.c Thu Dec 18 23:36:59 2003
+++ linux-2.6.0-mo/drivers/cdrom/cdrom.c Thu Dec 18 23:40:51 2003
@@ -426,7 +426,8 @@ int cdrom_open(struct cdrom_device_info
if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS))
ret = cdi->ops->open(cdi, 1);
else {
- if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_DVD_RAM))
+ if ((fp->f_mode & FMODE_WRITE) &&
+ !(CDROM_CAN(CDC_DVD_RAM) || CDROM_CAN(CDC_MO_DRIVE)))
return -EROFS;

ret = open_for_data(cdi);

--
Ciao,
Pascal

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:59    [W:0.184 / U:0.044 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site