public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Martin Dalecki <dalecki@evision-ventures.com>
To: Linus Torvalds <torvalds@transmeta.com>
Cc: Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] 2.5.21 ide 92
Date: Sun, 16 Jun 2002 20:36:24 +0200	[thread overview]
Message-ID: <3D0CDAA8.9090409@evision-ventures.com> (raw)
In-Reply-To: Pine.LNX.4.33.0206082235240.4635-100000@penguin.transmeta.com

[-- Attachment #1: Type: text/plain, Size: 984 bytes --]

Fri Jun 14 15:32:38 CEST 2002 ide-clean-92

- Finally unify task_in_intr and task_mulin_intr. One crucial code path less to
   watch out, but a quite dangerous step in itself. PIO reading is functional
   again. The next step will be the unification of the write path of course.

- Introduce a small helper for the execution of task file commands which
   basically just send a simple command down to the drive.

- Add a buffer parameter to ide_raw_taskfile allowing to unify the handling of
   ioctl and normal ide_raw_taskfile request.

- Fix some small function pointer type mismatches.

Apply more host chip controller clenups by Bartlomiej:

- move setting drive->current_speed from *_tune_chipset()
	  to ide_config_drive_speed()

cmd64x.c:
	- convert cmd64x_tuneproc() to use ata-timing library
	- clean cmd64x_tune_chipset() and cmd680_tune_chipset()

hpt366.c:
	- remove empty timings table

it8172.c:
	- kill prototypes
	- update to new udma_setup() scheme

+ misc cleanups

[-- Attachment #2: ide-clean-92.diff --]
[-- Type: text/plain, Size: 46959 bytes --]

diff -urN linux-2.5.21/arch/i386/kernel/dmi_scan.c linux/arch/i386/kernel/dmi_scan.c
--- linux-2.5.21/arch/i386/kernel/dmi_scan.c	2002-06-09 07:29:00.000000000 +0200
+++ linux/arch/i386/kernel/dmi_scan.c	2002-06-16 01:39:27.000000000 +0200
@@ -185,28 +185,6 @@
 #define NO_MATCH	{ NONE, NULL}
 #define MATCH(a,b)	{ a, b }
 
-/*
- *	We have problems with IDE DMA on some platforms. In paticular the
- *	KT7 series. On these it seems the newer BIOS has fixed them. The
- *	rule needs to be improved to match specific BIOS revisions with
- *	corruption problems
- */ 
- 
-#if 0
-static __init int disable_ide_dma(struct dmi_blacklist *d)
-{
-#ifdef CONFIG_BLK_DEV_IDE
-	extern int noautodma;
-	if(noautodma == 0)
-	{
-		noautodma = 1;
-		printk(KERN_INFO "%s series board detected. Disabling IDE DMA.\n", d->ident);
-	}
-#endif	
-	return 0;
-}
-#endif
-
 /* 
  * Reboot options and system auto-detection code provided by
  * Dell Computer Corporation so their systems "just work". :-)
@@ -511,12 +489,6 @@
  */
  
 static __initdata struct dmi_blacklist dmi_blacklist[]={
-#if 0
-	{ disable_ide_dma, "KT7", {	/* Overbroad right now - kill DMA on problem KT7 boards */
-			MATCH(DMI_PRODUCT_NAME, "KT7-RAID"),
-			NO_MATCH, NO_MATCH, NO_MATCH
-			} },
-#endif			
 	{ broken_ps2_resume, "Dell Latitude C600", {	/* Handle problems with APM on the C600 */
 			MATCH(DMI_SYS_VENDOR, "Dell"),
 			MATCH(DMI_PRODUCT_NAME, "Latitude C600"),
diff -urN linux-2.5.21/drivers/ide/aec62xx.c linux/drivers/ide/aec62xx.c
--- linux-2.5.21/drivers/ide/aec62xx.c	2002-06-14 12:45:00.000000000 +0200
+++ linux/drivers/ide/aec62xx.c	2002-06-14 16:11:19.000000000 +0200
@@ -141,8 +141,6 @@
 	else
 		aec_set_speed_new(drive->channel->pci_dev, drive->dn, &t);
 
-	drive->current_speed = speed;
-
 	return 0;
 }
 
diff -urN linux-2.5.21/drivers/ide/alim15x3.c linux/drivers/ide/alim15x3.c
--- linux-2.5.21/drivers/ide/alim15x3.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/alim15x3.c	2002-06-14 16:11:27.000000000 +0200
@@ -53,6 +53,7 @@
 
 	t = ata_timing_data(pio);
 
+	/* FIXME: use generic ata-timing library  --bkz */
 	s_time = t->setup;
 	a_time = t->active;
 	if ((s_clc = (s_time * system_bus_speed + 999999) / 1000000) >= 8)
@@ -171,8 +172,6 @@
 	}
 #endif /* CONFIG_BLK_DEV_IDEDMA */
 
-	drive->current_speed = speed;
-
 	return ide_config_drive_speed(drive, speed);
 }
 
diff -urN linux-2.5.21/drivers/ide/amd74xx.c linux/drivers/ide/amd74xx.c
--- linux-2.5.21/drivers/ide/amd74xx.c	2002-06-09 07:30:30.000000000 +0200
+++ linux/drivers/ide/amd74xx.c	2002-06-14 16:11:19.000000000 +0200
@@ -153,8 +153,6 @@
 
 	amd_set_speed(drive->channel->pci_dev, drive->dn, &t);
 
-	drive->current_speed = speed;
-
 	return 0;
 }
 
diff -urN linux-2.5.21/drivers/ide/cmd64x.c linux/drivers/ide/cmd64x.c
--- linux-2.5.21/drivers/ide/cmd64x.c	2002-06-14 12:45:13.000000000 +0200
+++ linux/drivers/ide/cmd64x.c	2002-06-14 16:11:27.000000000 +0200
@@ -156,26 +156,27 @@
  * 8: prefetch off, 9: prefetch on, 255: auto-select best mode.
  * Called with 255 at boot time.
  */
-static void cmd64x_tuneproc(struct ata_device *drive, byte mode_wanted)
+static void cmd64x_tuneproc(struct ata_device *drive, u8 pio)
 {
-	int recovery_time, clock_time;
-	u8 recovery_count2, cycle_count, speed;
-	int setup_count, active_count, recovery_count;
+	int T;
+	u8 speed, active, recover;
 	struct ata_timing *t;
 
-	switch (mode_wanted) {
+	switch (pio) {
+		/* FIXME: b0rken  --bkz */
 		case 8: /* set prefetch off */
 		case 9: /* set prefetch on */
-			mode_wanted &= 1;
+			pio &= 1;
 			/*set_prefetch_mode(index, mode_wanted);*/
-			cmdprintk("%s: %sabled cmd640 prefetch\n", drive->name, mode_wanted ? "en" : "dis");
+			cmdprintk("%s: %sabled cmd640 prefetch\n", drive->name,
+				  pio ? "en" : "dis");
 			return;
 	}
 
-	if (mode_wanted == 255)
+	if (pio == 255)
 		speed = ata_best_pio_mode(drive);
 	else
-		speed = XFER_PIO_0 + min_t(u8, mode_wanted, 4);
+		speed = XFER_PIO_0 + min_t(u8, pio, 4);
 
 	t = ata_timing_data(speed);
 
@@ -183,24 +184,21 @@
 	 * I copied all this complicated stuff from cmd640.c and made a few minor changes.
 	 * For now I am just going to pray that it is correct.
 	 */
-	/* FIXME: try to use generic ata-timings library  --bkz */
+	/* FIXME: verify it  --bkz */
+
+	T = 1000000000 / system_bus_speed;
+	ata_timing_quantize(t, t, T, T);
 
-	recovery_time = t->cycle - (t->setup + t->active);
-	clock_time = 1000000 / system_bus_speed;
-	cycle_count = (t->cycle + clock_time - 1) / clock_time;
-	setup_count = (t->setup + clock_time - 1) / clock_time;
-	active_count = (t->active + clock_time - 1) / clock_time;
-
-	recovery_count = (recovery_time + clock_time - 1) / clock_time;
-	recovery_count2 = cycle_count - (setup_count + active_count);
-	if (recovery_count2 > recovery_count)
-		recovery_count = recovery_count2;
-	if (recovery_count > 16) {
-		active_count += recovery_count - 16;
-		recovery_count = 16;
+	/* FIXME: maybe switch to ata_timing_compute()  --bkz */
+	recover = t->cycle - (t->setup + t->active);
+	active = t->active;
+
+	if (recover > 16) {
+		active += recover - 16;
+		recover = 16;
 	}
-	if (active_count > 16)
-		active_count = 16; /* maximum allowed by cmd646 */
+	if (active > 16)
+		active = 16;	/* maximum allowed by CMD646 */
 
 	/*
 	 * In a perfect world, we might set the drive pio mode here
@@ -210,13 +208,12 @@
 	 *	1) this is the wrong place to do it (proper is do_special() in ide.c)
 	 * 	2) in practice this is rarely, if ever, necessary
 	 */
-	program_drive_counts (drive, setup_count, active_count, recovery_count);
+	program_drive_counts(drive, t->setup, active, recover);
 
 	cmdprintk("%s: selected cmd646 PIO mode%d : %d (%dns), clocks=%d/%d/%d\n",
-		drive->name, t.mode - XFER_PIO_0, mode_wanted, cycle_time,
-		setup_count, active_count, recovery_count);
+		drive->name, t.mode - XFER_PIO_0, pio, t->cycle,
+		t->setup, active, recover);
 
-	drive->current_speed = speed;
 	ide_config_drive_speed(drive, speed);
 }
 
@@ -237,7 +234,7 @@
 			break;
 		case PCI_DEVICE_ID_CMD_646:
 		{
-			unsigned int class_rev	= 0;
+			u32 class_rev;
 			pci_read_config_dword(dev,
 				PCI_CLASS_REVISION, &class_rev);
 			class_rev &= 0xff;
@@ -332,11 +329,10 @@
 
 	speed = XFER_PIO_0 + min_t(u8, pio, 4);
 
-	drive->current_speed = speed;
 	ide_config_drive_speed(drive, speed);
 }
 
-static int cmd64x_tune_chipset(struct ata_device *drive, byte speed)
+static int cmd64x_tune_chipset(struct ata_device *drive, u8 speed)
 {
 #ifdef CONFIG_BLK_DEV_IDEDMA
 	struct ata_channel *hwif = drive->channel;
@@ -345,34 +341,40 @@
 	u8 unit			= (drive->select.b.unit & 0x01);
 	u8 pciU			= (hwif->unit) ? UDIDETCR1 : UDIDETCR0;
 	u8 pciD			= (hwif->unit) ? BMIDESR1 : BMIDESR0;
-	u8 regU, regD;
+	u8 regU, regD, U = 0, D = 0;
 
 	if ((drive->type != ATA_DISK) && (speed < XFER_SW_DMA_0))
 		return 1;
 
-	(void) pci_read_config_byte(dev, pciD, &regD);
-	(void) pci_read_config_byte(dev, pciU, &regU);
+	pci_read_config_byte(dev, pciD, &regD);
+	pci_read_config_byte(dev, pciU, &regU);
+
+	/* unit 1 - 01000000b	unit 0 - 00100000b */
 	regD &= ~(unit ? 0x40 : 0x20);
+
+	/* unit 1 - 11001010b	unit 0 - 00110101b */
 	regU &= ~(unit ? 0xCA : 0x35);
-	(void) pci_write_config_byte(dev, pciD, regD);
-	(void) pci_write_config_byte(dev, pciU, regU);
 
-	(void) pci_read_config_byte(dev, pciD, &regD);
-	(void) pci_read_config_byte(dev, pciU, &regU);
-	/* FIXME: get unit checking out of here  --bkz */
+	pci_write_config_byte(dev, pciD, regD);
+	pci_write_config_byte(dev, pciU, regU);
+
+	pci_read_config_byte(dev, pciD, &regD);
+	pci_read_config_byte(dev, pciU, &regU);
+
 	switch(speed) {
-		case XFER_UDMA_5:	regU |= (unit ? 0x0A : 0x05); break;
-		case XFER_UDMA_4:	regU |= (unit ? 0x4A : 0x15); break;
-		case XFER_UDMA_3:	regU |= (unit ? 0x8A : 0x25); break;
-		case XFER_UDMA_2:	regU |= (unit ? 0x42 : 0x11); break;
-		case XFER_UDMA_1:	regU |= (unit ? 0x82 : 0x21); break;
-		case XFER_UDMA_0:	regU |= (unit ? 0xC2 : 0x31); break;
-		case XFER_MW_DMA_2:	regD |= (unit ? 0x40 : 0x10); break;
-		case XFER_MW_DMA_1:	regD |= (unit ? 0x80 : 0x20); break;
-		case XFER_MW_DMA_0:	regD |= (unit ? 0xC0 : 0x30); break;
-		case XFER_SW_DMA_2:	regD |= (unit ? 0x40 : 0x10); break;
-		case XFER_SW_DMA_1:	regD |= (unit ? 0x80 : 0x20); break;
-		case XFER_SW_DMA_0:	regD |= (unit ? 0xC0 : 0x30); break;
+		/* FIXME: use tables  --bkz */
+		case XFER_UDMA_5:	U = 0x05; break;
+		case XFER_UDMA_4:	U = 0x15; break;
+		case XFER_UDMA_3:	U = 0x25; break;
+		case XFER_UDMA_2:	U = 0x11; break;
+		case XFER_UDMA_1:	U = 0x21; break;
+		case XFER_UDMA_0:	U = 0x31; break;
+		case XFER_MW_DMA_2:	D = 0x10; break;
+		case XFER_MW_DMA_1:	D = 0x20; break;
+		case XFER_MW_DMA_0:	D = 0x30; break;
+		case XFER_SW_DMA_2:	D = 0x10; break;
+		case XFER_SW_DMA_1:	D = 0x20; break;
+		case XFER_SW_DMA_0:	D = 0x30; break;
 #else
 	switch(speed) {
 #endif /* CONFIG_BLK_DEV_IDEDMA */
@@ -390,15 +392,22 @@
 
 	cmd64x_tuneproc(drive, 255);
 #ifdef CONFIG_BLK_DEV_IDEDMA
-	(void) pci_write_config_byte(dev, pciU, regU);
-#endif /* CONFIG_BLK_DEV_IDEDMA */
 
-	drive->current_speed = speed;
+	if (unit) {
+		if (speed >= XFER_UDMA_0)
+			regU |= (((U & 0xf0) << 2) | ((U & 0x0f) << 1));
+		else if (speed >= XFER_SW_DMA_0)
+			regD |= ((D & 0xf0) << 2);
+	} else {
+		regU |= U;
+		regD |= D;
+	}
+
+	pci_write_config_byte(dev, pciU, regU);
 
-#ifdef CONFIG_BLK_DEV_IDEDMA
 	regD |= (unit ? 0x40 : 0x20);
-	(void) pci_write_config_byte(dev, pciD, regD);
-#endif /* CONFIG_BLK_DEV_IDEDMA */
+	pci_write_config_byte(dev, pciD, regD);
+#endif
 
 	return ide_config_drive_speed(drive, speed);
 }
@@ -410,19 +419,20 @@
 	u8 addr_mask		= (hwif->unit) ? 0x84 : 0x80;
 	u8 unit			= (drive->select.b.unit & 0x01);
 	u8 dma_pci, udma_pci;
-	u8 mode_pci, scsc;
+	u8 mode_pci, scsc, scsc_on = 0;
 	u16 ultra, multi;
 
         pci_read_config_byte(dev, addr_mask, &mode_pci);
 	pci_read_config_byte(dev, 0x8A, &scsc);
 
         switch (drive->dn) {
-		case 0: dma_pci = 0xA8; udma_pci = 0xAC; break;
-		case 1: dma_pci = 0xAA; udma_pci = 0xAE; break;
-		case 2: dma_pci = 0xB8; udma_pci = 0xBC; break;
-		case 3: dma_pci = 0xBA; udma_pci = 0xBE; break;
+		case 0: dma_pci = 0xA8; break;
+		case 1: dma_pci = 0xAA; break;
+		case 2: dma_pci = 0xB8; break;
+		case 3: dma_pci = 0xBA; break;
 		default: return 1;
 	}
+	udma_pci = dma_pci + 4;
 
 	pci_read_config_byte(dev, addr_mask, &mode_pci);
 	mode_pci &= ~((unit) ? 0x30 : 0x03);
@@ -434,46 +444,38 @@
 		pci_read_config_byte(dev, 0x8A, &scsc);
 	}
 
+	if (speed >= XFER_UDMA_0) {
+		ultra &= ~0x3F;
+		multi = 0x10C1;
+		scsc_on = ((scsc & 0x30) == 0x00) ? 1 : 0;
+	}
+
 	switch(speed) {
 #ifdef CONFIG_BLK_DEV_IDEDMA
 		case XFER_UDMA_6:
-			if ((scsc & 0x30) == 0x00)
+			if (scsc_on)
 				goto speed_break;
-			multi = 0x10C1;
-			ultra &= ~0x3F;
 			ultra |= 0x01;
 			break;
 speed_break :
 			speed = XFER_UDMA_5;
 		case XFER_UDMA_5:
-			multi = 0x10C1;
-			ultra &= ~0x3F;
-			ultra |= (((scsc & 0x30) == 0x00) ? 0x01 : 0x02);
+			ultra |= (scsc_on ? 0x01 : 0x02);
 			break;
 		case XFER_UDMA_4:
-			multi = 0x10C1;
-			ultra &= ~0x3F;
-			ultra |= (((scsc & 0x30) == 0x00) ? 0x02 : 0x03);
+			ultra |= (scsc_on ? 0x02 : 0x03);
 			break;
 		case XFER_UDMA_3:
-			multi = 0x10C1;
-			ultra &= ~0x3F;
-			ultra |= (((scsc & 0x30) == 0x00) ? 0x04 : 0x05);
+			ultra |= (scsc_on ? 0x04 : 0x05);
 			break;
 		case XFER_UDMA_2:
-			multi = 0x10C1;
-			ultra &= ~0x3F;
-			ultra |= (((scsc & 0x30) == 0x00) ? 0x05 : 0x07);
+			ultra |= (scsc_on ? 0x05 : 0x07);
 			break;
 		case XFER_UDMA_1:
-			multi = 0x10C1;
-			ultra &= ~0x3F;
-			ultra |= (((scsc & 0x30) == 0x00) ? 0x07 : 0x0B);
+			ultra |= (scsc_on ? 0x07 : 0x0B);
 			break;
 		case XFER_UDMA_0:
-			multi = 0x10C1;
-			ultra &= ~0x3F;
-			ultra |= (((scsc & 0x30) == 0x00) ? 0x0C : 0x0F);
+			ultra |= (scsc_on ? 0x0C : 0x0F);
 			break;
 		case XFER_MW_DMA_2:
 			multi = 0x10C1;
@@ -509,8 +511,6 @@
 	pci_write_config_word(dev, dma_pci, multi);
 	pci_write_config_word(dev, udma_pci, ultra);
 
-	drive->current_speed = speed;
-
 	return ide_config_drive_speed(drive, speed);
 }
 
@@ -520,11 +520,6 @@
 	int map;
 	u8 mode;
 
-	if (drive->type != ATA_DISK) {
-		cmdprintk("CMD64X: drive is not a disk at double check, inital check failed!!\n");
-		return 0;
-	}
-
 	if (udma)
 		map = cmd64x_ratemask(drive);
 	else
@@ -728,8 +723,8 @@
 
 static unsigned int cmd64x_pci_init(struct pci_dev *dev)
 {
-	unsigned char mrdmode;
-	unsigned int class_rev;
+	u8 mrdmode;
+	u32 class_rev;
 
 	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
 	class_rev &= 0xff;
diff -urN linux-2.5.21/drivers/ide/Config.help linux/drivers/ide/Config.help
--- linux-2.5.21/drivers/ide/Config.help	2002-06-14 12:45:00.000000000 +0200
+++ linux/drivers/ide/Config.help	2002-06-16 02:37:54.000000000 +0200
@@ -372,6 +372,8 @@
   HPT366 is an Ultra DMA chipset for ATA-66.
   HPT368 is an Ultra DMA chipset for ATA-66 RAID Based.
   HPT370 is an Ultra DMA chipset for ATA-100.
+  HPT372 is an Ultra DMA chipset for ATA-100.
+  HPT374 is an Ultra DMA chipset for ATA-100.
 
   This driver adds up to 4 more EIDE devices sharing a single
   interrupt.
diff -urN linux-2.5.21/drivers/ide/Config.in linux/drivers/ide/Config.in
--- linux-2.5.21/drivers/ide/Config.in	2002-06-14 12:45:00.000000000 +0200
+++ linux/drivers/ide/Config.in	2002-06-16 02:37:14.000000000 +0200
@@ -50,7 +50,7 @@
       dep_bool '    Cyrix CS5530 MediaGX chipset support' CONFIG_BLK_DEV_CS5530 $CONFIG_BLK_DEV_IDEDMA_PCI
       dep_bool '    HPT34X chipset support' CONFIG_BLK_DEV_HPT34X $CONFIG_BLK_DEV_IDEDMA_PCI
       dep_mbool '      HPT34X AUTODMA support (EXPERMENTAL)' CONFIG_HPT34X_AUTODMA $CONFIG_BLK_DEV_HPT34X $CONFIG_EXPERIMENTAL
-      dep_bool '    HPT366 chipset support' CONFIG_BLK_DEV_HPT366 $CONFIG_BLK_DEV_IDEDMA_PCI
+      dep_bool '    HPT36X/37X chipset support' CONFIG_BLK_DEV_HPT366 $CONFIG_BLK_DEV_IDEDMA_PCI
       dep_bool '    Intel and Efar (SMsC) chipset support' CONFIG_BLK_DEV_PIIX $CONFIG_BLK_DEV_IDEDMA_PCI
       if [ "$CONFIG_MIPS_ITE8172" = "y" -o "$CONFIG_MIPS_IVR" = "y" ]; then
          dep_mbool '    IT8172 IDE support' CONFIG_BLK_DEV_IT8172 $CONFIG_BLK_DEV_IDEDMA_PCI
diff -urN linux-2.5.21/drivers/ide/cy82c693.c linux/drivers/ide/cy82c693.c
--- linux-2.5.21/drivers/ide/cy82c693.c	2002-06-14 12:45:05.000000000 +0200
+++ linux/drivers/ide/cy82c693.c	2002-06-14 16:11:27.000000000 +0200
@@ -204,7 +204,7 @@
 	data = IN_BYTE(CY82_DATA_PORT);
 
 	printk (KERN_INFO "%s (ch=%d, dev=%d): DMA mode is %d (single=%d)\n", drive->name, drive->channel->unit, drive->select.b.unit, (data&0x3), ((data>>2)&1));
-#endif /* CY82C693_DEBUG_LOGS */
+#endif
 
 	data = (byte)mode|(byte)(single<<2);
 
@@ -213,7 +213,7 @@
 
 #if CY82C693_DEBUG_INFO
 	printk (KERN_INFO "%s (ch=%d, dev=%d): set DMA mode to %d (single=%d)\n", drive->name, drive->channel->unit, drive->select.b.unit, mode, single);
-#endif /* CY82C693_DEBUG_INFO */
+#endif
 
 	/*
 	 * note: below we set the value for Bus Master IDE TimeOut Register
@@ -231,7 +231,7 @@
 
 #if CY82C693_DEBUG_INFO
 	printk (KERN_INFO "%s: Set IDE Bus Master TimeOut Register to 0x%X\n", drive->name, data);
-#endif /* CY82C693_DEBUG_INFO */
+#endif
 }
 
 /*
@@ -331,7 +331,7 @@
 
 #if CY82C693_DEBUG_INFO
 	printk (KERN_INFO "%s: Selected PIO mode %d\n", drive->name, pio);
-#endif /* CY82C693_DEBUG_INFO */
+#endif
 
         compute_clocks(pio, &pclk);  /* let's calc the values for this PIO mode */
 
diff -urN linux-2.5.21/drivers/ide/hpt34x.c linux/drivers/ide/hpt34x.c
--- linux-2.5.21/drivers/ide/hpt34x.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/hpt34x.c	2002-06-14 16:11:19.000000000 +0200
@@ -63,7 +63,6 @@
 		udma, pio, err);
 #endif
 
-	drive->current_speed = speed;
 	return ide_config_drive_speed(drive, speed);
 }
 
diff -urN linux-2.5.21/drivers/ide/hpt366.c linux/drivers/ide/hpt366.c
--- linux-2.5.21/drivers/ide/hpt366.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/hpt366.c	2002-06-14 16:14:21.000000000 +0200
@@ -140,7 +140,7 @@
 	unsigned int	chipset_settings;
 };
 
-/* key for bus clock timings
+/* key for bus clock timings for HPT370
  * bit
  * 0:3    data_high_time. inactive time of DIOW_/DIOR_ for PIO and MW
  *        DMA. cycles = value + 1
@@ -409,26 +409,6 @@
 };
 
 #if 0
-static struct chipset_bus_clock_list_entry fifty_base_hpt374[] = {
-	{	XFER_UDMA_6,	},
-	{	XFER_UDMA_5,	},
-	{	XFER_UDMA_4,	},
-	{	XFER_UDMA_3,	},
-	{	XFER_UDMA_2,	},
-	{	XFER_UDMA_1,	},
-	{	XFER_UDMA_0,	},
-	{	XFER_MW_DMA_2,	},
-	{	XFER_MW_DMA_1,	},
-	{	XFER_MW_DMA_0,	},
-	{	XFER_PIO_4,	},
-	{	XFER_PIO_3,	},
-	{	XFER_PIO_2,	},
-	{	XFER_PIO_1,	},
-	{	XFER_PIO_0,	},
-	{	0,	}
-};
-#endif
-#if 0
 static struct chipset_bus_clock_list_entry sixty_six_base_hpt374[] = {
 	{	XFER_UDMA_6,	0x12406231	},	/* checkme */
 	{	XFER_UDMA_5,	0x12446231	},
@@ -678,21 +658,13 @@
 	} else {
                 hpt366_tune_chipset(drive, speed);
         }
-	drive->current_speed = speed;
+
 	return ide_config_drive_speed(drive, speed);
 }
 
 static void hpt3xx_tune_drive(struct ata_device *drive, u8 pio)
 {
-	u8 speed;
-	switch(pio) {
-		case 4:		speed = XFER_PIO_4;break;
-		case 3:		speed = XFER_PIO_3;break;
-		case 2:		speed = XFER_PIO_2;break;
-		case 1:		speed = XFER_PIO_1;break;
-		default:	speed = XFER_PIO_0;break;
-	}
-	(void) hpt3xx_tune_chipset(drive, speed);
+	(void) hpt3xx_tune_chipset(drive, XFER_PIO_0 + min_t(u8, pio, 4));
 }
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
diff -urN linux-2.5.21/drivers/ide/ide.c linux/drivers/ide/ide.c
--- linux-2.5.21/drivers/ide/ide.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/ide.c	2002-06-16 16:10:28.000000000 +0200
@@ -560,7 +560,7 @@
 		memset(&args, 0, sizeof(args));
 		args.taskfile.sector_count = drive->sect;
 		args.cmd = WIN_RESTORE;
-		ide_raw_taskfile(drive, &args);
+		ide_raw_taskfile(drive, &args, NULL);
 		printk(KERN_INFO "%s: done!\n", drive->name);
 	}
 
