From 9147d7beec181ebcf230ae27d92b6943aaa8d502 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 18 Jan 2004 18:27:51 -0800 Subject: [PATCH] [PATCH] ATAPI MO drive support From: Pascal Schmidt 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 | 3 ++- drivers/ide/ide-cd.c | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 12ea5fade600f..79347b59b59aa 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -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); diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 5756c5ce99e56..1f397e6cb2950 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -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 -- 2.53.0