Skip to contentSkip to conversation

2.5.72-bk3 oops when loading aha152X(isapnp)

DISCUSSION [email protected] 2 participants 2 messages Jun 21, 2003

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Using 2.4 kernels, everything is ok.

SCSI subsystem initialized
pnp: Device 01:02.00 activated.
aha152x: found ISAPnP AVA-1505A at io=0x140, irq=10
aha152x: BIOS test: passed, detected 1 controller(s)
aha152x: resetting bus...
aha152x0: vital data: rev=3, io=0x140 (0x140/0x140), irq=10, scsiid=7, reconnecd
aha152x0: trying software interrupt, <1>Unable to handle kernel NULL pointer dec
printing eip:
c58a01ea
*pde = 00000000

Oops: 0000 [#1]
CPU:    0      
EIP:    0060:[<c58a01ea>]    Not tainted
EFLAGS: 00010046                        

EIP is at swintr+0x4a/0x70 [aha152x]
eax: 00000000 ebx: c4201340 ecx: 0000000a edx: 00000002
esi: 24000001 edi: 00000000 ebp: c3f75ecc esp: c3f75ec8
ds: 007b es: 007b ss: 0068
Process modprobe (pid: 240, threadinfo=c3f74000 task=c40cad00)

Stack: 0000000a c3f75eec c010a713 0000000a c4102800 c3f75f1c c3f74000 0000000a 
       c02c1f00 c3f75f14 c010aa49 0000000a c3f75f1c c4201340 c4201340 00000500 
       c4102800 c41029b0 00000140 c3f75f5c c0109288 c4102800 c4699280 00000152 
Call Trace:                                                                    
 [<c010a713>] handle_IRQ_event+0x33/0x60
 [<c010aa49>] do_IRQ+0xb9/0x180         
 [<c0109288>] common_interrupt+0x18/0x20
 [<c58a6805>] +0x125/0x1304 [aha152x]   
 [<c58a045e>] aha152x_probe_one+0x24e/0x3d0 [aha152x]
 [<c58a0060>] +0x60/0x80 [aha152x]                   
 [<c58aa020>] setup+0x0/0x50 [aha152x]
 [<c58a09ae>] aha152x_detect+0x3ce/0x810 [aha152x]
 [<c58aa020>] setup+0x0/0x50 [aha152x]            
 [<c58a0df0>] aha152x_release+0x0/0x80 [aha152x]
 [<c58a9900>] +0x0/0x200 [aha152x]              
 [<c582503c>] +0x3c/0xec [aha152x]
 [<c58a9860>] aha152x_driver_template+0x0/0xa0 [aha152x]
 [<c012c6ab>] sys_init_module+0xfb/0x210                
 [<c0109067>] syscall_call+0x7/0xb      
                                  
Code: a1 4c 00 00 00 25 ff ff 00 00 50 68 e0 66 8a c5 e8 61 86 87 
 <0>Kernel panic: Fatal exception in interrupt                    

In interrupt handler - not syncing

Signature · 1 line
S.
#1 lore raw
Quoted 1 line · On Sat, 21 Jun 2003 [email protected] wrote:

aha152x0: trying software interrupt, <1>Unable to handle kernel NULL pointer dec

...

Quoted 1 line

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

drivers/scsi/aha152x.c +10 -5
@@ -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: