]> git.hungrycats.org Git - linux/commitdiff
[PATCH] ATAPI MO drive support
authorAndrew Morton <akpm@osdl.org>
Mon, 19 Jan 2004 02:27:51 +0000 (18:27 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Mon, 19 Jan 2004 02:27:51 +0000 (18:27 -0800)
From: Pascal Schmidt <der.eremit@email.de>

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.

drivers/cdrom/cdrom.c
drivers/ide/ide-cd.c

index 12ea5fade600fd255365df7d30a30ad4f224f86d..79347b59b59aa9b6a275d639b93ab4928160160d 100644 (file)
@@ -426,7 +426,8 @@ int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
        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);
index 5756c5ce99e5695a347c5013099ddcf3640cae56..1f397e6cb2950728aebc2653763ce5f88d165867 100644 (file)
@@ -2242,6 +2242,7 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
                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 *drive, struct request_sense *sense)
        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 *drive, struct request_sense *sense)
        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