Skip to contentSkip to conversation

2.4.25pre6 and qlogic pcmcia driver

DISCUSSION Marcelo Tosatti 3 participants 5 messages Jan 20, 2004 – Jan 28, 2004 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

Same here, 2.4.24 does not show this behaviour.

I can't find the guilty modification in 2.4.25-pre.

Quoted 23 lines · Arkadiusz Miskiewicz

Hi,

I was compiling 2.4.25pre6 (_but_ with bunch of different patches) with almost everything modular and got this:

ake[1]: Wej?cie do katalogu `/home/users/misiek/rpm/BUILD/linux-2.4.24/drivers/scsi/pcmcia'
gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogic_stub -c -o qlogic_stub.o qlogic_stub.c gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogicfas -DPCMCIA -D__NO_VERSION__ -c -o qlogicfas.o ../qlogicfas.c ../qlogicfas.c: In function `qlogicfas_detect':
../qlogicfas.c:650: warning: passing arg 1 of `scsi_unregister' from incompatible pointer type
ld -m elf_i386 -r -o qlogic_cs.o qlogic_stub.o qlogicfas.o
qlogicfas.o(.text+0xe50): In function `init_module':
: multiple definition of `init_module'
qlogic_stub.o(.text+0x860): first defined here
ld: Warning: size of symbol `init_module' changed from 86 in qlogic_stub.o to 75 in qlogicfas.o
qlogicfas.o(.text+0xea0): In function `cleanup_module':
: multiple definition of `cleanup_module'
qlogic_stub.o(.text+0x8c0): first defined here
ld: Warning: size of symbol `cleanup_module' changed from 47 in qlogic_stub.o to 27 in qlogicfas.o
make[1]: *** [qlogic_cs.o] B??d 1

qlogic_cs module is going to be build using drivers/scsi/pcmcia/qlogic_stub.c and drivers/scsi/qlogicfas.c.

#2 lore raw

On Tue, 20 Jan 2004 14:01:54 -0200 (BRST) Marcelo Tosatti <[email protected]> wrote:

| 
| 
| Same here, 2.4.24 does not show this behaviour.
| 
| I can't find the guilty modification in 2.4.25-pre.

Same problem with aha152x pcmcia being built as a module.

I also don't see any changes that would be causing this...

It's clear that this problem should be detected, since scsi/qlogicfas.c and scsi/pcmcia/qlogic_stub.c both #include <linux/init.h>, so both of them define the module init and cleanup functions. I don't see how this worked in the past, unless it was due to some tools that missed detecting the duplicated functions.

| On Sun, 18 Jan 2004, Arkadiusz Miskiewicz wrote:
| 
| > Hi,
| >
| > I was compiling 2.4.25pre6 (_but_ with bunch of different patches) with
| > almost everything modular and got this:
| >
| > ake[1]: Wej?cie do katalogu `/home/users/misiek/rpm/BUILD/linux-2.4.24/drivers/scsi/pcmcia'
| > gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE  -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogic_stub  -c -o qlogic_stub.o qlogic_stub.c
| > gcc -D__KERNEL__ -I/home/users/misiek/rpm/BUILD/linux-2.4.24/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -DMODULE  -nostdinc -iwithprefix include -DKBUILD_BASENAME=qlogicfas -DPCMCIA -D__NO_VERSION__ -c -o qlogicfas.o ../qlogicfas.c
| > ../qlogicfas.c: In function `qlogicfas_detect':
| > ../qlogicfas.c:650: warning: passing arg 1 of `scsi_unregister' from incompatible pointer type
| > ld -m elf_i386 -r -o qlogic_cs.o qlogic_stub.o qlogicfas.o
| > qlogicfas.o(.text+0xe50): In function `init_module':
| > : multiple definition of `init_module'
| > qlogic_stub.o(.text+0x860): first defined here
| > ld: Warning: size of symbol `init_module' changed from 86 in qlogic_stub.o to 75 in qlogicfas.o
| > qlogicfas.o(.text+0xea0): In function `cleanup_module':
| > : multiple definition of `cleanup_module'
| > qlogic_stub.o(.text+0x8c0): first defined here
| > ld: Warning: size of symbol `cleanup_module' changed from 47 in qlogic_stub.o to 27 in qlogicfas.o
| > make[1]: *** [qlogic_cs.o] B??d 1
| >
| > qlogic_cs module is going to be build using drivers/scsi/pcmcia/qlogic_stub.c
| > and drivers/scsi/qlogicfas.c.
| -

--
~Randy
kernel-janitors project: http://janitor.kernelnewbies.org/

