linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: Linux-2.5.18
       [not found] <Pine.LNX.4.44.0205241920230.3909-100000@home.transmeta.com>
@ 2002-05-25  2:27 ` H. Peter Anvin
  0 siblings, 0 replies; 3+ messages in thread
From: H. Peter Anvin @ 2002-05-25  2:27 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Alexander Viro, ftpadmin, linux-kernel

Linus Torvalds wrote:
> On Fri, 24 May 2002, Alexander Viro wrote:
> 
>>Erm.  Looks like ftp.kernel.org is neither here nor there.  Or, at least,
>>doesn't accept connections to ports 21 and 80...
> 
> Hmm.. Right you are. I always push my kernels to "master.kernel.org", and
> they get mirrored from there automatically, but yes, something appears
> broken with the rest of kernel.org..
> 

kernel.org had a multiple-disk failure and lost its archive RAID.  From 
the looks of it, several disks started developing "threshhold" failures 
at least two weeks ago, possibly in conjunction with the system being 
moved to a new rack.  Unfortunately the RAID controller didn't down the 
disks as they started having problems, and the system was allowed to 
keep running until it finally crashed due to data corruption.

Compaq is investigating the failure, and will probably give us the 
hardware for the #2 server that we asked for a few months ago (they've 
been occupied with some kind of merger...)

	-hpa



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

* Re: Linux-2.5.18
  2002-05-25  2:02 Linux-2.5.18 Linus Torvalds
@ 2002-05-28 14:23 ` Martin Dalecki
  0 siblings, 0 replies; 3+ messages in thread
From: Martin Dalecki @ 2002-05-28 14:23 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Kernel Mailing List

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


Mon May 27 12:37:58 CEST 2002 ide-clean-72

- Replace ide_delay_50m with mdelay(50). There is absolutely no reason we
   should behave different behaviors whatever IDECS support is enabled or not.

- Kill last parameter of ide_register_hw(). It should return a pointer to the
   interface registered later.

- pdc202xx patches by Bartomiej onierkiewicz.

- ServerWorks chi pset support cleanup by Andrej Panin.

- Move temporarily ide_setup_ports to main.c unfold it in ide-pnp.c.

I'm trying again to make the patch chunks a bit more palatable...

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

diff -urN linux-2.5.18/drivers/ide/buddha.c linux/drivers/ide/buddha.c
--- linux-2.5.18/drivers/ide/buddha.c	2002-05-25 03:55:25.000000000 +0200
+++ linux/drivers/ide/buddha.c	2002-05-27 16:06:44.000000000 +0200
@@ -202,9 +202,9 @@
 						xsurf_offsets, 0,
 						(ide_ioreg_t)(buddha_board+xsurf_irqports[i]),
 						xsurf_ack_intr, IRQ_AMIGA_PORTS);
-			}	
-			
-			index = ide_register_hw(&hw, NULL);
+			}
+
+			index = ide_register_hw(&hw);
 			if (index != -1) {
 				printk("ide%d: ", index);
 				switch(type) {
diff -urN linux-2.5.18/drivers/ide/falconide.c linux/drivers/ide/falconide.c
--- linux-2.5.18/drivers/ide/falconide.c	2002-05-25 03:55:25.000000000 +0200
+++ linux/drivers/ide/falconide.c	2002-05-27 16:06:54.000000000 +0200
@@ -60,7 +60,7 @@
 
 	ide_setup_ports(&hw, (ide_ioreg_t)ATA_HD_BASE, falconide_offsets,
 			0, 0, NULL, IRQ_MFP_IDE);
-	index = ide_register_hw(&hw, NULL);
+	index = ide_register_hw(&hw);
 
 	if (index != -1)
 	    printk("ide%d: Falcon IDE interface\n", index);
diff -urN linux-2.5.18/drivers/ide/gayle.c linux/drivers/ide/gayle.c
--- linux-2.5.18/drivers/ide/gayle.c	2002-05-25 03:55:21.000000000 +0200
+++ linux/drivers/ide/gayle.c	2002-05-27 16:06:00.000000000 +0200
@@ -150,7 +150,7 @@
 	ide_setup_ports(&hw, base, gayle_offsets,
 			ctrlport, irqport, ack_intr, IRQ_AMIGA_PORTS);
 
-	index = ide_register_hw(&hw, NULL);
+	index = ide_register_hw(&hw);
 	if (index != -1) {
 	    switch (i) {
 		case 0:
diff -urN linux-2.5.18/drivers/ide/ide.c linux/drivers/ide/ide.c
--- linux-2.5.18/drivers/ide/ide.c	2002-05-28 17:15:53.000000000 +0200
+++ linux/drivers/ide/ide.c	2002-05-28 13:21:53.000000000 +0200
@@ -151,6 +151,12 @@
 	return ret;
 }
 
+/* This is the default end request function as well */
+int ide_end_request(struct ata_device *drive, struct request *rq, int uptodate)
+{
+	return __ide_end_request(drive, rq, uptodate, 0);
+}
+
 /*
  * This should get invoked any time we exit the driver to
  * wait for an interrupt response from a drive.  handler() points
@@ -508,7 +514,7 @@
 	printk("} ");
 }
 #else
-#define ata_dump_bits(msgs,nr,bits) do { } while (0)
+# define ata_dump_bits(msgs,nr,bits) do { } while (0)
 #endif
 
 /*
@@ -1517,36 +1523,6 @@
 	return 0;
 }
 
-/*
- * Setup hw_regs_t structure described by parameters.  You
- * may set up the hw structure yourself OR use this routine to
- * do it for you.
- */
-void ide_setup_ports(hw_regs_t *hw,
-		ide_ioreg_t base, int *offsets,
-		ide_ioreg_t ctrl, ide_ioreg_t intr,
-		ide_ack_intr_t *ack_intr, int irq)
-{
-	int i;
-
-	for (i = 0; i < IDE_NR_PORTS; i++) {
-		if (offsets[i] != -1)
-			hw->io_ports[i] = base + offsets[i];
-		else
-			hw->io_ports[i] = 0;
-	}
-	if (offsets[IDE_CONTROL_OFFSET] == -1)
-		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl;
-/* FIMXE: check if we can remove this ifdef */
-#if defined(CONFIG_AMIGA) || defined(CONFIG_MAC)
-	if (offsets[IDE_IRQ_OFFSET] == -1)
-		hw->io_ports[IDE_IRQ_OFFSET] = intr;
-#endif
-	hw->irq = irq;
-	hw->dma = NO_DMA;
-	hw->ack_intr = ack_intr;
-}
-
 int ide_spin_wait_hwgroup(struct ata_device *drive)
 {
 	/* FIXME: Wait on a proper timer. Instead of playing games on the
@@ -1572,24 +1548,6 @@
 	return 0;
 }
 
-/*
- * Delay for *at least* 50ms.  As we don't know how much time is left
- * until the next tick occurs, we wait an extra tick to be safe.
- * This is used only during the probing/polling for drives at boot time.
- *
- * However, its usefullness may be needed in other places, thus we export it now.
- * The future may change this to a millisecond setable delay.
- */
-void ide_delay_50ms (void)
-{
-#ifndef CONFIG_BLK_DEV_IDECS
-	mdelay(50);
-#else
-	__set_current_state(TASK_UNINTERRUPTIBLE);
-	schedule_timeout(HZ/20);
-#endif
-}
-
 static int ide_check_media_change(kdev_t i_rdev)
 {
 	struct ata_device *drive;
@@ -1638,12 +1596,6 @@
 		*p++ = '\0';
 }
 
-/* This is the default end request function as well */
-int ide_end_request(struct ata_device *drive, struct request *rq, int uptodate)
-{
-	return __ide_end_request(drive, rq, uptodate, 0);
-}
-
 struct block_device_operations ide_fops[] = {{
 	owner:			THIS_MODULE,
 	open:			ide_open,
@@ -1669,7 +1621,6 @@
 EXPORT_SYMBOL(ide_end_drive_cmd);
 EXPORT_SYMBOL(__ide_end_request);
 EXPORT_SYMBOL(ide_end_request);
-EXPORT_SYMBOL(ide_delay_50ms);
 EXPORT_SYMBOL(ide_stall_queue);
 
 EXPORT_SYMBOL(ide_setup_ports);
diff -urN linux-2.5.18/drivers/ide/ide-cs.c linux/drivers/ide/ide-cs.c
--- linux-2.5.18/drivers/ide/ide-cs.c	2002-05-25 03:55:23.000000000 +0200
+++ linux/drivers/ide/ide-cs.c	2002-05-27 16:06:29.000000000 +0200
@@ -233,7 +233,8 @@
         ide_init_hwif_ports(&hw, (ide_ioreg_t) arg1, (ide_ioreg_t) arg2, NULL);
         hw.irq = irq;
         hw.chipset = ide_pci; /* this enables IRQ sharing w/ PCI irqs */
-        return ide_register_hw(&hw, NULL);
+
+        return ide_register_hw(&hw);
 }
 
 void ide_config(dev_link_t *link)
diff -urN linux-2.5.18/drivers/ide/ide-features.c linux/drivers/ide/ide-features.c
--- linux-2.5.18/drivers/ide/ide-features.c	2002-05-25 03:55:28.000000000 +0200
+++ linux/drivers/ide/ide-features.c	2002-05-28 13:23:56.000000000 +0200
@@ -189,17 +189,19 @@
 	SELECT_MASK(drive->channel, drive, 1);
 	if (IDE_CONTROL_REG)
 		OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
-	ide_delay_50ms();
+	mdelay(50);
 	OUT_BYTE(WIN_IDENTIFY, IDE_COMMAND_REG);
 	timeout = jiffies + WAIT_WORSTCASE;
 	do {
-		if (0 < (signed long)(jiffies - timeout)) {
+		if (time_after(jiffies, timeout)) {
 			SELECT_MASK(drive->channel, drive, 0);
 			return 0;	/* drive timed-out */
 		}
-		ide_delay_50ms();	/* give drive a breather */
+		mdelay(50);	/* give drive a breather */
 	} while (IN_BYTE(IDE_ALTSTATUS_REG) & BUSY_STAT);
-	ide_delay_50ms();	/* wait for IRQ and DRQ_STAT */
+
+	mdelay(50);	/* wait for IRQ and DRQ_STAT */
+
 	if (!OK_STAT(GET_STAT(),DRQ_STAT,BAD_R_STAT)) {
 		SELECT_MASK(drive->channel, drive, 0);
 		printk("%s: CHECK for good STATUS\n", drive->name);
diff -urN linux-2.5.18/drivers/ide/ide-pci.c linux/drivers/ide/ide-pci.c
--- linux-2.5.18/drivers/ide/ide-pci.c	2002-05-28 17:15:53.000000000 +0200
+++ linux/drivers/ide/ide-pci.c	2002-05-28 11:19:39.000000000 +0200
@@ -351,7 +351,7 @@
 		base = port ? 0x170 : 0x1f0;
 
 	if ((ch = lookup_channel(base, d->bootable, dev->name)) == NULL)
-		return -ENOMEM;	/* no room in ide_hwifs[] */
+		return -ENOMEM;	/* no room */
 
 	if (ch->io_ports[IDE_DATA_OFFSET] != base) {
 		ide_init_hwif_ports(&ch->hw, base, (ctl | 2), NULL);
diff -urN linux-2.5.18/drivers/ide/ide-pnp.c linux/drivers/ide/ide-pnp.c
--- linux-2.5.18/drivers/ide/ide-pnp.c	2002-05-28 17:15:53.000000000 +0200
+++ linux/drivers/ide/ide-pnp.c	2002-05-28 12:44:00.000000000 +0200
@@ -32,29 +32,6 @@
 
 #define DEV_NAME(dev) (dev->bus->name ? dev->bus->name : "ISA PnP")
 
-enum {
-	GENERIC_HD_DATA,
-	GENERIC_HD_ERROR,
-	GENERIC_HD_NSECTOR,
-	GENERIC_HD_SECTOR,
-	GENERIC_HD_LCYL,
-	GENERIC_HD_HCYL,
-	GENERIC_HD_SELECT,
-	GENERIC_HD_STATUS
-};
-
-static int generic_ide_offsets[IDE_NR_PORTS] __initdata = {
-	GENERIC_HD_DATA,
-	GENERIC_HD_ERROR,
-	GENERIC_HD_NSECTOR,
-	GENERIC_HD_SECTOR,
-	GENERIC_HD_LCYL,
-	GENERIC_HD_HCYL,
-	GENERIC_HD_SELECT,
-	GENERIC_HD_STATUS,
-	-1, -1
-};
-
 /* ISA PnP device table entry */
 struct pnp_dev_t {
 	unsigned short card_vendor, card_device, vendor, device;
@@ -65,8 +42,8 @@
 static int __init pnpide_generic_init(struct pci_dev *dev, int enable)
 {
 	hw_regs_t hw;
-	struct ata_channel *hwif;
 	int index;
+	int i;
 
 	if (!enable)
 		return 0;
@@ -74,15 +51,24 @@
 	if (!(DEV_IO(dev, 0) && DEV_IO(dev, 1) && DEV_IRQ(dev, 0)))
 		return 1;
 
-	ide_setup_ports(&hw, (ide_ioreg_t) DEV_IO(dev, 0),
-			generic_ide_offsets, (ide_ioreg_t) DEV_IO(dev, 1),
-			0, NULL, DEV_IRQ(dev, 0));
+	/* Initialize register access base values. */
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; ++i)
+		hw.io_ports[i] = DEV_IO(dev, 0) + i;
+	hw.io_ports[IDE_CONTROL_OFFSET] = DEV_IO(dev, 1);
+
+	hw.irq = DEV_IRQ(dev, 0);
+	hw.dma = NO_DMA;
+	hw.ack_intr = NULL;
 
-	index = ide_register_hw(&hw, &hwif);
+	index = ide_register_hw(&hw);
 
 	if (index != -1) {
-		hwif->pci_dev = dev;
+		struct ata_channel *ch;
+
+		ch = &ide_hwifs[index];
+		ch->pci_dev = dev;
 		printk(KERN_INFO "ide%d: %s IDE interface\n", index, DEV_NAME(dev));
+
 		return 0;
 	}
 
diff -urN linux-2.5.18/drivers/ide/ide-probe.c linux/drivers/ide/ide-probe.c
--- linux-2.5.18/drivers/ide/ide-probe.c	2002-05-25 03:55:16.000000000 +0200
+++ linux/drivers/ide/ide-probe.c	2002-05-28 13:13:30.000000000 +0200
@@ -68,17 +68,7 @@
 	 * However let's try to get away with this...
 	 */
 
-#if 1
 	ata_read(drive, id, SECTOR_WORDS);
-#else
-        {
-                unsigned long   *ptr = (unsigned long *)id ;
-                unsigned long   lcount = 256/2 ;
-                // printk("IDE_DATA_REG = %#lx",IDE_DATA_REG);
-                while( lcount-- )
-                        *ptr++ = inl(IDE_DATA_REG);
-        }
-#endif
 	ide__sti();	/* local CPU only */
 	ide_fix_driveid(id);
 
@@ -248,7 +238,7 @@
 	rc = 1;
 	if (IDE_CONTROL_REG) {
 		/* take a deep breath */
-		ide_delay_50ms();
+		mdelay(50);
 		a = IN_BYTE(IDE_ALTSTATUS_REG);
 		s = IN_BYTE(IDE_STATUS_REG);
 		if ((a ^ s) & ~INDEX_STAT) {
@@ -258,7 +248,7 @@
 			hd_status = IDE_ALTSTATUS_REG;	/* use non-intrusive polling */
 		}
 	} else {
-		ide_delay_50ms();
+		mdelay(50);
 		hd_status = IDE_STATUS_REG;
 	}
 
@@ -281,10 +271,11 @@
 	do {
 		if (time_after(jiffies, timeout))
 			goto out;	/* drive timed-out */
-		ide_delay_50ms();		/* give drive a breather */
+		mdelay(50);		/* give drive a breather */
 	} while (IN_BYTE(hd_status) & BUSY_STAT);
 
-	ide_delay_50ms();		/* wait for IRQ and DRQ_STAT */
+	mdelay(50);		/* wait for IRQ and DRQ_STAT */
+
 	if (OK_STAT(GET_STAT(),DRQ_STAT,BAD_R_STAT)) {
 		unsigned long flags;
 		__save_flags(flags);	/* local CPU only */
@@ -345,13 +336,13 @@
 		drive->name, drive->present, drive->type,
 		(cmd == WIN_IDENTIFY) ? "ATA" : "ATAPI");
 #endif
-	ide_delay_50ms();	/* needed for some systems (e.g. crw9624 as drive0 with disk as slave) */
+	mdelay(50);	/* needed for some systems (e.g. crw9624 as drive0 with disk as slave) */
 	SELECT_DRIVE(hwif,drive);
-	ide_delay_50ms();
+	mdelay(50);
 	if (IN_BYTE(IDE_SELECT_REG) != drive->select.all && !drive->present) {
 		if (drive->select.b.unit != 0) {
 			SELECT_DRIVE(hwif,&hwif->drives[0]);	/* exit with drive0 selected */
-			ide_delay_50ms();		/* allow BUSY_STAT to assert & clear */
+			mdelay(50);		/* allow BUSY_STAT to assert & clear */
 		}
 		return 3;    /* no i/f present: mmm.. this should be a 4 -ml */
 	}
@@ -363,13 +354,13 @@
 		if (rc == 1 && cmd == WIN_PIDENTIFY && drive->autotune != 2) {
 			unsigned long timeout;
 			printk("%s: no response (status = 0x%02x), resetting drive\n", drive->name, GET_STAT());
-			ide_delay_50ms();
+			mdelay(50);
 			OUT_BYTE (drive->select.all, IDE_SELECT_REG);
-			ide_delay_50ms();
+			mdelay(50);
 			OUT_BYTE(WIN_SRST, IDE_COMMAND_REG);
 			timeout = jiffies;
 			while ((GET_STAT() & BUSY_STAT) && time_before(jiffies, timeout + WAIT_WORSTCASE))
-				ide_delay_50ms();
+				mdelay(50);
 			rc = identify(drive, cmd);
 		}
 		if (rc == 1)
@@ -380,7 +371,7 @@
 
 	if (drive->select.b.unit != 0) {
 		SELECT_DRIVE(hwif,&hwif->drives[0]);	/* exit with drive0 selected */
-		ide_delay_50ms();
+		mdelay(50);
 		(void) GET_STAT();		/* ensure drive irq is clear */
 	}
 	return rc;
@@ -392,7 +383,7 @@
 
 	printk("%s: enabling %s -- ", drive->channel->name, drive->id->model);
 	SELECT_DRIVE(drive->channel, drive);
-	ide_delay_50ms();
+	mdelay(50);
 	OUT_BYTE(EXABYTE_ENABLE_NEST, IDE_COMMAND_REG);
 	timeout = jiffies + WAIT_WORSTCASE;
 	do {
@@ -400,9 +391,9 @@
 			printk("failed (timeout)\n");
 			return;
 		}
-		ide_delay_50ms();
+		mdelay(50);
 	} while (GET_STAT() & BUSY_STAT);
-	ide_delay_50ms();
+	mdelay(50);
 	if (!OK_STAT(GET_STAT(), 0, BAD_STAT))
 		printk("failed (status = 0x%02x)\n", GET_STAT());
 	else
@@ -536,7 +527,7 @@
 		udelay(10);
 		OUT_BYTE(8, ch->io_ports[IDE_CONTROL_OFFSET]);
 		do {
-			ide_delay_50ms();
+			mdelay(50);
 			stat = IN_BYTE(ch->io_ports[IDE_STATUS_OFFSET]);
 		} while ((stat & BUSY_STAT) && time_before(jiffies, timeout));
 	}
diff -urN linux-2.5.18/drivers/ide/ide-taskfile.c linux/drivers/ide/ide-taskfile.c
--- linux-2.5.18/drivers/ide/ide-taskfile.c	2002-05-28 17:15:53.000000000 +0200
+++ linux/drivers/ide/ide-taskfile.c	2002-05-28 11:41:22.000000000 +0200
@@ -353,13 +353,20 @@
 
 	OUT_BYTE((args->taskfile.device_head & HIHI) | drive->select.all, IDE_SELECT_REG);
 	if (args->handler != NULL) {
+
+		/* This is apparently supposed to reset the wait timeout for
+		 * the interrupt to accur.
+		 */
+
 		ide_set_handler(drive, args->handler, WAIT_CMD, NULL);
 		OUT_BYTE(args->taskfile.command, IDE_COMMAND_REG);
+
 		/*
 		 * Warning check for race between handler and prehandler for
 		 * writing first block of data.  however since we are well
 		 * inside the boundaries of the seek, we should be okay.
 		 */
+
 		if (args->prehandler != NULL)
 			return args->prehandler(drive, rq);
 	} else {
@@ -579,7 +586,8 @@
 	return ide_started;
 }
 
-/* Called by ioctl to feature out type of command being called */
+/* Called to figure out the type of command being called.
+ */
 void ide_cmd_type_parser(struct ata_taskfile *args)
 {
 	struct hd_drive_task_hdr *taskfile = &args->taskfile;
diff -urN linux-2.5.18/drivers/ide/macide.c linux/drivers/ide/macide.c
--- linux-2.5.18/drivers/ide/macide.c	2002-05-25 03:55:19.000000000 +0200
+++ linux/drivers/ide/macide.c	2002-05-27 16:05:38.000000000 +0200
@@ -100,17 +100,17 @@
 	case MAC_IDE_QUADRA:
 		ide_setup_ports(&hw, (ide_ioreg_t)IDE_BASE, macide_offsets,
 				0, 0, macide_ack_intr, IRQ_NUBUS_F);
-		index = ide_register_hw(&hw, NULL);
+		index = ide_register_hw(&hw);
 		break;
 	case MAC_IDE_PB:
 		ide_setup_ports(&hw, (ide_ioreg_t)IDE_BASE, macide_offsets,
 				0, 0, macide_ack_intr, IRQ_NUBUS_C);
-		index = ide_register_hw(&hw, NULL);
+		index = ide_register_hw(&hw);
 		break;
 	case MAC_IDE_BABOON:
 		ide_setup_ports(&hw, (ide_ioreg_t)BABOON_BASE, macide_offsets,
 				0, 0, NULL, IRQ_BABOON_1);
-		index = ide_register_hw(&hw, NULL);
+		index = ide_register_hw(&hw);
 		if (index == -1) break;
 		if (macintosh_config->ident == MAC_MODEL_PB190) {
 
diff -urN linux-2.5.18/drivers/ide/main.c linux/drivers/ide/main.c
--- linux-2.5.18/drivers/ide/main.c	2002-05-28 17:15:53.000000000 +0200
+++ linux/drivers/ide/main.c	2002-05-28 12:44:05.000000000 +0200
@@ -133,6 +133,43 @@
  */
 struct ata_channel ide_hwifs[MAX_HWIFS];	/* master data repository */
 
+/*
+ * FIXME: This function should be unrolled in the palces where it get's used,
+ * since in reality it's simple architecture specific initialization.
+ *
+ * Setup hw_regs_t structure described by parameters.  You may set up the hw
+ * structure yourself OR use this routine to do it for you.
+ */
+void ide_setup_ports(hw_regs_t *hw,
+		ide_ioreg_t base,
+		int *offsets,
+		ide_ioreg_t ctrl,
+		ide_ioreg_t intr,
+		ide_ack_intr_t *ack_intr,
+		int irq)
+{
+	int i;
+
+	for (i = 0; i < IDE_NR_PORTS; i++) {
+		if (offsets[i] != -1)
+			hw->io_ports[i] = base + offsets[i];
+		else
+			hw->io_ports[i] = 0;
+	}
+	if (offsets[IDE_CONTROL_OFFSET] == -1)
+		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl;
+
+	/* FIMXE: check if we can remove this ifdef */
+#if defined(CONFIG_AMIGA) || defined(CONFIG_MAC)
+	if (offsets[IDE_IRQ_OFFSET] == -1)
+		hw->io_ports[IDE_IRQ_OFFSET] = intr;
+#endif
+
+	hw->irq = irq;
+	hw->dma = NO_DMA;
+	hw->ack_intr = ack_intr;
+}
+
 static void init_hwif_data(struct ata_channel *ch, unsigned int index)
 {
 	static const unsigned int majors[] = {
@@ -148,15 +185,18 @@
 	memset(&hw, 0, sizeof(hw_regs_t));
 
 	/* fill in any non-zero initial values */
-	ch->index     = index;
+	ch->index = index;
 	ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, &ch->irq);
+
 	memcpy(&ch->hw, &hw, sizeof(hw));
 	memcpy(ch->io_ports, hw.io_ports, sizeof(hw.io_ports));
+
 	ch->noprobe	= !ch->io_ports[IDE_DATA_OFFSET];
 #ifdef CONFIG_BLK_DEV_HD
 	if (ch->io_ports[IDE_DATA_OFFSET] == HD_DATA)
 		ch->noprobe = 1; /* may be overridden by ide_setup() */
 #endif
+
 	ch->major = majors[index];
 	sprintf(ch->name, "ide%d", index);
 	ch->bus_state = BUSSTATE_ON;
@@ -576,7 +616,7 @@
  * Register an IDE interface, specifing exactly the registers etc
  * Set init=1 iff calling before probes have taken place.
  */
-int ide_register_hw(hw_regs_t *hw, struct ata_channel **hwifp)
+int ide_register_hw(hw_regs_t *hw)
 {
 	int h;
 	int retry = 1;
@@ -627,9 +667,6 @@
 			break;
 	}
 
-	if (hwifp)
-		*hwifp = ch;
-
 	return (initializing || ch->present) ? h : -1;
 }
 
diff -urN linux-2.5.18/drivers/ide/pdc202xx.c linux/drivers/ide/pdc202xx.c
--- linux-2.5.18/drivers/ide/pdc202xx.c	2002-05-25 03:55:30.000000000 +0200
+++ linux/drivers/ide/pdc202xx.c	2002-05-28 17:03:47.000000000 +0200
@@ -53,10 +53,6 @@
 #define PDC202XX_DEBUG_DRIVE_INFO		0
 #define PDC202XX_DECODE_REGISTER_INFO		0
 
-#ifndef SPLIT_BYTE
-#define SPLIT_BYTE(B,H,L)	((H)=(B>>4), (L)=(B-((B>>4)<<4)))
-#endif
-
 extern char *ide_xfer_verbose (byte xfer_rate);
 
 /* A Register */
@@ -67,103 +63,62 @@
 #define	IORDY_EN	0x20	/* PIO: IOREADY */
 #define	PREFETCH_EN	0x10	/* PIO: PREFETCH */
 
-#define	PA3		0x08	/* PIO"A" timing */
-#define	PA2		0x04	/* PIO"A" timing */
-#define	PA1		0x02	/* PIO"A" timing */
-#define	PA0		0x01	/* PIO"A" timing */
-
-/* B Register */
-
-#define	MB2		0x80	/* DMA"B" timing */
-#define	MB1		0x40	/* DMA"B" timing */
-#define	MB0		0x20	/* DMA"B" timing */
-
-#define	PB4		0x10	/* PIO_FORCE 1:0 */
-
-#define	PB3		0x08	/* PIO"B" timing */	/* PIO flow Control mode */
-#define	PB2		0x04	/* PIO"B" timing */	/* PIO 4 */
-#define	PB1		0x02	/* PIO"B" timing */	/* PIO 3 half */
-#define	PB0		0x01	/* PIO"B" timing */	/* PIO 3 other half */
-
-/* C Register */
-#define	IORDYp_NO_SPEED	0x4F
-#define	SPEED_DIS	0x0F
-
-#define	DMARQp		0x80
-#define	IORDYp		0x40
-#define	DMAR_EN		0x20
-#define	DMAW_EN		0x10
-
-#define	MC3		0x08	/* DMA"C" timing */
-#define	MC2		0x04	/* DMA"C" timing */
-#define	MC1		0x02	/* DMA"C" timing */
-#define	MC0		0x01	/* DMA"C" timing */
-
 #if PDC202XX_DECODE_REGISTER_INFO
 
-#define REG_A		0x01
-#define REG_B		0x02
-#define REG_C		0x04
-#define REG_D		0x08
+struct pdc_bit_messages {
+	u8 mask;
+	const char *msg;
+};
 
-static void decode_registers (byte registers, byte value)
+static struct pdc_bit_messages pdc_reg_A[] = {
+	{ 0x80, "SYNC_IN" },
+	{ 0x40, "ERRDY_EN" },
+	{ 0x20, "IORDY_EN" },
+	{ 0x10, "PREFETCH_EN" },
+	/* PA3-PA0 - PIO "A" timing */
+	{ 0x08, "PA3" },
+	{ 0x04, "PA2" },
+	{ 0x02, "PA1" },
+	{ 0x01, "PA0" }
+};
+
+static struct pdc_bit_messages pdc_reg_B[] = {
+	/* MB2-MB0 - DMA "B" timing */
+	{ 0x80, "MB2" },
+	{ 0x40, "MB1" },
+	{ 0x20, "MB0" },
+	{ 0x10, "PIO_FORCED/PB4" },	/* PIO_FORCE 1:0 */
+	/* PB3-PB0 - PIO "B" timing */
+	{ 0x08, "PB3" },		/* PIO flow Control mode */
+	{ 0x04, "PB2" },		/* PIO 4 */
+	{ 0x02, "PB1" },		/* PIO 3 half */
+	{ 0x01, "PB0" }			/* PIO 3 other half */
+};
+
+static struct pdc_bit_messages pdc_reg_C[] = {
+	{ 0x80, "DMARQp" },
+	{ 0x40, "IORDYp" },
+	{ 0x20, "DMAR_EN" },
+	{ 0x10, "DMAW_EN" },
+	/* MC3-MC0 - DMA "C" timing */
+	{ 0x08, "MC3" },
+	{ 0x04, "MC2" },
+	{ 0x02, "MC1" },
+	{ 0x01, "MC0" }
+};
+
+static void pdc_dump_bits(struct pdc_bit_messages *msgs, byte bits)
 {
-	byte	bit = 0, bit1 = 0, bit2 = 0;
+	int i;
 
-	switch(registers) {
-		case REG_A:
-			printk("A Register ");
-			if (value & 0x80) printk("SYNC_IN ");
-			if (value & 0x40) printk("ERRDY_EN ");
-			if (value & 0x20) printk("IORDY_EN ");
-			if (value & 0x10) printk("PREFETCH_EN ");
-			if (value & 0x08) { printk("PA3 ");bit2 |= 0x08; }
-			if (value & 0x04) { printk("PA2 ");bit2 |= 0x04; }
-			if (value & 0x02) { printk("PA1 ");bit2 |= 0x02; }
-			if (value & 0x01) { printk("PA0 ");bit2 |= 0x01; }
-			printk("PIO(A) = %d ", bit2);
-			break;
-		case REG_B:
-			printk("B Register ");
-			if (value & 0x80) { printk("MB2 ");bit1 |= 0x80; }
-			if (value & 0x40) { printk("MB1 ");bit1 |= 0x40; }
-			if (value & 0x20) { printk("MB0 ");bit1 |= 0x20; }
-			printk("DMA(B) = %d ", bit1 >> 5);
-			if (value & 0x10) printk("PIO_FORCED/PB4 ");
-			if (value & 0x08) { printk("PB3 ");bit2 |= 0x08; }
-			if (value & 0x04) { printk("PB2 ");bit2 |= 0x04; }
-			if (value & 0x02) { printk("PB1 ");bit2 |= 0x02; }
-			if (value & 0x01) { printk("PB0 ");bit2 |= 0x01; }
-			printk("PIO(B) = %d ", bit2);
-			break;
-		case REG_C:
-			printk("C Register ");
-			if (value & 0x80) printk("DMARQp ");
-			if (value & 0x40) printk("IORDYp ");
-			if (value & 0x20) printk("DMAR_EN ");
-			if (value & 0x10) printk("DMAW_EN ");
-
-			if (value & 0x08) { printk("MC3 ");bit2 |= 0x08; }
-			if (value & 0x04) { printk("MC2 ");bit2 |= 0x04; }
-			if (value & 0x02) { printk("MC1 ");bit2 |= 0x02; }
-			if (value & 0x01) { printk("MC0 ");bit2 |= 0x01; }
-			printk("DMA(C) = %d ", bit2);
-			break;
-		case REG_D:
-			printk("D Register ");
-			break;
-		default:
-			return;
-	}
-	printk("\n        %s ", (registers & REG_D) ? "DP" :
-				(registers & REG_C) ? "CP" :
-				(registers & REG_B) ? "BP" :
-				(registers & REG_A) ? "AP" : "ERROR");
-	for (bit=128;bit>0;bit/=2)
-		printk("%s", (value & bit) ? "1" : "0");
-	printk("\n");
-}
+	printk(KERN_DEBUG " { ");
+
+	for (i = 0; i < 8; i++, msgs++)
+		if (bits & msgs->mask)
+			printk(KERN_DEBUG "%s ", msgs->msg);
 
+	printk(KERN_DEBUG " }\n");
+}
 #endif /* PDC202XX_DECODE_REGISTER_INFO */
 
 int check_in_drive_lists(struct ata_device *drive)
@@ -222,13 +177,10 @@
 	byte			drive_pci, AP, BP, CP, DP;
 	byte			TA = 0, TB = 0, TC = 0;
 
-	switch (drive->dn) {
-		case 0: drive_pci = 0x60; break;
-		case 1: drive_pci = 0x64; break;
-		case 2: drive_pci = 0x68; break;
-		case 3: drive_pci = 0x6c; break;
-		default: return -1;
-	}
+	if (drive->dn > 3)
+		return -1;
+
+	drive_pci = 0x60 + (drive->dn << 2);
 
 	if ((drive->type != ATA_DISK) && (speed < XFER_SW_DMA_0))
 		return -1;
@@ -245,11 +197,8 @@
 			/* clear DMA modes of upper 842 bits of B Register */
 			/* clear PIO forced mode upper 1 bit of B Register */
 			pci_write_config_byte(dev, (drive_pci)|0x01, BP & ~0xF0);
-			pci_read_config_byte(dev, (drive_pci)|0x01, &BP);
-
 			/* clear DMA modes of lower 8421 bits of C Register */
 			pci_write_config_byte(dev, (drive_pci)|0x02, CP & ~0x0F);
-			pci_read_config_byte(dev, (drive_pci)|0x02, &CP);
 		}
 	} else {
 #else
@@ -258,14 +207,8 @@
 		if ((AP & 0x0F) || (BP & 0x07)) {
 			/* clear PIO modes of lower 8421 bits of A Register */
 			pci_write_config_byte(dev, (drive_pci), AP & ~0x0F);
-			pci_read_config_byte(dev, (drive_pci), &AP);
-
 			/* clear PIO modes of lower 421 bits of B Register */
 			pci_write_config_byte(dev, (drive_pci)|0x01, BP & ~0x07);
-			pci_read_config_byte(dev, (drive_pci)|0x01, &BP);
-
-			pci_read_config_byte(dev, (drive_pci), &AP);
-			pci_read_config_byte(dev, (drive_pci)|0x01, &BP);
 		}
 	}
 
@@ -277,17 +220,17 @@
 #ifdef CONFIG_BLK_DEV_IDEDMA
 		/* case XFER_UDMA_6: */
 		case XFER_UDMA_5:
-		case XFER_UDMA_4:	TB = 0x20; TC = 0x01; break;	/* speed 8 == UDMA mode 4 */
-		case XFER_UDMA_3:	TB = 0x40; TC = 0x02; break;	/* speed 7 == UDMA mode 3 */
-		case XFER_UDMA_2:	TB = 0x20; TC = 0x01; break;	/* speed 6 == UDMA mode 2 */
-		case XFER_UDMA_1:	TB = 0x40; TC = 0x02; break;	/* speed 5 == UDMA mode 1 */
-		case XFER_UDMA_0:	TB = 0x60; TC = 0x03; break;	/* speed 4 == UDMA mode 0 */
-		case XFER_MW_DMA_2:	TB = 0x60; TC = 0x03; break;	/* speed 4 == MDMA mode 2 */
-		case XFER_MW_DMA_1:	TB = 0x60; TC = 0x04; break;	/* speed 3 == MDMA mode 1 */
-		case XFER_MW_DMA_0:	TB = 0x60; TC = 0x05; break;	/* speed 2 == MDMA mode 0 */
-		case XFER_SW_DMA_2:	TB = 0x60; TC = 0x05; break;	/* speed 0 == SDMA mode 2 */
-		case XFER_SW_DMA_1:	TB = 0x80; TC = 0x06; break;	/* speed 1 == SDMA mode 1 */
-		case XFER_SW_DMA_0:	TB = 0xC0; TC = 0x0B; break;	/* speed 0 == SDMA mode 0 */
+		case XFER_UDMA_4:	TB = 0x20; TC = 0x01; break;
+		case XFER_UDMA_3:	TB = 0x40; TC = 0x02; break;
+		case XFER_UDMA_2:	TB = 0x20; TC = 0x01; break;
+		case XFER_UDMA_1:	TB = 0x40; TC = 0x02; break;
+		case XFER_UDMA_0:	TB = 0x60; TC = 0x03; break;
+		case XFER_MW_DMA_2:	TB = 0x60; TC = 0x03; break;
+		case XFER_MW_DMA_1:	TB = 0x60; TC = 0x04; break;
+		case XFER_MW_DMA_0:	TB = 0x60; TC = 0x05; break;
+		case XFER_SW_DMA_2:	TB = 0x60; TC = 0x05; break;
+		case XFER_SW_DMA_1:	TB = 0x80; TC = 0x06; break;
+		case XFER_SW_DMA_0:	TB = 0xC0; TC = 0x0B; break;
 #endif /* CONFIG_BLK_DEV_IDEDMA */
 		case XFER_PIO_4:	TA = 0x01; TB = 0x04; break;
 		case XFER_PIO_3:	TA = 0x02; TB = 0x06; break;
@@ -315,11 +258,18 @@
 	pci_read_config_byte(dev, (drive_pci)|0x02, &CP);
 	pci_read_config_byte(dev, (drive_pci)|0x03, &DP);
 
-	decode_registers(REG_A, AP);
-	decode_registers(REG_B, BP);
-	decode_registers(REG_C, CP);
-	decode_registers(REG_D, DP);
-#endif /* PDC202XX_DECODE_REGISTER_INFO */
+	printk(KERN_DEBUG "AP(%x): PIO(A) = %d\n", AP, AP & 0x0f);
+	pdc_dump_bits(pdc_reg_A, AP);
+
+	printk(KERN_DEBUG "BP(%x): DMA(B) = %d PIO(B) = %d\n",
+			  BP, (BP & 0xe0) >> 5, BP & 0x0f);
+	pdc_dump_bits(pdc_reg_B, BP);
+
+	printk(KERN_DEBUG "CP(%x): DMA(C) = %d\n", CP, CP & 0x0f);
+	pdc_dump_bits(pdc_reg_C, CP);
+
+	printk(KERN_DEBUG "DP(%x)\n", DP);
+#endif
 
 	if (!drive->init_speed)
 		drive->init_speed = speed;
@@ -352,8 +302,7 @@
 	unsigned long indexreg	= (hwif->dma_base + 1);
 	unsigned long datareg	= (hwif->dma_base + 3);
 #else
-	struct pci_dev *dev	= hwif->pci_dev;
-	unsigned long high_16	= pci_resource_start(dev, 4);
+	unsigned long high_16	= pci_resource_start(hwif->pci_dev, 4);
 	unsigned long indexreg	= high_16 + (hwif->unit ? 0x09 : 0x01);
 	unsigned long datareg	= (indexreg + 2);
 #endif /* CONFIG_BLK_DEV_IDEDMA */
@@ -473,6 +422,7 @@
 }
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
+/* FIXME: split this for old & new chipsets (jumpbit) --bkz */
 static int config_chipset_for_dma(struct ata_device *drive, byte udma)
 {
 	struct hd_driveid *id	= drive->id;
@@ -483,19 +433,13 @@
 	unsigned long dma_base  = hwif->dma_base;
 	unsigned long indexreg	= dma_base + 1;
 	unsigned long datareg	= dma_base + 3;
-	byte iordy		= 0x13;
 	byte adj		= (drive->dn%2) ? 0x08 : 0x00;
-	byte cable		= 0;
 	byte jumpbit		= 0;
 	unsigned int		drive_conf;
-	byte drive_pci = 0, mate_pci = 0;
-	byte			test1, test2, mode = -1;
-	byte			AP;
-	unsigned short		EP;
+	byte drive_pci = 0, AP, tmp, mode = -1;
 	byte CLKSPD		= 0;
 	/* primary - second bit, secondary - fourth bit */
 	byte mask		= hwif->unit ? 0x08 : 0x02;
-	unsigned short c_mask	= hwif->unit ? (1<<11) : (1<<10);
 	int map;
 
 	byte needs_80w = ((id->dma_ultra & 0x0008) ||
@@ -504,24 +448,14 @@
 			  (id->dma_ultra & 0x0040));
 
 	switch(dev->device) {
-		case PCI_DEVICE_ID_PROMISE_20275:
-		case PCI_DEVICE_ID_PROMISE_20276:
-		case PCI_DEVICE_ID_PROMISE_20269:
-		case PCI_DEVICE_ID_PROMISE_20268R:
-		case PCI_DEVICE_ID_PROMISE_20268:
-			OUT_BYTE(0x0b, indexreg);
-			cable = ((IN_BYTE(datareg) & 0x04));
-			jumpbit = 1;
-			break;
 		case PCI_DEVICE_ID_PROMISE_20267:
 		case PCI_DEVICE_ID_PROMISE_20265:
 		case PCI_DEVICE_ID_PROMISE_20262:
-			pci_read_config_word(dev, 0x50, &EP);
-			cable = (EP & c_mask);
+		case PCI_DEVICE_ID_PROMISE_20246:
 			jumpbit = 0;
 			break;
-		default:
-			cable = 1; jumpbit = 0;
+		default: /* chipsets newer then 20268 */
+			jumpbit = 1;
 			break;
 	}
 
@@ -541,7 +475,7 @@
 	 */
 	if (needs_80w) {
 		/* FIXME: this check is wrong for 20246 --bkz */
-		if (cable) {
+		if (!hwif->udma_four) {
 			printk(KERN_WARNING "%s: channel requires an 80-pin cable.\n", hwif->name);
 			printk(KERN_WARNING "%s: reduced to UDMA(33) mode.\n", drive->name);
 			if (!jumpbit)
@@ -563,37 +497,30 @@
 		}
 	}
 
-	if (jumpbit) {
-		if (drive->type != ATA_DISK)
-			return 0;
-		if (id->capability & 4) {	/* IORDY_EN & PREFETCH_EN */
-			set_2regs(iordy, (IN_BYTE(datareg)|0x03));
-		}
-		goto jumpbit_is_set;
-	}
+	if (jumpbit)
+		goto chipset_is_set;
 
-	switch(drive->dn) {
-		case 0:	drive_pci = 0x60;
-		case 2:	drive_pci = 0x68;
-			pci_read_config_dword(dev, drive_pci, &drive_conf);
-			if ((drive_conf != 0x004ff304) && (drive_conf != 0x004ff3c4))
-				goto chipset_is_set;
-			pci_read_config_byte(dev, drive_pci, &test1);
-			if (!(test1 & SYNC_ERRDY_EN))
-				pci_write_config_byte(dev, drive_pci, test1|SYNC_ERRDY_EN);
-			break;
-		case 1:	drive_pci = 0x64; mate_pci = 0x60;
-		case 3:	drive_pci = 0x6c; mate_pci = 0x68;
-			pci_read_config_dword(dev, drive_pci, &drive_conf);
-			if ((drive_conf != 0x004ff304) && (drive_conf != 0x004ff3c4))
-				goto chipset_is_set;
-			pci_read_config_byte(dev, mate_pci, &test1);
-			pci_read_config_byte(dev, drive_pci, &test2);
-			if ((test1 & SYNC_ERRDY_EN) && !(test2 & SYNC_ERRDY_EN))
-				pci_write_config_byte(dev, drive_pci, test2|SYNC_ERRDY_EN);
-			break;
-		default:
-			return 0;
+	if (drive->dn > 3)	/* FIXME: remove this --bkz */
+		return 0;
+
+	drive_pci = 0x60 + (drive->dn << 2);
+	pci_read_config_dword(dev, drive_pci, &drive_conf);
+	if ((drive_conf != 0x004ff304) && (drive_conf != 0x004ff3c4))
+		goto chipset_is_set;
+
+	/* FIXME: what if SYNC_ERRDY is enabled for slave
+		  and disabled for master? --bkz */
+	pci_read_config_byte(dev, drive_pci, &AP);
+	if (!(AP & SYNC_ERRDY_EN)) {
+		if (drive->dn == 0 || drive->dn == 2) {
+			/* enable SYNC_ERRDY for master */
+			pci_write_config_byte(dev, drive_pci, AP|SYNC_ERRDY_EN);
+		} else {
+			/* enable SYNC_ERRDY for slave if enabled for master */
+			pci_read_config_byte(dev, drive_pci - 4, &tmp);
+			if (tmp & SYNC_ERRDY_EN)
+				pci_write_config_byte(dev, drive_pci, AP|SYNC_ERRDY_EN);
+		}
 	}
 
 chipset_is_set:
@@ -601,14 +528,18 @@
 	if (drive->type != ATA_DISK)
 		return 0;
 
-	pci_read_config_byte(dev, (drive_pci), &AP);
-	if (id->capability & 4)	/* IORDY_EN */
-		pci_write_config_byte(dev, (drive_pci), AP|IORDY_EN);
-	pci_read_config_byte(dev, (drive_pci), &AP);
-	if (drive->type == ATA_DISK)	/* PREFETCH_EN */
-		pci_write_config_byte(dev, (drive_pci), AP|PREFETCH_EN);
-
-jumpbit_is_set:
+	if (jumpbit) {
+		if (id->capability & 4) {	/* IORDY_EN & PREFETCH_EN */
+			set_2regs(0x13, (IN_BYTE(datareg)|0x03));
+		}
+	} else {
+		pci_read_config_byte(dev, drive_pci, &AP);
+		if (id->capability & 4)		/* IORDY_EN */
+			pci_write_config_byte(dev, drive_pci, AP|IORDY_EN);
+		pci_read_config_byte(dev, drive_pci, &AP);
+		if (drive->type == ATA_DISK)	/* PREFETCH_EN */
+			pci_write_config_byte(dev, drive_pci, AP|PREFETCH_EN);
+	}
 
 	if (udma) {
 		map = pdc202xx_ratemask(drive);
@@ -688,24 +619,13 @@
 
 static int pdc202xx_udma_start(struct ata_device *drive, struct request *rq)
 {
-	u8 lba48hack = 0, clock = 0;
 	struct ata_channel *ch = drive->channel;
-	struct pci_dev *dev	= ch->pci_dev;
-	unsigned long high_16	= pci_resource_start(dev, 4);
-	unsigned long atapi_reg	= high_16 + (ch->unit ? 0x24 : 0x00);
+	unsigned long high_16 = pci_resource_start(ch->pci_dev, 4);
+	unsigned long atapi_reg = high_16 + (ch->unit ? 0x24 : 0x00);
 
-	switch (dev->device) {
-		case PCI_DEVICE_ID_PROMISE_20267:
-		case PCI_DEVICE_ID_PROMISE_20265:
-		case PCI_DEVICE_ID_PROMISE_20262:
-			lba48hack = 1;
-			clock = IN_BYTE(high_16 + 0x11);
-		default:
-			break;
-	}
-
-	if (drive->addressing && lba48hack) {
+	if (drive->addressing) {
 		unsigned long word_count = 0;
+		u8 clock = IN_BYTE(high_16 + 0x11);
 
 		outb(clock|(ch->unit ? 0x08 : 0x02), high_16 + 0x11);
 		word_count = (rq->nr_sectors << 8);
@@ -725,26 +645,13 @@
 
 int pdc202xx_udma_stop(struct ata_device *drive)
 {
-	u8 lba48hack = 0, clock = 0;
 	struct ata_channel *ch = drive->channel;
-	struct pci_dev *dev	= ch->pci_dev;
-	unsigned long high_16	= pci_resource_start(dev, 4);
+	unsigned long high_16 = pci_resource_start(ch->pci_dev, 4);
 	unsigned long atapi_reg	= high_16 + (ch->unit ? 0x24 : 0x00);
 	unsigned long dma_base = ch->dma_base;
-	u8 dma_stat;
+	u8 dma_stat, clock;
 
-	switch (dev->device) {
-		case PCI_DEVICE_ID_PROMISE_20267:
-		case PCI_DEVICE_ID_PROMISE_20265:
-		case PCI_DEVICE_ID_PROMISE_20262:
-			lba48hack = 1;
-			/* FIXME: why do we need this here --bkz */
-			clock = IN_BYTE(high_16 + 0x11);
- 		default:
-			break;
-	}
-
-	if (drive->addressing && lba48hack) {
+	if (drive->addressing) {
 		outl(0, atapi_reg);	/* zero out extra */
 		clock = IN_BYTE(high_16 + 0x11);
 		OUT_BYTE(clock & ~(ch->unit ? 0x08:0x02), high_16 + 0x11);
@@ -762,34 +669,10 @@
 static int pdc202xx_udma_irq_status(struct ata_device *drive)
 {
 	struct ata_channel *ch = drive->channel;
-	u8 dma_stat = 0;
-	u8 sc1d	= 0;
-	u8 newchip = 0;
-	u8 clock = 0;
-	struct pci_dev *dev = ch->pci_dev;
-	unsigned long high_16 = pci_resource_start(dev, 4);
-	unsigned long dma_base = ch->dma_base;
-
-	switch (dev->device) {
-		case PCI_DEVICE_ID_PROMISE_20275:
-		case PCI_DEVICE_ID_PROMISE_20276:
-		case PCI_DEVICE_ID_PROMISE_20269:
-		case PCI_DEVICE_ID_PROMISE_20268R:
-		case PCI_DEVICE_ID_PROMISE_20268:
-			newchip = 1;
-			break;
-		case PCI_DEVICE_ID_PROMISE_20267:
-		case PCI_DEVICE_ID_PROMISE_20265:
-		case PCI_DEVICE_ID_PROMISE_20262:
-			/* FIXME: why do we need this here --bkz */
-			clock = IN_BYTE(high_16 + 0x11);
-		default:
-			break;
-	}
+	unsigned long high_16 = pci_resource_start(ch->pci_dev, 4);
+	u8 dma_stat, sc1d;
 
-	dma_stat = IN_BYTE(dma_base + 2);
-	if (newchip)
-		return (dma_stat & 4) == 4;
+	dma_stat = IN_BYTE(ch->dma_base + 2);
 
 	sc1d = IN_BYTE(high_16 + 0x001d);
 	if (ch->unit) {
@@ -838,6 +721,7 @@
 		drive->channel->unit ? "Secondary" : "Primary");
 }
 
+/* FIXME: should be splited for old & new chipsets --bkz */
 static unsigned int __init pdc202xx_init_chipset(struct pci_dev *dev)
 {
 	unsigned long high_16	= pci_resource_start(dev, 4);
@@ -877,6 +761,8 @@
 			set_reg_and_wait(udma_speed_flag & ~0x10, high_16 + 0x001f, 2000);   /* 2 seconds ?! */
 			break;
 		default:
+		/* FIXME: only checked for 20246 - is this right?,
+			  if it is needed it should go to ide-pci --bkz */
 			if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) {
 				byte irq = 0, irq2 = 0;
 				pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
@@ -949,6 +835,15 @@
 		case PCI_DEVICE_ID_PROMISE_20265:
 		case PCI_DEVICE_ID_PROMISE_20262:
 			hwif->resetproc	= &pdc202xx_reset;
+#ifdef CONFIG_BLK_DEV_IDEDMA
+			/* we need special functions for lba48 */
+			if (hwif->dma_base) {
+				hwif->udma_start = pdc202xx_udma_start;
+				hwif->udma_stop = pdc202xx_udma_stop;
+				hwif->udma_irq_status = pdc202xx_udma_irq_status;
+			}
+#endif
+		/* FIXME: check whether 20246 works with lba48 --bkz */
 		case PCI_DEVICE_ID_PROMISE_20246:
 			hwif->speedproc = &pdc202xx_tune_chipset;
 		default:
@@ -957,9 +852,6 @@
 
 #ifdef CONFIG_BLK_DEV_IDEDMA
 	if (hwif->dma_base) {
-		hwif->udma_start = pdc202xx_udma_start;
-		hwif->udma_stop = pdc202xx_udma_stop;
-		hwif->udma_irq_status = pdc202xx_udma_irq_status;
 		hwif->udma_irq_lost = pdc202xx_bug;
 		hwif->udma_timeout = pdc202xx_bug;
 		hwif->XXX_udma = pdc202xx_dmaproc;
diff -urN linux-2.5.18/drivers/ide/pdc4030.c linux/drivers/ide/pdc4030.c
--- linux-2.5.18/drivers/ide/pdc4030.c	2002-05-25 03:55:21.000000000 +0200
+++ linux/drivers/ide/pdc4030.c	2002-05-27 15:03:08.000000000 +0200
@@ -342,7 +342,7 @@
 	outb(0x14, IDE_SELECT_REG);
 	outb(PROMISE_EXTENDED_COMMAND, IDE_COMMAND_REG);
 
-	ide_delay_50ms();
+	mdelay(50);
 
 	if (inb(IDE_ERROR_REG) == 'P' &&
 	    inb(IDE_NSECTOR_REG) == 'T' &&
diff -urN linux-2.5.18/drivers/ide/q40ide.c linux/drivers/ide/q40ide.c
--- linux-2.5.18/drivers/ide/q40ide.c	2002-05-25 03:55:27.000000000 +0200
+++ linux/drivers/ide/q40ide.c	2002-05-27 16:07:08.000000000 +0200
@@ -82,10 +82,10 @@
     for (i = 0; i < Q40IDE_NUM_HWIFS; i++) {
 	hw_regs_t hw;
 
-	ide_setup_ports(&hw,(ide_ioreg_t) pcide_bases[i], (int *)pcide_offsets, 
-			pcide_bases[i]+0x206, 
+	ide_setup_ports(&hw,(ide_ioreg_t) pcide_bases[i], (int *)pcide_offsets,
+			pcide_bases[i] + 0x206,
 			0, NULL, q40ide_default_irq(pcide_bases[i]));
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
     }
 }
 
diff -urN linux-2.5.18/drivers/ide/rapide.c linux/drivers/ide/rapide.c
--- linux-2.5.18/drivers/ide/rapide.c	2002-05-25 03:55:22.000000000 +0200
+++ linux/drivers/ide/rapide.c	2002-05-27 16:06:08.000000000 +0200
@@ -41,7 +41,7 @@
 	hw.io_ports[IDE_CONTROL_OFFSET] = port + 0x206;
 	hw.irq = ec->irq;
 
-	return ide_register_hw(&hw, NULL);
+	return ide_register_hw(&hw);
 }
 
 int __init rapide_init(void)
diff -urN linux-2.5.18/drivers/ide/serverworks.c linux/drivers/ide/serverworks.c
--- linux-2.5.18/drivers/ide/serverworks.c	2002-05-25 03:55:27.000000000 +0200
+++ linux/drivers/ide/serverworks.c	2002-05-28 10:28:49.000000000 +0200
@@ -98,7 +98,7 @@
 #undef DISPLAY_SVWKS_TIMINGS
 #undef SVWKS_DEBUG_DRIVE_INFO
 
-static u8 svwks_revision = 0;
+static u8 svwks_revision;
 
 #if defined(DISPLAY_SVWKS_TIMINGS) && defined(CONFIG_PROC_FS)
 #include <linux/stat.h>
@@ -230,12 +230,13 @@
 				((reg40&0x005D0000)==0x005D0000)?"0":"?");
 	return p-buffer;	 /* => must be less than 4k! */
 }
+
+static byte svwks_proc;
+
 #endif  /* defined(DISPLAY_SVWKS_TIMINGS) && defined(CONFIG_PROC_FS) */
 
 #define SVWKS_CSB5_REVISION_NEW	0x92 /* min PCI_REVISION_ID for UDMA5 (A2.0) */
 
-byte svwks_proc = 0;
-
 extern char *ide_xfer_verbose (byte xfer_rate);
 
 static struct pci_dev *isa_dev;
@@ -262,7 +263,6 @@
 
 static int svwks_tune_chipset(struct ata_device *drive, byte speed)
 {
-	static u8 udma_modes[]	= { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
 	static u8 dma_modes[]	= { 0x77, 0x21, 0x20 };
 	static u8 pio_modes[]	= { 0x5d, 0x47, 0x34, 0x22, 0x20 };
 
@@ -271,26 +271,23 @@
 	byte unit		= (drive->select.b.unit & 0x01);
 	byte csb5		= (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5IDE) ? 1 : 0;
 
-	byte drive_pci		= 0x00;
-	byte drive_pci2		= 0x00;
-	byte drive_pci3		= hwif->unit ? 0x57 : 0x56;
-
-	byte ultra_enable	= 0x00;
-	byte ultra_timing	= 0x00;
-	byte dma_timing		= 0x00;
-	byte pio_timing		= 0x00;
-	unsigned short csb5_pio	= 0x00;
+	byte drive_pci, drive_pci2;
+	byte drive_pci3	= hwif->unit ? 0x57 : 0x56;
+
+	byte ultra_enable, ultra_timing, dma_timing, pio_timing;
+	unsigned short csb5_pio;
 
 	byte pio = ata_timing_mode(drive, XFER_PIO | XFER_EPIO) - XFER_PIO_0;
 
         switch (drive->dn) {
-		case 0: drive_pci = 0x41; drive_pci2 = 0x45; break;
-		case 1: drive_pci = 0x40; drive_pci2 = 0x44; break;
-		case 2: drive_pci = 0x43; drive_pci2 = 0x47; break;
-		case 3: drive_pci = 0x42; drive_pci2 = 0x46; break;
+		case 0: drive_pci = 0x41; break;
+		case 1: drive_pci = 0x40; break;
+		case 2: drive_pci = 0x43; break;
+		case 3: drive_pci = 0x42; break;
 		default:
 			return -1;
 	}
+	drive_pci2 = drive_pci + 4;
 
 	pci_read_config_byte(dev, drive_pci, &pio_timing);
 	pci_read_config_byte(dev, drive_pci2, &dma_timing);
@@ -337,7 +334,7 @@
 			pio_timing   |= pio_modes[pio];
 			csb5_pio     |= (pio << (4*drive->dn));
 			dma_timing   |= dma_modes[2];
-			ultra_timing |= ((udma_modes[speed - XFER_UDMA_0]) << (4*unit));
+			ultra_timing |= ((speed - XFER_UDMA_0) << (4*unit));
 			ultra_enable |= (0x01 << drive->dn);
 #endif
 		default:
diff -urN linux-2.5.18/drivers/macintosh/mediabay.c linux/drivers/macintosh/mediabay.c
--- linux-2.5.18/drivers/macintosh/mediabay.c	2002-05-28 17:15:53.000000000 +0200
+++ linux/drivers/macintosh/mediabay.c	2002-05-27 16:07:38.000000000 +0200
@@ -569,7 +569,7 @@
 				pmu_suspend();
 				ide_init_hwif_ports(&hw, (ide_ioreg_t) bay->cd_base, (ide_ioreg_t) 0, NULL);
 				hw.irq = bay->cd_irq;
-				bay->cd_index = ide_register_hw(&hw, NULL);
+				bay->cd_index = ide_register_hw(&hw);
 				pmu_resume();
 			}
 			if (bay->cd_index == -1) {
diff -urN linux-2.5.18/include/asm-alpha/ide.h linux/include/asm-alpha/ide.h
--- linux-2.5.18/include/asm-alpha/ide.h	2002-05-25 03:55:23.000000000 +0200
+++ linux/include/asm-alpha/ide.h	2002-05-27 16:10:37.000000000 +0200
@@ -77,7 +77,7 @@
 	for (index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-arm/arch-anakin/ide.h linux/include/asm-arm/arch-anakin/ide.h
--- linux-2.5.18/include/asm-arm/arch-anakin/ide.h	2002-05-25 03:55:17.000000000 +0200
+++ linux/include/asm-arm/arch-anakin/ide.h	2002-05-27 16:09:24.000000000 +0200
@@ -29,9 +29,9 @@
 		hw->io_ports[i] = reg;
 		reg += regincr;
 	}
-	
+
 	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
-	
+
 	if (irq)
 		*irq = 0;
 }
@@ -46,10 +46,10 @@
 {
     hw_regs_t hw;
 
-    ide_init_hwif_ports(&hw, IO_BASE + COMPACTFLASH, 
-    			IO_BASE + COMPACTFLASH + IDE_CONTROL_OFFSET, NULL);
+    ide_init_hwif_ports(&hw, IO_BASE + COMPACTFLASH,
+			IO_BASE + COMPACTFLASH + IDE_CONTROL_OFFSET, NULL);
     hw.irq = IRQ_COMPACTFLASH;
-    ide_register_hw(&hw, NULL);
+    ide_register_hw(&hw);
 }
 
 
diff -urN linux-2.5.18/include/asm-arm/arch-arc/ide.h linux/include/asm-arm/arch-arc/ide.h
--- linux-2.5.18/include/asm-arm/arch-arc/ide.h	2002-05-25 03:55:22.000000000 +0200
+++ linux/include/asm-arm/arch-arc/ide.h	2002-05-27 16:09:47.000000000 +0200
@@ -50,6 +50,6 @@
 
 		ide_init_hwif_ports(&hw, 0x1f0, 0x3f6, NULL);
 		hw.irq = IRQ_HARDDISK;
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 }
diff -urN linux-2.5.18/include/asm-arm/arch-cl7500/ide.h linux/include/asm-arm/arch-cl7500/ide.h
--- linux-2.5.18/include/asm-arm/arch-cl7500/ide.h	2002-05-25 03:55:27.000000000 +0200
+++ linux/include/asm-arm/arch-cl7500/ide.h	2002-05-27 16:10:04.000000000 +0200
@@ -43,8 +43,8 @@
 ide_init_default_hwifs(void)
 {
 	hw_regs_t hw;
-   
+
 	ide_init_hwif_ports(&hw, ISASLOT_IO + 0x1f0, ISASLOT_IO + 0x3f6, NULL);
-   	hw.irq = IRQ_ISA_14;
-	ide_register_hw(&hw, NULL);
+	hw.irq = IRQ_ISA_14;
+	ide_register_hw(&hw);
 }
diff -urN linux-2.5.18/include/asm-arm/arch-ebsa285/ide.h linux/include/asm-arm/arch-ebsa285/ide.h
--- linux-2.5.18/include/asm-arm/arch-ebsa285/ide.h	2002-05-25 03:55:29.000000000 +0200
+++ linux/include/asm-arm/arch-ebsa285/ide.h	2002-05-27 16:09:38.000000000 +0200
@@ -44,6 +44,6 @@
 
 	ide_init_hwif_ports(&hw, 0x1f0, 0x3f6, NULL);
 	hw.irq = IRQ_HARDDISK;
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
 #endif
 }
diff -urN linux-2.5.18/include/asm-arm/arch-rpc/ide.h linux/include/asm-arm/arch-rpc/ide.h
--- linux-2.5.18/include/asm-arm/arch-rpc/ide.h	2002-05-25 03:55:25.000000000 +0200
+++ linux/include/asm-arm/arch-rpc/ide.h	2002-05-27 16:09:00.000000000 +0200
@@ -44,5 +44,5 @@
 
 	ide_init_hwif_ports(&hw, 0x1f0, 0x3f6, NULL);
 	hw.irq = IRQ_HARDDISK;
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
 }
diff -urN linux-2.5.18/include/asm-arm/arch-sa1100/ide.h linux/include/asm-arm/arch-sa1100/ide.h
--- linux-2.5.18/include/asm-arm/arch-sa1100/ide.h	2002-05-25 03:55:18.000000000 +0200
+++ linux/include/asm-arm/arch-sa1100/ide.h	2002-05-27 16:08:52.000000000 +0200
@@ -84,10 +84,10 @@
 	   doesn't match the silkscreen however. */
 	ide_init_hwif_ports(&hw, PCMCIA_IO_0_BASE + 0x40, PCMCIA_IO_0_BASE + 0x78, NULL);
 	hw.irq = EMPEG_IRQ_IDE2;
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
 	ide_init_hwif_ports(&hw, PCMCIA_IO_0_BASE + 0x00, PCMCIA_IO_0_BASE + 0x38, NULL);
 	hw.irq = ,EMPEG_IRQ_IDE1;
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
 #endif
     }
 
@@ -104,7 +104,7 @@
 
 	ide_init_hwif_ports(&hw, PCMCIA_IO_0_BASE + 0x1f0, PCMCIA_IO_0_BASE + 0x3f6, NULL);
 	hw.irq = IRQ_GPIO7;
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
 #endif
     }
     else if (machine_is_lart()) {
@@ -114,14 +114,14 @@
         /* Enable GPIO as interrupt line */
         GPDR &= ~LART_GPIO_IDE;
 	set_irq_type(LART_IRQ_IDE, IRQT_RISING);
-        
+
         /* set PCMCIA interface timing */
         MECR = 0x00060006;
 
         /* init the interface */
 	ide_init_hwif_ports(&hw, PCMCIA_IO_0_BASE + 0x0000, PCMCIA_IO_0_BASE + 0x1000, NULL);
         hw.irq = LART_IRQ_IDE;
-        ide_register_hw(&hw, NULL);
+        ide_register_hw(&hw);
 #endif
     }
 }
diff -urN linux-2.5.18/include/asm-arm/arch-shark/ide.h linux/include/asm-arm/arch-shark/ide.h
--- linux-2.5.18/include/asm-arm/arch-shark/ide.h	2002-05-25 03:55:29.000000000 +0200
+++ linux/include/asm-arm/arch-shark/ide.h	2002-05-27 16:10:11.000000000 +0200
@@ -42,6 +42,6 @@
 
 	ide_init_hwif_ports(&hw, 0x1f0, 0x3f6, NULL);
 	hw.irq = 14;
-	ide_register_hw(&hw, NULL);
+	ide_register_hw(&hw);
 }
 
diff -urN linux-2.5.18/include/asm-cris/ide.h linux/include/asm-cris/ide.h
--- linux-2.5.18/include/asm-cris/ide.h	2002-05-25 03:55:20.000000000 +0200
+++ linux/include/asm-cris/ide.h	2002-05-27 16:10:54.000000000 +0200
@@ -84,7 +84,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 }
 
diff -urN linux-2.5.18/include/asm-i386/ide.h linux/include/asm-i386/ide.h
--- linux-2.5.18/include/asm-i386/ide.h	2002-05-25 03:55:19.000000000 +0200
+++ linux/include/asm-i386/ide.h	2002-05-28 11:29:24.000000000 +0200
@@ -41,16 +41,9 @@
 
 static __inline__ ide_ioreg_t ide_default_io_base(int index)
 {
-	switch (index) {
-		case 0:	return 0x1f0;
-		case 1:	return 0x170;
-		case 2: return 0x1e8;
-		case 3: return 0x168;
-		case 4: return 0x1e0;
-		case 5: return 0x160;
-		default:
-			return 0;
-	}
+	static unsigned long ata_io_base[MAX_HWIFS] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 };
+
+	return ata_io_base[index];
 }
 
 static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
@@ -81,7 +74,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-ia64/ide.h linux/include/asm-ia64/ide.h
--- linux-2.5.18/include/asm-ia64/ide.h	2002-05-25 03:55:28.000000000 +0200
+++ linux/include/asm-ia64/ide.h	2002-05-27 16:08:01.000000000 +0200
@@ -87,7 +87,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-mips/ide.h linux/include/asm-mips/ide.h
--- linux-2.5.18/include/asm-mips/ide.h	2002-05-25 03:55:20.000000000 +0200
+++ linux/include/asm-mips/ide.h	2002-05-27 16:10:17.000000000 +0200
@@ -60,7 +60,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-mips64/ide.h linux/include/asm-mips64/ide.h
--- linux-2.5.18/include/asm-mips64/ide.h	2002-05-25 03:55:17.000000000 +0200
+++ linux/include/asm-mips64/ide.h	2002-05-27 16:11:03.000000000 +0200
@@ -63,7 +63,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-parisc/ide.h linux/include/asm-parisc/ide.h
--- linux-2.5.18/include/asm-parisc/ide.h	2002-05-25 03:55:24.000000000 +0200
+++ linux/include/asm-parisc/ide.h	2002-05-27 16:10:23.000000000 +0200
@@ -76,7 +76,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-ppc/ide.h linux/include/asm-ppc/ide.h
--- linux-2.5.18/include/asm-ppc/ide.h	2002-05-25 03:55:24.000000000 +0200
+++ linux/include/asm-ppc/ide.h	2002-05-27 16:08:17.000000000 +0200
@@ -100,7 +100,7 @@
 			continue;
 		ide_init_hwif_ports(&hw, base, 0, NULL);
 		hw.irq = ide_default_irq(base);
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-sh/ide.h linux/include/asm-sh/ide.h
--- linux-2.5.18/include/asm-sh/ide.h	2002-05-25 03:55:22.000000000 +0200
+++ linux/include/asm-sh/ide.h	2002-05-27 16:11:09.000000000 +0200
@@ -102,7 +102,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-sparc/ide.h linux/include/asm-sparc/ide.h
--- linux-2.5.18/include/asm-sparc/ide.h	2002-05-25 03:55:27.000000000 +0200
+++ linux/include/asm-sparc/ide.h	2002-05-27 16:10:48.000000000 +0200
@@ -68,7 +68,7 @@
 	for (index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-sparc64/ide.h linux/include/asm-sparc64/ide.h
--- linux-2.5.18/include/asm-sparc64/ide.h	2002-05-25 03:55:24.000000000 +0200
+++ linux/include/asm-sparc64/ide.h	2002-05-27 16:10:31.000000000 +0200
@@ -64,7 +64,7 @@
 	for (index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/asm-x86_64/ide.h linux/include/asm-x86_64/ide.h
--- linux-2.5.18/include/asm-x86_64/ide.h	2002-05-25 03:55:26.000000000 +0200
+++ linux/include/asm-x86_64/ide.h	2002-05-28 11:29:19.000000000 +0200
@@ -41,16 +41,9 @@
 
 static __inline__ ide_ioreg_t ide_default_io_base(int index)
 {
-	switch (index) {
-		case 0:	return 0x1f0;
-		case 1:	return 0x170;
-		case 2: return 0x1e8;
-		case 3: return 0x168;
-		case 4: return 0x1e0;
-		case 5: return 0x160;
-		default:
-			return 0;
-	}
+	static unsigned long ata_io_base[MAX_HWIFS] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 };
+
+	return ata_io_base[index];
 }
 
 static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
@@ -81,7 +74,7 @@
 	for(index = 0; index < MAX_HWIFS; index++) {
 		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
 		hw.irq = ide_default_irq(ide_default_io_base(index));
-		ide_register_hw(&hw, NULL);
+		ide_register_hw(&hw);
 	}
 #endif
 }
diff -urN linux-2.5.18/include/linux/ide.h linux/include/linux/ide.h
--- linux-2.5.18/include/linux/ide.h	2002-05-28 17:15:53.000000000 +0200
+++ linux/include/linux/ide.h	2002-05-28 12:44:03.000000000 +0200
@@ -71,18 +71,20 @@
 /*
  * Definitions for accessing IDE controller registers
  */
-#define IDE_NR_PORTS		(10)
 
-#define IDE_DATA_OFFSET		(0)
-#define IDE_ERROR_OFFSET	(1)
-#define IDE_NSECTOR_OFFSET	(2)
-#define IDE_SECTOR_OFFSET	(3)
-#define IDE_LCYL_OFFSET		(4)
-#define IDE_HCYL_OFFSET		(5)
-#define IDE_SELECT_OFFSET	(6)
-#define IDE_STATUS_OFFSET	(7)
-#define IDE_CONTROL_OFFSET	(8)
-#define IDE_IRQ_OFFSET		(9)
+enum {
+	IDE_DATA_OFFSET	    = 0,
+	IDE_ERROR_OFFSET    = 1,
+	IDE_NSECTOR_OFFSET  = 2,
+	IDE_SECTOR_OFFSET   = 3,
+	IDE_LCYL_OFFSET	    = 4,
+	IDE_HCYL_OFFSET	    = 5,
+	IDE_SELECT_OFFSET   = 6,
+	IDE_STATUS_OFFSET   = 7,
+	IDE_CONTROL_OFFSET  = 8,
+	IDE_IRQ_OFFSET	    = 9,
+	IDE_NR_PORTS	    = 10
+};
 
 #define IDE_FEATURE_OFFSET	IDE_ERROR_OFFSET
 #define IDE_COMMAND_OFFSET	IDE_STATUS_OFFSET
@@ -549,7 +551,7 @@
 /*
  * Register new hardware with ide
  */
-extern int ide_register_hw(hw_regs_t *hw, struct ata_channel **hwifp);
+extern int ide_register_hw(hw_regs_t *hw);
 extern void ide_unregister(struct ata_channel *hwif);
 
 struct ata_taskfile;
@@ -759,8 +761,6 @@
 extern int ide_raw_taskfile(struct ata_device *, struct ata_taskfile *);
 extern int ide_cmd_ioctl(struct ata_device *drive, unsigned long arg);
 
-void ide_delay_50ms(void);
-
 extern void ide_fix_driveid(struct hd_driveid *id);
 extern int ide_driveid_update(struct ata_device *);
 extern int ide_config_drive_speed(struct ata_device *, byte);

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

* Linux-2.5.18
@ 2002-05-25  2:02 Linus Torvalds
  2002-05-28 14:23 ` Linux-2.5.18 Martin Dalecki
  0 siblings, 1 reply; 3+ messages in thread
From: Linus Torvalds @ 2002-05-25  2:02 UTC (permalink / raw)
  To: Kernel Mailing List


Various bits here and there. 

		Linus

----

Summary of changes from v2.5.17 to v2.5.18
============================================

<Andries.Brouwer@cwi.nl>
	o usb-storage

<acme@conectiva.com.br>
	o drivers/char/rio/*.c

<beattie@beattie-home.net>
	o change USB scanner maintainer

Brian Gerst <bgerst@didntduck.org>
	o cpu_has_tsc
	o cpu_has_mmx
	o remaining cpu_has cleanups

<borisitk@fortunet.com>
	o [ARM 1146/1: Fix complilation bug in 2.5.10-rmk1 for jffs

<ccaputo@alt.net>
	o net/core/sock.c: Fix typo in sysctl_{w,m}mem_default init.

<ch@hpl.hp.com>
	o [ARM 1136/1: missing include in badge4.c
	o [ARM 1133/1: Small fixes for BadgePAD 4 pcmcia support.
	o [ARM 1137/1: additional defines for SA-1111 OHCI

<colin@gibbs.dhs.org>
	o Sparc: Do not BUG in srmmu_pte_alloc_one.
	o include/asm-sparc/pgalloc.h: In pmd_alloc_one, dont BUG just return NULL

Martin Dalecki <dalecki@evision-ventures.com>
	o 2.5.17 dquota punishment
	o 2.5.17 IDE 65-70

<davem@nuts.ninka.net>
	o Sparc: Use dma_addr_t and size_t in sparc32 DMA function args.
	o IPv4: Make pkt_too_big debug msg more informative.
	o drivers/net/sunlance.c: Make init_block_dvma a dma_addr_t
	o Tigon3: Fix typo in netgear ga320t support changes.
	o Sparc64 updates
	o Fix build fallout from namei.h/jiffies.h changes.
	o Sparc64 build fixes:

<david-b@pacbell.net>
	o cpia_usb, remove urb->next
	o usbcore, remove urb->next
	o hcds, remove urb->next
	o audio, set urb->interval

<dhowells@redhat.com>
	o rwsem update

<greg@kroah.com>
	o USB Makefile bug fix
	o USB build changes
	o USB se401, remove urb->next usage
	o USB stv680, remove urb->next usage
	o usb.h #include dependancies and whitespace cleanup
	o USB cdc-ether driver compile time fix
	o USB storage #include fixup
	o USB driver #include cleanups

Christoph Hellwig <hch@infradead.org>
	o fix bitop warnings in parallel port generic driver
	o buffermem_pages removal (1/5)
	o fix sr compile warnings
	o bfs header move around + warning fix
	o split namei.h out of fs.h
	o include buffer_head.h in actual users instead of fs.h (1/10)

<jbglaw@lug-owl.de>
	o Update to srm_env.c driver (for Alpha arch.)

<kai@tp1.ruhr-uni-bochum.de>
	o kbuild: Make USE_STANDARD_AS_RULE default
	o Fix UTS_MACHINE
	o Fix building .i / .s files for testing
	o kbuild: Stop immediately on error
	o kbuild: aic7xxx firmware build should not overwrite shipped files
	o kbuild: Regenerate include/linux/version.h only if necessary
	o kbuild: Restore build nr, improve vmlinux link
	o drivers/net: Simplify linking of subdirs
	o Simplify linking/building objects in subdirectories
	o drivers/pnp/pnpbios_core.c: Warning fix
	o kbuild: Fix command line printing
	o kbuild: Fix warning when .version doesn't exist yet
	o kbuild: Rearrange Rules.make
	o kbuild: Consistent use of [AC]FLAGS_KERNEL and MODFLAGS
	o EXPORT_SYMBOL: Remove EXPORT_NO_SYMBOLS from arch/*
	o EXPORT_SYMBOL: Remove EXPORT_NO_SYMBOLS from drivers/*
	o EXPORT_SYMBOL: Remove the option of implicitly exporting symbols
	o EXPORT_SYMBOL: Remove EXPORT_NO_SYMBOLS from fs/*
	o EXPORT_SYMBOL: Remove EXPORT_NO_SYMBOLS from net/*
	o EXPORT_SYMBOL: Remove EXPORT_NO_SYMBOLS from sound/*
	o kbuild: Use standard multi-part object declaration in drivers/char/*
	o ISDN: Fix compiler warnings
	o kbuild: Use standard multi-part object declaration in drivers/video/*
	o kbuild: Small cleanups
	o ISDN: Use 'built-in.o' instead of 'vmlinux-obj.o' as O_TARGET
	o ISDN: Move AVM Config.help entries to right dir
	o kbuild: Assorted small cleanups
	o Fix dummy gameport_{,un}register_port
	o Compiler warning fixes
	o kbuild: Clean up sound/*/Makefile
	o Add missing includes
	o kbuild: Remove now redundant 'O_TARGET := built-in.o' lines
	o kbuild: Make O_TARGET default to 'built-in.o'
	o kbuild: Beautify ACPI Makefiles
	o kbuild: Remove usage of L_TARGET in drivers/*
	o kbuild: Correct dependencies for generated soundmodem tables
	o kbuild: Use standard multi-part object declaration in lib/*
	o kbuild: Simplify linking subdirs in drivers/*/Makefile
	o kbuild: Use standard multi-part object declaration in fs/*
	o kbuild: Use standard multi-part object declaration in net/*
	o kbuild: Fix some issues I missed before

<kuznet@ms2.inr.ac.ru>
	o tcp_input.c: Really make sure rto = 3*rtt, found by Pasi Sarolahti
	o tcp_recvmsg: Fix application bug induced races with MSG_PEEK and copied_seq.

<mason@suse.com>
	o reiserfs 64 bit bug in get_virtual_node_size

<mikpe@csd.uu.se>
	o possible fix for broken floppy driver, take 2

<pavel@ucw.cz>
	o suspend-to-{RAM,disk} fixup
	o suspend-to-{RAM,disk}
	o more suspend-to-{RAM,disk} fixes
	o One more fix for swsusp
	o swsusp cleanups
	o swsusp: making myself maintainer
	o swsusp fixes

<petkan@mastika.lnxw.com>
	o USB pegasus driver, new vendor and device id.

<rmk@flint.arm.linux.org.uk>
	o [ARM] 2.5.15 PCI cleanups/fixups
	o [ARM] 2.5.15 random fixups:
	o [ARM] Make etherh.c build again - combine struct ei_device inside our
	o [ARM] Fix build errors caused by fb changes
	o [ARM] Fixups for GCC 3.x:
	o [ARM] Miscellaneous
	o [ARM] Remove old NetWinder uncompressed kernel image compatibility code.
	o [ARM] Acorn DMA/Expansion card fixups
	o [ARM] Make Acorn SCSI drivers build again.

<rml@tech9.net>
	o remove preempt_disable from pdflush
	o get/put_cpu methods

<rusty@rustcorp.com.au>
	o Tasklet cleanup
	o Futex update.
	o DMA-mapping.txt typo fix
	o printk() cleanup in ide-pnp.c
	o drivers/net/epic100.c: missing __devinit
	o drivers_net_sundance.c: missing __devinit
	o declance.c
	o Remove warning in fs/nfs/nfsroot.c
	o Fix order of #includes in init_version.c
	o check_region elimination
	o serial typo
	o MIPS min/max replacement
	o MIPS min/max replacement II
	o min/max elimination in netfilter.h
	o cris signal fix
	o sigio delivery fix
	o check_region elimination
	o MIPS/MIPS64  signal fix
	o jiffies.h
	o arch/arm/kernel/via82c505.c
	o smp_call_function doco fix
	o check_region elimination
	o check_region elimination

<shaggy@austin.ibm.com>
	o jfs_readdir does not need to grab BKL
	o JFS external journal support

<simonb@lipsyncpost.co.uk>
	o Tigon3: Add Netgear GA320T support.

<torvalds@transmeta.com>
	o Make the pte unmapping atomic wrt other threads.
	o Fix over-eager header file cleanup
	o Merge DRI CVS tree into standard kernel
	o Fix up more headers to make the drm merge compile more cleanly
	o Undo block devices changes from floppy fix: incorrect.
	o Update kernel version
	o Move check_pgt_cache() to tlb_finish_mmu().
	o Make sw-suspend compile even without ACPI sleep support.
	o Clean up tlb_start/end_vma.
	o Fix up header file

Alexander Viro <viro@math.psu.edu>
	o add proper ->getattr()
	o remove s390 procfs abuses
	o kill ->i_op->revalidate()
	o clean up readdir() for in-memory
	o new helpers for /proc
	o rd.c blocksize handling
	o removal of BKL from d_move()
	o md.c cleanup
	o kdev_t -> bdev cleanups

<zippel@linux-m68k.org>
	o m68k mmu update



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

end of thread, other threads:[~2002-05-28 15:27 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <Pine.LNX.4.44.0205241920230.3909-100000@home.transmeta.com>
2002-05-25  2:27 ` Linux-2.5.18 H. Peter Anvin
2002-05-25  2:02 Linux-2.5.18 Linus Torvalds
2002-05-28 14:23 ` Linux-2.5.18 Martin Dalecki

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).