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 <[EMAIL PROTECTED]>
> Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
> ---
>  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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to