]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/ide/pci/serverworks.c
serverworks: fix CSB6 tuning logic
[karo-tx-linux.git] / drivers / ide / pci / serverworks.c
index b04c99059c05bdb16b66f35cac7298bbfe51c187..d9c4fd1ae9969784144f10d073c7d078b490bbc6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/serverworks.c         Version 0.10    Jun 2 2007
+ * linux/drivers/ide/pci/serverworks.c         Version 0.11    Jun 2 2007
  *
  * Copyright (C) 1998-2000 Michel Aubry
  * Copyright (C) 1998-2000 Andrzej Krzysztofowicz
@@ -176,35 +176,49 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed)
                                return 0;
                        } else if ((dma_timing) &&
                                   ((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) {
-                               u8 dmaspeed = dma_timing;
+                               u8 dmaspeed;
 
-                               if ((dmaspeed & 0x20) == 0x20)
+                               switch (dma_timing & 0x77) {
+                               case 0x20:
                                        dmaspeed = XFER_MW_DMA_2;
-                               else if ((dmaspeed & 0x21) == 0x21)
+                                       break;
+                               case 0x21:
                                        dmaspeed = XFER_MW_DMA_1;
-                               else if ((dmaspeed & 0x77) == 0x77)
+                                       break;
+                               case 0x77:
                                        dmaspeed = XFER_MW_DMA_0;
-                               else
+                                       break;
+                               default:
                                        goto dma_pio;
+                               }
+
                                drive->current_speed = drive->init_speed = dmaspeed;
                                return 0;
                        }
 dma_pio:
                        if (pio_timing) {
-                               u8 piospeed = pio_timing;
+                               u8 piospeed;
 
-                               if ((piospeed & 0x20) == 0x20)
+                               switch (pio_timing & 0x7f) {
+                               case 0x20:
                                        piospeed = XFER_PIO_4;
-                               else if ((piospeed & 0x22) == 0x22)
+                                       break;
+                               case 0x22:
                                        piospeed = XFER_PIO_3;
-                               else if ((piospeed & 0x34) == 0x34)
+                                       break;
+                               case 0x34:
                                        piospeed = XFER_PIO_2;
-                               else if ((piospeed & 0x47) == 0x47)
+                                       break;
+                               case 0x47:
                                        piospeed = XFER_PIO_1;
-                               else if ((piospeed & 0x5d) == 0x5d)
+                                       break;
+                               case 0x5d:
                                        piospeed = XFER_PIO_0;
-                               else
+                                       break;
+                               default:
                                        goto oem_setup_failed;
+                               }
+
                                drive->current_speed = drive->init_speed = piospeed;
                                return 0;
                        }