* Re: Problem with module-init-tools-3.0-pre3
[not found] <16409.11897.539398.14955@ronispc.chem.mcgill.ca>
@ 2004-01-30 3:29 ` Rusty Russell
2004-01-30 7:35 ` Juergen E. Fischer
0 siblings, 1 reply; 7+ messages in thread
From: Rusty Russell @ 2004-01-30 3:29 UTC (permalink / raw)
To: david.ronis; +Cc: linux-kernel, fischer
In message <16409.11897.539398.14955@ronispc.chem.mcgill.ca> you write:
> Rusty Russell writes:
> I triggered the bug again, although this time in a different order;
> namely, I ran xsane as a regular user, removed the sg and aha152x
> modules, and then reran xsane while still root.
Right. Sounds like root v. non-root is a red herring.
BTW, you can just use "dmesg" in 2.6: ksymoops is not needed.
> CPU 1 IS NOW UP!
> Unable to handle kernel NULL pointer dereference at virtual address 00000708
> c0162800
> *pde = 00000000
> Oops: 0000 [#1]
> CPU: 1
> EIP: 0060:[<c0162800>] Not tainted
> Using defaults from ksymoops -t elf32-i386 -a i386
> EFLAGS: 00010202
> eax: e5880000 ebx: 00000708 ecx: 00000015 edx: e5881f28
> esi: f1452780 edi: 00000001 ebp: f1452780 esp: e5881ed8
> ds: 007b es: 007b ss: 0068
> Stack: 00000000 c1b64de0 e5880000 00000000 c01626ef f1452780 c01ebce9 01500000
> f1452780 00000006 c01626d0 00000000 e5880000 00000000 00000000 00000000
> c0162517 f7fe2c00 01500000 e5881f28 00000000 e5ed9080 e83a14d4 00000001
> [<c01626ef>] exact_lock+0xf/0x20
> [<c01ebce9>] kobj_lookup+0x119/0x200
> [<c01626d0>] exact_match+0x0/0x10
> [<c0162517>] chrdev_open+0x1e7/0x290
> [<c0157570>] dentry_open+0x160/0x230
> [<c0157408>] filp_open+0x68/0x70
> [<c015797b>] sys_open+0x5b/0x90
> [<c01092ab>] syscall_call+0x7/0xb
> Code: 83 3b 02 8b 40 10 74 7f c1 e0 05 8d 04 18 ff 80 a0 00 00 00
>
> >>EIP; c0162800 <cdev_get+20/b0> <=====
> Code; c0162800 <cdev_get+20/b0>
> 00000000 <_EIP>:
> Code; c0162800 <cdev_get+20/b0> <=====
> 0: 83 3b 02 cmpl $0x2,(%ebx) <=====
> Code; c0162803 <cdev_get+23/b0>
> 3: 8b 40 10 mov 0x10(%eax),%eax
> Code; c0162806 <cdev_get+26/b0>
> 6: 74 7f je 87 <_EIP+0x87>
> Code; c0162808 <cdev_get+28/b0>
> 8: c1 e0 05 shl $0x5,%eax
> Code; c016280b <cdev_get+2b/b0>
> b: 8d 04 18 lea (%eax,%ebx,1),%eax
> Code; c016280e <cdev_get+2e/b0>
> e: ff 80 a0 00 00 00 incl 0xa0(%eax)
Looks like aha152x or sd is not cleaning up properly, and when
reinserted, something screws up.
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem with module-init-tools-3.0-pre3
2004-01-30 3:29 ` Problem with module-init-tools-3.0-pre3 Rusty Russell
@ 2004-01-30 7:35 ` Juergen E. Fischer
2004-02-04 18:27 ` David Ronis
0 siblings, 1 reply; 7+ messages in thread
From: Juergen E. Fischer @ 2004-01-30 7:35 UTC (permalink / raw)
To: Rusty Russell; +Cc: david.ronis, linux-kernel
[-- Attachment #1.1: Type: text/plain, Size: 365 bytes --]
Hi,
On Fri, Jan 30, 2004 at 14:29:59 +1100, Rusty Russell wrote:
> Looks like aha152x or sd is not cleaning up properly, and when
> reinserted, something screws up.
I guess that's without the pending patch. If it's aha152x, the patch
might also do some good in that departement.
Jürgen
--
A: No.
Q: Should I include quotations after my reply?
[-- Attachment #1.2: aha152x-2.6.2-rc2-4.diff --]
[-- Type: text/plain, Size: 49862 bytes --]
diff -uprd orig/linux-2.6.2-rc2/drivers/scsi/aha152x.c linux-2.6.2-rc2/drivers/scsi/aha152x.c
--- orig/linux-2.6.2-rc2/drivers/scsi/aha152x.c 2004-01-24 11:54:43.000000000 +0100
+++ linux-2.6.2-rc2/drivers/scsi/aha152x.c 2004-01-30 08:21:54.000000000 +0100
@@ -1,6 +1,6 @@
/* aha152x.c -- Adaptec AHA-152x driver
* Author: Jürgen E. Fischer, fischer@norbit.de
- * Copyright 1993-2000 Jürgen E. Fischer
+ * Copyright 1993-2004 Jürgen E. Fischer
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -13,9 +13,17 @@
* General Public License for more details.
*
*
- * $Id: aha152x.c,v 2.6 2003/10/30 20:52:47 fischer Exp $
+ * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 fischer Exp $
*
* $Log: aha152x.c,v $
+ * Revision 2.7 2004/01/24 11:42:59 fischer
+ * - gather code that is not used by PCMCIA at the end
+ * - move request_region for !PCMCIA case to detection
+ * - migration to new scsi host api (remove legacy code)
+ * - free host scribble before scsi_done
+ * - fix error handling
+ * - one isapnp device added to id_table
+ *
* Revision 2.6 2003/10/30 20:52:47 fischer
* - interfaces changes for kernel 2.6
* - aha152x_probe_one introduced for pcmcia stub
@@ -344,7 +352,8 @@ MODULE_AUTHOR("Jürgen Fischer");
MODULE_DESCRIPTION(AHA152X_REVID);
MODULE_LICENSE("GPL");
-#if defined(MODULE) && !defined(PCMCIA)
+#if !defined(PCMCIA)
+#if defined(MODULE)
MODULE_PARM(io, "1-2i");
MODULE_PARM_DESC(io,"base io address of controller");
static int io[] = {0, 0};
@@ -398,21 +407,23 @@ MODULE_PARM(aha152x1, "1-9i");
MODULE_PARM_DESC(aha152x1, "parameters for second controller");
static int aha152x1[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
#endif /* !defined(AHA152X_DEBUG) */
-#endif /* MODULE && !PCMCIA */
+#endif /* MODULE */
#ifdef __ISAPNP__
static struct isapnp_device_id id_table[] __devinitdata = {
- { ISAPNP_DEVICE_SINGLE('A','D','P',0x1505, 'A','D','P',0x1505), },
+ { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+ ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 },
+ { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
+ ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 },
{ ISAPNP_DEVICE_SINGLE_END, }
};
MODULE_DEVICE_TABLE(isapnp, id_table);
#endif /* ISAPNP */
-/* set by aha152x_setup according to the command line */
-static int setup_count;
-static int registered_count;
-static struct aha152x_setup setup[2];
-static struct Scsi_Host *aha152x_host[2];
+#endif /* !PCMCIA */
+
+static int registered_count=0;
+static struct Scsi_Host *aha152x_host[2] = {0, 0};
static Scsi_Host_Template aha152x_driver_template;
/*
@@ -658,7 +669,6 @@ static irqreturn_t intr(int irq, void *d
static void reset_ports(struct Scsi_Host *shpnt);
static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
static void done(struct Scsi_Host *shpnt, int error);
-static int checksetup(struct aha152x_setup *setup);
/* diagnostics */
static void disp_ports(struct Scsi_Host *shpnt);
@@ -666,66 +676,6 @@ static void show_command(Scsi_Cmnd * ptr
static void show_queues(struct Scsi_Host *shpnt);
static void disp_enintr(struct Scsi_Host *shpnt);
-/* possible i/o addresses for the AIC-6260; default first */
-static unsigned short ports[] = { 0x340, 0x140 };
-
-#if !defined(SKIP_BIOSTEST)
-/* possible locations for the Adaptec BIOS; defaults first */
-static unsigned int addresses[] =
-{
- 0xdc000, /* default first */
- 0xc8000,
- 0xcc000,
- 0xd0000,
- 0xd4000,
- 0xd8000,
- 0xe0000,
- 0xeb800, /* VTech Platinum SMP */
- 0xf0000,
-};
-
-/* signatures for various AIC-6[23]60 based controllers.
- The point in detecting signatures is to avoid useless and maybe
- harmful probes on ports. I'm not sure that all listed boards pass
- auto-configuration. For those which fail the BIOS signature is
- obsolete, because user intervention to supply the configuration is
- needed anyway. May be an information whether or not the BIOS supports
- extended translation could be also useful here. */
-static struct signature {
- unsigned char *signature;
- int sig_offset;
- int sig_length;
-} signatures[] =
-{
- { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
- /* Adaptec 152x */
- { "Adaptec AHA-1520B", 0x000b, 17 },
- /* Adaptec 152x rev B */
- { "Adaptec AHA-1520B", 0x0026, 17 },
- /* Iomega Jaz Jet ISA (AIC6370Q) */
- { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
- /* on-board controller */
- { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
- /* on-board controller */
- { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
- /* on-board controller */
- { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
- /* on-board controller */
- { "ScsiPro SP-360 BIOS", 0x2873, 19 },
- /* ScsiPro-Controller */
- { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
- /* Gigabyte Local-Bus-SCSI */
- { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
- /* Adaptec 282x */
- { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
- /* IBM Thinkpad Dock II */
- { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
- /* IBM Thinkpad Dock II SCSI */
- { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
- /* DTC 3520A ISA SCSI */
-};
-#endif
-
/*
* queue services:
@@ -799,141 +749,6 @@ static inline Scsi_Cmnd *remove_SC(Scsi_
return ptr;
}
-#if defined(PCMCIA) || !defined(MODULE)
-static void aha152x_setup(char *str, int *ints)
-{
- if(setup_count>=ARRAY_SIZE(setup)) {
- printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
- return;
- }
-
- setup[setup_count].conf = str;
- setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
- setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
- setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
- setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
- setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
- setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
- setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
- setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
- if (ints[0] > 9) {
- printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
- "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
-#else
- if (ints[0] > 8) { /*}*/
- printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
- "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
-#endif
- } else {
- setup_count++;
- }
-}
-#endif
-
-#if !defined(MODULE)
-static int __init do_setup(char *str)
-{
-
-#if defined(AHA152X_DEBUG)
- int ints[11];
-#else
- int ints[10];
-#endif
- int count=setup_count;
-
- get_options(str, ARRAY_SIZE(ints), ints);
- aha152x_setup(str,ints);
-
- return count<setup_count;
-}
-
-__setup("aha152x=", do_setup);
-#endif
-
-/*
- * Test, if port_base is valid.
- *
- */
-static int aha152x_porttest(int io_port)
-{
- int i;
-
- SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
- for (i = 0; i < 16; i++)
- SETPORT(io_port + O_STACK, i);
-
- SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
- for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
- ;
-
- return (i == 16);
-}
-
-static int tc1550_porttest(int io_port)
-{
- int i;
-
- SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
- for (i = 0; i < 16; i++)
- SETPORT(io_port + O_STACK, i);
-
- SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
- for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
- ;
-
- return (i == 16);
-}
-
-static int checksetup(struct aha152x_setup *setup)
-{
-
-#if !defined(PCMCIA)
- int i;
- for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
- ;
-
- if (i == ARRAY_SIZE(ports))
- return 0;
-#endif
- if (!request_region(setup->io_port, IO_RANGE, "aha152x"))
- return 0;
-
- if(aha152x_porttest(setup->io_port)) {
- setup->tc1550=0;
- } else if(tc1550_porttest(setup->io_port)) {
- setup->tc1550=1;
- } else {
- release_region(setup->io_port, IO_RANGE);
- return 0;
- }
-
- release_region(setup->io_port, IO_RANGE);
-
-
- if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
- return 0;
-
- if ((setup->scsiid < 0) || (setup->scsiid > 7))
- return 0;
-
- if ((setup->reconnect < 0) || (setup->reconnect > 1))
- return 0;
-
- if ((setup->parity < 0) || (setup->parity > 1))
- return 0;
-
- if ((setup->synchronous < 0) || (setup->synchronous > 1))
- return 0;
-
- if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
- return 0;
-
-
- return 1;
-}
-
static inline struct Scsi_Host *lookup_irq(int irqno)
{
int i;
@@ -950,7 +765,6 @@ static irqreturn_t swintr(int irqno, voi
struct Scsi_Host *shpnt = lookup_irq(irqno);
if (!shpnt) {
- /* no point using HOSTNO here! */
printk(KERN_ERR "aha152x: catched software interrupt %d for unknown controller.\n", irqno);
return IRQ_NONE;
}
@@ -961,17 +775,19 @@ static irqreturn_t swintr(int irqno, voi
return IRQ_HANDLED;
}
-
struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
{
struct Scsi_Host *shpnt;
shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
if (!shpnt) {
- printk(KERN_ERR "aha152x: scsi_register failed\n");
+ printk(KERN_ERR "aha152x: scsi_host_alloc failed\n");
return NULL;
}
+ /* need to have host registered before triggering any interrupt */
+ aha152x_host[registered_count] = shpnt;
+
memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
shpnt->io_port = setup->io_port;
@@ -1034,24 +850,19 @@ struct Scsi_Host *aha152x_probe_one(stru
DELAY,
EXT_TRANS ? "enabled" : "disabled");
- if (!request_region(shpnt->io_port, IO_RANGE, "aha152x"))
- goto out_unregister;
-
/* not expecting any interrupts */
SETPORT(SIMODE0, 0);
SETPORT(SIMODE1, 0);
- if (request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) {
- printk(KERN_ERR "aha152x%d: driver needs an IRQ.\n", shpnt->host_no);
- goto out_release_region;
+ if( request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) {
+ printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq);
+ goto out_host_put;
}
HOSTDATA(shpnt)->swint = 0;
printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
- /* need to have host registered before triggering any interrupt */
- aha152x_host[registered_count] = shpnt;
mb();
SETPORT(DMACNTRL0, SWINT|INTEN);
mdelay(1000);
@@ -1066,9 +877,9 @@ struct Scsi_Host *aha152x_probe_one(stru
SETPORT(DMACNTRL0, INTEN);
- printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong. "
+ printk(KERN_ERR "aha152x%d: irq %d possibly wrong. "
"Please verify.\n", shpnt->host_no, shpnt->irq);
- goto out_unregister_host;
+ goto out_host_put;
}
printk("ok.\n");
@@ -1077,322 +888,50 @@ struct Scsi_Host *aha152x_probe_one(stru
SETPORT(SSTAT0, 0x7f);
SETPORT(SSTAT1, 0xef);
- if (request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) {
- printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n", shpnt->host_no);
- goto out_unregister_host;
- }
-
- scsi_add_host(shpnt, 0);
- scsi_scan_host(shpnt);
- return shpnt; /* the pcmcia stub needs the return value; */
-
-out_unregister_host:
- aha152x_host[registered_count] = NULL;
-out_release_region:
- release_region(shpnt->io_port, IO_RANGE);
-out_unregister:
- scsi_host_put(shpnt);
- return NULL;
-}
-
-static int __init aha152x_init(void)
-{
- int i, j, ok;
-#if defined(AUTOCONF)
- aha152x_config conf;
-#endif
-#ifdef __ISAPNP__
- struct pnp_dev *dev=0, *pnpdev[2] = {0, 0};
-#endif
-
- if (setup_count) {
- printk(KERN_INFO "aha152x: processing commandline: ");
-
- for (i = 0; i < setup_count; i++)
- if (!checksetup(&setup[i])) {
- printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
- printk(KERN_ERR "aha152x: invalid line\n");
- }
- printk("ok\n");
- }
-
-#if defined(SETUP0)
- if (setup_count < ARRAY_SIZE(setup)) {
- struct aha152x_setup override = SETUP0;
-
- if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
- if (!checksetup(&override)) {
- printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
- override.io_port,
- override.irq,
- override.scsiid,
- override.reconnect,
- override.parity,
- override.synchronous,
- override.delay,
- override.ext_trans);
- } else
- setup[setup_count++] = override;
- }
- }
-#endif
-
-#if defined(SETUP1)
- if (setup_count < ARRAY_SIZE(setup)) {
- struct aha152x_setup override = SETUP1;
-
- if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
- if (!checksetup(&override)) {
- printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
- override.io_port,
- override.irq,
- override.scsiid,
- override.reconnect,
- override.parity,
- override.synchronous,
- override.delay,
- override.ext_trans);
- } else
- setup[setup_count++] = override;
- }
- }
-#endif
-
-#if defined(MODULE) && !defined(PCMCIA)
- if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
- if(aha152x[0]!=0) {
- setup[setup_count].conf = "";
- setup[setup_count].io_port = aha152x[0];
- setup[setup_count].irq = aha152x[1];
- setup[setup_count].scsiid = aha152x[2];
- setup[setup_count].reconnect = aha152x[3];
- setup[setup_count].parity = aha152x[4];
- setup[setup_count].synchronous = aha152x[5];
- setup[setup_count].delay = aha152x[6];
- setup[setup_count].ext_trans = aha152x[7];
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = aha152x[8];
-#endif
- } else if(io[0]!=0 || irq[0]!=0) {
- if(io[0]!=0) setup[setup_count].io_port = io[0];
- if(irq[0]!=0) setup[setup_count].irq = irq[0];
-
- setup[setup_count].scsiid = scsiid[0];
- setup[setup_count].reconnect = reconnect[0];
- setup[setup_count].parity = parity[0];
- setup[setup_count].synchronous = sync[0];
- setup[setup_count].delay = delay[0];
- setup[setup_count].ext_trans = exttrans[0];
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = debug[0];
-#endif
- }
-
- if (checksetup(&setup[setup_count]))
- setup_count++;
- else
- printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
- setup[setup_count].io_port,
- setup[setup_count].irq,
- setup[setup_count].scsiid,
- setup[setup_count].reconnect,
- setup[setup_count].parity,
- setup[setup_count].synchronous,
- setup[setup_count].delay,
- setup[setup_count].ext_trans);
- }
-
- if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
- if(aha152x1[0]!=0) {
- setup[setup_count].conf = "";
- setup[setup_count].io_port = aha152x1[0];
- setup[setup_count].irq = aha152x1[1];
- setup[setup_count].scsiid = aha152x1[2];
- setup[setup_count].reconnect = aha152x1[3];
- setup[setup_count].parity = aha152x1[4];
- setup[setup_count].synchronous = aha152x1[5];
- setup[setup_count].delay = aha152x1[6];
- setup[setup_count].ext_trans = aha152x1[7];
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = aha152x1[8];
-#endif
- } else if(io[1]!=0 || irq[1]!=0) {
- if(io[1]!=0) setup[setup_count].io_port = io[1];
- if(irq[1]!=0) setup[setup_count].irq = irq[1];
-
- setup[setup_count].scsiid = scsiid[1];
- setup[setup_count].reconnect = reconnect[1];
- setup[setup_count].parity = parity[1];
- setup[setup_count].synchronous = sync[1];
- setup[setup_count].delay = delay[1];
- setup[setup_count].ext_trans = exttrans[1];
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = debug[1];
-#endif
- }
- if (checksetup(&setup[setup_count]))
- setup_count++;
- else
- printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
- setup[setup_count].io_port,
- setup[setup_count].irq,
- setup[setup_count].scsiid,
- setup[setup_count].reconnect,
- setup[setup_count].parity,
- setup[setup_count].synchronous,
- setup[setup_count].delay,
- setup[setup_count].ext_trans);
+ if ( request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) {
+ printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq);
+ goto out_host_put;
}
-#endif
-#ifdef __ISAPNP__
- while ( setup_count<ARRAY_SIZE(setup) && (dev=pnp_find_dev(NULL, ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), dev)) ) {
- if (pnp_device_attach(dev) < 0)
- continue;
- if (pnp_activate_dev(dev) < 0) {
- pnp_device_detach(dev);
- continue;
- }
- if (!pnp_port_valid(dev, 0)) {
- pnp_device_detach(dev);
- continue;
- }
- if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
- pnp_device_detach(dev);
- continue;
- }
- setup[setup_count].io_port = pnp_port_start(dev, 0);
- setup[setup_count].irq = pnp_irq(dev, 0);
- setup[setup_count].scsiid = 7;
- setup[setup_count].reconnect = 1;
- setup[setup_count].parity = 1;
- setup[setup_count].synchronous = 1;
- setup[setup_count].delay = DELAY_DEFAULT;
- setup[setup_count].ext_trans = 0;
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = DEBUG_DEFAULT;
-#endif
- pnpdev[setup_count] = dev;
- printk (KERN_INFO
- "aha152x: found ISAPnP AVA-1505A at io=0x%03x, irq=%d\n",
- setup[setup_count].io_port, setup[setup_count].irq);
- setup_count++;
+ if( scsi_add_host(shpnt, 0) ) {
+ free_irq(shpnt->irq, shpnt);
+ printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no);
+ goto out_host_put;
}
-#endif
-#if defined(AUTOCONF)
- if (setup_count<ARRAY_SIZE(setup)) {
-#if !defined(SKIP_BIOSTEST)
- ok = 0;
- for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++)
- for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
- ok = isa_check_signature(addresses[i] + signatures[j].sig_offset,
- signatures[j].signature, signatures[j].sig_length);
-
- if (!ok && setup_count == 0)
- return 0;
-
- printk(KERN_INFO "aha152x: BIOS test: passed, ");
-#else
- printk(KERN_INFO "aha152x: ");
-#endif /* !SKIP_BIOSTEST */
-
- ok = 0;
- for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
- if ((setup_count == 1) && (setup[0].io_port == ports[i]))
- continue;
-
- if (aha152x_porttest(ports[i])) {
- ok++;
- setup[setup_count].io_port = ports[i];
- setup[setup_count].tc1550 = 0;
-
- conf.cf_port =
- (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
-
- setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
- setup[setup_count].scsiid = conf.cf_id;
- setup[setup_count].reconnect = conf.cf_tardisc;
- setup[setup_count].parity = !conf.cf_parity;
- setup[setup_count].synchronous = conf.cf_syncneg;
- setup[setup_count].delay = DELAY_DEFAULT;
- setup[setup_count].ext_trans = 0;
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = DEBUG_DEFAULT;
-#endif
- setup_count++;
- } else if (tc1550_porttest(ports[i])) {
- ok++;
- setup[setup_count].io_port = ports[i];
- setup[setup_count].tc1550 = 1;
-
- conf.cf_port =
- (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
-
- setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
- setup[setup_count].scsiid = conf.cf_id;
- setup[setup_count].reconnect = conf.cf_tardisc;
- setup[setup_count].parity = !conf.cf_parity;
- setup[setup_count].synchronous = conf.cf_syncneg;
- setup[setup_count].delay = DELAY_DEFAULT;
- setup[setup_count].ext_trans = 0;
-#if defined(AHA152X_DEBUG)
- setup[setup_count].debug = DEBUG_DEFAULT;
-#endif
- setup_count++;
- }
- }
+ scsi_scan_host(shpnt);
- if (ok)
- printk("auto configuration: ok, ");
- }
-#endif
+ registered_count++;
- printk("detected %d controller(s)\n", setup_count);
+ return shpnt;
- for (i=0; i<setup_count; i++) {
- aha152x_probe_one(&setup[i]);
- if (aha152x_host[registered_count]) {
-#ifdef __ISAPNP__
- if(pnpdev[i])
- HOSTDATA(aha152x_host[registered_count])->pnpdev=pnpdev[i];
-#endif
- registered_count++;
- }
- }
+out_host_put:
+ aha152x_host[registered_count]=0;
+ scsi_host_put(shpnt);
- return registered_count>0;
+ return 0;
}
-static int aha152x_release(struct Scsi_Host *shpnt)
+void aha152x_release(struct Scsi_Host *shpnt)
{
+ if(!shpnt)
+ return;
+
if (shpnt->irq)
free_irq(shpnt->irq, shpnt);
+#if !defined(PCMCIA)
if (shpnt->io_port)
release_region(shpnt->io_port, IO_RANGE);
+#endif
#ifdef __ISAPNP__
if (HOSTDATA(shpnt)->pnpdev)
pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
#endif
+ scsi_remove_host(shpnt);
scsi_host_put(shpnt);
-
- return 0;
-}
-
-static void __exit aha152x_exit(void)
-{
- int i;
-
- for(i=0; i<ARRAY_SIZE(setup); i++) {
- if(aha152x_host[i]) {
- scsi_remove_host(aha152x_host[i]);
- aha152x_release(aha152x_host[i]);
- aha152x_host[i]=0;
- }
- }
}
@@ -1446,8 +985,8 @@ static int aha152x_internal_queue(Scsi_C
#if defined(AHA152X_DEBUG)
if (HOSTDATA(shpnt)->debug & debug_queue) {
- printk(INFO_LEAD "queue: cmd_len=%d pieces=%d size=%u cmnd=",
- CMDINFO(SCpnt), SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
+ printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
+ CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
print_command(SCpnt->cmnd);
}
#endif
@@ -1466,7 +1005,7 @@ static int aha152x_internal_queue(Scsi_C
return FAILED;
}
} else {
- SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
+ SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
if(SCpnt->host_scribble==0) {
printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
return FAILED;
@@ -1561,11 +1100,6 @@ static int aha152x_abort(Scsi_Cmnd *SCpn
Scsi_Cmnd *ptr;
unsigned long flags;
- if(!shpnt) {
- printk(ERR_LEAD "abort(%p): no host structure\n", CMDINFO(SCpnt), SCpnt);
- return FAILED;
- }
-
#if defined(AHA152X_DEBUG)
if(HOSTDATA(shpnt)->debug & debug_eh) {
printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt);
@@ -1608,33 +1142,52 @@ static int aha152x_abort(Scsi_Cmnd *SCpn
static void timer_expired(unsigned long p)
{
Scsi_Cmnd *SCp = (Scsi_Cmnd *)p;
- struct semaphore *sem = SCSEM(SCp);
- struct Scsi_Host *shpnt = SCp->device->host;
+ struct semaphore *sem;
+ struct Scsi_Host *shpnt;
+ unsigned long flags;
- /* remove command from issue queue */
- if(remove_SC(&ISSUE_SC, SCp)) {
- printk(KERN_INFO "aha152x: ABORT timed out - removed from issue queue\n");
- kfree(SCp->host_scribble);
- SCp->host_scribble=0;
- } else {
- printk(KERN_INFO "aha152x: ABORT timed out - not on issue queue\n");
+ if(SCp==0) {
+ printk(KERN_ERR "timer_expired: command not set\n");
+ return;
}
- up(sem);
+ if(SCp->host_scribble==0) {
+ printk(KERN_ERR "timer_expired: host_scribble not set\n");
+ return;
+ }
+
+ if(SCp->device==0) {
+ printk(KERN_ERR "timer_expired: device not set\n");
+ return;
+ }
+
+ shpnt = SCp->device->host;
+
+ if(shpnt==0) {
+ printk(KERN_ERR "timer_expired: host not set\n");
+ return;
+ }
+
+ sem = SCSEM(SCp);
+
+ if(sem) {
+ up(sem);
+ } else {
+ printk(KERN_ERR "timer_expired: semaphore not set\n");
+ }
}
/*
* Reset a device
*
- * FIXME: never seen this live. might lockup...
- *
*/
static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
{
struct Scsi_Host *shpnt = SCpnt->device->host;
DECLARE_MUTEX_LOCKED(sem);
struct timer_list timer;
- int ret;
+ int ret, issued, disconnected;
+ unsigned long flags;
#if defined(AHA152X_DEBUG)
if(HOSTDATA(shpnt)->debug & debug_eh) {
@@ -1648,13 +1201,18 @@ static int aha152x_device_reset(Scsi_Cmn
return FAILED;
}
+ DO_LOCK(flags);
+ issued = remove_SC(&ISSUE_SC, SCpnt)==0;
+ disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
+ DO_UNLOCK(flags);
+
SCpnt->cmd_len = 0;
SCpnt->use_sg = 0;
SCpnt->request_buffer = 0;
SCpnt->request_bufflen = 0;
init_timer(&timer);
- timer.data = (unsigned long) cmd;
+ timer.data = (unsigned long) SCpnt;
timer.expires = jiffies + 100*HZ; /* 10s */
timer.function = (void (*)(unsigned long)) timer_expired;
@@ -1662,18 +1220,36 @@ static int aha152x_device_reset(Scsi_Cmn
add_timer(&timer);
down(&sem);
del_timer(&timer);
-
+
SCpnt->cmd_len = SCpnt->old_cmd_len;
SCpnt->use_sg = SCpnt->old_use_sg;
SCpnt->request_buffer = SCpnt->buffer;
SCpnt->request_bufflen = SCpnt->bufflen;
+ DO_LOCK(flags);
+
if(SCpnt->SCp.phase & resetted) {
+ HOSTDATA(shpnt)->commands--;
+ if (!HOSTDATA(shpnt)->commands)
+ SETPORT(PORTA, 0);
+ kfree(SCpnt->host_scribble);
+ SCpnt->host_scribble=0;
+
ret = SUCCESS;
} else {
+ /* requeue */
+ if(!issued) {
+ append_SC(&ISSUE_SC, SCpnt);
+ } else if(disconnected) {
+ remove_SC(&ISSUE_SC, SCpnt);
+ append_SC(&DISCONNECTED_SC, SCpnt);
+ }
+
ret = FAILED;
}
+ DO_UNLOCK(flags);
+
spin_lock_irq(shpnt->host_lock);
return ret;
}
@@ -1681,13 +1257,17 @@ static int aha152x_device_reset(Scsi_Cmn
static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
{
Scsi_Cmnd *ptr;
- unsigned long flags;
-
- DO_LOCK(flags);
ptr=*SCs;
while(ptr) {
- Scsi_Cmnd *next = SCNEXT(ptr);
+ Scsi_Cmnd *next;
+
+ if(SCDATA(ptr)) {
+ next = SCNEXT(ptr);
+ } else {
+ printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
+ next = 0;
+ }
if (!ptr->device->soft_reset) {
DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
@@ -1699,8 +1279,6 @@ static void free_hard_reset_SCs(struct S
ptr = next;
}
-
- DO_UNLOCK(flags);
}
/*
@@ -1712,6 +1290,8 @@ static int aha152x_bus_reset(Scsi_Cmnd *
struct Scsi_Host *shpnt = SCpnt->device->host;
unsigned long flags;
+ DO_LOCK(flags);
+
#if defined(AHA152X_DEBUG)
if(HOSTDATA(shpnt)->debug & debug_eh) {
printk(DEBUG_LEAD "aha152x_bus_reset(%p)", CMDINFO(SCpnt), SCpnt);
@@ -1729,12 +1309,12 @@ static int aha152x_bus_reset(Scsi_Cmnd *
SETPORT(SCSISEQ, 0);
mdelay(DELAY);
- DPRINTK(debug_eh, DEBUG_LEAD "bus reset returns\n", CMDINFO(SCpnt));
+ DPRINTK(debug_eh, DEBUG_LEAD "bus resetted\n", CMDINFO(SCpnt));
- DO_LOCK(flags);
setup_expected_interrupts(shpnt);
if(HOSTDATA(shpnt)->commands==0)
SETPORT(PORTA, 0);
+
DO_UNLOCK(flags);
return SUCCESS;
@@ -2000,6 +1580,7 @@ static void busfree_run(struct Scsi_Host
#if defined(AHA152X_STAT)
action++;
#endif
+
if(DONE_SC->SCp.phase & check_condition) {
#if 0
if(HOSTDATA(shpnt)->debug & debug_eh) {
@@ -2029,47 +1610,57 @@ static void busfree_run(struct Scsi_Host
#endif
if(!(DONE_SC->SCp.Status & not_issued)) {
+ Scsi_Cmnd *ptr = DONE_SC;
+ DONE_SC=0;
#if 0
- DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(DONE_SC));
+ DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
#endif
- DONE_SC->cmnd[0] = REQUEST_SENSE;
- DONE_SC->cmnd[1] = 0;
- DONE_SC->cmnd[2] = 0;
- DONE_SC->cmnd[3] = 0;
- DONE_SC->cmnd[4] = sizeof(DONE_SC->sense_buffer);
- DONE_SC->cmnd[5] = 0;
- DONE_SC->cmd_len = 6;
- DONE_SC->use_sg = 0;
- DONE_SC->request_buffer = DONE_SC->sense_buffer;
- DONE_SC->request_bufflen = sizeof(DONE_SC->sense_buffer);
+ ptr->cmnd[0] = REQUEST_SENSE;
+ ptr->cmnd[1] = 0;
+ ptr->cmnd[2] = 0;
+ ptr->cmnd[3] = 0;
+ ptr->cmnd[4] = sizeof(ptr->sense_buffer);
+ ptr->cmnd[5] = 0;
+ ptr->cmd_len = 6;
+ ptr->use_sg = 0;
+ ptr->request_buffer = ptr->sense_buffer;
+ ptr->request_bufflen = sizeof(ptr->sense_buffer);
DO_UNLOCK(flags);
- aha152x_internal_queue(DONE_SC, 0, check_condition, DONE_SC->scsi_done);
+ aha152x_internal_queue(ptr, 0, check_condition, ptr->scsi_done);
DO_LOCK(flags);
-
- DONE_SC=0;
- } else {
#if 0
+ } else {
DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
#endif
}
}
if(DONE_SC && DONE_SC->scsi_done) {
+#if defined(AHA152X_DEBUG)
+ int hostno=DONE_SC->device->host->host_no;
+ int id=DONE_SC->device->id & 0xf;
+ int lun=DONE_SC->device->lun & 0x7;
+#endif
+ Scsi_Cmnd *ptr = DONE_SC;
+ DONE_SC=0;
+
/* turn led off, when no commands are in the driver */
HOSTDATA(shpnt)->commands--;
if (!HOSTDATA(shpnt)->commands)
SETPORT(PORTA, 0); /* turn led off */
+ if(ptr->scsi_done != reset_done) {
+ kfree(ptr->host_scribble);
+ ptr->host_scribble=0;
+ }
+
DO_UNLOCK(flags);
- DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", CMDINFO(DONE_SC), DONE_SC);
- DONE_SC->scsi_done(DONE_SC);
- DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", CMDINFO(DONE_SC), DONE_SC);
+ DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
+ ptr->scsi_done(ptr);
+ DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
DO_LOCK(flags);
-
- kfree(DONE_SC->host_scribble);
- DONE_SC->host_scribble=0;
}
DONE_SC=0;
@@ -2936,11 +2527,11 @@ static void rsti_run(struct Scsi_Host *s
if (!ptr->device->soft_reset) {
remove_SC(&DISCONNECTED_SC, ptr);
- ptr->result = DID_RESET << 16;
- ptr->scsi_done(ptr);
-
kfree(ptr->host_scribble);
ptr->host_scribble=0;
+
+ ptr->result = DID_RESET << 16;
+ ptr->scsi_done(ptr);
}
ptr = next;
@@ -3382,7 +2973,11 @@ static void show_command(Scsi_Cmnd *ptr)
printk("aborted|");
if (ptr->SCp.phase & resetted)
printk("resetted|");
- printk("; next=0x%p\n", SCNEXT(ptr));
+ if( SCDATA(ptr) ) {
+ printk("; next=0x%p\n", SCNEXT(ptr));
+ } else {
+ printk("; next=(host scribble NULL)\n");
+ }
}
/*
@@ -3406,7 +3001,7 @@ static void show_queues(struct Scsi_Host
printk(KERN_DEBUG "none\n");
printk(KERN_DEBUG "disconnected_SC:\n");
- for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
+ for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : 0)
show_command(ptr);
disp_ports(shpnt);
@@ -3914,7 +3509,494 @@ static Scsi_Host_Template aha152x_driver
.use_clustering = DISABLE_CLUSTERING,
};
-#ifndef PCMCIA
+#if !defined(PCMCIA)
+static int setup_count;
+static struct aha152x_setup setup[2];
+
+/* possible i/o addresses for the AIC-6260; default first */
+static unsigned short ports[] = { 0x340, 0x140 };
+
+#if !defined(SKIP_BIOSTEST)
+/* possible locations for the Adaptec BIOS; defaults first */
+static unsigned int addresses[] =
+{
+ 0xdc000, /* default first */
+ 0xc8000,
+ 0xcc000,
+ 0xd0000,
+ 0xd4000,
+ 0xd8000,
+ 0xe0000,
+ 0xeb800, /* VTech Platinum SMP */
+ 0xf0000,
+};
+
+/* signatures for various AIC-6[23]60 based controllers.
+ The point in detecting signatures is to avoid useless and maybe
+ harmful probes on ports. I'm not sure that all listed boards pass
+ auto-configuration. For those which fail the BIOS signature is
+ obsolete, because user intervention to supply the configuration is
+ needed anyway. May be an information whether or not the BIOS supports
+ extended translation could be also useful here. */
+static struct signature {
+ unsigned char *signature;
+ int sig_offset;
+ int sig_length;
+} signatures[] =
+{
+ { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
+ /* Adaptec 152x */
+ { "Adaptec AHA-1520B", 0x000b, 17 },
+ /* Adaptec 152x rev B */
+ { "Adaptec AHA-1520B", 0x0026, 17 },
+ /* Iomega Jaz Jet ISA (AIC6370Q) */
+ { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
+ /* on-board controller */
+ { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
+ /* on-board controller */
+ { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
+ /* on-board controller */
+ { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
+ /* on-board controller */
+ { "ScsiPro SP-360 BIOS", 0x2873, 19 },
+ /* ScsiPro-Controller */
+ { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
+ /* Gigabyte Local-Bus-SCSI */
+ { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
+ /* Adaptec 282x */
+ { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
+ /* IBM Thinkpad Dock II */
+ { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
+ /* IBM Thinkpad Dock II SCSI */
+ { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
+ /* DTC 3520A ISA SCSI */
+};
+#endif /* !SKIP_BIOSTEST */
+
+/*
+ * Test, if port_base is valid.
+ *
+ */
+static int aha152x_porttest(int io_port)
+{
+ int i;
+
+ SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
+ for (i = 0; i < 16; i++)
+ SETPORT(io_port + O_STACK, i);
+
+ SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
+ for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
+ ;
+
+ return (i == 16);
+}
+
+static int tc1550_porttest(int io_port)
+{
+ int i;
+
+ SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
+ for (i = 0; i < 16; i++)
+ SETPORT(io_port + O_STACK, i);
+
+ SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
+ for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
+ ;
+
+ return (i == 16);
+}
+
+
+static int checksetup(struct aha152x_setup *setup)
+{
+ int i;
+ for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
+ ;
+
+ if (i == ARRAY_SIZE(ports))
+ return 0;
+
+ if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
+ printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
+ return 0;
+ }
+
+ if( aha152x_porttest(setup->io_port) ) {
+ setup->tc1550=0;
+ } else if( tc1550_porttest(setup->io_port) ) {
+ setup->tc1550=1;
+ } else {
+ release_region(setup->io_port, IO_RANGE);
+ return 0;
+ }
+
+ release_region(setup->io_port, IO_RANGE);
+
+ if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
+ return 0;
+
+ if ((setup->scsiid < 0) || (setup->scsiid > 7))
+ return 0;
+
+ if ((setup->reconnect < 0) || (setup->reconnect > 1))
+ return 0;
+
+ if ((setup->parity < 0) || (setup->parity > 1))
+ return 0;
+
+ if ((setup->synchronous < 0) || (setup->synchronous > 1))
+ return 0;
+
+ if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
+ return 0;
+
+
+ return 1;
+}
+
+
+static int __init aha152x_init(void)
+{
+ int i, j, ok;
+#if defined(AUTOCONF)
+ aha152x_config conf;
+#endif
+#ifdef __ISAPNP__
+ struct pnp_dev *dev=0, *pnpdev[2] = {0, 0};
+#endif
+
+ if ( setup_count ) {
+ printk(KERN_INFO "aha152x: processing commandline: ");
+
+ for (i = 0; i<setup_count; i++) {
+ if (!checksetup(&setup[i])) {
+ printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
+ printk(KERN_ERR "aha152x: invalid line\n");
+ }
+ }
+ printk("ok\n");
+ }
+
+#if defined(SETUP0)
+ if (setup_count < ARRAY_SIZE(setup)) {
+ struct aha152x_setup override = SETUP0;
+
+ if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
+ if (!checksetup(&override)) {
+ printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
+ override.io_port,
+ override.irq,
+ override.scsiid,
+ override.reconnect,
+ override.parity,
+ override.synchronous,
+ override.delay,
+ override.ext_trans);
+ } else
+ setup[setup_count++] = override;
+ }
+ }
+#endif
+
+#if defined(SETUP1)
+ if (setup_count < ARRAY_SIZE(setup)) {
+ struct aha152x_setup override = SETUP1;
+
+ if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
+ if (!checksetup(&override)) {
+ printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
+ override.io_port,
+ override.irq,
+ override.scsiid,
+ override.reconnect,
+ override.parity,
+ override.synchronous,
+ override.delay,
+ override.ext_trans);
+ } else
+ setup[setup_count++] = override;
+ }
+ }
+#endif
+
+#if defined(MODULE)
+ if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
+ if(aha152x[0]!=0) {
+ setup[setup_count].conf = "";
+ setup[setup_count].io_port = aha152x[0];
+ setup[setup_count].irq = aha152x[1];
+ setup[setup_count].scsiid = aha152x[2];
+ setup[setup_count].reconnect = aha152x[3];
+ setup[setup_count].parity = aha152x[4];
+ setup[setup_count].synchronous = aha152x[5];
+ setup[setup_count].delay = aha152x[6];
+ setup[setup_count].ext_trans = aha152x[7];
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = aha152x[8];
+#endif
+ } else if(io[0]!=0 || irq[0]!=0) {
+ if(io[0]!=0) setup[setup_count].io_port = io[0];
+ if(irq[0]!=0) setup[setup_count].irq = irq[0];
+
+ setup[setup_count].scsiid = scsiid[0];
+ setup[setup_count].reconnect = reconnect[0];
+ setup[setup_count].parity = parity[0];
+ setup[setup_count].synchronous = sync[0];
+ setup[setup_count].delay = delay[0];
+ setup[setup_count].ext_trans = exttrans[0];
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = debug[0];
+#endif
+ }
+
+ if (checksetup(&setup[setup_count]))
+ setup_count++;
+ else
+ printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
+ setup[setup_count].io_port,
+ setup[setup_count].irq,
+ setup[setup_count].scsiid,
+ setup[setup_count].reconnect,
+ setup[setup_count].parity,
+ setup[setup_count].synchronous,
+ setup[setup_count].delay,
+ setup[setup_count].ext_trans);
+ }
+
+ if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
+ if(aha152x1[0]!=0) {
+ setup[setup_count].conf = "";
+ setup[setup_count].io_port = aha152x1[0];
+ setup[setup_count].irq = aha152x1[1];
+ setup[setup_count].scsiid = aha152x1[2];
+ setup[setup_count].reconnect = aha152x1[3];
+ setup[setup_count].parity = aha152x1[4];
+ setup[setup_count].synchronous = aha152x1[5];
+ setup[setup_count].delay = aha152x1[6];
+ setup[setup_count].ext_trans = aha152x1[7];
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = aha152x1[8];
+#endif
+ } else if(io[1]!=0 || irq[1]!=0) {
+ if(io[1]!=0) setup[setup_count].io_port = io[1];
+ if(irq[1]!=0) setup[setup_count].irq = irq[1];
+
+ setup[setup_count].scsiid = scsiid[1];
+ setup[setup_count].reconnect = reconnect[1];
+ setup[setup_count].parity = parity[1];
+ setup[setup_count].synchronous = sync[1];
+ setup[setup_count].delay = delay[1];
+ setup[setup_count].ext_trans = exttrans[1];
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = debug[1];
+#endif
+ }
+ if (checksetup(&setup[setup_count]))
+ setup_count++;
+ else
+ printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
+ setup[setup_count].io_port,
+ setup[setup_count].irq,
+ setup[setup_count].scsiid,
+ setup[setup_count].reconnect,
+ setup[setup_count].parity,
+ setup[setup_count].synchronous,
+ setup[setup_count].delay,
+ setup[setup_count].ext_trans);
+ }
+#endif
+
+#ifdef __ISAPNP__
+ for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
+ while ( setup_count<ARRAY_SIZE(setup) &&
+ (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
+ if (pnp_device_attach(dev) < 0)
+ continue;
+
+ if (pnp_activate_dev(dev) < 0) {
+ pnp_device_detach(dev);
+ continue;
+ }
+
+ if (!pnp_port_valid(dev, 0)) {
+ pnp_device_detach(dev);
+ continue;
+ }
+
+ if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
+ pnp_device_detach(dev);
+ continue;
+ }
+
+ setup[setup_count].io_port = pnp_port_start(dev, 0);
+ setup[setup_count].irq = pnp_irq(dev, 0);
+ setup[setup_count].scsiid = 7;
+ setup[setup_count].reconnect = 1;
+ setup[setup_count].parity = 1;
+ setup[setup_count].synchronous = 1;
+ setup[setup_count].delay = DELAY_DEFAULT;
+ setup[setup_count].ext_trans = 0;
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = DEBUG_DEFAULT;
+#endif
+#if defined(__ISAPNP__)
+ pnpdev[setup_count] = dev;
+#endif
+ printk (KERN_INFO
+ "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
+ setup[setup_count].io_port, setup[setup_count].irq);
+ setup_count++;
+ }
+ }
+#endif
+
+#if defined(AUTOCONF)
+ if (setup_count<ARRAY_SIZE(setup)) {
+#if !defined(SKIP_BIOSTEST)
+ ok = 0;
+ for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++)
+ for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
+ ok = isa_check_signature(addresses[i] + signatures[j].sig_offset,
+ signatures[j].signature, signatures[j].sig_length);
+ if (!ok && setup_count == 0)
+ return 0;
+
+ printk(KERN_INFO "aha152x: BIOS test: passed, ");
+#else
+ printk(KERN_INFO "aha152x: ");
+#endif /* !SKIP_BIOSTEST */
+
+ ok = 0;
+ for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
+ if ((setup_count == 1) && (setup[0].io_port == ports[i]))
+ continue;
+
+ if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
+ printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
+ continue;
+ }
+
+ if (aha152x_porttest(ports[i])) {
+ setup[setup_count].tc1550 = 0;
+
+ conf.cf_port =
+ (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
+ } else if (tc1550_porttest(ports[i])) {
+ setup[setup_count].tc1550 = 1;
+
+ conf.cf_port =
+ (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
+ } else {
+ release_region(ports[i], IO_RANGE);
+ continue;
+ }
+
+ release_region(ports[i], IO_RANGE);
+
+ ok++;
+ setup[setup_count].io_port = ports[i];
+ setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
+ setup[setup_count].scsiid = conf.cf_id;
+ setup[setup_count].reconnect = conf.cf_tardisc;
+ setup[setup_count].parity = !conf.cf_parity;
+ setup[setup_count].synchronous = conf.cf_syncneg;
+ setup[setup_count].delay = DELAY_DEFAULT;
+ setup[setup_count].ext_trans = 0;
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = DEBUG_DEFAULT;
+#endif
+ setup_count++;
+
+ }
+
+ if (ok)
+ printk("auto configuration: ok, ");
+ }
+#endif
+
+ printk("%d controller(s) configured\n", setup_count);
+
+ for (i=0; i<setup_count; i++) {
+ if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
+ struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
+
+ if( !shpnt ) {
+ release_region(setup[i].io_port, IO_RANGE);
+#if defined(__ISAPNP__)
+ } else if( pnpdev[i] ) {
+ HOSTDATA(shpnt)->pnpdev=pnpdev[i];
+ pnpdev[i]=0;
+#endif
+ }
+ } else {
+ printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
+ }
+
+#if defined(__ISAPNP__)
+ if( pnpdev[i] )
+ pnp_device_detach(pnpdev[i]);
+#endif
+ }
+
+ return registered_count>0;
+}
+
+static void __exit aha152x_exit(void)
+{
+ int i;
+
+ for(i=0; i<ARRAY_SIZE(setup); i++) {
+ aha152x_release(aha152x_host[i]);
+ aha152x_host[i]=0;
+ }
+}
+
module_init(aha152x_init);
module_exit(aha152x_exit);
+
+#if !defined(MODULE)
+static int __init aha152x_setup(char *str)
+{
+#if defined(AHA152X_DEBUG)
+ int ints[11];
+#else
+ int ints[10];
+#endif
+ get_options(str, ARRAY_SIZE(ints), ints);
+
+ if(setup_count>=ARRAY_SIZE(setup)) {
+ printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
+ return 1;
+ }
+
+ setup[setup_count].conf = str;
+ setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
+ setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
+ setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
+ setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
+ setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
+ setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
+ setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
+ setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
+#if defined(AHA152X_DEBUG)
+ setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
+ if (ints[0] > 9) {
+ printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
+ "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
+#else
+ if (ints[0] > 8) { /*}*/
+ printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
+ "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
#endif
+ } else {
+ setup_count++;
+ return 0;
+ }
+
+ return 1;
+}
+__setup("aha152x=", aha152x_setup);
+#endif
+
+#endif /* !PCMCIA */
diff -uprd orig/linux-2.6.2-rc2/drivers/scsi/aha152x.h linux-2.6.2-rc2/drivers/scsi/aha152x.h
--- orig/linux-2.6.2-rc2/drivers/scsi/aha152x.h 2003-12-18 03:59:05.000000000 +0100
+++ linux-2.6.2-rc2/drivers/scsi/aha152x.h 2004-01-24 12:45:17.000000000 +0100
@@ -2,14 +2,14 @@
#define _AHA152X_H
/*
- * $Id: aha152x.h,v 2.5 2002/04/14 11:24:12 fischer Exp $
+ * $Id: aha152x.h,v 2.7 2004/01/24 11:39:03 fischer Exp $
*/
/* number of queueable commands
(unless we support more than 1 cmd_per_lun this should do) */
#define AHA152X_MAXQUEUE 7
-#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 2.5 $"
+#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 2.7 $"
/* port addresses */
#define SCSISEQ (HOSTIOPORT0+0x00) /* SCSI sequence control */
@@ -331,6 +331,7 @@ struct aha152x_setup {
};
struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *);
-int aha152x_host_reset(struct scsi_cmnd *);
+void aha152x_release(struct Scsi_Host *);
+int aha152x_host_reset(Scsi_Cmnd *);
#endif /* _AHA152X_H */
diff -uprd orig/linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c
--- orig/linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c 2004-01-24 11:54:43.000000000 +0100
+++ linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c 2004-01-24 12:06:31.000000000 +0100
@@ -78,7 +78,7 @@ static int irq_list[4] = { -1 };
static int host_id = 7;
static int reconnect = 1;
static int parity = 1;
-static int synchronous = 0;
+static int synchronous = 1;
static int reset_delay = 100;
static int ext_trans = 0;
@@ -244,9 +244,6 @@ static void aha152x_config_cs(dev_link_t
CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
- /* A bad hack... */
- release_region(link->io.BasePort1, link->io.NumPorts1);
-
/* Set configuration options for the aha152x driver */
memset(&s, 0, sizeof(s));
s.conf = "PCMCIA setup";
@@ -266,9 +263,6 @@ static void aha152x_config_cs(dev_link_t
goto cs_failed;
}
- scsi_add_host(host, NULL); /* XXX handle failure */
- scsi_scan_host(host);
-
sprintf(info->node.dev_name, "scsi%d", host->host_no);
link->dev = &info->node;
info->host = host;
@@ -286,7 +280,7 @@ static void aha152x_release_cs(dev_link_
{
scsi_info_t *info = link->priv;
- scsi_remove_host(info->host);
+ aha152x_release(info->host);
link->dev = NULL;
pcmcia_release_configuration(link->handle);
@@ -294,7 +288,6 @@ static void aha152x_release_cs(dev_link_
pcmcia_release_irq(link->handle, &link->irq);
link->state &= ~DEV_CONFIG;
- scsi_unregister(info->host);
}
static int aha152x_event(event_t event, int priority,
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem with module-init-tools-3.0-pre3
2004-01-30 7:35 ` Juergen E. Fischer
@ 2004-02-04 18:27 ` David Ronis
2004-02-04 19:31 ` Juergen E. Fischer
0 siblings, 1 reply; 7+ messages in thread
From: David Ronis @ 2004-02-04 18:27 UTC (permalink / raw)
To: Juergen E. Fischer; +Cc: linux-kernel, Rusty Russell
Hi,
I just built 2.6.2 and tried the scsi driver install/remove problem I
wrote about earlier (if, I manually remove the sg and aha152x modules with modprobe, I get an oops the next time they are used). The problem is still present.
Here's what's in syslog:
Feb 4 13:16:16 ronispc kernel: Unable to handle kernel NULL pointer dereference at virtual address 00000708
Feb 4 13:16:16 ronispc kernel: printing eip:
Feb 4 13:16:16 ronispc kernel: c0162a50
Feb 4 13:16:16 ronispc kernel: *pde = 00000000
Feb 4 13:16:16 ronispc kernel: Oops: 0000 [#1]
Feb 4 13:16:16 ronispc kernel: CPU: 1
Feb 4 13:16:16 ronispc kernel: EIP: 0060:[<c0162a50>] Not tainted
Feb 4 13:16:16 ronispc kernel: EFLAGS: 00010202
Feb 4 13:16:16 ronispc kernel: EIP is at cdev_get+0x20/0xb0
Feb 4 13:16:16 ronispc kernel: eax: e8736000 ebx: 00000708 ecx: 00000015 edx: e8737f28
Feb 4 13:16:16 ronispc kernel: esi: f739fb60 edi: 00000001 ebp: f739fb60 esp: e8737ed8
Feb 4 13:16:16 ronispc kernel: ds: 007b es: 007b ss: 0068
Feb 4 13:16:16 ronispc kernel: Process xsane (pid: 1629, threadinfo=e8736000 task=f1c5ccc0)
Feb 4 13:16:16 ronispc kernel: Stack: c0130185 ebbaa660 e8736000 00000000 c016293f f739fb60 c01ecf89 01500000
Feb 4 13:16:16 ronispc kernel: f739fb60 00000006 c0162920 00000000 e8736000 00000000 00000000 00000000
Feb 4 13:16:16 ronispc kernel: c0162767 f7fe2c00 01500000 e8737f28 00000000 e9e84da0 ea9802d4 00000001
Feb 4 13:16:16 ronispc kernel: Call Trace:
Feb 4 13:16:16 ronispc kernel: [<c0130185>] in_group_p+0x25/0x30
Feb 4 13:16:16 ronispc kernel: [<c016293f>] exact_lock+0xf/0x20
Feb 4 13:16:16 ronispc kernel: [<c01ecf89>] kobj_lookup+0x119/0x200
Feb 4 13:16:16 ronispc kernel: [<c0162920>] exact_match+0x0/0x10
Feb 4 13:16:16 ronispc kernel: [<c0162767>] chrdev_open+0x1e7/0x290
Feb 4 13:16:16 ronispc kernel: [<c01576e0>] dentry_open+0x160/0x230
Feb 4 13:16:16 ronispc kernel: [<c0157578>] filp_open+0x68/0x70
Feb 4 13:16:16 ronispc kernel: [<c0157aeb>] sys_open+0x5b/0x90
Feb 4 13:16:16 ronispc kernel: [<c01092ab>] syscall_call+0x7/0xb
Feb 4 13:16:16 ronispc kernel:
Feb 4 13:16:16 ronispc kernel: Code: 83 3b 02 8b 40 10 74 7f c1 e0 05 8d 04 18 ff 80 a0 00 00 00
Feb 4 13:16:16 ronispc kernel: <6>note: xsane[1629] exited with preempt_count 1
Feb 4 13:16:16 ronispc kernel: bad: scheduling while atomic!
Feb 4 13:16:16 ronispc kernel: Call Trace:
Feb 4 13:16:16 ronispc kernel: [<c011b8a1>] schedule+0x6e1/0x6f0
Feb 4 13:16:16 ronispc kernel: [<c0153698>] free_pages_and_swap_cache+0x68/0xa0
Feb 4 13:16:16 ronispc kernel: [<c0148db1>] unmap_vmas+0x241/0x2f0
Feb 4 13:16:16 ronispc kernel: [<c014d1d9>] exit_mmap+0xe9/0x240
Feb 4 13:16:16 ronispc kernel: [<c011e0b0>] mmput+0x70/0xd0
Feb 4 13:16:16 ronispc kernel: [<c012290b>] do_exit+0x18b/0x500
Feb 4 13:16:16 ronispc kernel: [<c01186f0>] do_page_fault+0x0/0x530
Feb 4 13:16:16 ronispc kernel: [<c010a3c5>] die+0xf5/0x100
Feb 4 13:16:16 ronispc kernel: [<c01188ce>] do_page_fault+0x1de/0x530
Feb 4 13:16:16 ronispc kernel: [<c01a3e81>] journal_stop+0x201/0x310
Feb 4 13:16:16 ronispc kernel: [<c0171441>] dput+0x31/0x270
Feb 4 13:16:16 ronispc kernel: [<c0167f14>] link_path_walk+0x694/0x9f0
Feb 4 13:16:16 ronispc kernel: [<c01186f0>] do_page_fault+0x0/0x530
Feb 4 13:16:16 ronispc kernel: [<c0109d15>] error_code+0x2d/0x38
Feb 4 13:16:16 ronispc kernel: [<c0162a50>] cdev_get+0x20/0xb0
Feb 4 13:16:16 ronispc kernel: [<c0130185>] in_group_p+0x25/0x30
Feb 4 13:16:16 ronispc kernel: [<c016293f>] exact_lock+0xf/0x20
Feb 4 13:16:16 ronispc kernel: [<c01ecf89>] kobj_lookup+0x119/0x200
Feb 4 13:16:16 ronispc kernel: [<c0162920>] exact_match+0x0/0x10
Feb 4 13:16:16 ronispc kernel: [<c0162767>] chrdev_open+0x1e7/0x290
Feb 4 13:16:16 ronispc kernel: [<c01576e0>] dentry_open+0x160/0x230
Feb 4 13:16:16 ronispc kernel: [<c0157578>] filp_open+0x68/0x70
Feb 4 13:16:16 ronispc kernel: [<c0157aeb>] sys_open+0x5b/0x90
Feb 4 13:16:16 ronispc kernel: [<c01092ab>] syscall_call+0x7/0xb
One other thing I noticed; after the oops, lsmod didn't show either sg
or aha152x as being installed. Is it possible that the kernel still
thinks they were?
David
Juergen E. Fischer writes:
> Hi,
>
> On Fri, Jan 30, 2004 at 14:29:59 +1100, Rusty Russell wrote:
> > Looks like aha152x or sd is not cleaning up properly, and when
> > reinserted, something screws up.
>
> I guess that's without the pending patch. If it's aha152x, the patch
> might also do some good in that departement.
>
>
> Jürgen
>
> --
> A: No.
> Q: Should I include quotations after my reply?
> diff -uprd orig/linux-2.6.2-rc2/drivers/scsi/aha152x.c linux-2.6.2-rc2/drivers/scsi/aha152x.c
> --- orig/linux-2.6.2-rc2/drivers/scsi/aha152x.c 2004-01-24 11:54:43.000000000 +0100
> +++ linux-2.6.2-rc2/drivers/scsi/aha152x.c 2004-01-30 08:21:54.000000000 +0100
> @@ -1,6 +1,6 @@
> /* aha152x.c -- Adaptec AHA-152x driver
> * Author: Jürgen E. Fischer, fischer@norbit.de
> - * Copyright 1993-2000 Jürgen E. Fischer
> + * Copyright 1993-2004 Jürgen E. Fischer
> *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms of the GNU General Public License as published by the
> @@ -13,9 +13,17 @@
> * General Public License for more details.
> *
> *
> - * $Id: aha152x.c,v 2.6 2003/10/30 20:52:47 fischer Exp $
> + * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 fischer Exp $
> *
> * $Log: aha152x.c,v $
> + * Revision 2.7 2004/01/24 11:42:59 fischer
> + * - gather code that is not used by PCMCIA at the end
> + * - move request_region for !PCMCIA case to detection
> + * - migration to new scsi host api (remove legacy code)
> + * - free host scribble before scsi_done
> + * - fix error handling
> + * - one isapnp device added to id_table
> + *
> * Revision 2.6 2003/10/30 20:52:47 fischer
> * - interfaces changes for kernel 2.6
> * - aha152x_probe_one introduced for pcmcia stub
> @@ -344,7 +352,8 @@ MODULE_AUTHOR("Jürgen Fischer");
> MODULE_DESCRIPTION(AHA152X_REVID);
> MODULE_LICENSE("GPL");
>
> -#if defined(MODULE) && !defined(PCMCIA)
> +#if !defined(PCMCIA)
> +#if defined(MODULE)
> MODULE_PARM(io, "1-2i");
> MODULE_PARM_DESC(io,"base io address of controller");
> static int io[] = {0, 0};
> @@ -398,21 +407,23 @@ MODULE_PARM(aha152x1, "1-9i");
> MODULE_PARM_DESC(aha152x1, "parameters for second controller");
> static int aha152x1[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
> #endif /* !defined(AHA152X_DEBUG) */
> -#endif /* MODULE && !PCMCIA */
> +#endif /* MODULE */
>
> #ifdef __ISAPNP__
> static struct isapnp_device_id id_table[] __devinitdata = {
> - { ISAPNP_DEVICE_SINGLE('A','D','P',0x1505, 'A','D','P',0x1505), },
> + { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
> + ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 },
> + { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
> + ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 },
> { ISAPNP_DEVICE_SINGLE_END, }
> };
> MODULE_DEVICE_TABLE(isapnp, id_table);
> #endif /* ISAPNP */
>
> -/* set by aha152x_setup according to the command line */
> -static int setup_count;
> -static int registered_count;
> -static struct aha152x_setup setup[2];
> -static struct Scsi_Host *aha152x_host[2];
> +#endif /* !PCMCIA */
> +
> +static int registered_count=0;
> +static struct Scsi_Host *aha152x_host[2] = {0, 0};
> static Scsi_Host_Template aha152x_driver_template;
>
> /*
> @@ -658,7 +669,6 @@ static irqreturn_t intr(int irq, void *d
> static void reset_ports(struct Scsi_Host *shpnt);
> static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
> static void done(struct Scsi_Host *shpnt, int error);
> -static int checksetup(struct aha152x_setup *setup);
>
> /* diagnostics */
> static void disp_ports(struct Scsi_Host *shpnt);
> @@ -666,66 +676,6 @@ static void show_command(Scsi_Cmnd * ptr
> static void show_queues(struct Scsi_Host *shpnt);
> static void disp_enintr(struct Scsi_Host *shpnt);
>
> -/* possible i/o addresses for the AIC-6260; default first */
> -static unsigned short ports[] = { 0x340, 0x140 };
> -
> -#if !defined(SKIP_BIOSTEST)
> -/* possible locations for the Adaptec BIOS; defaults first */
> -static unsigned int addresses[] =
> -{
> - 0xdc000, /* default first */
> - 0xc8000,
> - 0xcc000,
> - 0xd0000,
> - 0xd4000,
> - 0xd8000,
> - 0xe0000,
> - 0xeb800, /* VTech Platinum SMP */
> - 0xf0000,
> -};
> -
> -/* signatures for various AIC-6[23]60 based controllers.
> - The point in detecting signatures is to avoid useless and maybe
> - harmful probes on ports. I'm not sure that all listed boards pass
> - auto-configuration. For those which fail the BIOS signature is
> - obsolete, because user intervention to supply the configuration is
> - needed anyway. May be an information whether or not the BIOS supports
> - extended translation could be also useful here. */
> -static struct signature {
> - unsigned char *signature;
> - int sig_offset;
> - int sig_length;
> -} signatures[] =
> -{
> - { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
> - /* Adaptec 152x */
> - { "Adaptec AHA-1520B", 0x000b, 17 },
> - /* Adaptec 152x rev B */
> - { "Adaptec AHA-1520B", 0x0026, 17 },
> - /* Iomega Jaz Jet ISA (AIC6370Q) */
> - { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
> - /* on-board controller */
> - { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
> - /* on-board controller */
> - { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
> - /* on-board controller */
> - { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
> - /* on-board controller */
> - { "ScsiPro SP-360 BIOS", 0x2873, 19 },
> - /* ScsiPro-Controller */
> - { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
> - /* Gigabyte Local-Bus-SCSI */
> - { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
> - /* Adaptec 282x */
> - { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
> - /* IBM Thinkpad Dock II */
> - { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
> - /* IBM Thinkpad Dock II SCSI */
> - { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
> - /* DTC 3520A ISA SCSI */
> -};
> -#endif
> -
>
> /*
> * queue services:
> @@ -799,141 +749,6 @@ static inline Scsi_Cmnd *remove_SC(Scsi_
> return ptr;
> }
>
> -#if defined(PCMCIA) || !defined(MODULE)
> -static void aha152x_setup(char *str, int *ints)
> -{
> - if(setup_count>=ARRAY_SIZE(setup)) {
> - printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
> - return;
> - }
> -
> - setup[setup_count].conf = str;
> - setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
> - setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
> - setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
> - setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
> - setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
> - setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
> - setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
> - setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
> - if (ints[0] > 9) {
> - printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
> - "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
> -#else
> - if (ints[0] > 8) { /*}*/
> - printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
> - "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
> -#endif
> - } else {
> - setup_count++;
> - }
> -}
> -#endif
> -
> -#if !defined(MODULE)
> -static int __init do_setup(char *str)
> -{
> -
> -#if defined(AHA152X_DEBUG)
> - int ints[11];
> -#else
> - int ints[10];
> -#endif
> - int count=setup_count;
> -
> - get_options(str, ARRAY_SIZE(ints), ints);
> - aha152x_setup(str,ints);
> -
> - return count<setup_count;
> -}
> -
> -__setup("aha152x=", do_setup);
> -#endif
> -
> -/*
> - * Test, if port_base is valid.
> - *
> - */
> -static int aha152x_porttest(int io_port)
> -{
> - int i;
> -
> - SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
> - for (i = 0; i < 16; i++)
> - SETPORT(io_port + O_STACK, i);
> -
> - SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
> - for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
> - ;
> -
> - return (i == 16);
> -}
> -
> -static int tc1550_porttest(int io_port)
> -{
> - int i;
> -
> - SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
> - for (i = 0; i < 16; i++)
> - SETPORT(io_port + O_STACK, i);
> -
> - SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
> - for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
> - ;
> -
> - return (i == 16);
> -}
> -
> -static int checksetup(struct aha152x_setup *setup)
> -{
> -
> -#if !defined(PCMCIA)
> - int i;
> - for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
> - ;
> -
> - if (i == ARRAY_SIZE(ports))
> - return 0;
> -#endif
> - if (!request_region(setup->io_port, IO_RANGE, "aha152x"))
> - return 0;
> -
> - if(aha152x_porttest(setup->io_port)) {
> - setup->tc1550=0;
> - } else if(tc1550_porttest(setup->io_port)) {
> - setup->tc1550=1;
> - } else {
> - release_region(setup->io_port, IO_RANGE);
> - return 0;
> - }
> -
> - release_region(setup->io_port, IO_RANGE);
> -
> -
> - if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
> - return 0;
> -
> - if ((setup->scsiid < 0) || (setup->scsiid > 7))
> - return 0;
> -
> - if ((setup->reconnect < 0) || (setup->reconnect > 1))
> - return 0;
> -
> - if ((setup->parity < 0) || (setup->parity > 1))
> - return 0;
> -
> - if ((setup->synchronous < 0) || (setup->synchronous > 1))
> - return 0;
> -
> - if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
> - return 0;
> -
> -
> - return 1;
> -}
> -
> static inline struct Scsi_Host *lookup_irq(int irqno)
> {
> int i;
> @@ -950,7 +765,6 @@ static irqreturn_t swintr(int irqno, voi
> struct Scsi_Host *shpnt = lookup_irq(irqno);
>
> if (!shpnt) {
> - /* no point using HOSTNO here! */
> printk(KERN_ERR "aha152x: catched software interrupt %d for unknown controller.\n", irqno);
> return IRQ_NONE;
> }
> @@ -961,17 +775,19 @@ static irqreturn_t swintr(int irqno, voi
> return IRQ_HANDLED;
> }
>
> -
> struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
> {
> struct Scsi_Host *shpnt;
>
> shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
> if (!shpnt) {
> - printk(KERN_ERR "aha152x: scsi_register failed\n");
> + printk(KERN_ERR "aha152x: scsi_host_alloc failed\n");
> return NULL;
> }
>
> + /* need to have host registered before triggering any interrupt */
> + aha152x_host[registered_count] = shpnt;
> +
> memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
>
> shpnt->io_port = setup->io_port;
> @@ -1034,24 +850,19 @@ struct Scsi_Host *aha152x_probe_one(stru
> DELAY,
> EXT_TRANS ? "enabled" : "disabled");
>
> - if (!request_region(shpnt->io_port, IO_RANGE, "aha152x"))
> - goto out_unregister;
> -
> /* not expecting any interrupts */
> SETPORT(SIMODE0, 0);
> SETPORT(SIMODE1, 0);
>
> - if (request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) {
> - printk(KERN_ERR "aha152x%d: driver needs an IRQ.\n", shpnt->host_no);
> - goto out_release_region;
> + if( request_irq(shpnt->irq, swintr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) {
> + printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq);
> + goto out_host_put;
> }
>
> HOSTDATA(shpnt)->swint = 0;
>
> printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
>
> - /* need to have host registered before triggering any interrupt */
> - aha152x_host[registered_count] = shpnt;
> mb();
> SETPORT(DMACNTRL0, SWINT|INTEN);
> mdelay(1000);
> @@ -1066,9 +877,9 @@ struct Scsi_Host *aha152x_probe_one(stru
>
> SETPORT(DMACNTRL0, INTEN);
>
> - printk(KERN_ERR "aha152x%d: IRQ %d possibly wrong. "
> + printk(KERN_ERR "aha152x%d: irq %d possibly wrong. "
> "Please verify.\n", shpnt->host_no, shpnt->irq);
> - goto out_unregister_host;
> + goto out_host_put;
> }
> printk("ok.\n");
>
> @@ -1077,322 +888,50 @@ struct Scsi_Host *aha152x_probe_one(stru
> SETPORT(SSTAT0, 0x7f);
> SETPORT(SSTAT1, 0xef);
>
> - if (request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) < 0) {
> - printk(KERN_ERR "aha152x%d: failed to reassign interrupt.\n", shpnt->host_no);
> - goto out_unregister_host;
> - }
> -
> - scsi_add_host(shpnt, 0);
> - scsi_scan_host(shpnt);
> - return shpnt; /* the pcmcia stub needs the return value; */
> -
> -out_unregister_host:
> - aha152x_host[registered_count] = NULL;
> -out_release_region:
> - release_region(shpnt->io_port, IO_RANGE);
> -out_unregister:
> - scsi_host_put(shpnt);
> - return NULL;
> -}
> -
> -static int __init aha152x_init(void)
> -{
> - int i, j, ok;
> -#if defined(AUTOCONF)
> - aha152x_config conf;
> -#endif
> -#ifdef __ISAPNP__
> - struct pnp_dev *dev=0, *pnpdev[2] = {0, 0};
> -#endif
> -
> - if (setup_count) {
> - printk(KERN_INFO "aha152x: processing commandline: ");
> -
> - for (i = 0; i < setup_count; i++)
> - if (!checksetup(&setup[i])) {
> - printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
> - printk(KERN_ERR "aha152x: invalid line\n");
> - }
> - printk("ok\n");
> - }
> -
> -#if defined(SETUP0)
> - if (setup_count < ARRAY_SIZE(setup)) {
> - struct aha152x_setup override = SETUP0;
> -
> - if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
> - if (!checksetup(&override)) {
> - printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
> - override.io_port,
> - override.irq,
> - override.scsiid,
> - override.reconnect,
> - override.parity,
> - override.synchronous,
> - override.delay,
> - override.ext_trans);
> - } else
> - setup[setup_count++] = override;
> - }
> - }
> -#endif
> -
> -#if defined(SETUP1)
> - if (setup_count < ARRAY_SIZE(setup)) {
> - struct aha152x_setup override = SETUP1;
> -
> - if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
> - if (!checksetup(&override)) {
> - printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
> - override.io_port,
> - override.irq,
> - override.scsiid,
> - override.reconnect,
> - override.parity,
> - override.synchronous,
> - override.delay,
> - override.ext_trans);
> - } else
> - setup[setup_count++] = override;
> - }
> - }
> -#endif
> -
> -#if defined(MODULE) && !defined(PCMCIA)
> - if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
> - if(aha152x[0]!=0) {
> - setup[setup_count].conf = "";
> - setup[setup_count].io_port = aha152x[0];
> - setup[setup_count].irq = aha152x[1];
> - setup[setup_count].scsiid = aha152x[2];
> - setup[setup_count].reconnect = aha152x[3];
> - setup[setup_count].parity = aha152x[4];
> - setup[setup_count].synchronous = aha152x[5];
> - setup[setup_count].delay = aha152x[6];
> - setup[setup_count].ext_trans = aha152x[7];
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = aha152x[8];
> -#endif
> - } else if(io[0]!=0 || irq[0]!=0) {
> - if(io[0]!=0) setup[setup_count].io_port = io[0];
> - if(irq[0]!=0) setup[setup_count].irq = irq[0];
> -
> - setup[setup_count].scsiid = scsiid[0];
> - setup[setup_count].reconnect = reconnect[0];
> - setup[setup_count].parity = parity[0];
> - setup[setup_count].synchronous = sync[0];
> - setup[setup_count].delay = delay[0];
> - setup[setup_count].ext_trans = exttrans[0];
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = debug[0];
> -#endif
> - }
> -
> - if (checksetup(&setup[setup_count]))
> - setup_count++;
> - else
> - printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
> - setup[setup_count].io_port,
> - setup[setup_count].irq,
> - setup[setup_count].scsiid,
> - setup[setup_count].reconnect,
> - setup[setup_count].parity,
> - setup[setup_count].synchronous,
> - setup[setup_count].delay,
> - setup[setup_count].ext_trans);
> - }
> -
> - if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
> - if(aha152x1[0]!=0) {
> - setup[setup_count].conf = "";
> - setup[setup_count].io_port = aha152x1[0];
> - setup[setup_count].irq = aha152x1[1];
> - setup[setup_count].scsiid = aha152x1[2];
> - setup[setup_count].reconnect = aha152x1[3];
> - setup[setup_count].parity = aha152x1[4];
> - setup[setup_count].synchronous = aha152x1[5];
> - setup[setup_count].delay = aha152x1[6];
> - setup[setup_count].ext_trans = aha152x1[7];
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = aha152x1[8];
> -#endif
> - } else if(io[1]!=0 || irq[1]!=0) {
> - if(io[1]!=0) setup[setup_count].io_port = io[1];
> - if(irq[1]!=0) setup[setup_count].irq = irq[1];
> -
> - setup[setup_count].scsiid = scsiid[1];
> - setup[setup_count].reconnect = reconnect[1];
> - setup[setup_count].parity = parity[1];
> - setup[setup_count].synchronous = sync[1];
> - setup[setup_count].delay = delay[1];
> - setup[setup_count].ext_trans = exttrans[1];
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = debug[1];
> -#endif
> - }
> - if (checksetup(&setup[setup_count]))
> - setup_count++;
> - else
> - printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
> - setup[setup_count].io_port,
> - setup[setup_count].irq,
> - setup[setup_count].scsiid,
> - setup[setup_count].reconnect,
> - setup[setup_count].parity,
> - setup[setup_count].synchronous,
> - setup[setup_count].delay,
> - setup[setup_count].ext_trans);
> + if ( request_irq(shpnt->irq, intr, SA_INTERRUPT|SA_SHIRQ, "aha152x", shpnt) ) {
> + printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq);
> + goto out_host_put;
> }
> -#endif
>
> -#ifdef __ISAPNP__
> - while ( setup_count<ARRAY_SIZE(setup) && (dev=pnp_find_dev(NULL, ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), dev)) ) {
> - if (pnp_device_attach(dev) < 0)
> - continue;
> - if (pnp_activate_dev(dev) < 0) {
> - pnp_device_detach(dev);
> - continue;
> - }
> - if (!pnp_port_valid(dev, 0)) {
> - pnp_device_detach(dev);
> - continue;
> - }
> - if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
> - pnp_device_detach(dev);
> - continue;
> - }
> - setup[setup_count].io_port = pnp_port_start(dev, 0);
> - setup[setup_count].irq = pnp_irq(dev, 0);
> - setup[setup_count].scsiid = 7;
> - setup[setup_count].reconnect = 1;
> - setup[setup_count].parity = 1;
> - setup[setup_count].synchronous = 1;
> - setup[setup_count].delay = DELAY_DEFAULT;
> - setup[setup_count].ext_trans = 0;
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = DEBUG_DEFAULT;
> -#endif
> - pnpdev[setup_count] = dev;
> - printk (KERN_INFO
> - "aha152x: found ISAPnP AVA-1505A at io=0x%03x, irq=%d\n",
> - setup[setup_count].io_port, setup[setup_count].irq);
> - setup_count++;
> + if( scsi_add_host(shpnt, 0) ) {
> + free_irq(shpnt->irq, shpnt);
> + printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no);
> + goto out_host_put;
> }
> -#endif
>
> -#if defined(AUTOCONF)
> - if (setup_count<ARRAY_SIZE(setup)) {
> -#if !defined(SKIP_BIOSTEST)
> - ok = 0;
> - for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++)
> - for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
> - ok = isa_check_signature(addresses[i] + signatures[j].sig_offset,
> - signatures[j].signature, signatures[j].sig_length);
> -
> - if (!ok && setup_count == 0)
> - return 0;
> -
> - printk(KERN_INFO "aha152x: BIOS test: passed, ");
> -#else
> - printk(KERN_INFO "aha152x: ");
> -#endif /* !SKIP_BIOSTEST */
> -
> - ok = 0;
> - for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
> - if ((setup_count == 1) && (setup[0].io_port == ports[i]))
> - continue;
> -
> - if (aha152x_porttest(ports[i])) {
> - ok++;
> - setup[setup_count].io_port = ports[i];
> - setup[setup_count].tc1550 = 0;
> -
> - conf.cf_port =
> - (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
> -
> - setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
> - setup[setup_count].scsiid = conf.cf_id;
> - setup[setup_count].reconnect = conf.cf_tardisc;
> - setup[setup_count].parity = !conf.cf_parity;
> - setup[setup_count].synchronous = conf.cf_syncneg;
> - setup[setup_count].delay = DELAY_DEFAULT;
> - setup[setup_count].ext_trans = 0;
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = DEBUG_DEFAULT;
> -#endif
> - setup_count++;
> - } else if (tc1550_porttest(ports[i])) {
> - ok++;
> - setup[setup_count].io_port = ports[i];
> - setup[setup_count].tc1550 = 1;
> -
> - conf.cf_port =
> - (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
> -
> - setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
> - setup[setup_count].scsiid = conf.cf_id;
> - setup[setup_count].reconnect = conf.cf_tardisc;
> - setup[setup_count].parity = !conf.cf_parity;
> - setup[setup_count].synchronous = conf.cf_syncneg;
> - setup[setup_count].delay = DELAY_DEFAULT;
> - setup[setup_count].ext_trans = 0;
> -#if defined(AHA152X_DEBUG)
> - setup[setup_count].debug = DEBUG_DEFAULT;
> -#endif
> - setup_count++;
> - }
> - }
> + scsi_scan_host(shpnt);
>
> - if (ok)
> - printk("auto configuration: ok, ");
> - }
> -#endif
> + registered_count++;
>
> - printk("detected %d controller(s)\n", setup_count);
> + return shpnt;
>
> - for (i=0; i<setup_count; i++) {
> - aha152x_probe_one(&setup[i]);
> - if (aha152x_host[registered_count]) {
> -#ifdef __ISAPNP__
> - if(pnpdev[i])
> - HOSTDATA(aha152x_host[registered_count])->pnpdev=pnpdev[i];
> -#endif
> - registered_count++;
> - }
> - }
> +out_host_put:
> + aha152x_host[registered_count]=0;
> + scsi_host_put(shpnt);
>
> - return registered_count>0;
> + return 0;
> }
>
> -static int aha152x_release(struct Scsi_Host *shpnt)
> +void aha152x_release(struct Scsi_Host *shpnt)
> {
> + if(!shpnt)
> + return;
> +
> if (shpnt->irq)
> free_irq(shpnt->irq, shpnt);
>
> +#if !defined(PCMCIA)
> if (shpnt->io_port)
> release_region(shpnt->io_port, IO_RANGE);
> +#endif
>
> #ifdef __ISAPNP__
> if (HOSTDATA(shpnt)->pnpdev)
> pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
> #endif
>
> + scsi_remove_host(shpnt);
> scsi_host_put(shpnt);
> -
> - return 0;
> -}
> -
> -static void __exit aha152x_exit(void)
> -{
> - int i;
> -
> - for(i=0; i<ARRAY_SIZE(setup); i++) {
> - if(aha152x_host[i]) {
> - scsi_remove_host(aha152x_host[i]);
> - aha152x_release(aha152x_host[i]);
> - aha152x_host[i]=0;
> - }
> - }
> }
>
>
> @@ -1446,8 +985,8 @@ static int aha152x_internal_queue(Scsi_C
>
> #if defined(AHA152X_DEBUG)
> if (HOSTDATA(shpnt)->debug & debug_queue) {
> - printk(INFO_LEAD "queue: cmd_len=%d pieces=%d size=%u cmnd=",
> - CMDINFO(SCpnt), SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
> + printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
> + CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
> print_command(SCpnt->cmnd);
> }
> #endif
> @@ -1466,7 +1005,7 @@ static int aha152x_internal_queue(Scsi_C
> return FAILED;
> }
> } else {
> - SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
> + SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
> if(SCpnt->host_scribble==0) {
> printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
> return FAILED;
> @@ -1561,11 +1100,6 @@ static int aha152x_abort(Scsi_Cmnd *SCpn
> Scsi_Cmnd *ptr;
> unsigned long flags;
>
> - if(!shpnt) {
> - printk(ERR_LEAD "abort(%p): no host structure\n", CMDINFO(SCpnt), SCpnt);
> - return FAILED;
> - }
> -
> #if defined(AHA152X_DEBUG)
> if(HOSTDATA(shpnt)->debug & debug_eh) {
> printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt);
> @@ -1608,33 +1142,52 @@ static int aha152x_abort(Scsi_Cmnd *SCpn
> static void timer_expired(unsigned long p)
> {
> Scsi_Cmnd *SCp = (Scsi_Cmnd *)p;
> - struct semaphore *sem = SCSEM(SCp);
> - struct Scsi_Host *shpnt = SCp->device->host;
> + struct semaphore *sem;
> + struct Scsi_Host *shpnt;
> + unsigned long flags;
>
> - /* remove command from issue queue */
> - if(remove_SC(&ISSUE_SC, SCp)) {
> - printk(KERN_INFO "aha152x: ABORT timed out - removed from issue queue\n");
> - kfree(SCp->host_scribble);
> - SCp->host_scribble=0;
> - } else {
> - printk(KERN_INFO "aha152x: ABORT timed out - not on issue queue\n");
> + if(SCp==0) {
> + printk(KERN_ERR "timer_expired: command not set\n");
> + return;
> }
>
> - up(sem);
> + if(SCp->host_scribble==0) {
> + printk(KERN_ERR "timer_expired: host_scribble not set\n");
> + return;
> + }
> +
> + if(SCp->device==0) {
> + printk(KERN_ERR "timer_expired: device not set\n");
> + return;
> + }
> +
> + shpnt = SCp->device->host;
> +
> + if(shpnt==0) {
> + printk(KERN_ERR "timer_expired: host not set\n");
> + return;
> + }
> +
> + sem = SCSEM(SCp);
> +
> + if(sem) {
> + up(sem);
> + } else {
> + printk(KERN_ERR "timer_expired: semaphore not set\n");
> + }
> }
>
> /*
> * Reset a device
> *
> - * FIXME: never seen this live. might lockup...
> - *
> */
> static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
> {
> struct Scsi_Host *shpnt = SCpnt->device->host;
> DECLARE_MUTEX_LOCKED(sem);
> struct timer_list timer;
> - int ret;
> + int ret, issued, disconnected;
> + unsigned long flags;
>
> #if defined(AHA152X_DEBUG)
> if(HOSTDATA(shpnt)->debug & debug_eh) {
> @@ -1648,13 +1201,18 @@ static int aha152x_device_reset(Scsi_Cmn
> return FAILED;
> }
>
> + DO_LOCK(flags);
> + issued = remove_SC(&ISSUE_SC, SCpnt)==0;
> + disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
> + DO_UNLOCK(flags);
> +
> SCpnt->cmd_len = 0;
> SCpnt->use_sg = 0;
> SCpnt->request_buffer = 0;
> SCpnt->request_bufflen = 0;
>
> init_timer(&timer);
> - timer.data = (unsigned long) cmd;
> + timer.data = (unsigned long) SCpnt;
> timer.expires = jiffies + 100*HZ; /* 10s */
> timer.function = (void (*)(unsigned long)) timer_expired;
>
> @@ -1662,18 +1220,36 @@ static int aha152x_device_reset(Scsi_Cmn
> add_timer(&timer);
> down(&sem);
> del_timer(&timer);
> -
> +
> SCpnt->cmd_len = SCpnt->old_cmd_len;
> SCpnt->use_sg = SCpnt->old_use_sg;
> SCpnt->request_buffer = SCpnt->buffer;
> SCpnt->request_bufflen = SCpnt->bufflen;
>
> + DO_LOCK(flags);
> +
> if(SCpnt->SCp.phase & resetted) {
> + HOSTDATA(shpnt)->commands--;
> + if (!HOSTDATA(shpnt)->commands)
> + SETPORT(PORTA, 0);
> + kfree(SCpnt->host_scribble);
> + SCpnt->host_scribble=0;
> +
> ret = SUCCESS;
> } else {
> + /* requeue */
> + if(!issued) {
> + append_SC(&ISSUE_SC, SCpnt);
> + } else if(disconnected) {
> + remove_SC(&ISSUE_SC, SCpnt);
> + append_SC(&DISCONNECTED_SC, SCpnt);
> + }
> +
> ret = FAILED;
> }
>
> + DO_UNLOCK(flags);
> +
> spin_lock_irq(shpnt->host_lock);
> return ret;
> }
> @@ -1681,13 +1257,17 @@ static int aha152x_device_reset(Scsi_Cmn
> static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
> {
> Scsi_Cmnd *ptr;
> - unsigned long flags;
> -
> - DO_LOCK(flags);
>
> ptr=*SCs;
> while(ptr) {
> - Scsi_Cmnd *next = SCNEXT(ptr);
> + Scsi_Cmnd *next;
> +
> + if(SCDATA(ptr)) {
> + next = SCNEXT(ptr);
> + } else {
> + printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
> + next = 0;
> + }
>
> if (!ptr->device->soft_reset) {
> DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
> @@ -1699,8 +1279,6 @@ static void free_hard_reset_SCs(struct S
>
> ptr = next;
> }
> -
> - DO_UNLOCK(flags);
> }
>
> /*
> @@ -1712,6 +1290,8 @@ static int aha152x_bus_reset(Scsi_Cmnd *
> struct Scsi_Host *shpnt = SCpnt->device->host;
> unsigned long flags;
>
> + DO_LOCK(flags);
> +
> #if defined(AHA152X_DEBUG)
> if(HOSTDATA(shpnt)->debug & debug_eh) {
> printk(DEBUG_LEAD "aha152x_bus_reset(%p)", CMDINFO(SCpnt), SCpnt);
> @@ -1729,12 +1309,12 @@ static int aha152x_bus_reset(Scsi_Cmnd *
> SETPORT(SCSISEQ, 0);
> mdelay(DELAY);
>
> - DPRINTK(debug_eh, DEBUG_LEAD "bus reset returns\n", CMDINFO(SCpnt));
> + DPRINTK(debug_eh, DEBUG_LEAD "bus resetted\n", CMDINFO(SCpnt));
>
> - DO_LOCK(flags);
> setup_expected_interrupts(shpnt);
> if(HOSTDATA(shpnt)->commands==0)
> SETPORT(PORTA, 0);
> +
> DO_UNLOCK(flags);
>
> return SUCCESS;
> @@ -2000,6 +1580,7 @@ static void busfree_run(struct Scsi_Host
> #if defined(AHA152X_STAT)
> action++;
> #endif
> +
> if(DONE_SC->SCp.phase & check_condition) {
> #if 0
> if(HOSTDATA(shpnt)->debug & debug_eh) {
> @@ -2029,47 +1610,57 @@ static void busfree_run(struct Scsi_Host
> #endif
>
> if(!(DONE_SC->SCp.Status & not_issued)) {
> + Scsi_Cmnd *ptr = DONE_SC;
> + DONE_SC=0;
> #if 0
> - DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(DONE_SC));
> + DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
> #endif
>
> - DONE_SC->cmnd[0] = REQUEST_SENSE;
> - DONE_SC->cmnd[1] = 0;
> - DONE_SC->cmnd[2] = 0;
> - DONE_SC->cmnd[3] = 0;
> - DONE_SC->cmnd[4] = sizeof(DONE_SC->sense_buffer);
> - DONE_SC->cmnd[5] = 0;
> - DONE_SC->cmd_len = 6;
> - DONE_SC->use_sg = 0;
> - DONE_SC->request_buffer = DONE_SC->sense_buffer;
> - DONE_SC->request_bufflen = sizeof(DONE_SC->sense_buffer);
> + ptr->cmnd[0] = REQUEST_SENSE;
> + ptr->cmnd[1] = 0;
> + ptr->cmnd[2] = 0;
> + ptr->cmnd[3] = 0;
> + ptr->cmnd[4] = sizeof(ptr->sense_buffer);
> + ptr->cmnd[5] = 0;
> + ptr->cmd_len = 6;
> + ptr->use_sg = 0;
> + ptr->request_buffer = ptr->sense_buffer;
> + ptr->request_bufflen = sizeof(ptr->sense_buffer);
>
> DO_UNLOCK(flags);
> - aha152x_internal_queue(DONE_SC, 0, check_condition, DONE_SC->scsi_done);
> + aha152x_internal_queue(ptr, 0, check_condition, ptr->scsi_done);
> DO_LOCK(flags);
> -
> - DONE_SC=0;
> - } else {
> #if 0
> + } else {
> DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
> #endif
> }
> }
>
> if(DONE_SC && DONE_SC->scsi_done) {
> +#if defined(AHA152X_DEBUG)
> + int hostno=DONE_SC->device->host->host_no;
> + int id=DONE_SC->device->id & 0xf;
> + int lun=DONE_SC->device->lun & 0x7;
> +#endif
> + Scsi_Cmnd *ptr = DONE_SC;
> + DONE_SC=0;
> +
> /* turn led off, when no commands are in the driver */
> HOSTDATA(shpnt)->commands--;
> if (!HOSTDATA(shpnt)->commands)
> SETPORT(PORTA, 0); /* turn led off */
>
> + if(ptr->scsi_done != reset_done) {
> + kfree(ptr->host_scribble);
> + ptr->host_scribble=0;
> + }
> +
> DO_UNLOCK(flags);
> - DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", CMDINFO(DONE_SC), DONE_SC);
> - DONE_SC->scsi_done(DONE_SC);
> - DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", CMDINFO(DONE_SC), DONE_SC);
> + DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
> + ptr->scsi_done(ptr);
> + DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
> DO_LOCK(flags);
> -
> - kfree(DONE_SC->host_scribble);
> - DONE_SC->host_scribble=0;
> }
>
> DONE_SC=0;
> @@ -2936,11 +2527,11 @@ static void rsti_run(struct Scsi_Host *s
> if (!ptr->device->soft_reset) {
> remove_SC(&DISCONNECTED_SC, ptr);
>
> - ptr->result = DID_RESET << 16;
> - ptr->scsi_done(ptr);
> -
> kfree(ptr->host_scribble);
> ptr->host_scribble=0;
> +
> + ptr->result = DID_RESET << 16;
> + ptr->scsi_done(ptr);
> }
>
> ptr = next;
> @@ -3382,7 +2973,11 @@ static void show_command(Scsi_Cmnd *ptr)
> printk("aborted|");
> if (ptr->SCp.phase & resetted)
> printk("resetted|");
> - printk("; next=0x%p\n", SCNEXT(ptr));
> + if( SCDATA(ptr) ) {
> + printk("; next=0x%p\n", SCNEXT(ptr));
> + } else {
> + printk("; next=(host scribble NULL)\n");
> + }
> }
>
> /*
> @@ -3406,7 +3001,7 @@ static void show_queues(struct Scsi_Host
> printk(KERN_DEBUG "none\n");
>
> printk(KERN_DEBUG "disconnected_SC:\n");
> - for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
> + for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : 0)
> show_command(ptr);
>
> disp_ports(shpnt);
> @@ -3914,7 +3509,494 @@ static Scsi_Host_Template aha152x_driver
> .use_clustering = DISABLE_CLUSTERING,
> };
>
> -#ifndef PCMCIA
> +#if !defined(PCMCIA)
> +static int setup_count;
> +static struct aha152x_setup setup[2];
> +
> +/* possible i/o addresses for the AIC-6260; default first */
> +static unsigned short ports[] = { 0x340, 0x140 };
> +
> +#if !defined(SKIP_BIOSTEST)
> +/* possible locations for the Adaptec BIOS; defaults first */
> +static unsigned int addresses[] =
> +{
> + 0xdc000, /* default first */
> + 0xc8000,
> + 0xcc000,
> + 0xd0000,
> + 0xd4000,
> + 0xd8000,
> + 0xe0000,
> + 0xeb800, /* VTech Platinum SMP */
> + 0xf0000,
> +};
> +
> +/* signatures for various AIC-6[23]60 based controllers.
> + The point in detecting signatures is to avoid useless and maybe
> + harmful probes on ports. I'm not sure that all listed boards pass
> + auto-configuration. For those which fail the BIOS signature is
> + obsolete, because user intervention to supply the configuration is
> + needed anyway. May be an information whether or not the BIOS supports
> + extended translation could be also useful here. */
> +static struct signature {
> + unsigned char *signature;
> + int sig_offset;
> + int sig_length;
> +} signatures[] =
> +{
> + { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
> + /* Adaptec 152x */
> + { "Adaptec AHA-1520B", 0x000b, 17 },
> + /* Adaptec 152x rev B */
> + { "Adaptec AHA-1520B", 0x0026, 17 },
> + /* Iomega Jaz Jet ISA (AIC6370Q) */
> + { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
> + /* on-board controller */
> + { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
> + /* on-board controller */
> + { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
> + /* on-board controller */
> + { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
> + /* on-board controller */
> + { "ScsiPro SP-360 BIOS", 0x2873, 19 },
> + /* ScsiPro-Controller */
> + { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
> + /* Gigabyte Local-Bus-SCSI */
> + { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
> + /* Adaptec 282x */
> + { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
> + /* IBM Thinkpad Dock II */
> + { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
> + /* IBM Thinkpad Dock II SCSI */
> + { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
> + /* DTC 3520A ISA SCSI */
> +};
> +#endif /* !SKIP_BIOSTEST */
> +
> +/*
> + * Test, if port_base is valid.
> + *
> + */
> +static int aha152x_porttest(int io_port)
> +{
> + int i;
> +
> + SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
> + for (i = 0; i < 16; i++)
> + SETPORT(io_port + O_STACK, i);
> +
> + SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
> + for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
> + ;
> +
> + return (i == 16);
> +}
> +
> +static int tc1550_porttest(int io_port)
> +{
> + int i;
> +
> + SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
> + for (i = 0; i < 16; i++)
> + SETPORT(io_port + O_STACK, i);
> +
> + SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
> + for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
> + ;
> +
> + return (i == 16);
> +}
> +
> +
> +static int checksetup(struct aha152x_setup *setup)
> +{
> + int i;
> + for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
> + ;
> +
> + if (i == ARRAY_SIZE(ports))
> + return 0;
> +
> + if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
> + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
> + return 0;
> + }
> +
> + if( aha152x_porttest(setup->io_port) ) {
> + setup->tc1550=0;
> + } else if( tc1550_porttest(setup->io_port) ) {
> + setup->tc1550=1;
> + } else {
> + release_region(setup->io_port, IO_RANGE);
> + return 0;
> + }
> +
> + release_region(setup->io_port, IO_RANGE);
> +
> + if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
> + return 0;
> +
> + if ((setup->scsiid < 0) || (setup->scsiid > 7))
> + return 0;
> +
> + if ((setup->reconnect < 0) || (setup->reconnect > 1))
> + return 0;
> +
> + if ((setup->parity < 0) || (setup->parity > 1))
> + return 0;
> +
> + if ((setup->synchronous < 0) || (setup->synchronous > 1))
> + return 0;
> +
> + if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
> + return 0;
> +
> +
> + return 1;
> +}
> +
> +
> +static int __init aha152x_init(void)
> +{
> + int i, j, ok;
> +#if defined(AUTOCONF)
> + aha152x_config conf;
> +#endif
> +#ifdef __ISAPNP__
> + struct pnp_dev *dev=0, *pnpdev[2] = {0, 0};
> +#endif
> +
> + if ( setup_count ) {
> + printk(KERN_INFO "aha152x: processing commandline: ");
> +
> + for (i = 0; i<setup_count; i++) {
> + if (!checksetup(&setup[i])) {
> + printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
> + printk(KERN_ERR "aha152x: invalid line\n");
> + }
> + }
> + printk("ok\n");
> + }
> +
> +#if defined(SETUP0)
> + if (setup_count < ARRAY_SIZE(setup)) {
> + struct aha152x_setup override = SETUP0;
> +
> + if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
> + if (!checksetup(&override)) {
> + printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
> + override.io_port,
> + override.irq,
> + override.scsiid,
> + override.reconnect,
> + override.parity,
> + override.synchronous,
> + override.delay,
> + override.ext_trans);
> + } else
> + setup[setup_count++] = override;
> + }
> + }
> +#endif
> +
> +#if defined(SETUP1)
> + if (setup_count < ARRAY_SIZE(setup)) {
> + struct aha152x_setup override = SETUP1;
> +
> + if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
> + if (!checksetup(&override)) {
> + printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
> + override.io_port,
> + override.irq,
> + override.scsiid,
> + override.reconnect,
> + override.parity,
> + override.synchronous,
> + override.delay,
> + override.ext_trans);
> + } else
> + setup[setup_count++] = override;
> + }
> + }
> +#endif
> +
> +#if defined(MODULE)
> + if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
> + if(aha152x[0]!=0) {
> + setup[setup_count].conf = "";
> + setup[setup_count].io_port = aha152x[0];
> + setup[setup_count].irq = aha152x[1];
> + setup[setup_count].scsiid = aha152x[2];
> + setup[setup_count].reconnect = aha152x[3];
> + setup[setup_count].parity = aha152x[4];
> + setup[setup_count].synchronous = aha152x[5];
> + setup[setup_count].delay = aha152x[6];
> + setup[setup_count].ext_trans = aha152x[7];
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = aha152x[8];
> +#endif
> + } else if(io[0]!=0 || irq[0]!=0) {
> + if(io[0]!=0) setup[setup_count].io_port = io[0];
> + if(irq[0]!=0) setup[setup_count].irq = irq[0];
> +
> + setup[setup_count].scsiid = scsiid[0];
> + setup[setup_count].reconnect = reconnect[0];
> + setup[setup_count].parity = parity[0];
> + setup[setup_count].synchronous = sync[0];
> + setup[setup_count].delay = delay[0];
> + setup[setup_count].ext_trans = exttrans[0];
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = debug[0];
> +#endif
> + }
> +
> + if (checksetup(&setup[setup_count]))
> + setup_count++;
> + else
> + printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
> + setup[setup_count].io_port,
> + setup[setup_count].irq,
> + setup[setup_count].scsiid,
> + setup[setup_count].reconnect,
> + setup[setup_count].parity,
> + setup[setup_count].synchronous,
> + setup[setup_count].delay,
> + setup[setup_count].ext_trans);
> + }
> +
> + if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
> + if(aha152x1[0]!=0) {
> + setup[setup_count].conf = "";
> + setup[setup_count].io_port = aha152x1[0];
> + setup[setup_count].irq = aha152x1[1];
> + setup[setup_count].scsiid = aha152x1[2];
> + setup[setup_count].reconnect = aha152x1[3];
> + setup[setup_count].parity = aha152x1[4];
> + setup[setup_count].synchronous = aha152x1[5];
> + setup[setup_count].delay = aha152x1[6];
> + setup[setup_count].ext_trans = aha152x1[7];
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = aha152x1[8];
> +#endif
> + } else if(io[1]!=0 || irq[1]!=0) {
> + if(io[1]!=0) setup[setup_count].io_port = io[1];
> + if(irq[1]!=0) setup[setup_count].irq = irq[1];
> +
> + setup[setup_count].scsiid = scsiid[1];
> + setup[setup_count].reconnect = reconnect[1];
> + setup[setup_count].parity = parity[1];
> + setup[setup_count].synchronous = sync[1];
> + setup[setup_count].delay = delay[1];
> + setup[setup_count].ext_trans = exttrans[1];
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = debug[1];
> +#endif
> + }
> + if (checksetup(&setup[setup_count]))
> + setup_count++;
> + else
> + printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
> + setup[setup_count].io_port,
> + setup[setup_count].irq,
> + setup[setup_count].scsiid,
> + setup[setup_count].reconnect,
> + setup[setup_count].parity,
> + setup[setup_count].synchronous,
> + setup[setup_count].delay,
> + setup[setup_count].ext_trans);
> + }
> +#endif
> +
> +#ifdef __ISAPNP__
> + for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
> + while ( setup_count<ARRAY_SIZE(setup) &&
> + (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
> + if (pnp_device_attach(dev) < 0)
> + continue;
> +
> + if (pnp_activate_dev(dev) < 0) {
> + pnp_device_detach(dev);
> + continue;
> + }
> +
> + if (!pnp_port_valid(dev, 0)) {
> + pnp_device_detach(dev);
> + continue;
> + }
> +
> + if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
> + pnp_device_detach(dev);
> + continue;
> + }
> +
> + setup[setup_count].io_port = pnp_port_start(dev, 0);
> + setup[setup_count].irq = pnp_irq(dev, 0);
> + setup[setup_count].scsiid = 7;
> + setup[setup_count].reconnect = 1;
> + setup[setup_count].parity = 1;
> + setup[setup_count].synchronous = 1;
> + setup[setup_count].delay = DELAY_DEFAULT;
> + setup[setup_count].ext_trans = 0;
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = DEBUG_DEFAULT;
> +#endif
> +#if defined(__ISAPNP__)
> + pnpdev[setup_count] = dev;
> +#endif
> + printk (KERN_INFO
> + "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
> + setup[setup_count].io_port, setup[setup_count].irq);
> + setup_count++;
> + }
> + }
> +#endif
> +
> +#if defined(AUTOCONF)
> + if (setup_count<ARRAY_SIZE(setup)) {
> +#if !defined(SKIP_BIOSTEST)
> + ok = 0;
> + for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++)
> + for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
> + ok = isa_check_signature(addresses[i] + signatures[j].sig_offset,
> + signatures[j].signature, signatures[j].sig_length);
> + if (!ok && setup_count == 0)
> + return 0;
> +
> + printk(KERN_INFO "aha152x: BIOS test: passed, ");
> +#else
> + printk(KERN_INFO "aha152x: ");
> +#endif /* !SKIP_BIOSTEST */
> +
> + ok = 0;
> + for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
> + if ((setup_count == 1) && (setup[0].io_port == ports[i]))
> + continue;
> +
> + if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
> + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
> + continue;
> + }
> +
> + if (aha152x_porttest(ports[i])) {
> + setup[setup_count].tc1550 = 0;
> +
> + conf.cf_port =
> + (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
> + } else if (tc1550_porttest(ports[i])) {
> + setup[setup_count].tc1550 = 1;
> +
> + conf.cf_port =
> + (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
> + } else {
> + release_region(ports[i], IO_RANGE);
> + continue;
> + }
> +
> + release_region(ports[i], IO_RANGE);
> +
> + ok++;
> + setup[setup_count].io_port = ports[i];
> + setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
> + setup[setup_count].scsiid = conf.cf_id;
> + setup[setup_count].reconnect = conf.cf_tardisc;
> + setup[setup_count].parity = !conf.cf_parity;
> + setup[setup_count].synchronous = conf.cf_syncneg;
> + setup[setup_count].delay = DELAY_DEFAULT;
> + setup[setup_count].ext_trans = 0;
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = DEBUG_DEFAULT;
> +#endif
> + setup_count++;
> +
> + }
> +
> + if (ok)
> + printk("auto configuration: ok, ");
> + }
> +#endif
> +
> + printk("%d controller(s) configured\n", setup_count);
> +
> + for (i=0; i<setup_count; i++) {
> + if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
> + struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
> +
> + if( !shpnt ) {
> + release_region(setup[i].io_port, IO_RANGE);
> +#if defined(__ISAPNP__)
> + } else if( pnpdev[i] ) {
> + HOSTDATA(shpnt)->pnpdev=pnpdev[i];
> + pnpdev[i]=0;
> +#endif
> + }
> + } else {
> + printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
> + }
> +
> +#if defined(__ISAPNP__)
> + if( pnpdev[i] )
> + pnp_device_detach(pnpdev[i]);
> +#endif
> + }
> +
> + return registered_count>0;
> +}
> +
> +static void __exit aha152x_exit(void)
> +{
> + int i;
> +
> + for(i=0; i<ARRAY_SIZE(setup); i++) {
> + aha152x_release(aha152x_host[i]);
> + aha152x_host[i]=0;
> + }
> +}
> +
> module_init(aha152x_init);
> module_exit(aha152x_exit);
> +
> +#if !defined(MODULE)
> +static int __init aha152x_setup(char *str)
> +{
> +#if defined(AHA152X_DEBUG)
> + int ints[11];
> +#else
> + int ints[10];
> +#endif
> + get_options(str, ARRAY_SIZE(ints), ints);
> +
> + if(setup_count>=ARRAY_SIZE(setup)) {
> + printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
> + return 1;
> + }
> +
> + setup[setup_count].conf = str;
> + setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
> + setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
> + setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
> + setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
> + setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
> + setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
> + setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
> + setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
> +#if defined(AHA152X_DEBUG)
> + setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
> + if (ints[0] > 9) {
> + printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
> + "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
> +#else
> + if (ints[0] > 8) { /*}*/
> + printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
> + "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
> #endif
> + } else {
> + setup_count++;
> + return 0;
> + }
> +
> + return 1;
> +}
> +__setup("aha152x=", aha152x_setup);
> +#endif
> +
> +#endif /* !PCMCIA */
> diff -uprd orig/linux-2.6.2-rc2/drivers/scsi/aha152x.h linux-2.6.2-rc2/drivers/scsi/aha152x.h
> --- orig/linux-2.6.2-rc2/drivers/scsi/aha152x.h 2003-12-18 03:59:05.000000000 +0100
> +++ linux-2.6.2-rc2/drivers/scsi/aha152x.h 2004-01-24 12:45:17.000000000 +0100
> @@ -2,14 +2,14 @@
> #define _AHA152X_H
>
> /*
> - * $Id: aha152x.h,v 2.5 2002/04/14 11:24:12 fischer Exp $
> + * $Id: aha152x.h,v 2.7 2004/01/24 11:39:03 fischer Exp $
> */
>
> /* number of queueable commands
> (unless we support more than 1 cmd_per_lun this should do) */
> #define AHA152X_MAXQUEUE 7
>
> -#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 2.5 $"
> +#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 2.7 $"
>
> /* port addresses */
> #define SCSISEQ (HOSTIOPORT0+0x00) /* SCSI sequence control */
> @@ -331,6 +331,7 @@ struct aha152x_setup {
> };
>
> struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *);
> -int aha152x_host_reset(struct scsi_cmnd *);
> +void aha152x_release(struct Scsi_Host *);
> +int aha152x_host_reset(Scsi_Cmnd *);
>
> #endif /* _AHA152X_H */
> diff -uprd orig/linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c
> --- orig/linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c 2004-01-24 11:54:43.000000000 +0100
> +++ linux-2.6.2-rc2/drivers/scsi/pcmcia/aha152x_stub.c 2004-01-24 12:06:31.000000000 +0100
> @@ -78,7 +78,7 @@ static int irq_list[4] = { -1 };
> static int host_id = 7;
> static int reconnect = 1;
> static int parity = 1;
> -static int synchronous = 0;
> +static int synchronous = 1;
> static int reset_delay = 100;
> static int ext_trans = 0;
>
> @@ -244,9 +244,6 @@ static void aha152x_config_cs(dev_link_t
> CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));
> CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));
>
> - /* A bad hack... */
> - release_region(link->io.BasePort1, link->io.NumPorts1);
> -
> /* Set configuration options for the aha152x driver */
> memset(&s, 0, sizeof(s));
> s.conf = "PCMCIA setup";
> @@ -266,9 +263,6 @@ static void aha152x_config_cs(dev_link_t
> goto cs_failed;
> }
>
> - scsi_add_host(host, NULL); /* XXX handle failure */
> - scsi_scan_host(host);
> -
> sprintf(info->node.dev_name, "scsi%d", host->host_no);
> link->dev = &info->node;
> info->host = host;
> @@ -286,7 +280,7 @@ static void aha152x_release_cs(dev_link_
> {
> scsi_info_t *info = link->priv;
>
> - scsi_remove_host(info->host);
> + aha152x_release(info->host);
> link->dev = NULL;
>
> pcmcia_release_configuration(link->handle);
> @@ -294,7 +288,6 @@ static void aha152x_release_cs(dev_link_
> pcmcia_release_irq(link->handle, &link->irq);
>
> link->state &= ~DEV_CONFIG;
> - scsi_unregister(info->host);
> }
>
> static int aha152x_event(event_t event, int priority,
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem with module-init-tools-3.0-pre3
2004-02-04 18:27 ` David Ronis
@ 2004-02-04 19:31 ` Juergen E. Fischer
2004-02-04 19:39 ` David Ronis
0 siblings, 1 reply; 7+ messages in thread
From: Juergen E. Fischer @ 2004-02-04 19:31 UTC (permalink / raw)
To: david.ronis; +Cc: linux-kernel, Rusty Russell, Andrew Morton
[-- Attachment #1: Type: text/plain, Size: 540 bytes --]
Hi David,
On Wed, Feb 04, 2004 at 13:27:28 -0500, David Ronis wrote:
> I just built 2.6.2 and tried the scsi driver install/remove problem I
> wrote about earlier (if, I manually remove the sg and aha152x modules
> with modprobe, I get an oops the next time they are used). The
> problem is still present.
With or without the patch? It wasn't applied in 2.6.2.
Jürgen
--
Phase 1: Where do you want to go today?
Phase 2: This is where you want to go today.
Phase 3: You're not going anywhere today.
-- seen on /.
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem with module-init-tools-3.0-pre3
2004-02-04 19:31 ` Juergen E. Fischer
@ 2004-02-04 19:39 ` David Ronis
[not found] ` <20040204194756.GA29909@linux-buechse.de>
0 siblings, 1 reply; 7+ messages in thread
From: David Ronis @ 2004-02-04 19:39 UTC (permalink / raw)
To: Juergen E. Fischer; +Cc: linux-kernel, Rusty Russell, Andrew Morton
Hi Jurgen,
Without. [Can you point me to it? I'll give it a try].
David
Juergen E. Fischer writes:
> Hi David,
>
> On Wed, Feb 04, 2004 at 13:27:28 -0500, David Ronis wrote:
> > I just built 2.6.2 and tried the scsi driver install/remove problem I
> > wrote about earlier (if, I manually remove the sg and aha152x modules
> > with modprobe, I get an oops the next time they are used). The
> > problem is still present.
>
> With or without the patch? It wasn't applied in 2.6.2.
>
>
> Jürgen
>
> --
> Phase 1: Where do you want to go today?
> Phase 2: This is where you want to go today.
> Phase 3: You're not going anywhere today.
> -- seen on /.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem with module-init-tools-3.0-pre3
[not found] ` <20040204194756.GA29909@linux-buechse.de>
@ 2004-02-04 21:03 ` David Ronis
2004-02-04 22:05 ` Juergen E. Fischer
0 siblings, 1 reply; 7+ messages in thread
From: David Ronis @ 2004-02-04 21:03 UTC (permalink / raw)
To: Juergen E. Fischer; +Cc: linux-kernel, Rusty Russell, Andrew Morton
OK, I applied the patch and rebuilt/reinstalled kernel and modules.
Problem is still present.
David
Here's the log:
Feb 4 16:00:49 ronispc kernel: printing eip:
Feb 4 16:00:49 ronispc kernel: c0162a50
Feb 4 16:00:49 ronispc kernel: *pde = 00000000
Feb 4 16:00:49 ronispc kernel: Oops: 0000 [#1]
Feb 4 16:00:49 ronispc kernel: CPU: 1
Feb 4 16:00:49 ronispc kernel: EIP: 0060:[<c0162a50>] Not tainted
Feb 4 16:00:49 ronispc kernel: EFLAGS: 00010202
Feb 4 16:00:49 ronispc kernel: EIP is at cdev_get+0x20/0xb0
Feb 4 16:00:49 ronispc kernel: eax: e8a92000 ebx: 00000708 ecx: 00000015 edx: e8a93f28
Feb 4 16:00:49 ronispc kernel: esi: e88e2ea0 edi: 00000001 ebp: e88e2ea0 esp: e8a93ed8
Feb 4 16:00:49 ronispc kernel: ds: 007b es: 007b ss: 0068
Feb 4 16:00:49 ronispc kernel: Process xsane (pid: 2175, threadinfo=e8a92000 task=e89ab370)
Feb 4 16:00:49 ronispc kernel: Stack: c0130185 e8bf2560 e8a92000 00000000 c016293f e88e2ea0 c01ecf89 01500000
Feb 4 16:00:49 ronispc kernel: e88e2ea0 00000006 c0162920 00000000 e8a92000 00000000 00000000 00000000
Feb 4 16:00:49 ronispc kernel: c0162767 f7fe2c00 01500000 e8a93f28 00000000 e8cc2540 ec313a14 00000001
Feb 4 16:00:49 ronispc kernel: Call Trace:
Feb 4 16:00:49 ronispc kernel: [<c0130185>] in_group_p+0x25/0x30
Feb 4 16:00:49 ronispc kernel: [<c016293f>] exact_lock+0xf/0x20
Feb 4 16:00:49 ronispc kernel: [<c01ecf89>] kobj_lookup+0x119/0x200
Feb 4 16:00:49 ronispc kernel: [<c0162920>] exact_match+0x0/0x10
Feb 4 16:00:49 ronispc kernel: [<c0162767>] chrdev_open+0x1e7/0x290
Feb 4 16:00:49 ronispc kernel: [<c01576e0>] dentry_open+0x160/0x230
Feb 4 16:00:49 ronispc kernel: [<c0157578>] filp_open+0x68/0x70
Feb 4 16:00:49 ronispc kernel: [<c0157aeb>] sys_open+0x5b/0x90
Feb 4 16:00:49 ronispc kernel: [<c01092ab>] syscall_call+0x7/0xb
Feb 4 16:00:49 ronispc kernel:
Feb 4 16:00:49 ronispc kernel: Code: 83 3b 02 8b 40 10 74 7f c1 e0 05 8d 04 18 ff 80 a0 00 00 00
Feb 4 16:00:49 ronispc kernel: <6>note: xsane[2175] exited with preempt_count 1
Feb 4 16:00:49 ronispc kernel: bad: scheduling while atomic!
Feb 4 16:00:49 ronispc kernel: Call Trace:
Feb 4 16:00:49 ronispc kernel: [<c011b8a1>] schedule+0x6e1/0x6f0
Feb 4 16:00:49 ronispc kernel: [<c0153698>] free_pages_and_swap_cache+0x68/0xa0
Feb 4 16:00:49 ronispc kernel: [<c0148db1>] unmap_vmas+0x241/0x2f0
Feb 4 16:00:49 ronispc kernel: [<c014d1d9>] exit_mmap+0xe9/0x240
Feb 4 16:00:49 ronispc kernel: [<c011e0b0>] mmput+0x70/0xd0
Feb 4 16:00:49 ronispc kernel: [<c012290b>] do_exit+0x18b/0x500
Feb 4 16:00:49 ronispc kernel: [<c01186f0>] do_page_fault+0x0/0x530
Feb 4 16:00:49 ronispc kernel: [<c010a3c5>] die+0xf5/0x100
Feb 4 16:00:49 ronispc kernel: [<c01188ce>] do_page_fault+0x1de/0x530
Feb 4 16:00:49 ronispc kernel: [<c01a3e81>] journal_stop+0x201/0x310
Feb 4 16:00:49 ronispc kernel: [<c0171441>] dput+0x31/0x270
Feb 4 16:00:49 ronispc kernel: [<c0167f14>] link_path_walk+0x694/0x9f0
Feb 4 16:00:49 ronispc kernel: [<c01186f0>] do_page_fault+0x0/0x530
Feb 4 16:00:49 ronispc kernel: [<c0109d15>] error_code+0x2d/0x38
Feb 4 16:00:49 ronispc kernel: [<c0162a50>] cdev_get+0x20/0xb0
Feb 4 16:00:49 ronispc kernel: [<c0130185>] in_group_p+0x25/0x30
Feb 4 16:00:49 ronispc kernel: [<c016293f>] exact_lock+0xf/0x20
Feb 4 16:00:49 ronispc kernel: [<c01ecf89>] kobj_lookup+0x119/0x200
Feb 4 16:00:49 ronispc kernel: [<c0162920>] exact_match+0x0/0x10
Feb 4 16:00:49 ronispc kernel: [<c0162767>] chrdev_open+0x1e7/0x290
Feb 4 16:00:49 ronispc kernel: [<c01576e0>] dentry_open+0x160/0x230
Feb 4 16:00:49 ronispc kernel: [<c0157578>] filp_open+0x68/0x70
Feb 4 16:00:49 ronispc kernel: [<c0157aeb>] sys_open+0x5b/0x90
Feb 4 16:00:49 ronispc kernel: [<c01092ab>] syscall_call+0x7/0xb
Feb 4 16:00:49 ronispc kernel:
Feb 4 16:00:49 ronispc kernel: bad: scheduling while atomic!
Feb 4 16:00:49 ronispc kernel: Call Trace:
Feb 4 16:00:49 ronispc kernel: [<c011b8a1>] schedule+0x6e1/0x6f0
Feb 4 16:00:49 ronispc kernel: [<c0148acb>] zap_pmd_range+0x4b/0x70
Feb 4 16:00:49 ronispc kernel: [<c0153698>] free_pages_and_swap_cache+0x68/0xa0
Feb 4 16:00:49 ronispc kernel: [<c0148db1>] unmap_vmas+0x241/0x2f0
Feb 4 16:00:49 ronispc kernel: [<c014d1d9>] exit_mmap+0xe9/0x240
Feb 4 16:00:49 ronispc kernel: [<c011e0b0>] mmput+0x70/0xd0
Feb 4 16:00:49 ronispc kernel: [<c012290b>] do_exit+0x18b/0x500
Feb 4 16:00:49 ronispc kernel: [<c01186f0>] do_page_fault+0x0/0x530
Feb 4 16:00:49 ronispc kernel: [<c010a3c5>] die+0xf5/0x100
Feb 4 16:00:49 ronispc kernel: [<c01188ce>] do_page_fault+0x1de/0x530
Feb 4 16:00:49 ronispc kernel: [<c01a3e81>] journal_stop+0x201/0x310
Feb 4 16:00:49 ronispc kernel: [<c0171441>] dput+0x31/0x270
Feb 4 16:00:49 ronispc kernel: [<c0167f14>] link_path_walk+0x694/0x9f0
Feb 4 16:00:49 ronispc kernel: [<c01186f0>] do_page_fault+0x0/0x530
Feb 4 16:00:49 ronispc kernel: [<c0109d15>] error_code+0x2d/0x38
Feb 4 16:00:49 ronispc kernel: [<c0162a50>] cdev_get+0x20/0xb0
Feb 4 16:00:49 ronispc kernel: [<c0130185>] in_group_p+0x25/0x30
Feb 4 16:00:49 ronispc kernel: [<c016293f>] exact_lock+0xf/0x20
Feb 4 16:00:49 ronispc kernel: [<c01ecf89>] kobj_lookup+0x119/0x200
Feb 4 16:00:49 ronispc kernel: [<c0162920>] exact_match+0x0/0x10
Feb 4 16:00:49 ronispc kernel: [<c0162767>] chrdev_open+0x1e7/0x290
Feb 4 16:00:49 ronispc kernel: [<c01576e0>] dentry_open+0x160/0x230
Feb 4 16:00:49 ronispc kernel: [<c0157578>] filp_open+0x68/0x70
Feb 4 16:00:49 ronispc kernel: [<c0157aeb>] sys_open+0x5b/0x90
Feb 4 16:00:49 ronispc kernel: [<c01092ab>] syscall_call+0x7/0xb
Feb 4 16:00:49 ronispc kernel:
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem with module-init-tools-3.0-pre3
2004-02-04 21:03 ` David Ronis
@ 2004-02-04 22:05 ` Juergen E. Fischer
0 siblings, 0 replies; 7+ messages in thread
From: Juergen E. Fischer @ 2004-02-04 22:05 UTC (permalink / raw)
To: david.ronis; +Cc: linux-kernel, linux-scsi, Rusty Russell, Douglas Gilbert
[-- Attachment #1: Type: text/plain, Size: 597 bytes --]
Hi David,
On Wed, Feb 04, 2004 at 16:03:06 -0500, David Ronis wrote:
> OK, I applied the patch and rebuilt/reinstalled kernel and modules.
> Problem is still present.
Ok. That was just a thought.
Looks like the same problem was also reported twice on linux-kernel
Both while running cdrecord -scanbus with the usb-storage driver, but
not the aha152x driver (References:
<20040106174755.GA8855@paradigm.rfc822.org>
<1075241217.3851.8.camel@localhost.localdomain>).
Your report and those two all involve sg. So I guess the problem is in
sg (or an upper layer).
Jürgen
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2004-02-04 22:07 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <16409.11897.539398.14955@ronispc.chem.mcgill.ca>
2004-01-30 3:29 ` Problem with module-init-tools-3.0-pre3 Rusty Russell
2004-01-30 7:35 ` Juergen E. Fischer
2004-02-04 18:27 ` David Ronis
2004-02-04 19:31 ` Juergen E. Fischer
2004-02-04 19:39 ` David Ronis
[not found] ` <20040204194756.GA29909@linux-buechse.de>
2004-02-04 21:03 ` David Ronis
2004-02-04 22:05 ` Juergen E. Fischer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox