linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 5/13] cy82c693: add ->set_dma_mode method
@ 2007-11-12 23:01 Bartlomiej Zolnierkiewicz
  2008-01-04 19:57 ` Sergei Shtylyov
  0 siblings, 1 reply; 3+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-11-12 23:01 UTC (permalink / raw)
  To: linux-ide


* Fix SWDMA/MWDMA masks in cy82c693_chipset.

* Add IDE_HFLAG_CY82C693 host flag and use it in ide_tune_dma() to
  check whether the DMA should be enabled even if ide_max_dma_mode()
  fails.

* Convert cy82c693_dma_enable() to become cy82c693_set_dma_mode()
  and remove no longer needed cy82c693_ide_dma_on().  Then set
  IDE_HFLAG_CY82C693 instead of IDE_HFLAG_TRUST_BIOS_FOR_DMA in
  cy82c693_chipset.

* Bump driver version.

As a result of this patch cy82c693 driver will configure and use DMA on
all SWDMA0-2 and MWDMA0-2 capable ATA devices instead of relying on BIOS.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
---
 drivers/ide/ide-dma.c      |   15 +++++++---
 drivers/ide/pci/cy82c693.c |   64 +++++++--------------------------------------
 include/linux/ide.h        |    2 +
 3 files changed, 24 insertions(+), 57 deletions(-)

Index: b/drivers/ide/ide-dma.c
===================================================================
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -758,6 +758,7 @@ EXPORT_SYMBOL_GPL(ide_find_dma_mode);
 
 static int ide_tune_dma(ide_drive_t *drive)
 {
+	ide_hwif_t *hwif = drive->hwif;
 	u8 speed;
 
 	if (noautodma || drive->nodma || (drive->id->capability & 1) == 0)
@@ -767,15 +768,21 @@ static int ide_tune_dma(ide_drive_t *dri
 	if (__ide_dma_bad_drive(drive))
 		return 0;
 
-	if (drive->hwif->host_flags & IDE_HFLAG_TRUST_BIOS_FOR_DMA)
+	if (hwif->host_flags & IDE_HFLAG_TRUST_BIOS_FOR_DMA)
 		return config_drive_for_dma(drive);
 
 	speed = ide_max_dma_mode(drive);
 
-	if (!speed)
-		return 0;
+	if (!speed) {
+		 /* is this really correct/needed? */
+		if ((hwif->host_flags & IDE_HFLAG_CY82C693) &&
+		    ide_dma_good_drive(drive))
+			return 1;
+		else
+			return 0;
+	}
 
-	if (drive->hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
+	if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE)
 		return 0;
 
 	if (ide_set_dma_mode(drive, speed))
Index: b/drivers/ide/pci/cy82c693.c
===================================================================
--- a/drivers/ide/pci/cy82c693.c
+++ b/drivers/ide/pci/cy82c693.c
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/cy82c693.c		Version 0.43	Nov 7, 2007
+ * linux/drivers/ide/pci/cy82c693.c		Version 0.44	Nov 8, 2007
  *
  *  Copyright (C) 1998-2000 Andreas S. Krebs (akrebs@altavista.net), Maintainer
  *  Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>, Integrator
@@ -176,14 +176,12 @@ static void compute_clocks (u8 pio, pio_
  * set DMA mode a specific channel for CY82C693
  */
 
-static void cy82c693_dma_enable (ide_drive_t *drive, int mode, int single)
+static void cy82c693_set_dma_mode(ide_drive_t *drive, const u8 mode)
 {
-	u8 index = 0, data = 0;
+	ide_hwif_t *hwif = drive->hwif;
+	u8 single = (mode & 0x10) >> 4, index = 0, data = 0;
 
-	if (mode>2)	/* make sure we set a valid mode */
-		mode = 2;
-
-	index = (HWIF(drive)->channel==0) ? CY82_INDEX_CHANNEL0 : CY82_INDEX_CHANNEL1;
+	index = hwif->channel ? CY82_INDEX_CHANNEL1 : CY82_INDEX_CHANNEL0;
 
 #if CY82C693_DEBUG_LOGS
 	/* for debug let's show the previous values */
@@ -196,7 +194,7 @@ static void cy82c693_dma_enable (ide_dri
 		(data&0x3), ((data>>2)&1));
 #endif /* CY82C693_DEBUG_LOGS */
 
-	data = (u8)mode|(u8)(single<<2);
+	data = (mode & 3) | (single << 2);
 
 	outb(index, CY82_INDEX_PORT);
 	outb(data, CY82_DATA_PORT);
@@ -204,7 +202,7 @@ static void cy82c693_dma_enable (ide_dri
 #if CY82C693_DEBUG_INFO
 	printk(KERN_INFO "%s (ch=%d, dev=%d): set DMA mode to %d (single=%d)\n",
 		drive->name, HWIF(drive)->channel, drive->select.b.unit,
-		mode, single);
+		mode & 3, single);
 #endif /* CY82C693_DEBUG_INFO */
 
 	/* 
@@ -227,42 +225,6 @@ static void cy82c693_dma_enable (ide_dri
 #endif /* CY82C693_DEBUG_INFO */
 }
 
-/* 
- * used to set DMA mode for CY82C693 (single and multi modes)
- */
-static int cy82c693_ide_dma_on (ide_drive_t *drive)
-{
-	struct hd_driveid *id = drive->id;
-
-#if CY82C693_DEBUG_INFO
-	printk (KERN_INFO "dma_on: %s\n", drive->name);
-#endif /* CY82C693_DEBUG_INFO */
-
-	if (id != NULL) {		
-		/* Enable DMA on any drive that has DMA
-		 * (multi or single) enabled
-		 */
-		if (id->field_valid & 2) {	/* regular DMA */
-			int mmode, smode;
-
-			mmode = id->dma_mword & (id->dma_mword >> 8);
-			smode = id->dma_1word & (id->dma_1word >> 8);
-
-			mmode &= ATA_MWDMA2;
-			smode &= ATA_SWDMA2;
-
-			if (mmode != 0) {
-				/* enable multi */
-				cy82c693_dma_enable(drive, (mmode >> 1), 0);
-			} else if (smode != 0) {
-				/* enable single */
-				cy82c693_dma_enable(drive, (smode >> 1), 1);
-			}
-		}
-	}
-        return __ide_dma_on(drive);
-}
-
 static void cy82c693_set_pio_mode(ide_drive_t *drive, const u8 pio)
 {
 	ide_hwif_t *hwif = HWIF(drive);
@@ -429,11 +391,7 @@ static unsigned int __devinit init_chips
 static void __devinit init_hwif_cy82c693(ide_hwif_t *hwif)
 {
 	hwif->set_pio_mode = &cy82c693_set_pio_mode;
-
-	if (hwif->dma_base == 0)
-		return;
-
-	hwif->ide_dma_on = &cy82c693_ide_dma_on;
+	hwif->set_dma_mode = &cy82c693_set_dma_mode;
 }
 
 static void __devinit init_iops_cy82c693(ide_hwif_t *hwif)
@@ -454,11 +412,11 @@ static const struct ide_port_info cy82c6
 	.init_iops	= init_iops_cy82c693,
 	.init_hwif	= init_hwif_cy82c693,
 	.chipset	= ide_cy82c693,
-	.host_flags	= IDE_HFLAG_SINGLE | IDE_HFLAG_TRUST_BIOS_FOR_DMA |
+	.host_flags	= IDE_HFLAG_SINGLE | IDE_HFLAG_CY82C693 |
 			  IDE_HFLAG_BOOTABLE,
 	.pio_mask	= ATA_PIO4,
-	.swdma_mask	= ATA_SWDMA2_ONLY,
-	.mwdma_mask	= ATA_MWDMA2_ONLY,
+	.swdma_mask	= ATA_SWDMA2,
+	.mwdma_mask	= ATA_MWDMA2,
 };
 
 static int __devinit cy82c693_init_one(struct pci_dev *dev, const struct pci_device_id *id)
Index: b/include/linux/ide.h
===================================================================
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -1095,6 +1095,8 @@ enum {
 	/* unmask IRQs */
 	IDE_HFLAG_UNMASK_IRQS		= (1 << 25),
 	IDE_HFLAG_ABUSE_SET_DMA_MODE	= (1 << 26),
+	/* host is CY82C693 */
+	IDE_HFLAG_CY82C693		= (1 << 27),
 };
 
 #ifdef CONFIG_BLK_DEV_OFFBOARD

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 5/13] cy82c693: add ->set_dma_mode method
  2007-11-12 23:01 [PATCH 5/13] cy82c693: add ->set_dma_mode method Bartlomiej Zolnierkiewicz
@ 2008-01-04 19:57 ` Sergei Shtylyov
  2008-02-16 17:59   ` Bartlomiej Zolnierkiewicz
  0 siblings, 1 reply; 3+ messages in thread
From: Sergei Shtylyov @ 2008-01-04 19:57 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz; +Cc: linux-ide

Bartlomiej Zolnierkiewicz wrote:

> * Fix SWDMA/MWDMA masks in cy82c693_chipset.

> * Add IDE_HFLAG_CY82C693 host flag and use it in ide_tune_dma() to
>   check whether the DMA should be enabled even if ide_max_dma_mode()
>   fails.

    I didn't get why this was necessary...

> * Convert cy82c693_dma_enable() to become cy82c693_set_dma_mode()
>   and remove no longer needed cy82c693_ide_dma_on().  Then set
>   IDE_HFLAG_CY82C693 instead of IDE_HFLAG_TRUST_BIOS_FOR_DMA in
>   cy82c693_chipset.

> * Bump driver version.

> As a result of this patch cy82c693 driver will configure and use DMA on
> all SWDMA0-2 and MWDMA0-2 capable ATA devices instead of relying on BIOS.

> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>


> Index: b/drivers/ide/pci/cy82c693.c
> ===================================================================
> --- a/drivers/ide/pci/cy82c693.c
> +++ b/drivers/ide/pci/cy82c693.c
> @@ -1,5 +1,5 @@
>  /*
> - * linux/drivers/ide/pci/cy82c693.c		Version 0.43	Nov 7, 2007
> + * linux/drivers/ide/pci/cy82c693.c		Version 0.44	Nov 8, 2007
>   *
>   *  Copyright (C) 1998-2000 Andreas S. Krebs (akrebs@altavista.net), Maintainer
>   *  Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>, Integrator
> @@ -176,14 +176,12 @@ static void compute_clocks (u8 pio, pio_
>   * set DMA mode a specific channel for CY82C693
>   */
>  
> -static void cy82c693_dma_enable (ide_drive_t *drive, int mode, int single)
> +static void cy82c693_set_dma_mode(ide_drive_t *drive, const u8 mode)
>  {
> -	u8 index = 0, data = 0;
> +	ide_hwif_t *hwif = drive->hwif;
> +	u8 single = (mode & 0x10) >> 4, index = 0, data = 0;

    Useless intializers for 'index' and 'data'.

MBR, Sergei

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 5/13] cy82c693: add ->set_dma_mode method
  2008-01-04 19:57 ` Sergei Shtylyov