diff -urN linux-2.5.21/drivers/ide/ide-disk.c linux/drivers/ide/ide-disk.c
--- linux-2.5.21/drivers/ide/ide-disk.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/ide-disk.c	2002-06-16 19:29:02.000000000 +0200
@@ -93,61 +93,74 @@
 /*
  * Handler for command with PIO data-in phase.
  */
-static ide_startstop_t task_in_intr(struct ata_device *drive, struct request *rq)
+static ide_startstop_t pio_in_intr(struct ata_device *drive, struct request *rq)
 {
 	unsigned long flags;
 	struct ata_channel *ch = drive->channel;
-	int ret;
+	unsigned int msect;
 
 	spin_lock_irqsave(ch->lock, flags);
-
 	if (!ata_status(drive, DATA_READY, BAD_R_STAT)) {
-		if (drive->status & (ERR_STAT | DRQ_STAT)) {
+		if (drive->status & (ERR_STAT|DRQ_STAT)) {
 			spin_unlock_irqrestore(ch->lock, flags);
 
 			return ata_error(drive, rq, __FUNCTION__);
 		}
 
-		/* no data yet, so wait for another interrupt */
-		ata_set_handler(drive, task_in_intr, WAIT_CMD, NULL);
+		if (!(drive->status & BUSY_STAT))
+			goto cont;
+	}
 
-		ret = ide_started;
-	} else {
+	msect = drive->mult_count;
+	do {
+		unsigned int nsect;
 
-		//	printk("Read: %p, rq->current_nr_sectors: %d\n", buf, (int) rq->current_nr_sectors);
+		if (drive->mult_count) {
+			nsect = rq->current_nr_sectors;
+			/* Don't try to transfer more sectors at once then one
+			 * multi sector command can swallow.
+			 */
+			if (nsect > msect)
+				nsect = msect;
+		} else {
+			nsect = rq->current_nr_sectors;
+			nsect = 1;
+		}
+
+//		printk("Read: rq->current_nr_sectors: %d %d %d\n", msect, nsect,  (int) rq->current_nr_sectors);
 		{
 			unsigned long flags;
 			char *buf;
 
 			buf = ide_map_rq(rq, &flags);
-			ata_read(drive, buf, SECTOR_WORDS);
+			ata_read(drive, buf, nsect * SECTOR_WORDS);
 			ide_unmap_rq(rq, buf, &flags);
 		}
 
-		/* First segment of the request is complete. note that this does not
-		 * necessarily mean that the entire request is done!! this is only true
-		 * if ata_end_request() returns 0.
+		/* Segment of the request is complete. note that this does not
+		 * necessarily mean that the entire request is done!! this is
+		 * only true if ata_end_request() returns 0.
 		 */
+
 		rq->errors = 0;
-		--rq->current_nr_sectors;
+		rq->current_nr_sectors -= nsect;
 
 		if (rq->current_nr_sectors <= 0) {
 			if (!__ata_end_request(drive, rq, 1, 0)) {
-			//		printk("Request Ended stat: %02x\n", drive->status);
 				spin_unlock_irqrestore(ch->lock, flags);
 
 				return ide_stopped;
 			}
 		}
+		msect -= nsect;
+	} while (msect > 0);
 
-		/* still data left to transfer */
-		ata_set_handler(drive, task_in_intr,  WAIT_CMD, NULL);
-
-		ret = ide_started;
-	}
+cont:
+	/* still data left to transfer */
+	ata_set_handler(drive, pio_in_intr,  WAIT_CMD, NULL);
 	spin_unlock_irqrestore(ch->lock, flags);
 
-	return ret;
+	return ide_started;
 }
 
 /*
@@ -190,77 +203,6 @@
 	return ret;
 }
 
-/*
- * Handler for command with Read Multiple
- */
-static ide_startstop_t task_mulin_intr(struct ata_device *drive, struct request *rq)
-{
-	unsigned long flags;
-	struct ata_channel *ch = drive->channel;
-	int ret;
-
-	spin_lock_irqsave(ch->lock, flags);
-	if (!ata_status(drive, DATA_READY, BAD_R_STAT)) {
-		if (drive->status & (ERR_STAT | DRQ_STAT)) {
-			spin_unlock_irqrestore(ch->lock, flags);
-
-			return ata_error(drive, rq, __FUNCTION__);
-		}
-
-		/* no data yet, so wait for another interrupt */
-		ata_set_handler(drive, task_mulin_intr, WAIT_CMD, NULL);
-
-		ret = ide_started;
-	} else {
-		unsigned int msect;
-
-		/* (ks/hs): Fixed Multi-Sector transfer */
-		msect = drive->mult_count;
-
-		do {
-			unsigned int nsect;
-
-			nsect = rq->current_nr_sectors;
-			if (nsect > msect)
-				nsect = msect;
-
-#if 0
-			printk("Multiread: %p, nsect: %d , rq->current_nr_sectors: %d\n",
-					buf, nsect, rq->current_nr_sectors);
-#endif
-			{
-				unsigned long flags;
-				char *buf;
-
-				buf = ide_map_rq(rq, &flags);
-				ata_read(drive, buf, nsect * SECTOR_WORDS);
-				ide_unmap_rq(rq, buf, &flags);
-			}
-
-			rq->errors = 0;
-			rq->current_nr_sectors -= nsect;
-
-			/* FIXME: this seems buggy */
-			if (rq->current_nr_sectors <= 0) {
-				if (!__ata_end_request(drive, rq, 1, 0)) {
-					spin_unlock_irqrestore(ch->lock, flags);
-
-					return ide_stopped;
-				}
-			}
-			msect -= nsect;
-		} while (msect);
-
-		/* more data left */
-		ata_set_handler(drive, task_mulin_intr, WAIT_CMD, NULL);
-
-		ret = ide_started;
-	}
-	spin_unlock_irqrestore(ch->lock, flags);
-
-	return ret;
-}
-
 static ide_startstop_t task_mulout_intr(struct ata_device *drive, struct request *rq)
 {
 	unsigned long flags;
@@ -610,10 +552,10 @@
 			} else if (drive->using_dma) {
 				args.cmd = WIN_READDMA_EXT;
 			} else if (drive->mult_count) {
-				args.XXX_handler = task_mulin_intr;
+				args.XXX_handler = pio_in_intr;
 				args.cmd = WIN_MULTREAD_EXT;
 			} else {
-				args.XXX_handler = task_in_intr;
+				args.XXX_handler = pio_in_intr;
 				args.cmd = WIN_READ_EXT;
 			}
 		} else {
@@ -622,11 +564,10 @@
 			} else if (drive->using_dma) {
 				args.cmd = WIN_READDMA;
 			} else if (drive->mult_count) {
-				/* FIXME : Shouldn't this be task_mulin_intr?! */
-				args.XXX_handler = task_in_intr;
+				args.XXX_handler = pio_in_intr;
 				args.cmd = WIN_MULTREAD;
 			} else {
-				args.XXX_handler = task_in_intr;
+				args.XXX_handler = pio_in_intr;
 				args.cmd = WIN_READ;
 			}
 		}
@@ -673,6 +614,19 @@
 	return __do_request(drive, &args, rq);
 }
 
+/*
+ * Small helper function used to execute simple commands.
+ */
+static int simple_taskfile(struct ata_device *drive, u8 cmd)
+{
+	struct ata_taskfile args;
+
+	memset(&args, 0, sizeof(args));
+	args.cmd = cmd;
+
+	return ide_raw_taskfile(drive, &args, NULL);
+}
+
 static int idedisk_open(struct inode *inode, struct file *__fp, struct ata_device *drive)
 {
 	MOD_INC_USE_COUNT;
@@ -681,15 +635,11 @@
 
 		/*
 		 * Ignore the return code from door_lock, since the open() has
-		 * already succeeded once, and the door_lock is irrelevant at this
-		 * time.
+		 * already succeeded once, and the door_lock is irrelevant at
+		 * this time.
 		 */
 		if (drive->doorlocking) {
-			struct ata_taskfile args;
-
-			memset(&args, 0, sizeof(args));
-			args.cmd = WIN_DOORLOCK;
-			if (ide_raw_taskfile(drive, &args))
+			if (simple_taskfile(drive, WIN_DOORLOCK))
 				drive->doorlocking = 0;
 		}
 	}
