Skip to contentSkip to conversation

ide: convert ide_find_best_mode() users to use ide_max_dma_mode()

PATCH In review Bartlomiej Zolnierkiewicz 2 participants 3 messages Jun 9, 2007 – Jun 15, 2007

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ide: convert ide_find_best_mode() users to use ide_max_dma_mode()

ide-timing.h:

* remove handling of DMA modes from ide_find_best_mode() and rename it to ide_find_best_pio_mode()

* drop no longer needed "map" argument from ide_find_best_pio_mode() and delete needless ->id check

* remove no longer needed XFER_SWDMA and XFER_UDMA* defines

au1xxx-ide.c:

* use ide_max_dma_mode() instead of ide_find_best_mode()

* remove needless CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA #ifdef

amd74xx.c:

* store UDMA masks in amd_ide_chip[] and while at it make "base" field to be u8 instead of unsigned long

* convert the driver to use UDMA masks from amd_ide_chip[]

* use ide_max_dma_mode() and ide_find_best_pio_mode() instead of ide_find_best_mode()

* delete stale comment from amd74xx_ide_dma_check()

* remove no longer needed AMD_UDMA* defines

via82cxxx.c:

* remove unused DISPLAY_VIA_TIMINGS define

* store UDMA masks in via_isa_bridges[] and while at it make "flags" field to be u8 instead of u16

* convert the driver to use UDMA masks from via_isa_bridges[]

* use ide_max_dma_mode() and ide_find_best_pio_mode() instead of ide_find_best_mode()

* remove no longer needed VIA_UDMA* defines

pmac.c:

* use ide_max_dma_mode() instead of ide_find_best_mode()

There should be no functionality changes caused by this patch.

---
 drivers/ide/ide-timing.h      |   56 -----------------
 drivers/ide/mips/au1xxx-ide.c |    7 --
 drivers/ide/pci/amd74xx.c     |  118 +++++++++++++++++--------------------
 drivers/ide/pci/via82cxxx.c   |  132 +++++++++++++++++++-----------------------
 drivers/ide/ppc/pmac.c        |   25 +------
 5 files changed, 123 insertions(+), 215 deletions(-)
drivers/ide/ide-timing.h +3 -53
Index: b/drivers/ide/ide-timing.h
===================================================================
@@ -102,66 +102,16 @@ static struct ide_timing ide_timing[] = 
 #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)
+static short ide_find_best_pio_mode(ide_drive_t *drive)
 {
 	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 (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 :
@@ -262,7 +212,7 @@ static int ide_timing_compute(ide_drive_
  */
 
 	if ((speed & XFER_MODE) != XFER_PIO) {
-		ide_timing_compute(drive, ide_find_best_mode(drive, XFER_PIO | XFER_EPIO), &p, T, UT);
+		ide_timing_compute(drive, ide_find_best_pio_mode(drive), &p, T, UT);
 		ide_timing_merge(&p, t, t, IDE_TIMING_ALL);
 	}
 
drivers/ide/mips/au1xxx-ide.c +1 -6
Index: b/drivers/ide/mips/au1xxx-ide.c
===================================================================
@@ -381,9 +381,7 @@ static int auide_dma_setup(ide_drive_t *
 
 static int auide_dma_check(ide_drive_t *drive)
 {
-	u8 speed;
-
-#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
+	u8 speed = ide_max_dma_mode(drive);
 
 	if( dbdma_init_done == 0 ){
 		auide_hwif.white_list = ide_in_drive_list(drive->id,
@@ -394,7 +392,6 @@ static int auide_dma_check(ide_drive_t *
 		auide_ddma_init(&auide_hwif);
 		dbdma_init_done = 1;
 	}
-#endif
 
 	/* Is the drive in our DMA black list? */
 
@@ -409,8 +406,6 @@ static int auide_dma_check(ide_drive_t *
 	else
 		drive->using_dma = 1;
 
-	speed = ide_find_best_mode(drive, XFER_PIO | XFER_MWDMA);
-	
 	if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
 		return 0;
 
drivers/ide/pci/amd74xx.c +54 -64

210 lines not on this page · raw message

drivers/ide/pci/via82cxxx.c +61 -71

229 lines not on this page · raw message

drivers/ide/ppc/pmac.c +4 -21
Index: b/drivers/ide/ppc/pmac.c
===================================================================
@@ -1821,28 +1821,11 @@ pmac_ide_dma_check(ide_drive_t *drive)
 		enable = 0;
 
 	if (enable) {
-		short mode;
-		
-		map = XFER_MWDMA;
-		if (pmif->kind == controller_kl_ata4
-		    || pmif->kind == controller_un_ata6
-		    || pmif->kind == controller_k2_ata6
-		    || pmif->kind == controller_sh_ata6) {
-			map |= XFER_UDMA;
-			if (pmif->cable_80) {
-				map |= XFER_UDMA_66;
-				if (pmif->kind == controller_un_ata6 ||
-				    pmif->kind == controller_k2_ata6 ||
-				    pmif->kind == controller_sh_ata6)
-					map |= XFER_UDMA_100;
-				if (pmif->kind == controller_sh_ata6)
-					map |= XFER_UDMA_133;
-			}
-		}
-		mode = ide_find_best_mode(drive, map);
-		if (mode & XFER_UDMA)
+		u8 mode = ide_max_dma_mode(drive);
+
+		if (mode >= XFER_UDMA_0)
 			drive->using_dma = pmac_ide_udma_enable(drive, mode);
-		else if (mode & XFER_MWDMA)
+		else if (mode >= XFER_MW_DMA_0)
 			drive->using_dma = pmac_ide_mdma_enable(drive, mode);
 		hwif->OUTB(0, IDE_CONTROL_REG);
 		/* Apply settings to controller */
#1 lore raw
Quoted 42 lines · Bartlomiej Zolnierkiewicz

ide-timing.h:

* remove handling of DMA modes from ide_find_best_mode() and rename it to ide_find_best_pio_mode()

* drop no longer needed "map" argument from ide_find_best_pio_mode() and delete needless ->id check

* remove no longer needed XFER_SWDMA and XFER_UDMA* defines

au1xxx-ide.c:

* use ide_max_dma_mode() instead of ide_find_best_mode()

* remove needless CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA #ifdef

amd74xx.c:

* store UDMA masks in amd_ide_chip[] and while at it make "base" field to be u8 instead of unsigned long

* convert the driver to use UDMA masks from amd_ide_chip[]

* use ide_max_dma_mode() and ide_find_best_pio_mode() instead of ide_find_best_mode()

* delete stale comment from amd74xx_ide_dma_check()

* remove no longer needed AMD_UDMA* defines

via82cxxx.c:

* remove unused DISPLAY_VIA_TIMINGS define

* store UDMA masks in via_isa_bridges[] and while at it make "flags" field to be u8 instead of u16

* convert the driver to use UDMA masks from via_isa_bridges[]

* use ide_max_dma_mode() and ide_find_best_pio_mode() instead of ide_find_best_mode()

Quoted 7 lines

* remove no longer needed VIA_UDMA* defines

pmac.c:

* use ide_max_dma_mode() instead of ide_find_best_mode()

There should be no functionality changes caused by this patch.

I'm afraid this hasn't been accomplished yet. ;-)

Quoted 7 lines

Index: b/drivers/ide/mips/au1xxx-ide.c
===================================================================

drivers/ide/mips/au1xxx-ide.c static int auide_dma_setup(ide_drive_t * · line 386

Quoted 9 lines
drivers/ide/mips/au1xxx-ide.c +1 -3
@@ -381,9 +381,7 @@ static int auide_dma_setup(ide_drive_t *
 
 static int auide_dma_check(ide_drive_t *drive)
 {
-	u8 speed;
-
-#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
+	u8 speed = ide_max_dma_mode(drive);
 
 	if( dbdma_init_done == 0 ){

Ugh, coding style isnn't kosher here. :-)

Quoted 10 lines
drivers/ide/mips/au1xxx-ide.c +0 -1
 		auide_hwif.white_list = ide_in_drive_list(drive->id,
@@ -394,7 +392,6 @@ static int auide_dma_check(ide_drive_t *
 		auide_ddma_init(&auide_hwif);
 		dbdma_init_done = 1;
 	}
-#endif
 
 	/* Is the drive in our DMA black list? */
 

drivers/ide/mips/au1xxx-ide.c static int auide_dma_check(ide_drive_t * · line 409

Quoted 6 lines
drivers/ide/mips/au1xxx-ide.c +0 -2
@@ -409,8 +406,6 @@ static int auide_dma_check(ide_drive_t *
 	else
 		drive->using_dma = 1;
 
-	speed = ide_find_best_mode(drive, XFER_PIO | XFER_MWDMA);
-	
 	if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)

ide_max_dma_mode() returns 0 if DMA not available, so that if should have
looked this way:

if (drive->autodma && speed)

drivers/ide/mips/au1xxx-ide.c static int auide_dma_check(ide_drive_t * · line 410

Quoted 1 line
drivers/ide/mips/au1xxx-ide.c +0 -0
 		return 0;

But is this really equivalent? Why there's no fallback call to
ide_find_best_pio_mode() like in other cases?

MBR, Sergei

#2 lore raw

Hi,

Quoted 15 lines · Sergei Shtylyov
Quoted 13 lines · Bartlomiej Zolnierkiewicz

Index: b/drivers/ide/mips/au1xxx-ide.c
===================================================================

drivers/ide/mips/au1xxx-ide.c +1 -3
@@ -381,9 +381,7 @@ static int auide_dma_setup(ide_drive_t *
 
 static int auide_dma_check(ide_drive_t *drive)
 {
-	u8 speed;
-
-#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
+	u8 speed = ide_max_dma_mode(drive);
 
Quoted 3 lines

drivers/ide/mips/au1xxx-ide.c static int auide_dma_setup(ide_drive_t * · line 386

Quoted 1 line
drivers/ide/mips/au1xxx-ide.c +0 -0
 	if( dbdma_init_done == 0 ){

Ugh, coding style isnn't kosher here. :-)

Ah, indeed I overlooked it.

Now looking at the au1xxx-ide.c I see that there are few other non-kosher places worth fixing... Care to send a patch?

Quoted 13 lines
Quoted 13 lines
drivers/ide/mips/au1xxx-ide.c +0 -1
 		auide_hwif.white_list = ide_in_drive_list(drive->id,
@@ -394,7 +392,6 @@ static int auide_dma_check(ide_drive_t *
 		auide_ddma_init(&auide_hwif);
 		dbdma_init_done = 1;
 	}
-#endif
 
 	/* Is the drive in our DMA black list? */
 
@@ -409,8 +406,6 @@ static int auide_dma_check(ide_drive_t *
 	else
 		drive->using_dma = 1;
 
Quoted 6 lines

drivers/ide/mips/au1xxx-ide.c static int auide_dma_check(ide_drive_t * · line 409

Quoted 3 lines
drivers/ide/mips/au1xxx-ide.c +0 -2
-	speed = ide_find_best_mode(drive, XFER_PIO | XFER_MWDMA);
-	
 	if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)

ide_max_dma_mode() returns 0 if DMA not available, so that if should have
looked this way:

XFER_PIO is 0x00 so the patch is correct but

Quoted 1 line
  	if (drive->autodma && speed)

is of course simpler

I think that it is not worth re-spinning the whole patch just for that (especially since the code in question is an old one and not introduced in this patch). However I'll happilly apply a follow-up fix.

Quoted 4 lines

drivers/ide/mips/au1xxx-ide.c static int auide_dma_check(ide_drive_t * · line 410

Quoted 1 line
drivers/ide/mips/au1xxx-ide.c +0 -0
 		return 0;

But is this really equivalent? Why there's no fallback call to
ide_find_best_pio_mode() like in other cases?

Because of the

	if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)

check.

In other places "speed" is always used, here it is only used if it denotes a DMA mode (XFER_PIO mask was needlessly passed to ide_find_best_mode() call since PIO modes were always filtered out later).

Thanks,
Bart