On Friday 08 June 2007, Samuel Ortiz wrote:
> Hi Bjorn,
>
> On 6/7/2007, "Bjorn Helgaas" <[EMAIL PROTECTED]> wrote:
> >On Wednesday 06 June 2007 02:45:01 pm Andrey Borzenkov wrote:
> >> On Wednesday 06 June 2007, Bjorn Helgaas wrote:
> >> > On Tuesday 05 June 2007 09:29:11 pm Andrey Borzenkov wrote:
> >> > > On Wednesday 06 June 2007, Bjorn Helgaas wrote:
> >> > > > Something's wrong with this strategy.  The BIOS is telling us that
> >> > > > an SMCf010 device is present, active, and responds at io ports
> >> > > > 0x100-0x107 and 0x2e8-0x2ef.  The fact that it happens to be on
> >> > > > the other side of an ISA or LPC bridge should be immaterial to the
> >> > > > OS driver.
> >> > >
> >> > > I thought this as well.
> >> >
> >> > If this is really true, it also means we shouldn't twiddle with the
> >> > bridge.  If the BIOS left us a working setup, the preconfiguration
> >> > is certainly going to change it to something incompatible with the
> >> > PNP info.
> >> >
> >> > What if we try the following patch, which keeps the FIR/SIR swap and
> >> > just removes the preconfiguration?
> >>
> >> I already tried different patch but with similar effect (switch off
> >> preconfiguration) - it does not work. I am beginning to doubt whether
> >> drier works on my system at all (i.e. before PnP change); have to find
> >> time to test.
> >
> >OK.  My patch wasn't the right approach anyway.  Attached is what I
> >think we should do instead -- do the preconfig if we're not using PNP.
>
> Thats sounds good, yes.
> Maybe we should also run the legacy probe when the PnP one fails. I
> don't know how the preconfiguration stuff will behave with the device
> being PnP enabled, but with your patch Andrey will still need to
> modprobe smsc-ircc with smsc_nopnp.
>

One thing that makes me uneasy - ideally we have to do it *after* PnP probe 
fails. Currently we lie to PnP layer that we successfully probed for device 
while in effect we did not (at least, not where PnP told us to).

> So, here is the patch I propose (I had to move smsc_ircc_legacy_probe()
> a bit earlier in the code to avoid forward declaration, but it's
> basically your patch plus a call to smsc_ircc_legacy_probe() from the
> pnp_probe() routine):
>

Yes this patch works:

[58674.337465] pnp: Device 00:0a activated.
[58674.337465] smsc_ircc_present(), addr 0x02e8 - no device found!
[58674.337465] PnP probe failed
[58674.340799] Detected unconfigured Toshiba laptop with ALi ISA bridge SMSC 
IrDA chip, pre-configuring device.
[58674.340799] Activated ALi 1533 ISA bridge port 0x02e8.
[58674.340799] Activated ALi 1533 ISA bridge port 0x02f8.
[58674.340799] found SMC SuperIO Chip (devid=0x5a rev=00 base=0x002e): 
LPC47N227
[58674.340799] smsc_superio_flat(): IrDA not enabled
[58674.340799] smsc_superio_flat(): fir: 0x2f8, sir: 0x2e8, dma: 03, irq: 7, 
mode: 0x02
[58674.340799] SMsC IrDA Controller found
[58674.340799]  IrCC version 2.0, firport 0x2f8, sirport 0x2e8 dma=3, irq=7
[58674.340799] No transceiver found. Defaulting to Fast pin select


But I noticed something very strange.

{pts/1}% lspnp -vv 00:0a
00:0a SMCf010 SMC Fast Infrared Port
    state = active
    allocated resources:
        io 0x100-0x107
        io 0x2e8-0x2ef
        irq 5
        dma 1
    possible resources:
        port 0x100-0x130, align 0xf, size 0x8, 16-bit address decoding
        irq 3,4,5,6,7,10,11 High-Edge
        dma 1,2,3 16-bit compatible
        Dependent: 01 - Priority acceptable
           port 0x3f8-0x3f8, align 0x0, size 0x8, 16-bit address decoding
        Dependent: 02 - Priority acceptable
           port 0x2e8-0x2e8, align 0x0, size 0x8, 16-bit address decoding
        Dependent: 03 - Priority acceptable
           port 0x2f8-0x2f8, align 0x0, size 0x8, 16-bit address decoding
        Dependent: 04 - Priority acceptable
           port 0x3e8-0x3e8, align 0x0, size 0x8, 16-bit address decoding

but

{pts/1}% cat /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
0070-0077 : rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0100-013f : pcmcia_socket0
^^^^^^^^^^^^^^^^^^^^^^^^^^ hell, what's it?

and really

{pts/1}% sudo 
cat /sys/class/pcmcia_socket/pcmcia_socket0/available_resources_io
0x00000100 - 0x000003af
0x000003e0 - 0x000004ff
0x00000820 - 0x000008ff
0x00000a00 - 0x00000aff
0x00000c00 - 0x00000cf7

Does it mean we did not inform PnP layer when PCMCIA is configured? Should we 
do it? I Cc to PCMCIA maintainer as well :) Configuration I have

{pts/1}% pccardctl status
Socket 0:
  3.3V 16-bit PC Card
  Subdevice 0 (function 0) bound to driver "wlags49"
Socket 1:
  no card
Socket 2:
  no card
{pts/1}% pccardctl info
PRODID_1="TOSHIBA"
PRODID_2="Wireless LAN Card"
PRODID_3="Version 01.01"
PRODID_4=""
MANFID=0156,0002
FUNCID=6
PRODID_1=""
PRODID_2=""
PRODID_3=""
PRODID_4=""
MANFID=0000,0000
FUNCID=255
PRODID_1=""
PRODID_2=""
PRODID_3=""
PRODID_4=""
MANFID=0000,0000
FUNCID=255

>
> diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c
> index 9043bf4..1d7ab3f 100644
> --- a/drivers/net/irda/smsc-ircc2.c
> +++ b/drivers/net/irda/smsc-ircc2.c
> @@ -366,6 +366,44 @@ static inline void register_bank(int iobase, int bank)
>                 iobase + IRCC_MASTER);
>  }
>
> +
> +static int __init smsc_ircc_legacy_probe(void)
> +{
> +     int ret = 0;
> +
> +#ifdef CONFIG_PCI
> +     if (smsc_ircc_preconfigure_subsystems(ircc_cfg, ircc_fir, ircc_sir,
> +                                           ircc_dma, ircc_irq) < 0) {
> +             /* Ignore errors from preconfiguration */
> +             IRDA_ERROR("%s, Preconfiguration failed !\n", driver_name);
> +     }
> +#endif
> +
> +     if (ircc_fir > 0 && ircc_sir > 0) {
> +             IRDA_MESSAGE(" Overriding FIR address 0x%04x\n", ircc_fir);
> +             IRDA_MESSAGE(" Overriding SIR address 0x%04x\n", ircc_sir);
> +
> +             if (smsc_ircc_open(ircc_fir, ircc_sir, ircc_dma, ircc_irq))
> +                     ret = -ENODEV;
> +     } else {
> +             ret = -ENODEV;
> +
> +             /* try user provided configuration register base address */
> +             if (ircc_cfg > 0) {
> +                     IRDA_MESSAGE(" Overriding configuration address "
> +                                  "0x%04x\n", ircc_cfg);
> +                     if (!smsc_superio_fdc(ircc_cfg))
> +                             ret = 0;
> +                     if (!smsc_superio_lpc(ircc_cfg))
> +                             ret = 0;
> +             }
> +
> +             if (smsc_ircc_look_for_chips() > 0)
> +                     ret = 0;
> +     }
> +     return ret;
> +}
> +
>  /* PNP hotplug support */
>  static const struct pnp_device_id smsc_ircc_pnp_table[] = {
>       { .id = "SMCf010", .driver_data = 0 },
> @@ -391,9 +429,14 @@ static int __init smsc_ircc_pnp_probe(struct pnp_dev
> *dev, dma = pnp_dma(dev, 0);
>       irq = pnp_irq(dev, 0);
>
> -     if (smsc_ircc_open(firbase, sirbase, dma, irq))
> -             return -ENODEV;
> -
> +     if (smsc_ircc_open(firbase, sirbase, dma, irq)) {
> +             IRDA_ERROR("PnP probe failed\n");
> +             if (smsc_ircc_legacy_probe()) {
> +                     IRDA_ERROR("Legacy probe failed\n");
> +                     return -ENODEV;
> +             }
> +     }
> +
>       return 0;
>  }
>
> @@ -412,35 +455,6 @@ static struct pnp_driver smsc_ircc_pnp_driver = {
>   *
>  
> ***************************************************************************
>****/
>
> -static int __init smsc_ircc_legacy_probe(void)
> -{
> -     int ret = 0;
> -
> -     if (ircc_fir > 0 && ircc_sir > 0) {
> -             IRDA_MESSAGE(" Overriding FIR address 0x%04x\n", ircc_fir);
> -             IRDA_MESSAGE(" Overriding SIR address 0x%04x\n", ircc_sir);
> -
> -             if (smsc_ircc_open(ircc_fir, ircc_sir, ircc_dma, ircc_irq))
> -                     ret = -ENODEV;
> -     } else {
> -             ret = -ENODEV;
> -
> -             /* try user provided configuration register base address */
> -             if (ircc_cfg > 0) {
> -                     IRDA_MESSAGE(" Overriding configuration address "
> -                                  "0x%04x\n", ircc_cfg);
> -                     if (!smsc_superio_fdc(ircc_cfg))
> -                             ret = 0;
> -                     if (!smsc_superio_lpc(ircc_cfg))
> -                             ret = 0;
> -             }
> -
> -             if (smsc_ircc_look_for_chips() > 0)
> -                     ret = 0;
> -     }
> -     return ret;
> -}
> -
>  /*
>   * Function smsc_ircc_init ()
>   *
> @@ -459,13 +473,6 @@ static int __init smsc_ircc_init(void)
>               return ret;
>       }
>
> -#ifdef CONFIG_PCI
> -     if (smsc_ircc_preconfigure_subsystems(ircc_cfg, ircc_fir, ircc_sir,
> ircc_dma, ircc_irq) < 0) { -          /* Ignore errors from preconfiguration 
> */
> -             IRDA_ERROR("%s, Preconfiguration failed !\n", driver_name);
> -     }
> -#endif
> -
>       dev_count = 0;
>
>       if (smsc_nopnp || !pnp_platform_devices ||


Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to