#3 lore raw
Quoted 7 lines · Randy.Dunlap

On Tue, 20 Jan 2004 14:01:54 -0200 (BRST) Marcelo Tosatti <[email protected]> wrote:

| Same here, 2.4.24 does not show this behaviour.
|
| I can't find the guilty modification in 2.4.25-pre.

Same problem with aha152x pcmcia being built as a module.

Quoted 8 lines

I also don't see any changes that would be causing this...

It's clear that this problem should be detected, since scsi/qlogicfas.c and scsi/pcmcia/qlogic_stub.c both #include <linux/init.h>, so both of them define the module init and cleanup functions. I don't see how this worked in the past, unless it was due to some tools that missed detecting the duplicated functions.

This change causes whole problem:

include/linux/spinlock.h 2004-01-16 12:20:45.000000000 +0000 renamed from include/linux/spinlock.h 2002-11-28 23:53:15.000000000 +0000 +2 -0
diff -Naur -p -X /home/marcelo/lib/dontdiff linux-2.4.24/include/linux/spinlock.h linux-2.4.25-pre6/include/linux/spinlock.h
@@ -3,6 +3,8 @@
 
 #include <linux/config.h>
 
+#include <asm/system.h>
+
 /*
  * These are the generic versions of the spinlocks and read-write
  * locks..

The difference between 2.4.23 after preprocessing is:
static Scsi_Host_Template driver_template = { detect: qlogicfas_detect, release: qlogicfas_release, info: qlogicfas_info, co
mmand: qlogicfas_command, queuecommand: qlogicfas_queuecommand, abort: qlogicfas_abort, reset: qlogicfas_reset, bios_param:
qlogicfas_biosparam, can_queue: 0, this_id: -1, sg_tablesize: 0xff, cmd_per_lun: 1, use_clustering: 0 }; # 1 "scsi_module.c" 1
# 35 "scsi_module.c"
static int __attribute__ ((__section__ (".text.init"))) init_this_scsi_driver(void)

{
        driver_template.module = (&__this_module);
        scsi_register_module(1, &driver_template);
        if (driver_template.present)
                return 0;

        scsi_unregister_module(1, &driver_template);
        return -19;
}

static void __attribute__ ((unused, __section__(".text.exit"))) exit_this_scsi_driver(void)

{
        scsi_unregister_module(1, &driver_template);
}

static initcall_t __initcall_init_this_scsi_driver __attribute__ ((unused,__section__ (".initcall.init"))) = init_this_scsi_ driver;;
static exitcall_t __exitcall_exit_this_scsi_driver __attribute__ ((unused,__section__ (".exitcall.exit"))) = exit_this_scsi_ driver;;

and on 2.4.25pre6:
static Scsi_Host_Template driver_template = { detect: qlogicfas_detect, release: qlogicfas_release, info: qlogicfas_info, co
mmand: qlogicfas_command, queuecommand: qlogicfas_queuecommand, abort: qlogicfas_abort, reset: qlogicfas_reset, bios_param:
qlogicfas_biosparam, can_queue: 0, this_id: -1, sg_tablesize: 0xff, cmd_per_lun: 1, use_clustering: 0 }; # 1 "scsi_module.c" 1
# 35 "scsi_module.c"
static int init_this_scsi_driver(void)

{
        driver_template.module = (&__this_module);
        scsi_register_module(1, &driver_template);
        if (driver_template.present)
                return 0;

        scsi_unregister_module(1, &driver_template);
        return -19;
}

static void exit_this_scsi_driver(void)

{
        scsi_unregister_module(1, &driver_template);
}

int init_module(void) __attribute__((alias("init_this_scsi_driver"))); static __inline__ __attribute__((always_inline)) __at tribute__((always_inline)) __init_module_func_t __init_module_inline(void) { return init_this_scsi_driver; }; void cleanup_module(void) __attribute__((alias("exit_this_scsi_driver"))); static __inline__ __attribute__((always_inline)) __attribute__((always_inline)) __cleanup_module_func_t __cleanup_module_inline(void) { return exit_this_scsi_driver; }; # 723 "qlogicfas.c" 2

The problem is because in 2.4.25pre6 we have
MODULE defined and
drivers/scsi/qlogicfas.c -> #include <linux/module.h>
include/linux/moduleh -> #include <linux/spinlock.h>
include/linux/spinlock.h -> #include <asm/system.h>
include/asm/system.h -> #include <linux/init.h>
as MODULE is defined then wrong functions are taken (we want these for undefined MODULE to be taken later) then back in drivers/scsi/qlogicfas.c

#ifdef PCMCIA
#undef MODULE
#endif

and again #include <linux/init.h> this time with MODULE undefined

Signature · 2 lines
Arkadiusz Miśkiewicz    CS at FoE, Wroclaw University of Technology
arekm.pld-linux.org AM2-6BONE, 1024/3DB19BBD, arekm(at)ircnet, PLD/Linux
#4 lore raw

(moved to linux-scsi)

On Wed, 21 Jan 2004 02:32:43 +0100 Arkadiusz Miskiewicz <[email protected]> wrote:

| Dnia wto 20. stycznia 2004 19:11, Randy.Dunlap napisa³:
| > On Tue, 20 Jan 2004 14:01:54 -0200 (BRST) Marcelo Tosatti <[email protected]> wrote:
| > | Same here, 2.4.24 does not show this behaviour.
| > |
| > | I can't find the guilty modification in 2.4.25-pre.
| >
| > Same problem with aha152x pcmcia being built as a module.
| >
| > I also don't see any changes that would be causing this...
| >
| > It's clear that this problem should be detected, since
| > scsi/qlogicfas.c and scsi/pcmcia/qlogic_stub.c both
| > #include <linux/init.h>, so both of them define the module
| > init and cleanup functions.  I don't see how this worked
| > in the past, unless it was due to some tools that missed
| > detecting the duplicated functions.
| This change causes whole problem:
| 
| diff -Naur -p -X /home/marcelo/lib/dontdiff linux-2.4.24/include/linux/spinlock.h linux-2.4.25-pre6/include/linux/spinlock.h
| --- linux-2.4.24/include/linux/spinlock.h       2002-11-28 23:53:15.000000000 +0000
| +++ linux-2.4.25-pre6/include/linux/spinlock.h  2004-01-16 12:20:45.000000000 +0000
| @@ -3,6 +3,8 @@
| 
|  #include <linux/config.h>
| 
| +#include <asm/system.h>
| +

[snip]

| The problem is because in 2.4.25pre6 we have
| MODULE defined and
| drivers/scsi/qlogicfas.c -> #include <linux/module.h>
| include/linux/moduleh -> #include <linux/spinlock.h>
| include/linux/spinlock.h -> #include <asm/system.h>
| include/asm/system.h -> #include <linux/init.h>
| as MODULE is defined then wrong functions are taken (we want these for undefined MODULE to be taken later)
| then back in drivers/scsi/qlogicfas.c
| 
| #ifdef PCMCIA
| #undef MODULE
| #endif
| 
| and again #include <linux/init.h> this time with MODULE undefined

Thanks for finding/isolating that one... wow.

Is reverting that change to include/linux/spinlock.h a possibility?

If not, here's a patch that fixes 3 SCSI PCMCIA modules so that they will build in 2.4.25-pre6. Not tested....

Is it OK Not to include scsi_module.c for these PCMCIA modules? That's where the problem comes, and they don't use those functions AFAICT.

Comments?

--
~Randy
kernel-janitors project: http://janitor.kernelnewbies.org/

description: repair scsi/pcmcia modules so that they can build

		by only including scsi_module.c for non-PCMCIA builds;
		qlogicfas:  fix parameter type to scsi_unregister();

patch_name: scsi_pcmcia_modules.patch
product_versions: linux-2425-pre6
maintainer: Doug Ledford et al ([email protected])
Juergen Fischer <[email protected]> (aha152x)

diffstat:=

 drivers/scsi/aha152x.c   |   10 ++++++----
 drivers/scsi/fdomain.c   |    2 ++
 drivers/scsi/qlogicfas.c |   12 +++++++-----
 3 files changed, 15 insertions(+), 9 deletions(-)
drivers/scsi/qlogicfas.c renamed from drivers/scsi/qlogicfas.c~pcmc_module +7 -5
diff -Naurp ./drivers/scsi/qlogicfas.c~pcmc_module ./drivers/scsi/qlogicfas.c
@@ -111,10 +111,6 @@
 
 #include <linux/module.h>
 
-#ifdef PCMCIA
-#undef MODULE
-#endif 
-
 #include <linux/blk.h>	/* to get disk capacity */
 #include <linux/kernel.h>
 #include <linux/string.h>
@@ -131,6 +127,10 @@
 #include "qlogicfas.h"
 #include <linux/stat.h>
 
+#ifdef PCMCIA
+#undef MODULE
+#endif 
+
 /*----------------------------------------------------------------*/
 /* driver state info, local to driver */
 static int	    qbase;	/* Port */
@@ -647,7 +647,7 @@ host->proc_name =  "qlogicfas";
 	if(request_irq(qlirq, do_ql_ihandl, SA_SHIRQ, "qlogicfas", hreg) < 0)
 #endif	
 	{
-		scsi_unregister(host);
+		scsi_unregister(hreg);
 		goto err_release_mem;
 	}
 #endif
@@ -717,7 +717,9 @@ const char	*qlogicfas_info(struct Scsi_H
 }
 MODULE_LICENSE("GPL");
 
+#ifndef PCMCIA
 /* Eventually this will go into an include file, but this will be later */
 static Scsi_Host_Template driver_template = QLOGICFAS;
 #include "scsi_module.c"
+#endif
 
drivers/scsi/aha152x.c renamed from drivers/scsi/aha152x.c~pcmc_module +6 -4
diff -Naurp ./drivers/scsi/aha152x.c~pcmc_module ./drivers/scsi/aha152x.c
@@ -222,10 +222,6 @@
 
 #include <linux/module.h>
 
-#if defined(PCMCIA)
-#undef MODULE
-#endif
-
 #include <linux/sched.h>
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -254,6 +250,10 @@
 
 #include <scsi/scsicam.h>
 
+#if defined(PCMCIA)
+#undef MODULE
+#endif
+
 /* DEFINES */
 
 /* For PCMCIA cards, always use AUTOCONF */
@@ -3951,7 +3951,9 @@ int aha152x_proc_info(char *buffer, char
 	return thislength < length ? thislength : length;
 }
 
+#ifndef PCMCIA
 /* Eventually this will go into an include file, but this will be later */
 static Scsi_Host_Template driver_template = AHA152X;
 
 #include "scsi_module.c"
+#endif
drivers/scsi/fdomain.c renamed from drivers/scsi/fdomain.c~pcmc_module +2 -0
diff -Naurp ./drivers/scsi/fdomain.c~pcmc_module ./drivers/scsi/fdomain.c
@@ -2046,7 +2046,9 @@ int fdomain_16x0_release(struct Scsi_Hos
 
 MODULE_LICENSE("GPL");
 
+#ifndef PCMCIA
 /* Eventually this will go into an include file, but this will be later */
 static Scsi_Host_Template driver_template = FDOMAIN_16X0;
 
 #include "scsi_module.c"
+#endif

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw

Randy, others,

I will apply your untested fixes, however I wonder if it might be better to just undo the spinlock.h addition of "#include <asm/system.h>".

Would be good to have someone with the cards to test it.

Quoted 166 lines · Randy.Dunlap

(moved to linux-scsi)

On Wed, 21 Jan 2004 02:32:43 +0100 Arkadiusz Miskiewicz <[email protected]> wrote:

| Dnia wto 20. stycznia 2004 19:11, Randy.Dunlap napisa³:
| > On Tue, 20 Jan 2004 14:01:54 -0200 (BRST) Marcelo Tosatti <[email protected]> wrote:
| > | Same here, 2.4.24 does not show this behaviour.
| > |
| > | I can't find the guilty modification in 2.4.25-pre.
| >
| > Same problem with aha152x pcmcia being built as a module.
| >
| > I also don't see any changes that would be causing this...
| >
| > It's clear that this problem should be detected, since
| > scsi/qlogicfas.c and scsi/pcmcia/qlogic_stub.c both
| > #include <linux/init.h>, so both of them define the module
| > init and cleanup functions.  I don't see how this worked
| > in the past, unless it was due to some tools that missed
| > detecting the duplicated functions.
| This change causes whole problem:
|
| diff -Naur -p -X /home/marcelo/lib/dontdiff linux-2.4.24/include/linux/spinlock.h linux-2.4.25-pre6/include/linux/spinlock.h
| --- linux-2.4.24/include/linux/spinlock.h       2002-11-28 23:53:15.000000000 +0000
| +++ linux-2.4.25-pre6/include/linux/spinlock.h  2004-01-16 12:20:45.000000000 +0000
| @@ -3,6 +3,8 @@
|
|  #include <linux/config.h>
|
| +#include <asm/system.h>
| +

[snip]

| The problem is because in 2.4.25pre6 we have
| MODULE defined and
| drivers/scsi/qlogicfas.c -> #include <linux/module.h>
| include/linux/moduleh -> #include <linux/spinlock.h>
| include/linux/spinlock.h -> #include <asm/system.h>
| include/asm/system.h -> #include <linux/init.h>
| as MODULE is defined then wrong functions are taken (we want these for undefined MODULE to be taken later)
| then back in drivers/scsi/qlogicfas.c
|
| #ifdef PCMCIA
| #undef MODULE
| #endif
|
| and again #include <linux/init.h> this time with MODULE undefined

Thanks for finding/isolating that one... wow.

Is reverting that change to include/linux/spinlock.h a possibility?

If not, here's a patch that fixes 3 SCSI PCMCIA modules so that they will build in 2.4.25-pre6. Not tested....

Is it OK Not to include scsi_module.c for these PCMCIA modules? That's where the problem comes, and they don't use those functions AFAICT.

Comments?

--
~Randy
kernel-janitors project: http://janitor.kernelnewbies.org/

description: repair scsi/pcmcia modules so that they can build

		by only including scsi_module.c for non-PCMCIA builds;
		qlogicfas:  fix parameter type to scsi_unregister();

patch_name: scsi_pcmcia_modules.patch
product_versions: linux-2425-pre6
maintainer: Doug Ledford et al ([email protected])
Juergen Fischer <[email protected]> (aha152x)

diffstat:=

 drivers/scsi/aha152x.c   |   10 ++++++----
 drivers/scsi/fdomain.c   |    2 ++
 drivers/scsi/qlogicfas.c |   12 +++++++-----
 3 files changed, 15 insertions(+), 9 deletions(-)

diff -Naurp ./drivers/scsi/qlogicfas.c~pcmc_module ./drivers/scsi/qlogicfas.c

drivers/scsi/qlogicfas.c renamed from drivers/scsi/qlogicfas.c~pcmc_module +7 -5
@@ -111,10 +111,6 @@
 
 #include <linux/module.h>
 
-#ifdef PCMCIA
-#undef MODULE
-#endif
-
 #include <linux/blk.h>	/* to get disk capacity */
 #include <linux/kernel.h>
 #include <linux/string.h>
@@ -131,6 +127,10 @@
 #include "qlogicfas.h"
 #include <linux/stat.h>
 
+#ifdef PCMCIA
+#undef MODULE
+#endif
+
 /*----------------------------------------------------------------*/
 /* driver state info, local to driver */
 static int	    qbase;	/* Port */
@@ -647,7 +647,7 @@ host->proc_name =  "qlogicfas";
 	if(request_irq(qlirq, do_ql_ihandl, SA_SHIRQ, "qlogicfas", hreg) < 0)
 #endif
 	{
-		scsi_unregister(host);
+		scsi_unregister(hreg);
 		goto err_release_mem;
 	}
 #endif
@@ -717,7 +717,9 @@ const char	*qlogicfas_info(struct Scsi_H
 }
 MODULE_LICENSE("GPL");
 
+#ifndef PCMCIA
 /* Eventually this will go into an include file, but this will be later */
 static Scsi_Host_Template driver_template = QLOGICFAS;
 #include "scsi_module.c"
+#endif
 

diff -Naurp ./drivers/scsi/aha152x.c~pcmc_module ./drivers/scsi/aha152x.c

drivers/scsi/aha152x.c renamed from drivers/scsi/aha152x.c~pcmc_module +6 -4
@@ -222,10 +222,6 @@
 
 #include <linux/module.h>
 
-#if defined(PCMCIA)
-#undef MODULE
-#endif
-
 #include <linux/sched.h>
 #include <asm/irq.h>
 #include <asm/io.h>
@@ -254,6 +250,10 @@
 
 #include <scsi/scsicam.h>
 
+#if defined(PCMCIA)
+#undef MODULE
+#endif
+
 /* DEFINES */
 
 /* For PCMCIA cards, always use AUTOCONF */
@@ -3951,7 +3951,9 @@ int aha152x_proc_info(char *buffer, char
 	return thislength < length ? thislength : length;
 }
 
+#ifndef PCMCIA
 /* Eventually this will go into an include file, but this will be later */
 static Scsi_Host_Template driver_template = AHA152X;
 
 #include "scsi_module.c"
+#endif

diff -Naurp ./drivers/scsi/fdomain.c~pcmc_module ./drivers/scsi/fdomain.c

drivers/scsi/fdomain.c int fdomain_16x0_release(struct Scsi_Hos · line 2054

Quoted 9 lines
drivers/scsi/fdomain.c renamed from drivers/scsi/fdomain.c~pcmc_module +2 -0
@@ -2046,7 +2046,9 @@ int fdomain_16x0_release(struct Scsi_Hos
 
 MODULE_LICENSE("GPL");
 
+#ifndef PCMCIA
 /* Eventually this will go into an include file, but this will be later */
 static Scsi_Host_Template driver_template = FDOMAIN_16X0;
 
 #include "scsi_module.c"
+#endif

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html