@ 2008-02-16 17:59   ` Bartlomiej Zolnierkiewicz
  0 siblings, 0 replies; 3+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2008-02-16 17:59 UTC (permalink / raw)
  To: Sergei Shtylyov; +Cc: linux-ide


[ Sorry for the late reply. ]

On Friday 04 January 2008, Sergei Shtylyov wrote:
> Bartlomiej Zolnierkiewicz wrote:
> 
> > * Fix SWDMA/MWDMA masks in cy82c693_chipset.
> 
> > * Add IDE_HFLAG_CY82C693 host flag and use it in ide_tune_dma() to
> >   check whether the DMA should be enabled even if ide_max_dma_mode()
> >   fails.
> 
>     I didn't get why this was necessary...

"paranoia" ;-)

Care to send a patch removing it?

> > * Convert cy82c693_dma_enable() to become cy82c693_set_dma_mode()
> >   and remove no longer needed cy82c693_ide_dma_on().  Then set
> >   IDE_HFLAG_CY82C693 instead of IDE_HFLAG_TRUST_BIOS_FOR_DMA in
> >   cy82c693_chipset.
> 
> > * Bump driver version.
> 
> > As a result of this patch cy82c693 driver will configure and use DMA on
> > all SWDMA0-2 and MWDMA0-2 capable ATA devices instead of relying on BIOS.
> 
> > Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> 
> 
> > Index: b/drivers/ide/pci/cy82c693.c
> > ===================================================================
> > --- a/drivers/ide/pci/cy82c693.c
> > +++ b/drivers/ide/pci/cy82c693.c
> > @@ -1,5 +1,5 @@
> >  /*
> > - * linux/drivers/ide/pci/cy82c693.c		Version 0.43	Nov 7, 2007
> > + * linux/drivers/ide/pci/cy82c693.c		Version 0.44	Nov 8, 2007
> >   *
> >   *  Copyright (C) 1998-2000 Andreas S. Krebs (akrebs@altavista.net), Maintainer
> >   *  Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>, Integrator
> > @@ -176,14 +176,12 @@ static void compute_clocks (u8 pio, pio_
> >   * set DMA mode a specific channel for CY82C693
> >   */
> >  
> > -static void cy82c693_dma_enable (ide_drive_t *drive, int mode, int single)
> > +static void cy82c693_set_dma_mode(ide_drive_t *drive, const u8 mode)
> >  {
> > -	u8 index = 0, data = 0;
> > +	ide_hwif_t *hwif = drive->hwif;
> > +	u8 single = (mode & 0x10) >> 4, index = 0, data = 0;
> 
>     Useless intializers for 'index' and 'data'.

ditto

Thanks,
Bart

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-02-16 17:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-12 23:01 [PATCH 5/13] cy82c693: add ->set_dma_mode method Bartlomiej Zolnierkiewicz
2008-01-04 19:57 ` Sergei Shtylyov
2008-02-16 17:59   ` Bartlomiej Zolnierkiewicz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).