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)
next prev parent 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox