|
@@ -1068,8 +1068,8 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
|
|
|
return 0;
|
|
|
else if (ireason == 0) {
|
|
|
/* Whoops... The drive is expecting to receive data from us! */
|
|
|
- printk(KERN_ERR "%s: read_intr: Drive wants to transfer data the "
|
|
|
- "wrong way!\n", drive->name);
|
|
|
+ printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
|
|
|
+ drive->name, __FUNCTION__);
|
|
|
|
|
|
/* Throw some data at the drive so it doesn't hang
|
|
|
and quit this request. */
|
|
@@ -1086,8 +1086,8 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
|
|
|
return 0;
|
|
|
} else {
|
|
|
/* Drive wants a command packet, or invalid ireason... */
|
|
|
- printk(KERN_ERR "%s: read_intr: bad interrupt reason %x\n", drive->name,
|
|
|
- ireason);
|
|
|
+ printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
|
|
|
+ drive->name, __FUNCTION__, ireason);
|
|
|
}
|
|
|
|
|
|
cdrom_end_request(drive, 0);
|
|
@@ -1112,8 +1112,11 @@ static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
|
|
|
*/
|
|
|
if (dma) {
|
|
|
info->dma = 0;
|
|
|
- if ((dma_error = HWIF(drive)->ide_dma_end(drive)))
|
|
|
+ dma_error = HWIF(drive)->ide_dma_end(drive);
|
|
|
+ if (dma_error) {
|
|
|
+ printk(KERN_ERR "%s: DMA read error\n", drive->name);
|
|
|
ide_dma_off(drive);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (cdrom_decode_status(drive, 0, &stat))
|
|
@@ -1443,7 +1446,7 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
|
|
|
return ide_stopped;
|
|
|
|
|
|
/* Read the interrupt reason and the transfer length. */
|
|
|
- ireason = HWIF(drive)->INB(IDE_IREASON_REG);
|
|
|
+ ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
|
|
|
lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
|
|
|
highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
|
|
|
|
|
@@ -1484,7 +1487,7 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
|
|
|
if (thislen > len) thislen = len;
|
|
|
|
|
|
/* The drive wants to be written to. */
|
|
|
- if ((ireason & 3) == 0) {
|
|
|
+ if (ireason == 0) {
|
|
|
if (!rq->data) {
|
|
|
blk_dump_rq_flags(rq, "cdrom_pc_intr, write");
|
|
|
goto confused;
|
|
@@ -1506,9 +1509,9 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
|
|
|
}
|
|
|
|
|
|
/* Same drill for reading. */
|
|
|
- else if ((ireason & 3) == 2) {
|
|
|
+ else if (ireason == 2) {
|
|
|
if (!rq->data) {
|
|
|
- blk_dump_rq_flags(rq, "cdrom_pc_intr, write");
|
|
|
+ blk_dump_rq_flags(rq, "cdrom_pc_intr, read");
|
|
|
goto confused;
|
|
|
}
|
|
|
/* Transfer the data. */
|
|
@@ -1632,8 +1635,8 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
|
|
|
return 0;
|
|
|
else if (ireason == 2) {
|
|
|
/* Whoops... The drive wants to send data. */
|
|
|
- printk(KERN_ERR "%s: write_intr: wrong transfer direction!\n",
|
|
|
- drive->name);
|
|
|
+ printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
|
|
|
+ drive->name, __FUNCTION__);
|
|
|
|
|
|
while (len > 0) {
|
|
|
int dum = 0;
|
|
@@ -1642,8 +1645,8 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
|
|
|
}
|
|
|
} else {
|
|
|
/* Drive wants a command packet, or invalid ireason... */
|
|
|
- printk(KERN_ERR "%s: write_intr: bad interrupt reason %x\n",
|
|
|
- drive->name, ireason);
|
|
|
+ printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
|
|
|
+ drive->name, __FUNCTION__, ireason);
|
|
|
}
|
|
|
|
|
|
cdrom_end_request(drive, 0);
|
|
@@ -1805,8 +1808,9 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
|
|
|
/* Check for errors. */
|
|
|
if (dma) {
|
|
|
info->dma = 0;
|
|
|
- if ((dma_error = HWIF(drive)->ide_dma_end(drive))) {
|
|
|
- printk(KERN_ERR "ide-cd: write dma error\n");
|
|
|
+ dma_error = HWIF(drive)->ide_dma_end(drive);
|
|
|
+ if (dma_error) {
|
|
|
+ printk(KERN_ERR "%s: DMA write error\n", drive->name);
|
|
|
ide_dma_off(drive);
|
|
|
}
|
|
|
}
|
|
@@ -1826,7 +1830,7 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
|
|
|
}
|
|
|
|
|
|
/* Read the interrupt reason and the transfer length. */
|
|
|
- ireason = HWIF(drive)->INB(IDE_IREASON_REG);
|
|
|
+ ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
|
|
|
lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
|
|
|
highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
|
|
|
|
|
@@ -1839,8 +1843,9 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
|
|
|
*/
|
|
|
uptodate = 1;
|
|
|
if (rq->current_nr_sectors > 0) {
|
|
|
- printk(KERN_ERR "%s: write_intr: data underrun (%d blocks)\n",
|
|
|
- drive->name, rq->current_nr_sectors);
|
|
|
+ printk(KERN_ERR "%s: %s: data underrun (%d blocks)\n",
|
|
|
+ drive->name, __FUNCTION__,
|
|
|
+ rq->current_nr_sectors);
|
|
|
uptodate = 0;
|
|
|
}
|
|
|
cdrom_end_request(drive, uptodate);
|
|
@@ -1860,7 +1865,8 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
|
|
|
int this_transfer;
|
|
|
|
|
|
if (!rq->current_nr_sectors) {
|
|
|
- printk(KERN_ERR "ide-cd: write_intr: oops\n");
|
|
|
+ printk(KERN_ERR "%s: %s: confused, missing data\n",
|
|
|
+ drive->name, __FUNCTION__);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -2688,14 +2694,14 @@ void ide_cdrom_update_speed (ide_drive_t *drive, struct atapi_capabilities_page
|
|
|
if (!drive->id->model[0] &&
|
|
|
!strncmp(drive->id->fw_rev, "241N", 4)) {
|
|
|
CDROM_STATE_FLAGS(drive)->current_speed =
|
|
|
- (((unsigned int)cap->curspeed) + (176/2)) / 176;
|
|
|
+ (le16_to_cpu(cap->curspeed) + (176/2)) / 176;
|
|
|
CDROM_CONFIG_FLAGS(drive)->max_speed =
|
|
|
- (((unsigned int)cap->maxspeed) + (176/2)) / 176;
|
|
|
+ (le16_to_cpu(cap->maxspeed) + (176/2)) / 176;
|
|
|
} else {
|
|
|
CDROM_STATE_FLAGS(drive)->current_speed =
|
|
|
- (ntohs(cap->curspeed) + (176/2)) / 176;
|
|
|
+ (be16_to_cpu(cap->curspeed) + (176/2)) / 176;
|
|
|
CDROM_CONFIG_FLAGS(drive)->max_speed =
|
|
|
- (ntohs(cap->maxspeed) + (176/2)) / 176;
|
|
|
+ (be16_to_cpu(cap->maxspeed) + (176/2)) / 176;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2909,6 +2915,9 @@ static int ide_cdrom_register (ide_drive_t *drive, int nslots)
|
|
|
if (!CDROM_CONFIG_FLAGS(drive)->ram)
|
|
|
devinfo->mask |= CDC_RAM;
|
|
|
|
|
|
+ if (CDROM_CONFIG_FLAGS(drive)->no_speed_select)
|
|
|
+ devinfo->mask |= CDC_SELECT_SPEED;
|
|
|
+
|
|
|
devinfo->disk = info->disk;
|
|
|
return register_cdrom(devinfo);
|
|
|
}
|
|
@@ -3161,7 +3170,7 @@ int ide_cdrom_setup (ide_drive_t *drive)
|
|
|
CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
|
|
|
/* the 3231 model does not support the SET_CD_SPEED command */
|
|
|
else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
|
|
|
- cdi->mask |= CDC_SELECT_SPEED;
|
|
|
+ CDROM_CONFIG_FLAGS(drive)->no_speed_select = 1;
|
|
|
|
|
|
#if ! STANDARD_ATAPI
|
|
|
/* by default Sanyo 3 CD changer support is turned off and
|
|
@@ -3504,15 +3513,8 @@ static int ide_cd_probe(ide_drive_t *drive)
|
|
|
g->driverfs_dev = &drive->gendev;
|
|
|
g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
|
|
|
if (ide_cdrom_setup(drive)) {
|
|
|
- struct cdrom_device_info *devinfo = &info->devinfo;
|
|
|
ide_proc_unregister_driver(drive, &ide_cdrom_driver);
|
|
|
- kfree(info->buffer);
|
|
|
- kfree(info->toc);
|
|
|
- kfree(info->changer_info);
|
|
|
- if (devinfo->handle == drive && unregister_cdrom(devinfo))
|
|
|
- printk (KERN_ERR "%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.\n", drive->name);
|
|
|
- kfree(info);
|
|
|
- drive->driver_data = NULL;
|
|
|
+ ide_cd_release(&info->kref);
|
|
|
goto failed;
|
|
|
}
|
|
|
|