Skip to contentSkip to conversation

hpt366: MWDMA filter for SATA cards

PATCH In review Sergei Shtylyov 2 participants 5 messages Sep 2, 2007 – Sep 11, 2007 libata

lore
Share & tools
lore
#0 lore raw

PATCH 2/4 hpt366: MWDMA filter for SATA cards

The Marvell bridge chips used on HighPoint SATA cards do not seem to support the MWDMA modes (at least that caould be seen in their so-called drivers :-), so the driver needs to account for this -- to achieve this:

- add mdma_filter() method from the original patch by Bartlomiej Zolnierkewicz with his consent, also adding the method callout to ide_rate_filter();

- installed the method for all chips to only return empty mask if a SATA drive is detected onHPT372{AN]/374 chips...

---
This patch against the current Linus' tree and unfortunately I was able to only compile test it since that tree gives MODPOST warning and dies early on bootup. Will hopefully try to test if/when I have time... :-)

 drivers/ide/ide-dma.c    |    9 +++++++--
 drivers/ide/ide-lib.c    |    4 +++-
 drivers/ide/ide.c        |    1 +
 drivers/ide/pci/hpt366.c |   23 +++++++++++++++++++++--
 include/linux/ide.h      |    1 +
 5 files changed, 33 insertions(+), 5 deletions(-)
drivers/ide/ide-dma.c +7 -2
Index: linux-2.6/drivers/ide/ide-dma.c
===================================================================
@@ -674,8 +674,13 @@ static unsigned int ide_get_mode_mask(id
 			mask &= 0x07;
 		break;
 	case XFER_MW_DMA_0:
-		if (id->field_valid & 2)
-			mask = id->dma_mword & hwif->mwdma_mask;
+		if ((id->field_valid & 2) == 0)
+			break;
+		if (hwif->mdma_filter)
+			mask = hwif->mdma_filter(drive);
+		else
+			mask = hwif->mwdma_mask;
+		mask &= id->dma_mword;
 		break;
 	case XFER_SW_DMA_0:
 		if (id->field_valid & 2) {
drivers/ide/ide-lib.c +3 -1
Index: linux-2.6/drivers/ide/ide-lib.c
===================================================================
@@ -103,7 +103,9 @@ u8 ide_rate_filter(ide_drive_t *drive, u
 		base = XFER_MW_DMA_0;
 		/* Fall thru */
 	case XFER_MW_DMA_0:
-		if (hwif->mwdma_mask & bit)
+		mask = hwif->mdma_filter ? hwif->mdma_filter(drive) :
+					   hwif->mwdma_mask;
+		if (mask & bit)
 			break;
 		base = XFER_SW_DMA_0;
 		/* Fall thru */
drivers/ide/ide.c +1 -0
Index: linux-2.6/drivers/ide/ide.c
===================================================================
@@ -398,6 +398,7 @@ static void ide_hwif_restore(ide_hwif_t 
 
 	hwif->tuneproc			= tmp_hwif->tuneproc;
 	hwif->speedproc			= tmp_hwif->speedproc;
+	hwif->mdma_filter		= tmp_hwif->mdma_filter;
 	hwif->udma_filter		= tmp_hwif->udma_filter;
 	hwif->selectproc		= tmp_hwif->selectproc;
 	hwif->reset_poll		= tmp_hwif->reset_poll;
drivers/ide/pci/hpt366.c +21 -2
Index: linux-2.6/drivers/ide/pci/hpt366.c
===================================================================
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/hpt366.c		Version 1.12	Aug 25, 2007
+ * linux/drivers/ide/pci/hpt366.c		Version 1.13	Aug 22, 2007
  *
  * Copyright (C) 1999-2003		Andre Hedrick <[email protected]>
  * Portions Copyright (C) 2001	        Sun Microsystems, Inc.
@@ -114,7 +114,7 @@
  *   unify HPT36x/37x timing setup code and the speedproc handlers by joining
  *   the register setting lists into the table indexed by the clock selected
  * - set the correct hwif->ultra_mask for each individual chip
- * - add UltraDMA mode filtering for the HPT37[24] based SATA cards
+ * - add Ultra and MW DMA mode filtering for the HPT37[24] based SATA cards
  *	Sergei Shtylyov, <[email protected]> or <[email protected]>
  */
 
@@ -562,6 +562,24 @@ static u8 hpt3xx_udma_filter(ide_drive_t
 	return check_in_drive_list(drive, bad_ata33) ? 0x00 : mask;
 }
 
+static u8 hpt3xx_mdma_filter(ide_drive_t *drive)
+{
+	ide_hwif_t *hwif	= HWIF(drive);
+	struct hpt_info *info	= pci_get_drvdata(hwif->pci_dev);
+
+	switch (info->chip_type) {
+	case HPT372 :
+	case HPT372A:
+	case HPT372N:
+	case HPT374 :
+		if (ide_dev_is_sata(drive->id))
+			return 0x00;
+		/* Fall thru */
+	default:
+		return 0x07;
+	}
+}
+
 static u32 get_speed_setting(u8 speed, struct hpt_info *info)
 {
 	int i;
@@ -1257,6 +1275,7 @@ static void __devinit init_hwif_hpt366(i
 	hwif->busproc		= &hpt3xx_busproc;
 
 	hwif->udma_filter	= &hpt3xx_udma_filter;
+	hwif->mdma_filter	= &hpt3xx_mdma_filter;
 
 	/*
 	 * HPT3xxN chips have some complications:
include/linux/ide.h +1 -0
Index: linux-2.6/include/linux/ide.h
===================================================================
@@ -723,6 +723,7 @@ typedef struct hwif_s {
 	/* driver soft-power interface */
 	int	(*busproc)(ide_drive_t *, int);
 #endif
+	u8 (*mdma_filter)(ide_drive_t *);
 	u8 (*udma_filter)(ide_drive_t *);
 
 	void (*ata_input_data)(ide_drive_t *, void *, u32);
#1 lore raw

Hello, I wrote:

The patch was 4/4 of course. :-<
Probably I was too esctatic about the code. ;-)

Quoted 22 lines

The Marvell bridge chips used on HighPoint SATA cards do not seem to support the MWDMA modes (at least that caould be seen in their so-called drivers :-), so the driver needs to account for this -- to achieve this:

- add mdma_filter() method from the original patch by Bartlomiej Zolnierkewicz with his consent, also adding the method callout to ide_rate_filter();

- installed the method for all chips to only return empty mask if a SATA drive is detected onHPT372{AN]/374 chips...

---
This patch against the current Linus' tree and unfortunately I was able to only compile test it since that tree gives MODPOST warning and dies early on bootup. Will hopefully try to test if/when I have time... :-)

Index: linux-2.6/drivers/ide/pci/hpt366.c
===================================================================

drivers/ide/pci/hpt366.c line 2

Quoted 3 lines
drivers/ide/pci/hpt366.c +1 -1
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/hpt366.c		Version 1.12	Aug 25, 2007
+ * linux/drivers/ide/pci/hpt366.c		Version 1.13	Aug 22, 2007

Errr... and version shuold Aug 02 -- thought I've fixed that. :-/

MBR, Sergei

#2 lore raw
Quoted 22 lines · Sergei Shtylyov

Hello, I wrote:

The patch was 4/4 of course. :-<
Probably I was too esctatic about the code. ;-)

Quoted 16 lines

The Marvell bridge chips used on HighPoint SATA cards do not seem to support the MWDMA modes (at least that caould be seen in their so-called drivers :-), so the driver needs to account for this -- to achieve this:

- add mdma_filter() method from the original patch by Bartlomiej Zolnierkewicz with his consent, also adding the method callout to ide_rate_filter();

- installed the method for all chips to only return empty mask if a SATA drive is detected onHPT372{AN]/374 chips...

---
This patch against the current Linus' tree and unfortunately I was able to only compile test it since that tree gives MODPOST warning and dies early on bootup. Will hopefully try to test if/when I have time... :-)

Quoted 10 lines

drivers/ide/pci/hpt366.c line 2

Quoted 8 lines

Index: linux-2.6/drivers/ide/pci/hpt366.c
===================================================================

drivers/ide/pci/hpt366.c +1 -1
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/hpt366.c		Version 1.12	Aug 25, 2007
+ * linux/drivers/ide/pci/hpt366.c		Version 1.13	Aug 22, 2007

Errr... and version shuold Aug 02 -- thought I've fixed that. :-/

and we have ATA_MWDMA2 define in _vanilla_ kernel now :)

Bart

#3 lore raw
In reply to Sergei Shtylyov

Hello, I wrote:

Quoted 2 lines · Sergei Shtylyov

The patch was 4/4 of course. :-<
Probably I was too esctatic about the code. ;-)

Or rarher me. :-)

Quoted 12 lines
Quoted 11 lines

The Marvell bridge chips used on HighPoint SATA cards do not seem to support the MWDMA modes (at least that caould be seen in their so-called drivers :-), so the driver needs to account for this -- to achieve this:

- add mdma_filter() method from the original patch by Bartlomiej Zolnierkewicz
with his consent, also adding the method callout to ide_rate_filter();

- installed the method for all chips to only return empty mask if a SATA drive
is detected onHPT372{AN]/374 chips...

Quoted 6 lines
Quoted 6 lines

---
This patch against the current Linus' tree and unfortunately I was able to only compile test it since that tree gives MODPOST warning and dies early on bootup. Will hopefully try to test if/when I have time... :-)

And it was still the same -- I'd bisected if I had time...

Quoted 10 lines

drivers/ide/pci/hpt366.c line 2

Quoted 8 lines

Index: linux-2.6/drivers/ide/pci/hpt366.c
===================================================================

drivers/ide/pci/hpt366.c +1 -1
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/hpt366.c        Version 1.12    Aug 25, 2007
+ * linux/drivers/ide/pci/hpt366.c        Version 1.13    Aug 22, 2007

Errr... and version shuold Aug 02 -- thought I've fixed that. :-/

Hehe, thanks. Those versions turned to be quite PITA a to keep.

MBR, Sergei

#4 lore raw
Quoted 23 lines · Sergei Shtylyov

Hello, I wrote:

Quoted 2 lines · Sergei Shtylyov

The patch was 4/4 of course. :-<
Probably I was too esctatic about the code. ;-)

Or rarher me. :-)

Quoted 15 lines
Quoted 15 lines

The Marvell bridge chips used on HighPoint SATA cards do not seem to support
the MWDMA modes (at least that caould be seen in their so-called drivers :-),
so the driver needs to account for this -- to achieve this:

- add mdma_filter() method from the original patch by Bartlomiej Zolnierkewicz
with his consent, also adding the method callout to ide_rate_filter();

- installed the method for all chips to only return empty mask if a SATA drive
is detected onHPT372{AN]/374 chips...

I pushed all your bugfix patches that were in IDE tree to Linus so (after "the pull") please resync and resend the outstanding patches.

Quoted 8 lines
Quoted 6 lines
Quoted 6 lines

---
This patch against the current Linus' tree and unfortunately I was able to only
compile test it since that tree gives MODPOST warning and dies early on bootup.
Will hopefully try to test if/when I have time... :-)

And it was still the same -- I'd bisected if I had time...

:(

Quoted 11 lines
Quoted 10 lines

drivers/ide/pci/hpt366.c line 2

Quoted 8 lines

Index: linux-2.6/drivers/ide/pci/hpt366.c
===================================================================

drivers/ide/pci/hpt366.c +1 -1
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/hpt366.c        Version 1.12    Aug 25, 2007
+ * linux/drivers/ide/pci/hpt366.c        Version 1.13    Aug 22, 2007

Errr... and version shuold Aug 02 -- thought I've fixed that. :-/

Quoted 1 line

Hehe, thanks. Those versions turned to be quite PITA a to keep.

I think we should get rid of these "old-style" versions and convert all IDE host drivers to use "new-style" versions (DRV_VERSION define
+ MODULE_VERSION(DRV_VERSION)). Any volunteers? :)

Thanks,
Bart