Messages in this thread Patch in this message | | | Date | Sat, 21 Jun 2003 16:29:06 +0200 (CEST) | From | Martin Diehl <> | Subject | Re: 2.5.72-bk3 oops when loading aha152X(isapnp) |
| |
On Sat, 21 Jun 2003 schmurtz@netcourrier.com wrote:
> aha152x0: trying software interrupt, <1>Unable to handle kernel NULL pointer dec ... > EIP is at swintr+0x4a/0x70 [aha152x]
Seems there are two problems: * interrupt handler expects to find the host in aha152x_host[] array which is currently set too late after probing irq's * despite testing for NULL swintr derefences a shpnt==NULL anyway, looks like a victim of HOSTNO obfuscation ;-)
The patch below fixes the issue for me - succesfully tested to compile, load and even use my attached scanner.
Martin ----------------------
--- linux-2.5.72-bk3/drivers/scsi/aha152x.c Sat Jun 21 16:14:40 2003 +++ v2.5.72bk3-md/drivers/scsi/aha152x.c Sat Jun 21 16:07:05 2003 @@ -941,7 +941,8 @@ static irqreturn_t swintr(int irqno, voi struct Scsi_Host *shpnt = lookup_irq(irqno); if (!shpnt) { - printk(KERN_ERR "aha152x%d: catched software interrupt %d for unknown controller.\n", HOSTNO, irqno); + /* no point using HOSTNO here! */ + printk(KERN_ERR "aha152x: catched software interrupt %d for unknown controller.\n", irqno); return IRQ_NONE; } @@ -1049,6 +1050,10 @@ struct Scsi_Host *aha152x_probe_one(stru printk(KERN_INFO "aha152x%d: trying software interrupt, ", shost->host_no); + + /* need to have host registered before triggering any interrupt */ + aha152x_host[registered_count] = shost; + mb(); SETPORT(DMACNTRL0, SWINT|INTEN); mdelay(1000); free_irq(shost->irq, shost); @@ -1064,7 +1069,7 @@ struct Scsi_Host *aha152x_probe_one(stru printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong. " "Please verify.\n", shost->host_no, shost->irq); - goto out_release_region; + goto out_unregister_host; } printk("ok.\n"); @@ -1077,12 +1082,12 @@ struct Scsi_Host *aha152x_probe_one(stru "aha152x", shost) < 0) { printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n", shost->host_no); - goto out_release_region; + goto out_unregister_host; } - - aha152x_host[registered_count] = shost; return shost; /* the pcmcia stub needs the return value; */ +out_unregister_host: + aha152x_host[registered_count] = NULL; out_release_region: release_region(shost->io_port, IO_RANGE); out_unregister: - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |