All of lore.kernel.org
 help / color / mirror / Atom feed
From: Manfred Spraul <manfred@colorfullife.com>
To: mailing-lists@digitaleric.net
Cc: linux-kernel@vger.kernel.org
Subject: Re: 2.5.68 IDE Oops at boot
Date: Sun, 20 Apr 2003 20:35:22 +0200	[thread overview]
Message-ID: <3EA2E86A.7010606@colorfullife.com> (raw)
In-Reply-To: <200304201348.34229.lkml@digitaleric.net>

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

Eric Northup wrote:

>init_irq called for hwif ide0.
>hdc: MAXTOR 6L080L4, ATA DISK drive
>
init_irq called, but does nothing.

>init_irq called for hwif ide2.
>blk_init_queue: c04c99d4 initialized.
>
This is what's supposed to happen: init_irq initialized the queues.

Two bugs:
- why doesn't init_irq initialize the queues for the siimage controller? 
I found a difference between 2.5.67 and 68: init_irq always returns 0, 
even on error. It should return 1 on error. (It wasn't difficult to 
find, I introduced it :-(
- The error handling is bad. Probably drive->present should be forced to 
0, if the queues could not be initialized.

Could you try the attached patch? It fixes the return code and adds some 
additional printks.

--
    Manfred

[-- Attachment #2: patch-elv-search --]
[-- Type: text/plain, Size: 5292 bytes --]

// $Header$
// Kernel Version:
//  VERSION = 2
//  PATCHLEVEL = 5
//  SUBLEVEL = 68
//  EXTRAVERSION =
--- 2.5/drivers/block/elevator.c	2003-04-20 11:19:13.000000000 +0200
+++ build-2.5/drivers/block/elevator.c	2003-04-20 20:04:55.000000000 +0200
@@ -290,6 +290,7 @@
 	if (plug)
 		blk_plug_device(q);
 
+if(!q->elevator.elevator_add_req_fn) printk(KERN_INFO "Duh. Elevator %p not initialized.\n", q);
 	q->elevator.elevator_add_req_fn(q, rq, insert);
 }
 
--- 2.5/drivers/block/ll_rw_blk.c	2003-04-20 11:19:13.000000000 +0200
+++ build-2.5/drivers/block/ll_rw_blk.c	2003-04-20 20:04:55.000000000 +0200
@@ -1156,6 +1156,7 @@
 {
 	int count = (queue_nr_requests*2);
 
+printk(KERN_INFO "blk_cleanup_queue: destroying %p.\n", q);
 	elevator_exit(q);
 
 	count -= __blk_cleanup_queue(&q->rq[READ]);
@@ -1273,6 +1274,7 @@
 	blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS);
 
 	INIT_LIST_HEAD(&q->plug_list);
+printk(KERN_INFO "blk_init_queue: %p initialized.\n", q);
 
 	return 0;
 }
--- 2.5/drivers/ide/ide.c	2003-04-20 11:13:39.000000000 +0200
+++ build-2.5/drivers/ide/ide.c	2003-04-20 20:04:55.000000000 +0200
@@ -599,6 +599,7 @@
 	hwif = &ide_hwifs[index];
 	if (!hwif->present)
 		goto abort;
+printk(KERN_INFO "ide_unregister called for %s.\n", hwif->name);
 	for (unit = 0; unit < MAX_DRIVES; ++unit) {
 		drive = &hwif->drives[unit];
 		if (!drive->present)
@@ -1428,6 +1429,7 @@
 		if (!try_module_get(driver->owner))
 			continue;
 		spin_unlock(&drivers_lock);
+printk(KERN_INFO "ata_attach: trying driver %p for drive %s(%p).\n", driver, drive->name, &drive->queue);
 		if (driver->attach(drive) == 0) {
 			module_put(driver->owner);
 			drive->gendev.driver = &driver->gen_driver;
--- 2.5/drivers/ide/ide-probe.c	2003-04-20 11:13:39.000000000 +0200
+++ build-2.5/drivers/ide/ide-probe.c	2003-04-20 20:22:05.000000000 +0200
@@ -1007,8 +1007,8 @@
 	 *	limits and LBA48 we could raise it but as yet
 	 *	do not.
 	 */
-	 
 	blk_init_queue(q, do_ide_request, &ide_lock);
+printk(KERN_INFO "ide_init_queue: drive %s has queue %p.\n", drive->name, q); 
 	q->queuedata = HWGROUP(drive);
 	drive->queue_setup = 1;
 	blk_queue_segment_boundary(q, 0xffff);
@@ -1060,6 +1060,8 @@
 	BUG_ON(irqs_disabled());	
 	down(&ide_cfg_sem);
 	hwif->hwgroup = NULL;
+
+printk(KERN_INFO "init_irq called for hwif %s.\n", hwif->name);
 #if MAX_HWIFS > 1
 	/*
 	 * Group up with any other hwifs that share our irq(s).
@@ -1107,8 +1109,10 @@
 		spin_unlock_irq(&ide_lock);
 	} else {
 		hwgroup = kmalloc(sizeof(ide_hwgroup_t),GFP_KERNEL);
-		if (!hwgroup)
+		if (!hwgroup) {
+printk(KERN_INFO "init_irq: kmalloc failed.\n");
 	       		goto out_up;
+		}
 
 		hwif->hwgroup = hwgroup;
 
@@ -1143,8 +1147,10 @@
 			/* clear nIEN */
 			hwif->OUTB(0x08, hwif->io_ports[IDE_CONTROL_OFFSET]);
 
-		if (request_irq(hwif->irq,&ide_intr,sa,hwif->name,hwgroup))
+		if (request_irq(hwif->irq,&ide_intr,sa,hwif->name,hwgroup)) {
+printk(KERN_INFO "init_irq: request_irq failed for irq %d.\n", hwif->irq);
 	       		goto out_unlink;
+		}
 	}
 
 	/*
@@ -1155,6 +1161,7 @@
 	 */
 	for (index = 0; index < MAX_DRIVES; ++index) {
 		ide_drive_t *drive = &hwif->drives[index];
+printk(KERN_INFO "init_irq: processing drive %s(%p), present %d.\n", drive->name, &drive->queue, drive->present);
 		if (!drive->present)
 			continue;
 		ide_init_queue(drive);
@@ -1214,7 +1221,7 @@
 	spin_unlock_irq(&ide_lock);
 out_up:
 	up(&ide_cfg_sem);
-	return 0;
+	return 1;
 }
 
 static int ata_lock(dev_t dev, void *data)
@@ -1315,8 +1322,10 @@
 {
 	int old_irq, unit;
 
+printk(KERN_INFO "hwif_init: hwif %s, stage 1.\n", hwif->name);
 	if (!hwif->present)
 		return 0;
+printk(KERN_INFO "hwif_init: hwif %s, stage 2.\n", hwif->name);
 
 	if (!hwif->irq) {
 		if (!(hwif->irq = ide_default_irq(hwif->io_ports[IDE_DATA_OFFSET])))
@@ -1325,6 +1334,7 @@
 			return (hwif->present = 0);
 		}
 	}
+printk(KERN_INFO "hwif_init: hwif %s, stage 3.\n", hwif->name);
 #ifdef CONFIG_BLK_DEV_HD
 	if (hwif->irq == HD_IRQ && hwif->io_ports[IDE_DATA_OFFSET] != HD_DATA) {
 		printk("%s: CANNOT SHARE IRQ WITH OLD "
@@ -1335,15 +1345,19 @@
 
 	/* we set it back to 1 if all is ok below */	
 	hwif->present = 0;
+printk(KERN_INFO "hwif_init: hwif %s, stage 4.\n", hwif->name);
 
 	if (register_blkdev(hwif->major, hwif->name))
 		return 0;
+printk(KERN_INFO "hwif_init: hwif %s, stage 5.\n", hwif->name);
 
 	if (alloc_disks(hwif) < 0)
 		goto out;
+printk(KERN_INFO "hwif_init: hwif %s, stage 6.\n", hwif->name);
 	
 	if (init_irq(hwif) == 0)
 		goto done;
+printk(KERN_INFO "hwif_init: hwif %s, stage 7.\n", hwif->name);
 
 	old_irq = hwif->irq;
 	/*
@@ -1355,6 +1369,7 @@
 			hwif->name, old_irq);
 		goto out_disks;
 	}
+printk(KERN_INFO "hwif_init: hwif %s, stage 8.\n", hwif->name);
 	if (init_irq(hwif)) {
 		printk("%s: probed IRQ %d and default IRQ %d failed.\n",
 			hwif->name, old_irq, hwif->irq);
--- 2.5/drivers/ide/setup-pci.c	2003-03-17 22:44:04.000000000 +0100
+++ build-2.5/drivers/ide/setup-pci.c	2003-04-20 20:04:55.000000000 +0200
@@ -751,6 +751,7 @@
 {
 	ata_index_t index_list = do_ide_setup_pci_device(dev, d, 1);
 
+printk(KERN_INFO "ide_setup_pci_device for %s called.\n", dev->dev.name);
 	if ((index_list.b.low & 0xf0) != 0xf0)
 		probe_hwif_init(&ide_hwifs[index_list.b.low]);
 	if ((index_list.b.high & 0xf0) != 0xf0)

  reply	other threads:[~2003-04-20 18:24 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-04-20 11:39 2.5.68 IDE Oops at boot Manfred Spraul
2003-04-20 17:48 ` Eric Northup
2003-04-20 18:35   ` Manfred Spraul [this message]
2003-04-22 20:37     ` 2.5.68 IDE Oops at boot [working now] Eric Northup
  -- strict thread matches above, loose matches on Subject: below --
2003-04-20  6:51 2.5.68 IDE Oops at boot Eric Northup
2003-04-21 14:26 ` Bruce Harada

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=3EA2E86A.7010606@colorfullife.com \
    --to=manfred@colorfullife.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mailing-lists@digitaleric.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.