On Sun, 2007-07-22 at 20:34 +0200, Bartlomiej Zolnierkiewicz wrote: > Use ide_config_drive_speed() instead of pmac_ide_do_setfeature() and remove > the latter, also ide-iops.c::__ide_wait_stat() could be static again. > > Since for IDE PMAC host driver IDE_CONTROL_REG is always true, device's > ->quirk_list is always zero and ->ide_dma_host_{on,off} are nops than > the only changes in behavior are: > > * if PIO mode is set then ->dma_off_queitly is called to disable DMA > > * if setting transfer mode fails ide_dump_status() is called to dump status This one needs to be on hold for the reason explained before. In the old days, I did use the generic function and triggered the lockup. Things changes and the generic function got several fixes, so it may well be fine now, but I need to verify it. > Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@xxxxxxxxx> > --- > drivers/ide/ide-iops.c | 2 - > drivers/ide/ppc/pmac.c | 79 +------------------------------------------------ > include/linux/ide.h | 1 > 3 files changed, 3 insertions(+), 79 deletions(-) > > Index: b/drivers/ide/ide-iops.c > =================================================================== > --- a/drivers/ide/ide-iops.c > +++ b/drivers/ide/ide-iops.c > @@ -483,7 +483,7 @@ EXPORT_SYMBOL(drive_is_ready); > * setting a timer to wake up at half second intervals thereafter, > * until timeout is achieved, before timing out. > */ > -int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat) > +static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat) > { > ide_hwif_t *hwif = drive->hwif; > unsigned long flags; > Index: b/drivers/ide/ppc/pmac.c > =================================================================== > --- a/drivers/ide/ppc/pmac.c > +++ b/drivers/ide/ppc/pmac.c > @@ -529,81 +529,6 @@ pmac_outbsync(ide_drive_t *drive, u8 val > } > > /* > - * Send the SET_FEATURE IDE command to the drive and update drive->id with > - * the new state. We currently don't use the generic routine as it used to > - * cause various trouble, especially with older mediabays. > - * This code is sometimes triggering a spurrious interrupt though, I need > - * to sort that out sooner or later and see if I can finally get the > - * common version to work properly in all cases > - */ > -static int > -pmac_ide_do_setfeature(ide_drive_t *drive, u8 command) > -{ > - ide_hwif_t *hwif = HWIF(drive); > - int result; > - u8 stat; > - > - disable_irq_nosync(hwif->irq); > - udelay(1); > - SELECT_DRIVE(drive); > - SELECT_MASK(drive, 0); > - udelay(1); > - hwif->OUTB(drive->ctl | 2, IDE_CONTROL_REG); > - hwif->OUTB(command, IDE_NSECTOR_REG); > - hwif->OUTB(SETFEATURES_XFER, IDE_FEATURE_REG); > - hwif->OUTBSYNC(drive, WIN_SETFEATURES, IDE_COMMAND_REG); > - result = __ide_wait_stat(drive, drive->ready_stat, > - BUSY_STAT|DRQ_STAT|ERR_STAT, > - WAIT_CMD, &stat); > - if (result) > - printk(KERN_ERR "%s: pmac_ide_do_setfeature disk not ready " > - "after SET_FEATURE !\n", drive->name); > - > - SELECT_MASK(drive, 0); > - if (result == 0) { > - drive->id->dma_ultra &= ~0xFF00; > - drive->id->dma_mword &= ~0x0F00; > - drive->id->dma_1word &= ~0x0F00; > - switch(command) { > - case XFER_UDMA_7: > - drive->id->dma_ultra |= 0x8080; break; > - case XFER_UDMA_6: > - drive->id->dma_ultra |= 0x4040; break; > - case XFER_UDMA_5: > - drive->id->dma_ultra |= 0x2020; break; > - case XFER_UDMA_4: > - drive->id->dma_ultra |= 0x1010; break; > - case XFER_UDMA_3: > - drive->id->dma_ultra |= 0x0808; break; > - case XFER_UDMA_2: > - drive->id->dma_ultra |= 0x0404; break; > - case XFER_UDMA_1: > - drive->id->dma_ultra |= 0x0202; break; > - case XFER_UDMA_0: > - drive->id->dma_ultra |= 0x0101; break; > - case XFER_MW_DMA_2: > - drive->id->dma_mword |= 0x0404; break; > - case XFER_MW_DMA_1: > - drive->id->dma_mword |= 0x0202; break; > - case XFER_MW_DMA_0: > - drive->id->dma_mword |= 0x0101; break; > - case XFER_SW_DMA_2: > - drive->id->dma_1word |= 0x0404; break; > - case XFER_SW_DMA_1: > - drive->id->dma_1word |= 0x0202; break; > - case XFER_SW_DMA_0: > - drive->id->dma_1word |= 0x0101; break; > - default: break; > - } > - if (!drive->init_speed) > - drive->init_speed = command; > - drive->current_speed = command; > - } > - enable_irq(hwif->irq); > - return result; > -} > - > -/* > * Old tuning functions (called on hdparm -p), sets up drive PIO timings > */ > static void > @@ -684,7 +609,7 @@ pmac_ide_set_pio_mode(ide_drive_t *drive > drive->name, pio, *timings); > #endif > > - if (pmac_ide_do_setfeature(drive, XFER_PIO + pio)) > + if (ide_config_drive_speed(drive, XFER_PIO + pio)) > return; > > pmac_ide_do_update_timings(drive); > @@ -947,7 +872,7 @@ static int pmac_ide_tune_chipset(ide_dri > if (ret) > return ret; > > - ret = pmac_ide_do_setfeature(drive, speed); > + ret = ide_config_drive_speed(drive, speed); > if (ret) > return ret; > > Index: b/include/linux/ide.h > =================================================================== > --- a/include/linux/ide.h > +++ b/include/linux/ide.h > @@ -1152,7 +1152,6 @@ extern void SELECT_MASK(ide_drive_t *, i > extern void QUIRK_LIST(ide_drive_t *); > > extern int drive_is_ready(ide_drive_t *); > -int __ide_wait_stat(ide_drive_t *, u8, u8, unsigned long); > > /* > * taskfile io for disks for now...and builds request from ide_ioctl - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html