提交 11ee2957 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6:
  cmd64x: fix hwif->chipset setup
  MAINTAINERS: update ide-cd entry
  ide-cd: fix 'ireason' reporting in cdrom_pc_intr()
  ide-cd: fix error message in cdrom_pc_intr()
  ide-cd: add error message for DMA error to cdrom_read_intr()
  ide-cd: fix error messages in cdrom_write_intr()
  ide-cd: add missing 'ireason' masking to cdrom_write_intr()
  ide-cd: fix error messages in cdrom_{read,write}_check_ireason()
  ide-cd: use ide_cd_release() in ide_cd_probe()
  ide-cd: fix ACER/AOpen 24X CDROM speed reporting on big-endian machines
  ide-cd: fix SAMSUNG CD-ROM SCR-3231 quirk
  drivers/ide/: Spelling fixes
...@@ -1870,8 +1870,10 @@ T: quilt kernel.org/pub/linux/kernel/people/bart/pata-2.6/ ...@@ -1870,8 +1870,10 @@ T: quilt kernel.org/pub/linux/kernel/people/bart/pata-2.6/
S: Maintained S: Maintained
IDE/ATAPI CDROM DRIVER IDE/ATAPI CDROM DRIVER
P: Borislav Petkov
M: bbpetkov@yahoo.de
L: linux-ide@vger.kernel.org L: linux-ide@vger.kernel.org
S: Unmaintained S: Maintained
IDE/ATAPI FLOPPY DRIVERS IDE/ATAPI FLOPPY DRIVERS
P: Paul Bristow P: Paul Bristow
......
...@@ -1068,8 +1068,8 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason) ...@@ -1068,8 +1068,8 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
return 0; return 0;
else if (ireason == 0) { else if (ireason == 0) {
/* Whoops... The drive is expecting to receive data from us! */ /* Whoops... The drive is expecting to receive data from us! */
printk(KERN_ERR "%s: read_intr: Drive wants to transfer data the " printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
"wrong way!\n", drive->name); drive->name, __FUNCTION__);
/* Throw some data at the drive so it doesn't hang /* Throw some data at the drive so it doesn't hang
and quit this request. */ and quit this request. */
...@@ -1086,8 +1086,8 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason) ...@@ -1086,8 +1086,8 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
return 0; return 0;
} else { } else {
/* Drive wants a command packet, or invalid ireason... */ /* Drive wants a command packet, or invalid ireason... */
printk(KERN_ERR "%s: read_intr: bad interrupt reason %x\n", drive->name, printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
ireason); drive->name, __FUNCTION__, ireason);
} }
cdrom_end_request(drive, 0); cdrom_end_request(drive, 0);
...@@ -1112,8 +1112,11 @@ static ide_startstop_t cdrom_read_intr (ide_drive_t *drive) ...@@ -1112,8 +1112,11 @@ static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
*/ */
if (dma) { if (dma) {
info->dma = 0; 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); ide_dma_off(drive);
}
} }
if (cdrom_decode_status(drive, 0, &stat)) if (cdrom_decode_status(drive, 0, &stat))
...@@ -1443,7 +1446,7 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive) ...@@ -1443,7 +1446,7 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
return ide_stopped; return ide_stopped;
/* Read the interrupt reason and the transfer length. */ /* 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); lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG); highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
...@@ -1484,7 +1487,7 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive) ...@@ -1484,7 +1487,7 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
if (thislen > len) thislen = len; if (thislen > len) thislen = len;
/* The drive wants to be written to. */ /* The drive wants to be written to. */
if ((ireason & 3) == 0) { if (ireason == 0) {
if (!rq->data) { if (!rq->data) {
blk_dump_rq_flags(rq, "cdrom_pc_intr, write"); blk_dump_rq_flags(rq, "cdrom_pc_intr, write");
goto confused; goto confused;
...@@ -1506,9 +1509,9 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive) ...@@ -1506,9 +1509,9 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
} }
/* Same drill for reading. */ /* Same drill for reading. */
else if ((ireason & 3) == 2) { else if (ireason == 2) {
if (!rq->data) { if (!rq->data) {
blk_dump_rq_flags(rq, "cdrom_pc_intr, write"); blk_dump_rq_flags(rq, "cdrom_pc_intr, read");
goto confused; goto confused;
} }
/* Transfer the data. */ /* Transfer the data. */
...@@ -1632,8 +1635,8 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason) ...@@ -1632,8 +1635,8 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
return 0; return 0;
else if (ireason == 2) { else if (ireason == 2) {
/* Whoops... The drive wants to send data. */ /* Whoops... The drive wants to send data. */
printk(KERN_ERR "%s: write_intr: wrong transfer direction!\n", printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
drive->name); drive->name, __FUNCTION__);
while (len > 0) { while (len > 0) {
int dum = 0; int dum = 0;
...@@ -1642,8 +1645,8 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason) ...@@ -1642,8 +1645,8 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
} }
} else { } else {
/* Drive wants a command packet, or invalid ireason... */ /* Drive wants a command packet, or invalid ireason... */
printk(KERN_ERR "%s: write_intr: bad interrupt reason %x\n", printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
drive->name, ireason); drive->name, __FUNCTION__, ireason);
} }
cdrom_end_request(drive, 0); cdrom_end_request(drive, 0);
...@@ -1805,8 +1808,9 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive) ...@@ -1805,8 +1808,9 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
/* Check for errors. */ /* Check for errors. */
if (dma) { if (dma) {
info->dma = 0; info->dma = 0;
if ((dma_error = HWIF(drive)->ide_dma_end(drive))) { dma_error = HWIF(drive)->ide_dma_end(drive);
printk(KERN_ERR "ide-cd: write dma error\n"); if (dma_error) {
printk(KERN_ERR "%s: DMA write error\n", drive->name);
ide_dma_off(drive); ide_dma_off(drive);
} }
} }
...@@ -1826,7 +1830,7 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive) ...@@ -1826,7 +1830,7 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
} }
/* Read the interrupt reason and the transfer length. */ /* 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); lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG); highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
...@@ -1839,8 +1843,9 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive) ...@@ -1839,8 +1843,9 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
*/ */
uptodate = 1; uptodate = 1;
if (rq->current_nr_sectors > 0) { if (rq->current_nr_sectors > 0) {
printk(KERN_ERR "%s: write_intr: data underrun (%d blocks)\n", printk(KERN_ERR "%s: %s: data underrun (%d blocks)\n",
drive->name, rq->current_nr_sectors); drive->name, __FUNCTION__,
rq->current_nr_sectors);
uptodate = 0; uptodate = 0;
} }
cdrom_end_request(drive, uptodate); cdrom_end_request(drive, uptodate);
...@@ -1860,7 +1865,8 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive) ...@@ -1860,7 +1865,8 @@ static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
int this_transfer; int this_transfer;
if (!rq->current_nr_sectors) { 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; break;
} }
...@@ -2688,14 +2694,14 @@ void ide_cdrom_update_speed (ide_drive_t *drive, struct atapi_capabilities_page ...@@ -2688,14 +2694,14 @@ void ide_cdrom_update_speed (ide_drive_t *drive, struct atapi_capabilities_page
if (!drive->id->model[0] && if (!drive->id->model[0] &&
!strncmp(drive->id->fw_rev, "241N", 4)) { !strncmp(drive->id->fw_rev, "241N", 4)) {
CDROM_STATE_FLAGS(drive)->current_speed = 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 = CDROM_CONFIG_FLAGS(drive)->max_speed =
(((unsigned int)cap->maxspeed) + (176/2)) / 176; (le16_to_cpu(cap->maxspeed) + (176/2)) / 176;
} else { } else {
CDROM_STATE_FLAGS(drive)->current_speed = 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 = 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) ...@@ -2909,6 +2915,9 @@ static int ide_cdrom_register (ide_drive_t *drive, int nslots)
if (!CDROM_CONFIG_FLAGS(drive)->ram) if (!CDROM_CONFIG_FLAGS(drive)->ram)
devinfo->mask |= CDC_RAM; devinfo->mask |= CDC_RAM;
if (CDROM_CONFIG_FLAGS(drive)->no_speed_select)
devinfo->mask |= CDC_SELECT_SPEED;
devinfo->disk = info->disk; devinfo->disk = info->disk;
return register_cdrom(devinfo); return register_cdrom(devinfo);
} }
...@@ -3161,7 +3170,7 @@ int ide_cdrom_setup (ide_drive_t *drive) ...@@ -3161,7 +3170,7 @@ int ide_cdrom_setup (ide_drive_t *drive)
CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1; CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
/* the 3231 model does not support the SET_CD_SPEED command */ /* the 3231 model does not support the SET_CD_SPEED command */
else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231")) 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 #if ! STANDARD_ATAPI
/* by default Sanyo 3 CD changer support is turned off and /* by default Sanyo 3 CD changer support is turned off and
...@@ -3504,15 +3513,8 @@ static int ide_cd_probe(ide_drive_t *drive) ...@@ -3504,15 +3513,8 @@ static int ide_cd_probe(ide_drive_t *drive)
g->driverfs_dev = &drive->gendev; g->driverfs_dev = &drive->gendev;
g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
if (ide_cdrom_setup(drive)) { if (ide_cdrom_setup(drive)) {
struct cdrom_device_info *devinfo = &info->devinfo;
ide_proc_unregister_driver(drive, &ide_cdrom_driver); ide_proc_unregister_driver(drive, &ide_cdrom_driver);
kfree(info->buffer); ide_cd_release(&info->kref);
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;
goto failed; goto failed;
} }
......
...@@ -91,7 +91,8 @@ struct ide_cd_config_flags { ...@@ -91,7 +91,8 @@ struct ide_cd_config_flags {
__u8 close_tray : 1; /* can close the tray */ __u8 close_tray : 1; /* can close the tray */
__u8 writing : 1; /* pseudo write in progress */ __u8 writing : 1; /* pseudo write in progress */
__u8 mo_drive : 1; /* drive is an MO device */ __u8 mo_drive : 1; /* drive is an MO device */
__u8 reserved : 2; __u8 no_speed_select : 1; /* SET_CD_SPEED command is unsupported. */
__u8 reserved : 1;
byte max_speed; /* Max speed of the drive */ byte max_speed; /* Max speed of the drive */
}; };
#define CDROM_CONFIG_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->config_flags)) #define CDROM_CONFIG_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->config_flags))
......
/* /*
* linux/drivers/ide/pci/cmd64x.c Version 1.51 Nov 8, 2007 * linux/drivers/ide/pci/cmd64x.c Version 1.52 Dec 24, 2007
* *
* cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines.
* Due to massive hardware bugs, UltraDMA is only supported * Due to massive hardware bugs, UltraDMA is only supported
...@@ -564,6 +564,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { ...@@ -564,6 +564,7 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
.init_chipset = init_chipset_cmd64x, .init_chipset = init_chipset_cmd64x,
.init_hwif = init_hwif_cmd64x, .init_hwif = init_hwif_cmd64x,
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
.chipset = ide_cmd646,
.host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE, .host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE,
.pio_mask = ATA_PIO5, .pio_mask = ATA_PIO5,
.mwdma_mask = ATA_MWDMA2, .mwdma_mask = ATA_MWDMA2,
...@@ -573,7 +574,6 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { ...@@ -573,7 +574,6 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = {
.init_chipset = init_chipset_cmd64x, .init_chipset = init_chipset_cmd64x,
.init_hwif = init_hwif_cmd64x, .init_hwif = init_hwif_cmd64x,
.enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}},
.chipset = ide_cmd646,
.host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE, .host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE,
.pio_mask = ATA_PIO5, .pio_mask = ATA_PIO5,
.mwdma_mask = ATA_MWDMA2, .mwdma_mask = ATA_MWDMA2,
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
#define ATAC_BM0_PRD 0x04 #define ATAC_BM0_PRD 0x04
#define CS5535_CABLE_DETECT 0x48 #define CS5535_CABLE_DETECT 0x48
/* Format I PIO settings. We seperate out cmd and data for safer timings */ /* Format I PIO settings. We separate out cmd and data for safer timings */
static unsigned int cs5535_pio_cmd_timings[5] = static unsigned int cs5535_pio_cmd_timings[5] =
{ 0xF7F4, 0x53F3, 0x13F1, 0x5131, 0x1131 }; { 0xF7F4, 0x53F3, 0x13F1, 0x5131, 0x1131 };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册