2016-10-11 09:25:28

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH] scsi: NCR5380: no longer mark irq probing as __init

The g_NCR5380 has been converted to more regular probing, which
means its probe function can now be invoked after the __init section
is discarded, as pointed out by this kbuild warning:

WARNING: drivers/scsi/built-in.o(.text+0x3a105): Section mismatch in reference from the function generic_NCR5380_isa_match() to the function .init.text:probe_intr()
WARNING: drivers/scsi/built-in.o(.text+0x3a145): Section mismatch in reference from the function generic_NCR5380_isa_match() to the variable .init.data:probe_irq

To make sure this works correctly in all cases, let's remove
the __init and __initdata annotations.

Fixes: a8cfbcaec0c1 ("scsi: g_NCR5380: Stop using scsi_module.c")
Signed-off-by: Arnd Bergmann <[email protected]>
---
drivers/scsi/NCR5380.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index 7053de5bd468..61f34aca2fa0 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -353,7 +353,7 @@ static void NCR5380_print_phase(struct Scsi_Host *instance)
#endif


-static int probe_irq __initdata;
+static int probe_irq;

/**
* probe_intr - helper for IRQ autoprobe
@@ -365,7 +365,7 @@ static int probe_irq __initdata;
* used by the IRQ probe code.
*/

-static irqreturn_t __init probe_intr(int irq, void *dev_id)
+static irqreturn_t probe_intr(int irq, void *dev_id)
{
probe_irq = irq;
return IRQ_HANDLED;
@@ -380,7 +380,7 @@ static irqreturn_t __init probe_intr(int irq, void *dev_id)
* and then looking to see what interrupt actually turned up.
*/

-static int __init __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
+static int __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
int possible)
{
struct NCR5380_hostdata *hostdata = shost_priv(instance);
--
2.9.0


2016-10-11 09:42:33

by Finn Thain

[permalink] [raw]
Subject: Re: [PATCH] scsi: NCR5380: no longer mark irq probing as __init


Acked-by: Finn Thain <[email protected]>

Thanks.

On Tue, 11 Oct 2016, Arnd Bergmann wrote:

> The g_NCR5380 has been converted to more regular probing, which
> means its probe function can now be invoked after the __init section
> is discarded, as pointed out by this kbuild warning:
>
> WARNING: drivers/scsi/built-in.o(.text+0x3a105): Section mismatch in reference from the function generic_NCR5380_isa_match() to the function .init.text:probe_intr()
> WARNING: drivers/scsi/built-in.o(.text+0x3a145): Section mismatch in reference from the function generic_NCR5380_isa_match() to the variable .init.data:probe_irq
>
> To make sure this works correctly in all cases, let's remove
> the __init and __initdata annotations.
>
> Fixes: a8cfbcaec0c1 ("scsi: g_NCR5380: Stop using scsi_module.c")
> Signed-off-by: Arnd Bergmann <[email protected]>
> ---
> drivers/scsi/NCR5380.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
> index 7053de5bd468..61f34aca2fa0 100644
> --- a/drivers/scsi/NCR5380.c
> +++ b/drivers/scsi/NCR5380.c
> @@ -353,7 +353,7 @@ static void NCR5380_print_phase(struct Scsi_Host *instance)
> #endif
>
>
> -static int probe_irq __initdata;
> +static int probe_irq;
>
> /**
> * probe_intr - helper for IRQ autoprobe
> @@ -365,7 +365,7 @@ static int probe_irq __initdata;
> * used by the IRQ probe code.
> */
>
> -static irqreturn_t __init probe_intr(int irq, void *dev_id)
> +static irqreturn_t probe_intr(int irq, void *dev_id)
> {
> probe_irq = irq;
> return IRQ_HANDLED;
> @@ -380,7 +380,7 @@ static irqreturn_t __init probe_intr(int irq, void *dev_id)
> * and then looking to see what interrupt actually turned up.
> */
>
> -static int __init __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
> +static int __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
> int possible)
> {
> struct NCR5380_hostdata *hostdata = shost_priv(instance);
>

2016-10-11 20:58:22

by Ondrej Zary

[permalink] [raw]
Subject: Re: [PATCH] scsi: NCR5380: no longer mark irq probing as __init

On Tuesday 11 October 2016 11:39:57 Finn Thain wrote:
> Acked-by: Finn Thain <[email protected]>
>
> Thanks.
>
> On Tue, 11 Oct 2016, Arnd Bergmann wrote:
> > The g_NCR5380 has been converted to more regular probing, which
> > means its probe function can now be invoked after the __init section
> > is discarded, as pointed out by this kbuild warning:
> >
> > WARNING: drivers/scsi/built-in.o(.text+0x3a105): Section mismatch in
> > reference from the function generic_NCR5380_isa_match() to the function
> > .init.text:probe_intr() WARNING: drivers/scsi/built-in.o(.text+0x3a145):
> > Section mismatch in reference from the function
> > generic_NCR5380_isa_match() to the variable .init.data:probe_irq
> >
> > To make sure this works correctly in all cases, let's remove
> > the __init and __initdata annotations.
> >
> > Fixes: a8cfbcaec0c1 ("scsi: g_NCR5380: Stop using scsi_module.c")
> > Signed-off-by: Arnd Bergmann <[email protected]>
> > ---
> > drivers/scsi/NCR5380.c | 6 +++---
> > 1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
> > index 7053de5bd468..61f34aca2fa0 100644
> > --- a/drivers/scsi/NCR5380.c
> > +++ b/drivers/scsi/NCR5380.c
> > @@ -353,7 +353,7 @@ static void NCR5380_print_phase(struct Scsi_Host
> > *instance) #endif
> >
> >
> > -static int probe_irq __initdata;
> > +static int probe_irq;
> >
> > /**
> > * probe_intr - helper for IRQ autoprobe
> > @@ -365,7 +365,7 @@ static int probe_irq __initdata;
> > * used by the IRQ probe code.
> > */
> >
> > -static irqreturn_t __init probe_intr(int irq, void *dev_id)
> > +static irqreturn_t probe_intr(int irq, void *dev_id)
> > {
> > probe_irq = irq;
> > return IRQ_HANDLED;
> > @@ -380,7 +380,7 @@ static irqreturn_t __init probe_intr(int irq, void
> > *dev_id) * and then looking to see what interrupt actually turned up.
> > */
> >
> > -static int __init __maybe_unused NCR5380_probe_irq(struct Scsi_Host
> > *instance, +static int __maybe_unused NCR5380_probe_irq(struct Scsi_Host
> > *instance, int possible)
> > {
> > struct NCR5380_hostdata *hostdata = shost_priv(instance);

I've tested IRQ probing on my IRQ7-hardwired ISA card without any success some
time ago. No IRQ was detected because it wasn't even generated (no increment
in /proc/interruptts). It also produced some warnings in dmesg about
conflicting interrupt flags. Can't the IRQ probing be simply deleted?

--
Ondrej Zary

2016-10-11 23:21:46

by Finn Thain

[permalink] [raw]
Subject: Re: [PATCH] scsi: NCR5380: no longer mark irq probing as __init


On Tue, 11 Oct 2016, Ondrej Zary wrote:

>
> I've tested IRQ probing on my IRQ7-hardwired ISA card without any
> success some time ago. No IRQ was detected because it wasn't even
> generated (no increment in /proc/interruptts).

The IRQ line does not appear in /proc/interrupts unless it has already
been claimed. So if you saw that the interrupt count stayed the same, then
the interrupt line wasn't available in the first place.

> It also produced some warnings in dmesg about conflicting interrupt
> flags.

Presumably that's because there is no way to probe shared interrupt lines.

> Can't the IRQ probing be simply deleted?
>

It isn't clear to me that there's a bug in the driver. I never saw a bug
in the irq probe code when I went looking for a reason to delete that code
a while ago.

Anyway, assuming that the interrupt line on your card works fine, have you
considered using probe_irq_on/probe_irq_off? See for example, sym53c416.c
and NCR53c406a.c.

Bug or no bug, I'd be very happy to delete the NCR5380 probe code if we
can use the standard probe functions to retain the documented
functionality.

--