@@ -699,30 +649,21 @@
 
 static int flush_cache(struct ata_device *drive)
 {
-	struct ata_taskfile args;
-
-	memset(&args, 0, sizeof(args));
+	u8 cmd;
 
 	if (drive->id->cfs_enable_2 & 0x2400)
-		args.cmd = WIN_FLUSH_CACHE_EXT;
+		cmd = WIN_FLUSH_CACHE_EXT;
 	else
-		args.cmd = WIN_FLUSH_CACHE;
+		cmd = WIN_FLUSH_CACHE;
 
-	return ide_raw_taskfile(drive, &args);
+	return simple_taskfile(drive, cmd);
 }
 
 static void idedisk_release(struct inode *inode, struct file *filp, struct ata_device *drive)
 {
 	if (drive->removable && !drive->usage) {
-		/* XXX I don't think this is up to the lowlevel drivers..  --hch */
-		invalidate_bdev(inode->i_bdev, 0);
-
 		if (drive->doorlocking) {
-			struct ata_taskfile args;
-
-			memset(&args, 0, sizeof(args));
-			args.cmd = WIN_DOORUNLOCK;
-			if (ide_raw_taskfile(drive, &args))
+			if (simple_taskfile(drive, WIN_DOORUNLOCK))
 				drive->doorlocking = 0;
 		}
 	}
@@ -769,7 +710,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.sector_count = arg;
 	args.cmd = WIN_SETMULT;
-	if (!ide_raw_taskfile(drive, &args)) {
+	if (!ide_raw_taskfile(drive, &args, NULL)) {
 		/* all went well track this setting as valid */
 		drive->mult_count = arg;
 
@@ -798,7 +739,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.feature	= (arg) ? SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE;
 	args.cmd = WIN_SETFEATURES;
-	ide_raw_taskfile(drive, &args);
+	ide_raw_taskfile(drive, &args, NULL);
 
 	drive->wcache = arg;
 
@@ -807,11 +748,7 @@
 
 static int idedisk_standby(struct ata_device *drive)
 {
-	struct ata_taskfile args;
-
-	memset(&args, 0, sizeof(args));
-	args.cmd = WIN_STANDBYNOW1;
-	return ide_raw_taskfile(drive, &args);
+	return simple_taskfile(drive, WIN_STANDBYNOW1);
 }
 
 static int set_acoustic(struct ata_device *drive, int arg)
@@ -822,7 +759,7 @@
 	args.taskfile.feature = (arg)?SETFEATURES_EN_AAM:SETFEATURES_DIS_AAM;
 	args.taskfile.sector_count = arg;
 	args.cmd = WIN_SETFEATURES;
-	ide_raw_taskfile(drive, &args);
+	ide_raw_taskfile(drive, &args, NULL);
 
 	drive->acoustic = arg;
 
@@ -942,7 +879,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.device_head = 0x40;
 	args.cmd = WIN_READ_NATIVE_MAX;
-	ide_raw_taskfile(drive, &args);
+	ide_raw_taskfile(drive, &args, NULL);
 
 	/* if OK, compute maximum address value */
 	if (!(drive->status & ERR_STAT)) {
@@ -964,10 +901,9 @@
 
 	/* Create IDE/ATA command request structure */
 	memset(&args, 0, sizeof(args));
-
 	args.taskfile.device_head = 0x40;
 	args.cmd = WIN_READ_NATIVE_MAX_EXT;
-        ide_raw_taskfile(drive, &args);
+        ide_raw_taskfile(drive, &args, NULL);
 
 	/* if OK, compute maximum address value */
 	if (!(drive->status & ERR_STAT)) {
@@ -1005,7 +941,7 @@
 
 	args.taskfile.device_head = ((addr_req >> 24) & 0x0f) | 0x40;
 	args.cmd = WIN_SET_MAX;
-	ide_raw_taskfile(drive, &args);
+	ide_raw_taskfile(drive, &args, NULL);
 
 	/* if OK, read new maximum address value */
 	if (!(drive->status & ERR_STAT)) {
@@ -1038,7 +974,7 @@
 	args.hobfile.high_cylinder = (addr_req >>= 8);
 	args.hobfile.device_head = 0x40;
 
-	ide_raw_taskfile(drive, &args);
+	ide_raw_taskfile(drive, &args, NULL);
 
 	/* if OK, compute maximum address value */
 	if (!(drive->status & ERR_STAT)) {
diff -urN linux-2.5.21/drivers/ide/ide-pmac.c linux/drivers/ide/ide-pmac.c
--- linux-2.5.21/drivers/ide/ide-pmac.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/ide-pmac.c	2002-06-14 16:38:47.000000000 +0200
@@ -341,21 +341,6 @@
 	}
 }
 
-#if 0
-/* This one could be later extended to handle CMD IDE and be used by some kind
- * of /proc interface. I want to be able to get the devicetree path of a block
- * device for yaboot configuration
- */
-struct device_node*
-pmac_ide_get_devnode(struct ata_device *drive)
-{
-	int i = pmac_ide_find(drive);
-	if (i < 0)
-		return NULL;
-	return pmac_ide[i].node;
-}
-#endif
-
 /* Setup timings for the selected drive (master/slave). I still need to verify if this
  * is enough, I beleive selectproc will be called whenever an IDE command is started,
  * but... */
@@ -1365,7 +1350,7 @@
 	 */
 	ix = pmac_ide_find(drive);
 	if (ix < 0)
-		return ide_started;
+		return ide_stopped;
 
 	dma = pmac_ide[ix].dma_regs;
 	ata4 = (pmac_ide[ix].kind == controller_kl_ata4 ||
diff -urN linux-2.5.21/drivers/ide/ide-taskfile.c linux/drivers/ide/ide-taskfile.c
--- linux-2.5.21/drivers/ide/ide-taskfile.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/ide-taskfile.c	2002-06-16 16:07:52.000000000 +0200
@@ -242,8 +242,9 @@
 /*
  * Invoked on completion of a special REQ_SPECIAL command.
  */
-ide_startstop_t ata_special_intr(struct ata_device *drive, struct
-		request *rq) {
+static ide_startstop_t special_intr(struct ata_device *drive,
+		struct request *rq)
+{
 
 	struct ata_taskfile *ar = rq->special;
 	ide_startstop_t ret = ide_stopped;
@@ -292,16 +293,18 @@
 	return ret;
 }
 
-int ide_raw_taskfile(struct ata_device *drive, struct ata_taskfile *ar)
+int ide_raw_taskfile(struct ata_device *drive, struct ata_taskfile *ar,
+		char *buffer)
 {
 	struct request req;
 
 	ar->command_type = IDE_DRIVE_TASK_NO_DATA;
-	ar->XXX_handler = ata_special_intr;
+	ar->XXX_handler = special_intr;
 
 	memset(&req, 0, sizeof(req));
 	req.flags = REQ_SPECIAL;
 	req.special = ar;
+	req.buffer = buffer;
 
 	return ide_do_drive_cmd(drive, &req, ide_wait);
 }
@@ -310,5 +313,4 @@
 EXPORT_SYMBOL(ide_do_drive_cmd);
 EXPORT_SYMBOL(ata_read);
 EXPORT_SYMBOL(ata_write);
-EXPORT_SYMBOL(ata_special_intr);
 EXPORT_SYMBOL(ide_raw_taskfile);
diff -urN linux-2.5.21/drivers/ide/ioctl.c linux/drivers/ide/ioctl.c
--- linux-2.5.21/drivers/ide/ioctl.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/ioctl.c	2002-06-16 16:10:51.000000000 +0200
@@ -47,7 +47,6 @@
 	u8 *argbuf = vals;
 	int argsize = 4;
 	struct ata_taskfile args;
-	struct request req;
 
 	/* Second phase.
 	 */
@@ -78,17 +77,7 @@
 		memset(argbuf + 4, 0, argsize - 4);
 	}
 
-	/* Issue ATA command and wait for completion.
-	 */
-	args.command_type = IDE_DRIVE_TASK_NO_DATA;
-	args.XXX_handler = ata_special_intr;
-
-	memset(&req, 0, sizeof(req));
-	req.flags = REQ_SPECIAL;
-	req.special = &args;
-
-	req.buffer = argbuf + 4;
-	err = ide_do_drive_cmd(drive, &req, ide_wait);
+	err = ide_raw_taskfile(drive, &args, argbuf + 4);
 
 	argbuf[0] = drive->status;
 	argbuf[1] = args.taskfile.feature;
diff -urN linux-2.5.21/drivers/ide/it8172.c linux/drivers/ide/it8172.c
--- linux-2.5.21/drivers/ide/it8172.c	2002-06-09 07:26:58.000000000 +0200
+++ linux/drivers/ide/it8172.c	2002-06-14 16:11:27.000000000 +0200
@@ -45,21 +45,11 @@
 #include "ata-timing.h"
 #include "pcihost.h"
 
-/*
- * Prototypes
- */
-static void it8172_tune_drive (struct ata_device *drive, byte pio);
-#if defined(CONFIG_BLK_DEV_IDEDMA) && defined(CONFIG_IT8172_TUNING)
-static byte it8172_dma_2_pio (byte xfer_rate);
-static int it8172_tune_chipset (struct ata_device *drive, byte speed);
-static int it8172_config_chipset_for_dma (struct ata_device *drive);
-static int it8172_dmaproc(ide_dma_action_t func, struct ata_device *drive);
-#endif
-void __init ide_init_it8172(struct ata_channel *channel);
-
 
-static void it8172_tune_drive (struct ata_device *drive, byte pio)
+/* FIXME: fix locking  --bkz */
+static void it8172_tune_drive (struct ata_device *drive, u8 pio)
 {
+	struct pci_dev *dev = drive->channel->pci_dev;
     unsigned long flags;
     u16 drive_enables;
     u32 drive_timing;
@@ -70,8 +60,8 @@
 	else
 		pio = min_t(byte, pio, 4);
 
-    pci_read_config_word(drive->channel->pci_dev, master_port, &master_data);
-    pci_read_config_dword(drive->channel->pci_dev, slave_port, &slave_data);
+	pci_read_config_word(dev, master_port, &master_data);
+	pci_read_config_dword(dev, slave_port, &slave_data);
 
     /*
      * FIX! The DIOR/DIOW pulse width and recovery times in port 0x44
@@ -102,7 +92,7 @@
 
     save_flags(flags);
     cli();
-    pci_write_config_word(drive->channel->pci_dev, master_port, master_data);
+	pci_write_config_word(dev, master_port, master_data);
     restore_flags(flags);
 }
 
@@ -110,7 +100,7 @@
 /*
  *
  */
-static byte it8172_dma_2_pio (byte xfer_rate)
+static u8 it8172_dma_2_pio(u8 xfer_rate)
 {
     switch(xfer_rate) {
     case XFER_UDMA_5:
@@ -139,7 +129,7 @@
     }
 }
 
-static int it8172_tune_chipset (struct ata_device *drive, byte speed)
+static int it8172_tune_chipset(struct ata_device *drive, u8 speed)
 {
     struct ata_channel *hwif = drive->channel;
     struct pci_dev *dev	= hwif->pci_dev;
@@ -147,7 +137,7 @@
     int u_flag		= 1 << drive->dn;
     int u_speed		= 0;
     int err		= 0;
-    byte reg48, reg4a;
+	u8 reg48, reg4a;
 
     pci_read_config_byte(dev, 0x48, &reg48);
     pci_read_config_byte(dev, 0x4a, &reg4a);
@@ -187,52 +177,28 @@
 
     it8172_tune_drive(drive, it8172_dma_2_pio(speed));
 
-    err = ide_config_drive_speed(drive, speed);
-    drive->current_speed = speed;
-    return err;
+	return ide_config_drive_speed(drive, speed);
 }
 
-static int it8172_config_chipset_for_dma(struct ata_device *drive)
+static int it8172_udma_setup(struct ata_device *drive)
 {
-    struct hd_driveid *id = drive->id;
-    byte speed;
-
-    speed = ata_timing_mode(drive, XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | XFER_UDMA);
+	u8 speed = ata_timing_mode(drive, XFER_PIO | XFER_EPIO |
+				   XFER_SWDMA | XFER_MWDMA | XFER_UDMA);
 
-    (void) it8172_tune_chipset(drive, speed);
-
-    return ((int)((id->dma_ultra >> 11) & 7) ? ide_dma_on :
-	    ((id->dma_ultra >> 8) & 7) ? ide_dma_on :
-	    ((id->dma_mword >> 8) & 7) ? ide_dma_on :
-	    ((id->dma_1word >> 8) & 7) ? ide_dma_on :
-	    ide_dma_off_quietly);
-}
-
-static int it8172_dmaproc(ide_dma_action_t func, struct ata_device *drive)
-{
-    switch (func) {
-    case ide_dma_check:
-	return ide_dmaproc((ide_dma_action_t)it8172_config_chipset_for_dma(drive),
-			   drive);
-    default :
-	break;
-    }
-    /* Other cases are done by generic IDE-DMA code. */
-    return ide_dmaproc(func, drive);
+	return !it8172_tune_chipset(drive, speed);
 }
-
 #endif /* defined(CONFIG_BLK_DEV_IDEDMA) && (CONFIG_IT8172_TUNING) */
 
 
-static unsigned int __init pci_init_it8172 (struct pci_dev *dev)
+static unsigned int __init pci_init_it8172(struct pci_dev *dev)
 {
-    unsigned char progif;
+	u8 progif;
 
     /*
      * Place both IDE interfaces into PCI "native" mode
      */
-    (void)pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
-    (void)pci_write_config_byte(dev, PCI_CLASS_PROG, progif | 0x05);
+	pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
+	pci_write_config_byte(dev, PCI_CLASS_PROG, progif | 0x05);
 
     return IT8172_IDE_IRQ;
 }
diff -urN linux-2.5.21/drivers/ide/opti621.c linux/drivers/ide/opti621.c
--- linux-2.5.21/drivers/ide/opti621.c	2002-06-09 07:27:36.000000000 +0200
+++ linux/drivers/ide/opti621.c	2002-06-14 16:11:27.000000000 +0200
@@ -342,9 +342,8 @@
 {
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(chipsets); ++i) {
+	for (i = 0; i < ARRAY_SIZE(chipsets); ++i)
 		ata_register_chipset(&chipsets[i]);
-	}
 
         return 0;
 }
diff -urN linux-2.5.21/drivers/ide/pcidma.c linux/drivers/ide/pcidma.c
--- linux-2.5.21/drivers/ide/pcidma.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/pcidma.c	2002-06-14 17:26:36.000000000 +0200
@@ -415,7 +415,7 @@
  *
  * Channel lock should be held.
  */
-int udma_pci_start(struct ata_device *drive, struct request *rq)
+void udma_pci_start(struct ata_device *drive, struct request *rq)
 {
 	struct ata_channel *ch = drive->channel;
 	unsigned long dma_base = ch->dma_base;
diff -urN linux-2.5.21/drivers/ide/pdc202xx.c linux/drivers/ide/pdc202xx.c
--- linux-2.5.21/drivers/ide/pdc202xx.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/pdc202xx.c	2002-06-14 16:13:07.000000000 +0200
@@ -230,8 +230,6 @@
 	printk(KERN_DEBUG "DP(%x)\n", DP);
 #endif
 
-	drive->current_speed = speed;
-
 #if PDC202XX_DEBUG_DRIVE_INFO
 	printk("%s: %02x drive%d 0x%08x ",
 		drive->name, speed,
@@ -352,8 +350,6 @@
 			;
 	}
 
-	drive->current_speed = speed;
-
 	return ide_config_drive_speed(drive, speed);
 }
 
@@ -551,7 +547,7 @@
 	return 0;
 }
 
-static int pdc202xx_udma_start(struct ata_device *drive, struct request *rq)
+static void pdc202xx_udma_start(struct ata_device *drive, struct request *rq)
 {
 	struct ata_channel *ch = drive->channel;
 	u32 high_16 = pci_resource_start(ch->pci_dev, 4);
diff -urN linux-2.5.21/drivers/ide/piix.c linux/drivers/ide/piix.c
--- linux-2.5.21/drivers/ide/piix.c	2002-06-14 12:45:00.000000000 +0200
+++ linux/drivers/ide/piix.c	2002-06-14 16:11:19.000000000 +0200
@@ -222,8 +222,6 @@
 
 	piix_set_speed(drive->channel->pci_dev, drive->dn, &t, umul);
 
-	drive->current_speed = speed;
-
 	return 0;
 }
 
diff -urN linux-2.5.21/drivers/ide/probe.c linux/drivers/ide/probe.c
--- linux-2.5.21/drivers/ide/probe.c	2002-06-14 12:45:09.000000000 +0200
+++ linux/drivers/ide/probe.c	2002-06-14 16:11:19.000000000 +0200
@@ -339,6 +339,8 @@
 		ata_irq_enable(drive, 1);
 	udelay(1);
 
+	/* FIXME: use ata_status_poll()  --bkz */
+
 	ata_busy_poll(drive, WAIT_CMD);
 
 	/*
@@ -395,6 +397,8 @@
 		default: break;
 	}
 
+	drive->current_speed = speed;
+
 	return error;
 }
 
diff -urN linux-2.5.21/drivers/ide/serverworks.c linux/drivers/ide/serverworks.c
--- linux-2.5.21/drivers/ide/serverworks.c	2002-06-14 12:45:13.000000000 +0200
+++ linux/drivers/ide/serverworks.c	2002-06-14 16:11:27.000000000 +0200
@@ -123,23 +123,21 @@
 	return map;
 }
 
-static int svwks_tune_chipset(struct ata_device *drive, byte speed)
+static int svwks_tune_chipset(struct ata_device *drive, u8 speed)
 {
 	static u8 dma_modes[]	= { 0x77, 0x21, 0x20 };
 	static u8 pio_modes[]	= { 0x5d, 0x47, 0x34, 0x22, 0x20 };
 
-	struct ata_channel *hwif = drive->channel;
-	struct pci_dev *dev	= hwif->pci_dev;
-	byte unit		= (drive->select.b.unit & 0x01);
-	byte csb5		= (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) ? 1 : 0;
-
-	byte drive_pci, drive_pci2;
-	byte drive_pci3	= hwif->unit ? 0x57 : 0x56;
+	struct ata_channel *ch = drive->channel;
+	struct pci_dev *dev = ch->pci_dev;
+	u8 unit = drive->select.b.unit & 0x01;
+	u8 drive_pci, drive_pci2;
+	u8 drive_pci3 = ch->unit ? 0x57 : 0x56;
 
-	byte ultra_enable, ultra_timing, dma_timing, pio_timing;
-	unsigned short csb5_pio;
+	u8 ultra_enable, ultra_timing, dma_timing, pio_timing;
+	u16 csb5_pio;
 
-	byte pio = ata_timing_mode(drive, XFER_PIO | XFER_EPIO) - XFER_PIO_0;
+	u8 pio = ata_timing_mode(drive, XFER_PIO | XFER_EPIO) - XFER_PIO_0;
 
         switch (drive->dn) {
 		case 0: drive_pci = 0x41; break;
@@ -213,7 +211,8 @@
 #endif
 
 	pci_write_config_byte(dev, drive_pci, pio_timing);
-	if (csb5)
+
+	if (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE)
 		pci_write_config_word(dev, 0x4A, csb5_pio);
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
@@ -221,29 +220,20 @@
 	pci_write_config_byte(dev, drive_pci3, ultra_timing);
 	pci_write_config_byte(dev, 0x54, ultra_enable);
 #endif
-	drive->current_speed = speed;
 
 	return ide_config_drive_speed(drive, speed);
 }
 
-static void svwks_tune_drive(struct ata_device *drive, byte pio)
+static void svwks_tune_drive(struct ata_device *drive, u8 pio)
 {
-	byte speed;
-	switch(pio) {
-		case 4:		speed = XFER_PIO_4;break;
-		case 3:		speed = XFER_PIO_3;break;
-		case 2:		speed = XFER_PIO_2;break;
-		case 1:		speed = XFER_PIO_1;break;
-		default:	speed = XFER_PIO_0;break;
-	}
-	(void) svwks_tune_chipset(drive, speed);
+	(void) svwks_tune_chipset(drive, XFER_PIO_0 + min_t(u8, pio, 4));
 }
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
 static int config_chipset_for_dma(struct ata_device *drive)
 {
 	int map;
-	byte mode;
+	u8 mode;
 
 	/* FIXME: check SWDMA modes --bkz */
 	map = XFER_MWDMA | svwks_ratemask(drive);
@@ -354,7 +344,7 @@
 static unsigned int __init svwks_init_chipset(struct pci_dev *dev)
 {
 	unsigned int reg;
-	byte btr;
+	u8 btr;
 
 	/* save revision id to determine DMA capability */
 	pci_read_config_byte(dev, PCI_REVISION_ID, &svwks_revision);
@@ -404,8 +394,7 @@
 static unsigned int __init ata66_svwks_dell(struct ata_channel *hwif)
 {
 	struct pci_dev *dev = hwif->pci_dev;
-	if (dev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
-	    dev->vendor	== PCI_VENDOR_ID_SERVERWORKS &&
+	if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
 	    (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE ||
 	     dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE))
 		return ((1 << (hwif->unit + 14)) &
@@ -422,8 +411,7 @@
 static unsigned int __init ata66_svwks_cobalt(struct ata_channel *hwif)
 {
 	struct pci_dev *dev = hwif->pci_dev;
-	if (dev->subsystem_vendor == PCI_VENDOR_ID_SUN &&
-	    dev->vendor	== PCI_VENDOR_ID_SERVERWORKS &&
+	if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
 	    dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE)
 		return ((1 << (hwif->unit + 14)) &
 			dev->subsystem_device) ? 1 : 0;
@@ -501,9 +489,8 @@
 {
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(chipsets); ++i) {
+	for (i = 0; i < ARRAY_SIZE(chipsets); ++i)
 		ata_register_chipset(&chipsets[i]);
-	}
 
         return 0;
 }
diff -urN linux-2.5.21/drivers/ide/sis5513.c linux/drivers/ide/sis5513.c
--- linux-2.5.21/drivers/ide/sis5513.c	2002-06-14 12:45:13.000000000 +0200
+++ linux/drivers/ide/sis5513.c	2002-06-14 16:11:27.000000000 +0200
@@ -267,7 +267,7 @@
 {
 	struct ata_channel *hwif = drive->channel;
 	struct pci_dev *dev = hwif->pci_dev;
-	u8 drive_pci, test1, test2, speed;
+	u8 drive_pci, test1, test2;
 
 #ifdef DEBUG
 	sis5513_load_verify_registers(dev, "config_drive_art_rwp_pio start");
@@ -280,13 +280,10 @@
 	       drive->dn, pio, timing);
 #endif
 
-	switch(drive->dn) {
-		case 0:		drive_pci = 0x40; break;
-		case 1:		drive_pci = 0x42; break;
-		case 2:		drive_pci = 0x44; break;
-		case 3:		drive_pci = 0x46; break;
-		default:	return 1;
-	}
+	if (drive->dn > 3)	/* FIXME: remove this  --bkz */
+		return 1;
+
+	drive_pci = 0x40 + (drive->dn << 1);
 
 	/* register layout changed with newer ATA100 chips */
 	if (chipset_family < ATA_100) {
@@ -321,9 +318,8 @@
 #ifdef DEBUG
 	sis5513_load_verify_registers(dev, "config_drive_art_rwp_pio start");
 #endif
-	speed = XFER_PIO_0 + min_t(u8, pio, 4);
-	drive->current_speed = speed;
-	return ide_config_drive_speed(drive, speed);
+
+	return ide_config_drive_speed(drive, XFER_PIO_0 + min_t(u8, pio, 4));
 }
 
 static int sis5513_tune_chipset(struct ata_device *drive, u8 speed)
@@ -338,13 +334,11 @@
 	printk("SIS5513: sis5513_tune_chipset, drive %d, speed %d\n",
 	       drive->dn, speed);
 #endif
-	switch(drive->dn) {
-		case 0:		drive_pci = 0x40; break;
-		case 1:		drive_pci = 0x42; break;
-		case 2:		drive_pci = 0x44; break;
-		case 3:		drive_pci = 0x46; break;
-		default:	return 0;
-	}
+
+	if (drive->dn > 3)	/* FIXME: remove this  --bkz */
+		return 1;
+
+	drive_pci = 0x40 + (drive->dn << 1);
 
 #ifdef BROKEN_LEVEL
 #ifdef DEBUG
@@ -396,11 +390,10 @@
 		default:
 			return config_art_rwp_pio(drive, 0);
 	}
-	drive->current_speed = speed;
 #ifdef DEBUG
 	sis5513_load_verify_registers(dev, "sis5513_tune_chipset end");
 #endif
-	return ((int) ide_config_drive_speed(drive, speed));
+	return ide_config_drive_speed(drive, speed);
 }
 
 static void sis5513_tune_drive(struct ata_device *drive, u8 pio)
@@ -568,8 +561,8 @@
 
 static unsigned int __init ata66_sis5513(struct ata_channel *hwif)
 {
-	byte reg48h = 0, ata66 = 0;
-	byte mask = hwif->unit ? 0x20 : 0x10;
+	u8 reg48h, ata66 = 0;
+	u8 mask = hwif->unit ? 0x20 : 0x10;
 	pci_read_config_byte(hwif->pci_dev, 0x48, &reg48h);
 
 	if (chipset_family >= ATA_66) {
diff -urN linux-2.5.21/drivers/ide/tcq.c linux/drivers/ide/tcq.c
--- linux-2.5.21/drivers/ide/tcq.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/tcq.c	2002-06-14 17:21:37.000000000 +0200
@@ -430,7 +430,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.feature = 0x01;
 	args.cmd = WIN_NOP;
-	ide_raw_taskfile(drive, &args);
+	ide_raw_taskfile(drive, &args, NULL);
 	if (args.taskfile.feature & ABRT_ERR)
 		return 1;
 
@@ -458,7 +458,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.feature = SETFEATURES_EN_WCACHE;
 	args.cmd = WIN_SETFEATURES;
-	if (ide_raw_taskfile(drive, &args)) {
+	if (ide_raw_taskfile(drive, &args, NULL)) {
 		printk("%s: failed to enable write cache\n", drive->name);
 		return 1;
 	}
@@ -470,7 +470,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.feature = SETFEATURES_DIS_RI;
 	args.cmd = WIN_SETFEATURES;
-	if (ide_raw_taskfile(drive, &args)) {
+	if (ide_raw_taskfile(drive, &args, NULL)) {
 		printk("%s: disabling release interrupt fail\n", drive->name);
 		return 1;
 	}
@@ -482,7 +482,7 @@
 	memset(&args, 0, sizeof(args));
 	args.taskfile.feature = SETFEATURES_EN_SI;
 	args.cmd = WIN_SETFEATURES;
-	if (ide_raw_taskfile(drive, &args)) {
+	if (ide_raw_taskfile(drive, &args, NULL)) {
 		printk("%s: enabling service interrupt fail\n", drive->name);
 		return 1;
 	}
diff -urN linux-2.5.21/drivers/ide/trm290.c linux/drivers/ide/trm290.c
--- linux-2.5.21/drivers/ide/trm290.c	2002-06-14 16:02:00.000000000 +0200
+++ linux/drivers/ide/trm290.c	2002-06-14 17:27:37.000000000 +0200
@@ -176,7 +176,7 @@
 }
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
-static int trm290_udma_start(struct ata_device *drive, struct request *__rq)
+static void trm290_udma_start(struct ata_device *drive, struct request *__rq)
 {
 	/* Nothing to be done here. */
 }
diff -urN linux-2.5.21/drivers/ide/via82cxxx.c linux/drivers/ide/via82cxxx.c
--- linux-2.5.21/drivers/ide/via82cxxx.c	2002-06-09 07:31:19.000000000 +0200
+++ linux/drivers/ide/via82cxxx.c	2002-06-14 16:11:19.000000000 +0200
@@ -199,8 +199,6 @@
 
 	via_set_speed(drive->channel->pci_dev, drive->dn, &t);
 
-	drive->current_speed = speed;
-
 	return 0;
 }
 
diff -urN linux-2.5.21/include/linux/ide.h linux/include/linux/ide.h
--- linux-2.5.21/include/linux/ide.h	2002-06-14 16:02:00.000000000 +0200
+++ linux/include/linux/ide.h	2002-06-16 16:08:00.000000000 +0200
@@ -679,8 +679,7 @@
 		bio_kunmap_irq(to, flags);
 }
 
-extern ide_startstop_t ata_special_intr(struct ata_device *, struct request *);
-extern int ide_raw_taskfile(struct ata_device *, struct ata_taskfile *);
+extern int ide_raw_taskfile(struct ata_device *, struct ata_taskfile *, char *);
 
 extern void ide_fix_driveid(struct hd_driveid *id);
 extern int ide_config_drive_speed(struct ata_device *, byte);
@@ -784,7 +783,7 @@
 #ifdef CONFIG_BLK_DEV_IDEDMA
 
 extern void udma_pci_enable(struct ata_device *drive, int on, int verbose);
-extern int udma_pci_start(struct ata_device *drive, struct request *rq);
+extern void udma_pci_start(struct ata_device *drive, struct request *rq);
 extern int udma_pci_stop(struct ata_device *drive);
 extern int udma_pci_init(struct ata_device *drive, struct request *rq);
 extern int udma_pci_irq_status(struct ata_device *drive);

      parent reply	other threads:[~2002-06-16 18:36 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-06-09  5:42 Linux 2.5.21 Linus Torvalds
2002-06-09  7:10 ` 2.5.21 -- suspend.h:58: parse error before "__nosavedata" Miles Lane
2002-06-09  8:40   ` Skip Ford
2002-06-09 13:37 ` [PATCH] 2.5.20 IDE 86 Martin Dalecki
2002-06-09 13:39 ` [PATCH] 2.5.20 locks.h Martin Dalecki
2002-06-10 11:19 ` [PATCH] 2.5.21 "I can't get no compilation" Martin Dalecki
2002-06-10 12:32   ` Anton Altaparmakov
2002-06-10 11:54     ` Martin Dalecki
2002-06-10 13:08       ` Anton Altaparmakov
2002-06-10 11:21 ` [PATCH] 2.5.21 kill warnings 1/19 Martin Dalecki
2002-06-10 11:23 ` [PATCH] 2.5.21 kill warnings 2/19 Martin Dalecki
2002-06-10 11:24 ` [PATCH] 2.5.21 kill warnings 3/19 Martin Dalecki
2002-06-10 11:26 ` [PATCH] 2.5.21 kill warnings 4/19 Martin Dalecki
2002-06-10 18:46   ` Maksim (Max) Krasnyanskiy
2002-06-10 18:57     ` Thomas 'Dent' Mirlacher
2002-06-10 19:08       ` Roland Dreier
2002-06-10 19:14         ` Thomas 'Dent' Mirlacher
2002-06-10 19:19       ` Tom Rini
2002-06-10 19:30         ` Andrew Morton
2002-06-10 19:44           ` Tom Rini
2002-06-10 19:51             ` Andrew Morton
2002-06-10 20:03               ` Thunder from the hill
2002-06-10 20:08                 ` Tom Rini
2002-06-10 20:14                   ` Andrew Morton
2002-06-10 21:01                   ` Maksim (Max) Krasnyanskiy
2002-06-10 21:11                     ` Tom Rini
2002-06-10 21:34                       ` Thunder from the hill
2002-06-10 20:10                 ` Thunder from the hill
2002-06-10 20:15                   ` Tom Rini
2002-06-10 20:05               ` Tom Rini
2002-06-10 20:18                 ` Thomas 'Dent' Mirlacher
2002-06-10 19:46           ` Thunder from the hill
2002-06-10 20:00             ` Andrew Morton
2002-06-11  6:12           ` Martin Dalecki
2002-06-10 21:51     ` Neil Booth
2002-06-10 22:42       ` Maksim (Max) Krasnyanskiy
2002-06-11  6:10     ` Martin Dalecki
2002-06-13 12:01     ` Martin Dalecki
2002-06-11  0:40   ` Greg KH
2002-06-11  6:33     ` Martin Dalecki
2002-06-11  6:38       ` Greg KH
2002-06-11  8:26       ` Russell King
2002-06-11  8:34         ` Martin Dalecki
2002-06-11  9:06           ` Russell King
2002-06-11  9:09             ` Martin Dalecki
2002-06-11  9:28               ` Russell King
2002-06-11  9:42                 ` Martin Dalecki
2002-06-11 10:36                   ` Russell King
2002-06-11 11:06   ` Pavel Machek
2002-06-10 11:28 ` [PATCH] 2.5.21 kill warnings 5/19 Martin Dalecki
2002-06-10 22:24   ` William Lee Irwin III
2002-06-10 22:35     ` Russell King
2002-06-11  0:38   ` Greg KH
2002-06-10 11:35 ` [PATCH] 2.5.21 kill warnings 6/19 Martin Dalecki
2002-06-16 11:05   ` Adrian Bunk
2002-06-10 11:37 ` [PATCH] 2.5.21 kill warnings 7/19 Martin Dalecki
2002-06-10 11:38 ` [PATCH] 2.5.21 kill warnings 8/19 Martin Dalecki
2002-06-10 11:39 ` [PATCH] 2.5.21 kill warnings 9/19 Martin Dalecki
2002-06-10 11:40 ` [PATCH] 2.5.21 kill warnings 10/19 Martin Dalecki
2002-06-10 11:42 ` [PATCH] 2.5.21 kill warnings 11/19 Martin Dalecki
2002-06-10 11:43 ` [PATCH] 2.5.21 kill warnings 12/19 Martin Dalecki
2002-06-10 11:44 ` [PATCH] 2.5.21 kill warnings 13/19 Martin Dalecki
2002-06-10 11:45 ` [PATCH] 2.5.21 kill warinigs 14/19 Martin Dalecki
2002-06-10 18:47   ` Ingo Oeser
2002-06-11  8:07     ` Martin Dalecki
2002-06-11 11:59     ` Dave Jones
2002-06-10 11:46 ` [PATCH] 2.5.21 kill warnings 15/19 Martin Dalecki
2002-06-10 11:48 ` [PATCH] 2.5.21 kill warnings 16/19 Martin Dalecki
2002-06-10 11:49 ` [PATCH] 2.5.21 kill warnings 17/19 Martin Dalecki
2002-06-10 11:49 ` [PATCH] 2.5.21 kill warnings 18/19 Martin Dalecki
2002-06-10 11:50 ` [PATCH] 2.5.21 kill warnings 19/19 Martin Dalecki
2002-06-10 11:59 ` [REVERT] 2.5.21 s390/block/xpram.c Martin Dalecki
2002-06-11  7:46 ` [PATCH] 2.5.21 IDE 87 Martin Dalecki
2002-06-11 19:02   ` John Weber
2002-06-12  7:00     ` Martin Dalecki
2002-06-13  1:25       ` John Weber
2002-06-12 17:39   ` Brad Heilbrun
2002-06-12 10:50 ` [PATCH] 2.5.21 inline abuse Martin Dalecki
2002-06-13 12:45   ` Richard Zidlicky
2002-06-13  9:51 ` [PATCH] 2.5.21 IDE 88 Martin Dalecki
2002-06-14 11:06 ` [PATCH] 2.5.21 IDE 89 Martin Dalecki
2002-06-14 11:08 ` [PATCH] 2.5.21 IDE 90 Martin Dalecki
2002-06-14 14:02 ` [PATCH] 2.5.21 IDE 91 Martin Dalecki
2002-06-14 15:17   ` Jens Axboe
2002-06-14 15:42     ` John Weber
2002-06-14 15:43     ` Dave Jones
2002-06-14 16:06       ` Bartlomiej Zolnierkiewicz
2002-06-14 16:33         ` Martin Dalecki
2002-06-14 17:56       ` Linus Torvalds
2002-06-14 15:56     ` Benjamin LaHaise
2002-06-14 16:04       ` Dave Jones
2002-06-14 17:23         ` Martin Dalecki
2002-06-14 16:09       ` Bartlomiej Zolnierkiewicz
2002-06-14 16:15     ` Martin Dalecki
2002-06-15  8:15       ` Jens Axboe
2002-06-14 16:43     ` Linus Torvalds
2002-06-14 16:47       ` Martin Dalecki
2002-06-15  8:19       ` Jens Axboe
2002-06-16 18:36 ` Martin Dalecki [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3D0CDAA8.9090409@evision-ventures.com \
    --to=dalecki@evision-ventures.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@transmeta.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox