]> err.no Git - linux-2.6/blobdiff - drivers/ide/ide-timing.h
Fix broken fix for fsl-diu-db
[linux-2.6] / drivers / ide / ide-timing.h
index c1196ce15b4d465ba3eaa91be1d3210d99d69b6d..3b12ffe770712dd1f1a708c7852ff5745a9b6e2a 100644 (file)
@@ -2,8 +2,6 @@
 #define _IDE_TIMING_H
 
 /*
- * $Id: ide-timing.h,v 1.6 2001/12/23 22:47:56 vojtech Exp $
- *
  *  Copyright (c) 1999-2001 Vojtech Pavlik
  */
 
@@ -27,6 +25,7 @@
  * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
  */
 
+#include <linux/kernel.h>
 #include <linux/hdreg.h>
 
 #define XFER_PIO_5             0x0d
@@ -96,84 +95,15 @@ static struct ide_timing ide_timing[] = {
 #define IDE_TIMING_UDMA                0x80
 #define IDE_TIMING_ALL         0xff
 
-#define MIN(a,b)       ((a)<(b)?(a):(b))
-#define MAX(a,b)       ((a)>(b)?(a):(b))
-#define FIT(v,min,max) MAX(MIN(v,max),min)
-#define ENOUGH(v,unit) (((v)-1)/(unit)+1)
-#define EZ(v,unit)     ((v)?ENOUGH(v,unit):0)
+#define FIT(v,vmin,vmax)       max_t(short,min_t(short,v,vmax),vmin)
+#define ENOUGH(v,unit)         (((v)-1)/(unit)+1)
+#define EZ(v,unit)             ((v)?ENOUGH(v,unit):0)
 
 #define XFER_MODE      0xf0
-#define XFER_UDMA_133  0x48
-#define XFER_UDMA_100  0x44
-#define XFER_UDMA_66   0x42
-#define XFER_UDMA      0x40
 #define XFER_MWDMA     0x20
-#define XFER_SWDMA     0x10
 #define XFER_EPIO      0x01
 #define XFER_PIO       0x00
 
-static short ide_find_best_mode(ide_drive_t *drive, int map)
-{
-       struct hd_driveid *id = drive->id;
-       short best = 0;
-
-       if (!id)
-               return XFER_PIO_SLOW;
-
-       if ((map & XFER_UDMA) && (id->field_valid & 4)) {       /* Want UDMA and UDMA bitmap valid */
-
-               if ((map & XFER_UDMA_133) == XFER_UDMA_133)
-                       if ((best = (id->dma_ultra & 0x0040) ? XFER_UDMA_6 : 0)) return best;
-
-               if ((map & XFER_UDMA_100) == XFER_UDMA_100)
-                       if ((best = (id->dma_ultra & 0x0020) ? XFER_UDMA_5 : 0)) return best;
-
-               if ((map & XFER_UDMA_66) == XFER_UDMA_66)
-                       if ((best = (id->dma_ultra & 0x0010) ? XFER_UDMA_4 :
-                                   (id->dma_ultra & 0x0008) ? XFER_UDMA_3 : 0)) return best;
-
-                if ((best = (id->dma_ultra & 0x0004) ? XFER_UDMA_2 :
-                           (id->dma_ultra & 0x0002) ? XFER_UDMA_1 :
-                           (id->dma_ultra & 0x0001) ? XFER_UDMA_0 : 0)) return best;
-       }
-
-       if ((map & XFER_MWDMA) && (id->field_valid & 2)) {      /* Want MWDMA and drive has EIDE fields */
-
-               if ((best = (id->dma_mword & 0x0004) ? XFER_MW_DMA_2 :
-                           (id->dma_mword & 0x0002) ? XFER_MW_DMA_1 :
-                           (id->dma_mword & 0x0001) ? XFER_MW_DMA_0 : 0)) return best;
-       }
-
-       if (map & XFER_SWDMA) {                                 /* Want SWDMA */
-
-               if (id->field_valid & 2) {                      /* EIDE SWDMA */
-
-                       if ((best = (id->dma_1word & 0x0004) ? XFER_SW_DMA_2 :
-                                   (id->dma_1word & 0x0002) ? XFER_SW_DMA_1 :
-                                   (id->dma_1word & 0x0001) ? XFER_SW_DMA_0 : 0)) return best;
-               }
-
-               if (id->capability & 1) {                       /* Pre-EIDE style SWDMA */
-
-                       if ((best = (id->tDMA == 2) ? XFER_SW_DMA_2 :
-                                   (id->tDMA == 1) ? XFER_SW_DMA_1 :
-                                   (id->tDMA == 0) ? XFER_SW_DMA_0 : 0)) return best;
-               }
-       }
-
-
-       if ((map & XFER_EPIO) && (id->field_valid & 2)) {       /* EIDE PIO modes */
-
-               if ((best = (drive->id->eide_pio_modes & 4) ? XFER_PIO_5 :
-                           (drive->id->eide_pio_modes & 2) ? XFER_PIO_4 :
-                           (drive->id->eide_pio_modes & 1) ? XFER_PIO_3 : 0)) return best;
-       }
-       
-       return  (drive->id->tPIO == 2) ? XFER_PIO_2 :
-               (drive->id->tPIO == 1) ? XFER_PIO_1 :
-               (drive->id->tPIO == 0) ? XFER_PIO_0 : XFER_PIO_SLOW;
-}
-
 static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int T, int UT)
 {
        q->setup   = EZ(t->setup   * 1000,  T);
@@ -188,14 +118,14 @@ static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int
 
 static void ide_timing_merge(struct ide_timing *a, struct ide_timing *b, struct ide_timing *m, unsigned int what)
 {
-       if (what & IDE_TIMING_SETUP  ) m->setup   = MAX(a->setup,   b->setup);
-       if (what & IDE_TIMING_ACT8B  ) m->act8b   = MAX(a->act8b,   b->act8b);
-       if (what & IDE_TIMING_REC8B  ) m->rec8b   = MAX(a->rec8b,   b->rec8b);
-       if (what & IDE_TIMING_CYC8B  ) m->cyc8b   = MAX(a->cyc8b,   b->cyc8b);
-       if (what & IDE_TIMING_ACTIVE ) m->active  = MAX(a->active,  b->active);
-       if (what & IDE_TIMING_RECOVER) m->recover = MAX(a->recover, b->recover);
-       if (what & IDE_TIMING_CYCLE  ) m->cycle   = MAX(a->cycle,   b->cycle);
-       if (what & IDE_TIMING_UDMA   ) m->udma    = MAX(a->udma,    b->udma);
+       if (what & IDE_TIMING_SETUP  ) m->setup   = max(a->setup,   b->setup);
+       if (what & IDE_TIMING_ACT8B  ) m->act8b   = max(a->act8b,   b->act8b);
+       if (what & IDE_TIMING_REC8B  ) m->rec8b   = max(a->rec8b,   b->rec8b);
+       if (what & IDE_TIMING_CYC8B  ) m->cyc8b   = max(a->cyc8b,   b->cyc8b);
+       if (what & IDE_TIMING_ACTIVE ) m->active  = max(a->active,  b->active);
+       if (what & IDE_TIMING_RECOVER) m->recover = max(a->recover, b->recover);
+       if (what & IDE_TIMING_CYCLE  ) m->cycle   = max(a->cycle,   b->cycle);
+       if (what & IDE_TIMING_UDMA   ) m->udma    = max(a->udma,    b->udma);
 }
 
 static struct ide_timing* ide_timing_find_mode(short speed)
@@ -220,6 +150,12 @@ static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing
        if (!(s = ide_timing_find_mode(speed)))
                return -EINVAL;
 
+/*
+ * Copy the timing from the table.
+ */
+
+       *t = *s;
+
 /*
  * If the drive is an EIDE drive, it can tell us it needs extended
  * PIO/MWDMA cycle timing.
@@ -248,7 +184,7 @@ static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing
  * Convert the timing to bus clock counts.
  */
 
-       ide_timing_quantize(s, t, T, UT);
+       ide_timing_quantize(t, t, T, UT);
 
 /*
  * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, S.M.A.R.T
@@ -257,12 +193,13 @@ static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing
  */
 
        if ((speed & XFER_MODE) != XFER_PIO) {
-               ide_timing_compute(drive, ide_find_best_mode(drive, XFER_PIO | XFER_EPIO), &p, T, UT);
+               u8 pio = ide_get_best_pio_mode(drive, 255, 5);
+               ide_timing_compute(drive, XFER_PIO_0 + pio, &p, T, UT);
                ide_timing_merge(&p, t, t, IDE_TIMING_ALL);
        }
 
 /*
- * Lenghten active & recovery time so that cycle time is correct.
+ * Lengthen active & recovery time so that cycle time is correct.
  */
 
        if (t->act8b + t->rec8b < t->cyc8b) {